create-prisma 0.12.1-pr.85.342.1 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -15,6 +15,10 @@ bunx create-prisma@latest my-app
15
15
 
16
16
  The CLI initializes Prisma 8 with `prisma@latest`, installs dependencies, emits the contract, and generates a deployable Composer app. PostgreSQL projects use Composer's native Prisma Postgres provider, including migrations and a typed runtime client.
17
17
 
18
+ PostgreSQL apps with Composer include `@prisma/dev` as a project devDependency for
19
+ local Postgres. In a monorepo it belongs at the root, where Composer runs. Prisma 8
20
+ does not include this runtime itself. MongoDB and Deno-only apps do not need it.
21
+
18
22
  For npm, use 11.6.0 or newer, which includes the [upstream resolver fix](https://github.com/npm/cli/pull/8448).
19
23
  Older npm releases can crash resolving the dependency tree (`Cannot read properties of null (reading 'edgesOut')`). Run
20
24
  `npm install --global npm@11` to update. create-prisma checks the selected npm
@@ -44,6 +48,7 @@ workspace. Choosing another workspace also updates the Prisma CLI's active works
44
48
  - `elysia`
45
49
  - `nest`
46
50
  - `next`
51
+ - `turborepo` (Hello World Node.js server in `apps/server`, shared Prisma package in `packages/database`)
47
52
  - `svelte` (SvelteKit)
48
53
  - `astro`
49
54
  - `nuxt`
package/dist/cli.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { a as ApplicationLayer } from "./json-output-CTzh3AGR.mjs";
2
+ import { a as ApplicationLayer } from "./json-output-Bpk7rG2T.mjs";
3
3
  import { runCreatePrismaCli } from "./index.mjs";
4
4
  import { Effect } from "effect";
5
5
  import { NodeRuntime } from "@effect/platform-node-shared";
package/dist/index.d.mts CHANGED
@@ -4,10 +4,6 @@ import { Command } from "effect/unstable/cli";
4
4
  import * as effect_FileSystem0 from "effect/FileSystem";
5
5
  import * as effect_Cause0 from "effect/Cause";
6
6
 
7
- //#region src/utils/child-process-failure.d.ts
8
- declare const ChildProcessFailureSchema: Schema.Literals<readonly ["cancelled", "command_not_found", "interrupted", "max_buffer", "non_zero_exit", "permission_denied", "spawn_failed", "terminated", "timed_out"]>;
9
- type ChildProcessFailure = typeof ChildProcessFailureSchema.Type;
10
- //#endregion
11
7
  //#region src/services/command-runner.d.ts
12
8
  type CommandSpec = {
13
9
  command: string;
@@ -21,7 +17,6 @@ type CommandResult = {
21
17
  exitCode: number;
22
18
  stdout: string;
23
19
  stderr: string;
24
- childProcessFailure?: ChildProcessFailure;
25
20
  };
26
21
  declare const CommandExecutionError_base: Schema.Class<CommandExecutionError, Schema.TaggedStruct<"CommandExecutionError", {
27
22
  readonly command: Schema.String;
@@ -30,7 +25,6 @@ declare const CommandExecutionError_base: Schema.Class<CommandExecutionError, Sc
30
25
  readonly stdout: Schema.String;
31
26
  readonly stderr: Schema.String;
32
27
  readonly cause: Schema.optionalKey<Schema.Defect>;
33
- readonly childProcessFailure: Schema.optional<Schema.Literals<readonly ["cancelled", "command_not_found", "interrupted", "max_buffer", "non_zero_exit", "permission_denied", "spawn_failed", "terminated", "timed_out"]>>;
34
28
  }>, effect_Cause0.YieldableError>;
35
29
  declare class CommandExecutionError extends CommandExecutionError_base {
36
30
  get message(): string;
@@ -48,10 +42,10 @@ declare const DatabaseProviderSchema: Schema.Literals<readonly ["postgres", "mon
48
42
  declare const PackageManagerSchema: Schema.Literals<readonly ["npm", "pnpm", "yarn", "bun", "deno"]>;
49
43
  declare const AuthoringStyleSchema: Schema.Literals<readonly ["psl", "typescript"]>;
50
44
  declare const AgentSkillTargetSchema: Schema.Literals<readonly ["claude", "cursor", "agents", "devin"]>;
51
- declare const CreateTemplateSchema: Schema.Literals<readonly ["minimal", "hono", "elysia", "nest", "next", "svelte", "astro", "nuxt", "tanstack-start"]>;
45
+ declare const CreateTemplateSchema: Schema.Literals<readonly ["minimal", "hono", "elysia", "nest", "next", "turborepo", "svelte", "astro", "nuxt", "tanstack-start"]>;
52
46
  declare const CreateCommandInputSchema: Schema.Struct<{
53
47
  readonly name: Schema.optionalKey<Schema.Trim>;
54
- readonly template: Schema.optionalKey<Schema.Literals<readonly ["minimal", "hono", "elysia", "nest", "next", "svelte", "astro", "nuxt", "tanstack-start"]>>;
48
+ readonly template: Schema.optionalKey<Schema.Literals<readonly ["minimal", "hono", "elysia", "nest", "next", "turborepo", "svelte", "astro", "nuxt", "tanstack-start"]>>;
55
49
  readonly force: Schema.optionalKey<Schema.Boolean>;
56
50
  readonly provider: Schema.optionalKey<Schema.Literals<readonly ["postgres", "mongo"]>>;
57
51
  readonly authoring: Schema.optionalKey<Schema.Literals<readonly ["psl", "typescript"]>>;
@@ -81,7 +75,7 @@ type CreateNextStep = typeof CreateNextStepSchema.Type;
81
75
  declare const CreateProjectResultSchema: Schema.Struct<{
82
76
  readonly name: Schema.String;
83
77
  readonly path: Schema.String;
84
- readonly template: Schema.Literals<readonly ["minimal", "hono", "elysia", "nest", "next", "svelte", "astro", "nuxt", "tanstack-start"]>;
78
+ readonly template: Schema.Literals<readonly ["minimal", "hono", "elysia", "nest", "next", "turborepo", "svelte", "astro", "nuxt", "tanstack-start"]>;
85
79
  readonly databaseProvider: Schema.Literals<readonly ["postgres", "mongo"]>;
86
80
  readonly authoring: Schema.Literals<readonly ["psl", "typescript"]>;
87
81
  readonly packageManager: Schema.Literals<readonly ["npm", "pnpm", "yarn", "bun", "deno"]>;
@@ -94,7 +88,7 @@ declare const CreateCommandSuccessResultSchema: Schema.Struct<{
94
88
  readonly project: Schema.Struct<{
95
89
  readonly name: Schema.String;
96
90
  readonly path: Schema.String;
97
- readonly template: Schema.Literals<readonly ["minimal", "hono", "elysia", "nest", "next", "svelte", "astro", "nuxt", "tanstack-start"]>;
91
+ readonly template: Schema.Literals<readonly ["minimal", "hono", "elysia", "nest", "next", "turborepo", "svelte", "astro", "nuxt", "tanstack-start"]>;
98
92
  readonly databaseProvider: Schema.Literals<readonly ["postgres", "mongo"]>;
99
93
  readonly authoring: Schema.Literals<readonly ["psl", "typescript"]>;
100
94
  readonly packageManager: Schema.Literals<readonly ["npm", "pnpm", "yarn", "bun", "deno"]>;
@@ -130,7 +124,7 @@ declare const CreateCommandFailureResultSchema: Schema.Struct<{
130
124
  readonly project: Schema.optionalKey<Schema.Struct<{
131
125
  readonly name: Schema.String;
132
126
  readonly path: Schema.String;
133
- readonly template: Schema.Literals<readonly ["minimal", "hono", "elysia", "nest", "next", "svelte", "astro", "nuxt", "tanstack-start"]>;
127
+ readonly template: Schema.Literals<readonly ["minimal", "hono", "elysia", "nest", "next", "turborepo", "svelte", "astro", "nuxt", "tanstack-start"]>;
134
128
  readonly databaseProvider: Schema.Literals<readonly ["postgres", "mongo"]>;
135
129
  readonly authoring: Schema.Literals<readonly ["psl", "typescript"]>;
136
130
  readonly packageManager: Schema.Literals<readonly ["npm", "pnpm", "yarn", "bun", "deno"]>;
@@ -143,7 +137,7 @@ declare const CreateCommandResultSchema: Schema.Union<readonly [Schema.Struct<{
143
137
  readonly project: Schema.Struct<{
144
138
  readonly name: Schema.String;
145
139
  readonly path: Schema.String;
146
- readonly template: Schema.Literals<readonly ["minimal", "hono", "elysia", "nest", "next", "svelte", "astro", "nuxt", "tanstack-start"]>;
140
+ readonly template: Schema.Literals<readonly ["minimal", "hono", "elysia", "nest", "next", "turborepo", "svelte", "astro", "nuxt", "tanstack-start"]>;
147
141
  readonly databaseProvider: Schema.Literals<readonly ["postgres", "mongo"]>;
148
142
  readonly authoring: Schema.Literals<readonly ["psl", "typescript"]>;
149
143
  readonly packageManager: Schema.Literals<readonly ["npm", "pnpm", "yarn", "bun", "deno"]>;
@@ -177,7 +171,7 @@ declare const CreateCommandResultSchema: Schema.Union<readonly [Schema.Struct<{
177
171
  readonly project: Schema.optionalKey<Schema.Struct<{
178
172
  readonly name: Schema.String;
179
173
  readonly path: Schema.String;
180
- readonly template: Schema.Literals<readonly ["minimal", "hono", "elysia", "nest", "next", "svelte", "astro", "nuxt", "tanstack-start"]>;
174
+ readonly template: Schema.Literals<readonly ["minimal", "hono", "elysia", "nest", "next", "turborepo", "svelte", "astro", "nuxt", "tanstack-start"]>;
181
175
  readonly databaseProvider: Schema.Literals<readonly ["postgres", "mongo"]>;
182
176
  readonly authoring: Schema.Literals<readonly ["psl", "typescript"]>;
183
177
  readonly packageManager: Schema.Literals<readonly ["npm", "pnpm", "yarn", "bun", "deno"]>;
@@ -189,7 +183,7 @@ type CreateCommandResult = typeof CreateCommandResultSchema.Type;
189
183
  declare const createPrismaCommand: Command.Command<"create-prisma", {
190
184
  readonly projectName: string | undefined;
191
185
  readonly name: string | undefined;
192
- readonly template: "minimal" | "hono" | "elysia" | "nest" | "next" | "svelte" | "astro" | "nuxt" | "tanstack-start" | undefined;
186
+ readonly template: "minimal" | "hono" | "elysia" | "nest" | "next" | "turborepo" | "svelte" | "astro" | "nuxt" | "tanstack-start" | undefined;
193
187
  readonly provider: "postgres" | "mongo" | undefined;
194
188
  readonly authoring: "psl" | "typescript" | undefined;
195
189
  readonly packageManager: "npm" | "pnpm" | "yarn" | "bun" | "deno" | undefined;
@@ -204,7 +198,7 @@ declare const createPrismaCommand: Command.Command<"create-prisma", {
204
198
  declare function createCreatePrismaCli(): Command.Command<"create-prisma", {
205
199
  readonly projectName: string | undefined;
206
200
  readonly name: string | undefined;
207
- readonly template: "minimal" | "hono" | "elysia" | "nest" | "next" | "svelte" | "astro" | "nuxt" | "tanstack-start" | undefined;
201
+ readonly template: "minimal" | "hono" | "elysia" | "nest" | "next" | "turborepo" | "svelte" | "astro" | "nuxt" | "tanstack-start" | undefined;
208
202
  readonly provider: "postgres" | "mongo" | undefined;
209
203
  readonly authoring: "psl" | "typescript" | undefined;
210
204
  readonly packageManager: "npm" | "pnpm" | "yarn" | "bun" | "deno" | undefined;
package/dist/index.mjs CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- import { _ as authoringStyles, b as normalizeDatabaseProvider, c as CreateCommandResultSchema, d as AuthoringStyleSchema, f as CreateCommandInputSchema, g as agentSkillTargets, h as PackageManagerSchema, i as getErrorMessage, l as createCommandFailureResult, m as DatabaseProviderSchema, n as writeJsonResult, o as applicationRuntime, p as CreateTemplateSchema, r as runCreateCommandEffect, s as CREATE_PRISMA_RESULT_SCHEMA_VERSION, t as isJsonOutputRequested, u as AgentSkillTargetSchema, v as createTemplates, x as packageManagers, y as databaseProviderInputs } from "./json-output-CTzh3AGR.mjs";
2
+ import { _ as authoringStyles, b as normalizeDatabaseProvider, c as CreateCommandResultSchema, d as AuthoringStyleSchema, f as CreateCommandInputSchema, g as agentSkillTargets, h as PackageManagerSchema, i as getErrorMessage, l as createCommandFailureResult, m as DatabaseProviderSchema, n as writeJsonResult, o as applicationRuntime, p as CreateTemplateSchema, r as runCreateCommandEffect, s as CREATE_PRISMA_RESULT_SCHEMA_VERSION, t as isJsonOutputRequested, u as AgentSkillTargetSchema, v as createTemplates, x as packageManagers, y as databaseProviderInputs } from "./json-output-Bpk7rG2T.mjs";
3
3
  import { Console, Effect, Option } from "effect";
4
4
  import { Argument, CliError, Command, Flag } from "effect/unstable/cli";
5
5
 
6
6
  //#region src/index.ts
7
- const CLI_VERSION = "0.12.1-pr.85.342.1";
7
+ const CLI_VERSION = "0.13.0";
8
8
  const optionalArgument = (name, description) => Argument.string(name).pipe(Argument.withDescription(description), Argument.optional, Argument.map(Option.getOrUndefined));
9
9
  const optionalBoolean = (name, description) => Flag.boolean(name).pipe(Flag.withDescription(description), Flag.optional, Flag.map(Option.getOrUndefined));
10
10
  const optionalString = (name, description) => Flag.string(name).pipe(Flag.withDescription(description), Flag.optional, Flag.map(Option.getOrUndefined));
@@ -13,36 +13,6 @@ import { fileURLToPath } from "node:url";
13
13
  import { Writable } from "node:stream";
14
14
  import { styleText } from "node:util";
15
15
 
16
- //#region src/utils/child-process-failure.ts
17
- const ChildProcessFailureSchema = Schema.Literals([
18
- "cancelled",
19
- "command_not_found",
20
- "interrupted",
21
- "max_buffer",
22
- "non_zero_exit",
23
- "permission_denied",
24
- "spawn_failed",
25
- "terminated",
26
- "timed_out"
27
- ]);
28
- const WINDOWS_CONTROL_C_EXIT_CODE = 3221225786;
29
- function getChildProcessFailure(error) {
30
- if (typeof error !== "object" || error === null) return void 0;
31
- if (Reflect.get(error, "name") !== "ExecaError" || Reflect.get(error, "failed") !== true) return;
32
- if (Reflect.get(error, "timedOut") === true) return "timed_out";
33
- if (Reflect.get(error, "isCanceled") === true) return "cancelled";
34
- if (Reflect.get(error, "isMaxBuffer") === true) return "max_buffer";
35
- const exitCode = Reflect.get(error, "exitCode");
36
- if (Reflect.get(error, "signal") === "SIGINT" || exitCode === 130 || exitCode === WINDOWS_CONTROL_C_EXIT_CODE) return "interrupted";
37
- if (Reflect.get(error, "isTerminated") === true) return "terminated";
38
- const code = Reflect.get(error, "code");
39
- if (code === "ENOENT") return "command_not_found";
40
- if (code === "EACCES" || code === "EPERM") return "permission_denied";
41
- if (typeof exitCode === "number") return "non_zero_exit";
42
- return "spawn_failed";
43
- }
44
-
45
- //#endregion
46
16
  //#region src/create-outcome.ts
47
17
  const CreateFailureStageSchema = Schema.Literals([
48
18
  "validate_input",
@@ -124,8 +94,7 @@ var PrismaCliCommandError = class extends Schema.TaggedError()("PrismaCliCommand
124
94
  command: Schema.optionalKey(Schema.String),
125
95
  code: Schema.optionalKey(Schema.String),
126
96
  stderr: Schema.optionalKey(Schema.String),
127
- exitCode: Schema.optionalKey(Schema.Number),
128
- childProcessFailure: Schema.optional(ChildProcessFailureSchema)
97
+ exitCode: Schema.optionalKey(Schema.Number)
129
98
  }) {
130
99
  prismaCliCommand = this.command;
131
100
  prismaCliErrorCode = this.code;
@@ -161,6 +130,7 @@ const createTemplates = [
161
130
  "elysia",
162
131
  "nest",
163
132
  "next",
133
+ "turborepo",
164
134
  "svelte",
165
135
  "astro",
166
136
  "nuxt",
@@ -314,8 +284,7 @@ var CommandExecutionError = class extends Schema.TaggedError()("CommandExecution
314
284
  exitCode: Schema.optionalKey(Schema.Number),
315
285
  stdout: Schema.String,
316
286
  stderr: Schema.String,
317
- cause: Schema.optionalKey(Schema.Defect()),
318
- childProcessFailure: Schema.optional(ChildProcessFailureSchema)
287
+ cause: Schema.optionalKey(Schema.Defect())
319
288
  }) {
320
289
  get message() {
321
290
  const detail = this.stderr.trim() || this.stdout.trim();
@@ -351,8 +320,7 @@ var CommandRunner = class CommandRunner extends Context.Service()("create-prisma
351
320
  return {
352
321
  exitCode: result.exitCode ?? 1,
353
322
  stdout: typeof result.stdout === "string" ? result.stdout : "",
354
- stderr: typeof result.stderr === "string" ? result.stderr : "",
355
- childProcessFailure: getChildProcessFailure(result)
323
+ stderr: typeof result.stderr === "string" ? result.stderr : ""
356
324
  };
357
325
  },
358
326
  catch: (cause) => new CommandExecutionError({
@@ -360,8 +328,7 @@ var CommandRunner = class CommandRunner extends Context.Service()("create-prisma
360
328
  args: [...spec.args],
361
329
  stdout: "",
362
330
  stderr: "",
363
- cause,
364
- childProcessFailure: getChildProcessFailure(cause)
331
+ cause
365
332
  })
366
333
  }));
367
334
  const runChecked = Effect.fn("CommandRunner.runChecked")((spec) => Effect.flatMap(run(spec), (result) => result.exitCode === 0 ? Effect.succeed(result) : Effect.fail(new CommandExecutionError({
@@ -369,8 +336,7 @@ var CommandRunner = class CommandRunner extends Context.Service()("create-prisma
369
336
  args: [...spec.args],
370
337
  exitCode: result.exitCode,
371
338
  stdout: result.stdout,
372
- stderr: result.stderr,
373
- childProcessFailure: result.childProcessFailure
339
+ stderr: result.stderr
374
340
  }))));
375
341
  return CommandRunner.of({
376
342
  run,
@@ -387,14 +353,20 @@ const applicationRuntime = ManagedRuntime.make(ApplicationLayer);
387
353
 
388
354
  //#endregion
389
355
  //#region src/telemetry/client.ts
390
- const TELEMETRY_API_KEY = "";
356
+ const TELEMETRY_API_KEY = "phc_cmc85avbWyuJ2JyKdGPdv7dxXli8xLdWDBPbvIXWJfs";
391
357
  const TELEMETRY_HOST = "https://us.i.posthog.com";
392
358
  const TELEMETRY_CONFIG_FILE = "telemetry.json";
393
359
  const TELEMETRY_TIMEOUT_MS = 2e3;
394
360
  const AnonymousId = Schema.String.check(Schema.isUUID(4));
395
361
  const decodeAnonymousId = Schema.decodeUnknownExit(AnonymousId);
362
+ const isTruthyEnvValue = (value) => [
363
+ "1",
364
+ "true",
365
+ "yes",
366
+ "on"
367
+ ].includes(String(value ?? "").trim().toLowerCase());
396
368
  function shouldDisableTelemetry() {
397
- return true;
369
+ return isTruthyEnvValue(process.env.CI) || isTruthyEnvValue(process.env.GITHUB_ACTIONS) || process.env.CREATE_PRISMA_DISABLE_TELEMETRY !== void 0 || process.env.CREATE_PRISMA_TELEMETRY_DISABLED !== void 0 || process.env.DO_NOT_TRACK !== void 0;
398
370
  }
399
371
  function getTelemetryConfigDir() {
400
372
  if (process.platform === "darwin") return path.join(os.homedir(), "Library", "Application Support", "create-prisma");
@@ -417,7 +389,7 @@ const getAnonymousIdEffect = Effect.fn("Telemetry.getAnonymousId")(function* ()
417
389
  return anonymousId;
418
390
  });
419
391
  const getCommonProperties = () => ({
420
- "cli-version": "0.12.1-pr.85.342.1",
392
+ "cli-version": "0.13.0",
421
393
  "node-version": process.version,
422
394
  platform: process.platform,
423
395
  arch: process.arch
@@ -503,9 +475,6 @@ function getErrorCode(error) {
503
475
  const code = Reflect.get(error, "code");
504
476
  return typeof code === "number" || typeof code === "string" ? code : null;
505
477
  }
506
- function getChildProcessFailureProperty(error) {
507
- return error instanceof CommandExecutionError || error instanceof PrismaCliCommandError ? error.childProcessFailure ?? null : null;
508
- }
509
478
  function getPrismaCliFailureProperty(error, property) {
510
479
  if (typeof error !== "object" || error === null) return null;
511
480
  const value = Reflect.get(error, property);
@@ -526,7 +495,6 @@ const trackCreateFailedEffect = Effect.fn("Telemetry.createFailed")(function* (p
526
495
  "failure-reason": params.reason,
527
496
  "error-name": getErrorName(params.error),
528
497
  "error-code": getErrorCode(params.error),
529
- "child-process-failure": getChildProcessFailureProperty(params.error),
530
498
  "prisma-cli-command": getPrismaCliFailureProperty(params.error, "prismaCliCommand"),
531
499
  "prisma-cli-error-code": getPrismaCliFailureProperty(params.error, "prismaCliErrorCode")
532
500
  }).pipe(Effect.scoped, Effect.timeout(TELEMETRY_TIMEOUT_MS), Effect.catch(() => Effect.void));
@@ -800,9 +768,10 @@ const renderTemplateTreeEffect = Effect.fn("Templates.renderTree")(function* (op
800
768
  for (const relativePath of entries) {
801
769
  const templateFilePath = path.join(opts.templateRoot, relativePath);
802
770
  if ((yield* fs.stat(templateFilePath)).type !== "File") continue;
771
+ const renderedRelativePath = stripHbsExtension(relativePath);
803
772
  yield* renderTemplateFileEffect({
804
773
  templateFilePath,
805
- outputPath: path.join(opts.outputDir, stripHbsExtension(relativePath)),
774
+ outputPath: path.join(opts.outputDir, opts.mapRelativeOutputPath?.(renderedRelativePath) ?? renderedRelativePath),
806
775
  context: opts.context
807
776
  });
808
777
  }
@@ -810,11 +779,17 @@ const renderTemplateTreeEffect = Effect.fn("Templates.renderTree")(function* (op
810
779
 
811
780
  //#endregion
812
781
  //#region src/templates/render-create-template.ts
782
+ const DEFAULT_PRISMA_SOURCE_DIR = "src/prisma";
783
+ const TURBOREPO_PRISMA_SOURCE_DIR = "packages/database/src";
784
+ function getCreatePrismaSourceDir(template) {
785
+ return template === "turborepo" ? TURBOREPO_PRISMA_SOURCE_DIR : DEFAULT_PRISMA_SOURCE_DIR;
786
+ }
813
787
  const tsdownEntries = {
814
788
  minimal: "src/index.ts",
815
789
  hono: "src/index.ts",
816
790
  elysia: "src/index.ts",
817
- nest: "src/main.ts"
791
+ nest: "src/main.ts",
792
+ turborepo: "src/index.ts"
818
793
  };
819
794
  function createTemplateContext(options) {
820
795
  return {
@@ -831,7 +806,14 @@ const scaffoldCreateSharedTemplatesEffect = Effect.fn("Templates.scaffoldShared"
831
806
  yield* renderTemplateTreeEffect({
832
807
  templateRoot: yield* resolveTemplatesDirEffect("templates/create/_shared"),
833
808
  outputDir: options.projectDir,
834
- context: createTemplateContext(options)
809
+ context: createTemplateContext(options),
810
+ mapRelativeOutputPath(relativePath) {
811
+ if (options.template !== "turborepo") return relativePath;
812
+ if (relativePath === "tsdown.config.ts") return path.join("apps/server", relativePath);
813
+ const relativePrismaPath = path.relative(DEFAULT_PRISMA_SOURCE_DIR, relativePath);
814
+ if (relativePrismaPath === ".." || relativePrismaPath.startsWith(`..${path.sep}`) || path.isAbsolute(relativePrismaPath)) return relativePath;
815
+ return path.join(TURBOREPO_PRISMA_SOURCE_DIR, relativePrismaPath);
816
+ }
835
817
  });
836
818
  });
837
819
  const scaffoldCreatePackageManagerTemplatesEffect = Effect.fn("Templates.scaffoldPackageManager")(function* (options) {
@@ -861,6 +843,7 @@ const dependencyVersionMap = {
861
843
  "@elysiajs/node": "^1.4.5",
862
844
  "@prisma/composer": "0.19.0",
863
845
  "@prisma/composer-prisma-cloud": "0.19.0",
846
+ "@prisma/dev": "0.25.2",
864
847
  "@prisma/orm-mongo": "8.0.0-rc.10",
865
848
  "@prisma/orm-postgres": "8.0.0-rc.10",
866
849
  "@sveltejs/adapter-node": "^5.3.2",
@@ -875,6 +858,7 @@ const dependencyVersionMap = {
875
858
  prisma: "latest",
876
859
  "temporal-polyfill": "^1.0.4",
877
860
  tsdown: "^0.22.14",
861
+ turbo: "2.10.12",
878
862
  tsx: "^4.21.0",
879
863
  typescript: "^5.9.3"
880
864
  };
@@ -886,7 +870,7 @@ function getDependencyVersion(packageName) {
886
870
  function usesTsdown(template) {
887
871
  return template === "minimal" || template === "hono" || template === "elysia" || template === "nest";
888
872
  }
889
- function getCreateTemplateDependencies(template, _packageManager) {
873
+ function getCreateTemplateDependencies(template, packageManager) {
890
874
  const dependencies = [
891
875
  "@prisma/composer",
892
876
  "@prisma/composer-prisma-cloud",
@@ -905,11 +889,31 @@ function getCreateTemplateDependencies(template, _packageManager) {
905
889
  if (template === "svelte") devDependencies.push("@sveltejs/adapter-node");
906
890
  if (template === "astro") dependencies.push("@astrojs/node");
907
891
  if (template === "tanstack-start") devDependencies.push("nitro");
908
- return [{
892
+ if (template === "turborepo") devDependencies.push("turbo", "typescript");
893
+ const targets = [{
909
894
  packageJsonPath: "package.json",
910
895
  dependencies,
911
896
  devDependencies
912
897
  }];
898
+ if (template === "turborepo") {
899
+ targets.push({
900
+ packageJsonPath: "apps/server/package.json",
901
+ dependencies: [],
902
+ devDependencies: [
903
+ "@types/node",
904
+ "tsdown",
905
+ "tsx",
906
+ "typescript"
907
+ ],
908
+ customDependencies: { "@repo/database": packageManager === "npm" ? "*" : "workspace:*" }
909
+ });
910
+ targets.push({
911
+ packageJsonPath: "packages/database/package.json",
912
+ dependencies: [],
913
+ devDependencies: ["typescript"]
914
+ });
915
+ }
916
+ return targets;
913
917
  }
914
918
 
915
919
  //#endregion
@@ -1028,16 +1032,25 @@ const addPackageDependencyEffect = Effect.fn("Dependencies.add")(function* (opts
1028
1032
  yield* writePackageJson(packageJsonPath, packageJson);
1029
1033
  });
1030
1034
  const writePrismaDependenciesEffect = Effect.fn("Dependencies.writePrisma")(function* (provider, packageManager, _authoring, projectDir = process.cwd(), options = {}) {
1031
- const dependencies = [getDbPackages(provider)];
1032
- if (provider === "postgres" && packageManager !== "deno") dependencies.push("temporal-polyfill");
1033
- if (provider === "mongo") dependencies.push("arktype", "mongodb");
1035
+ const databaseDependencies = [getDbPackages(provider)];
1036
+ const devDependencies = ["@types/node", "prisma"];
1037
+ if (provider === "postgres" && packageManager !== "deno") {
1038
+ databaseDependencies.push("temporal-polyfill");
1039
+ devDependencies.push("@prisma/dev");
1040
+ }
1041
+ if (provider === "mongo") databaseDependencies.push("arktype", "mongodb");
1042
+ const dependencies = options.template === "turborepo" ? [getDbPackages(provider), ...provider === "mongo" ? ["arktype"] : []] : [...databaseDependencies];
1034
1043
  if (packageManager === "deno") dependencies.push("dotenv");
1035
1044
  yield* addPackageDependencyEffect({
1036
1045
  dependencies,
1037
- devDependencies: ["@types/node", "prisma"],
1046
+ devDependencies,
1038
1047
  scripts: getPrismaScriptMap(packageManager, options.skillsSync ?? true),
1039
1048
  projectDir
1040
1049
  });
1050
+ if (options.template === "turborepo") yield* addPackageDependencyEffect({
1051
+ dependencies: databaseDependencies,
1052
+ projectDir: path.join(projectDir, "packages/database")
1053
+ });
1041
1054
  });
1042
1055
  const writeCreateTemplateDependenciesEffect = Effect.fn("Dependencies.writeTemplate")(function* (opts) {
1043
1056
  const projectDir = opts.projectDir ?? process.cwd();
@@ -1046,7 +1059,7 @@ const writeCreateTemplateDependenciesEffect = Effect.fn("Dependencies.writeTempl
1046
1059
  dependencies: target.dependencies,
1047
1060
  devDependencies: target.devDependencies,
1048
1061
  customDependencies: target.customDependencies,
1049
- scripts: getComposerScriptMap(opts.packageManager),
1062
+ scripts: target.packageJsonPath === "package.json" ? getComposerScriptMap(opts.packageManager) : void 0,
1050
1063
  projectDir: path.join(projectDir, path.dirname(target.packageJsonPath))
1051
1064
  });
1052
1065
  const packageJsonPath = path.join(projectDir, "package.json");
@@ -1143,8 +1156,7 @@ const runPrismaJsonCommandEffect = Effect.fn("PrismaCli.runJson")(function* (opt
1143
1156
  return yield* new PrismaCliCommandError({
1144
1157
  message: redactSecrets(result.stderr.trim() || result.stdout.trim()) || getErrorMessage(cause),
1145
1158
  stderr: redactSecrets(result.stderr),
1146
- exitCode: result.exitCode,
1147
- childProcessFailure: result.childProcessFailure
1159
+ exitCode: result.exitCode
1148
1160
  });
1149
1161
  }
1150
1162
  if (result.exitCode !== 0 || !envelope.ok || envelope.result === void 0) return yield* new PrismaCliCommandError({
@@ -1152,8 +1164,7 @@ const runPrismaJsonCommandEffect = Effect.fn("PrismaCli.runJson")(function* (opt
1152
1164
  ...envelope.commandId || envelope.command ? { command: envelope.commandId ?? envelope.command } : {},
1153
1165
  ...envelope.error?.code ? { code: envelope.error.code } : {},
1154
1166
  stderr: redactSecrets(result.stderr),
1155
- exitCode: result.exitCode,
1156
- childProcessFailure: result.childProcessFailure
1167
+ exitCode: result.exitCode
1157
1168
  });
1158
1169
  return envelope.result;
1159
1170
  });
@@ -1543,7 +1554,7 @@ const initializeGitRepositoryEffect = Effect.fn("Git.initialize")(function* (pro
1543
1554
 
1544
1555
  //#endregion
1545
1556
  //#region src/tasks/prisma-setup/commands.ts
1546
- const getContractPath = (authoring) => `src/prisma/contract${authoring === "typescript" ? ".ts" : ".prisma"}`;
1557
+ const getContractPath = (authoring, template) => `${getCreatePrismaSourceDir(template)}/contract${authoring === "typescript" ? ".ts" : ".prisma"}`;
1547
1558
  const getInitTarget = (provider) => provider === "mongo" ? "mongodb" : "postgres";
1548
1559
  const runPrismaCli = Effect.fn("PrismaSetup.runCli")(function* (context, projectDir, args) {
1549
1560
  const invocation = getLocalPackageBinaryArgs(context.packageManager, "prisma", args);
@@ -1561,7 +1572,7 @@ const runPrismaCli = Effect.fn("PrismaSetup.runCli")(function* (context, project
1561
1572
  ...context.verbose ? { onStderrLine: (line) => log.message(redactSecrets(line), { output: context.output }) } : {}
1562
1573
  });
1563
1574
  });
1564
- const runPrismaInit = Effect.fn("PrismaSetup.init")(function* (context, projectDir, force = false) {
1575
+ const runPrismaInit = Effect.fn("PrismaSetup.init")(function* (context, projectDir, force = false, template = "minimal") {
1565
1576
  yield* runPrismaCli(context, projectDir, [
1566
1577
  "orm",
1567
1578
  "init",
@@ -1572,7 +1583,7 @@ const runPrismaInit = Effect.fn("PrismaSetup.init")(function* (context, projectD
1572
1583
  "--authoring",
1573
1584
  context.authoring,
1574
1585
  "--schema-path",
1575
- getContractPath(context.authoring),
1586
+ getContractPath(context.authoring, template),
1576
1587
  "--skip-install"
1577
1588
  ]);
1578
1589
  if (context.packageManager === "deno") {
@@ -1840,14 +1851,17 @@ const executePrismaSetupContextEffect = Effect.fn("PrismaSetup.execute")(functio
1840
1851
  packageManager: context.packageManager,
1841
1852
  skillAgents: context.skillAgents
1842
1853
  }), "configure_project", "project_configuration_failed");
1843
- yield* atCreateStage(writePrismaDependenciesEffect(context.databaseProvider, context.packageManager, context.authoring, projectDir, { skillsSync: context.skillAgents.length > 0 }), "configure_project", "project_configuration_failed");
1854
+ yield* atCreateStage(writePrismaDependenciesEffect(context.databaseProvider, context.packageManager, context.authoring, projectDir, {
1855
+ skillsSync: context.skillAgents.length > 0,
1856
+ template
1857
+ }), "configure_project", "project_configuration_failed");
1844
1858
  yield* Effect.sync(() => progress?.message(`Installing dependencies with ${getInstallCommand(context.packageManager)}...`));
1845
1859
  yield* atCreateStage(installProjectDependenciesEffect(context.packageManager, projectDir, {
1846
1860
  verbose: context.verbose,
1847
1861
  json: context.json
1848
1862
  }), "install_dependencies", "dependency_install_failed");
1849
1863
  yield* Effect.sync(() => progress?.message("Preparing Prisma 8 project files..."));
1850
- yield* atCreateStage(runPrismaInit(context, projectDir, options.force), "initialize_prisma", "prisma_init_failed");
1864
+ yield* atCreateStage(runPrismaInit(context, projectDir, options.force, template), "initialize_prisma", "prisma_init_failed");
1851
1865
  yield* atCreateStage(Effect.gen(function* () {
1852
1866
  yield* scaffoldCreateSharedTemplatesEffect({
1853
1867
  projectDir,
@@ -2030,6 +2044,11 @@ const promptForCreateTemplate = Effect.fn("Prompts.template")(function* (output)
2030
2044
  label: "Next.js",
2031
2045
  hint: "Full-stack React app with App Router"
2032
2046
  },
2047
+ {
2048
+ value: "turborepo",
2049
+ label: "Monorepo (Turborepo)",
2050
+ hint: "Hello World server with a shared Prisma database package"
2051
+ },
2033
2052
  {
2034
2053
  value: "svelte",
2035
2054
  label: "SvelteKit",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-prisma",
3
- "version": "0.12.1-pr.85.342.1",
3
+ "version": "0.13.0",
4
4
  "private": false,
5
5
  "description": "Create Prisma 8 projects with first-party templates and great DX.",
6
6
  "homepage": "https://github.com/prisma/create-prisma",
@@ -1,4 +1,9 @@
1
1
  {{#if (eq packageManager "pnpm")}}
2
+ {{#if (eq template "turborepo")}}
3
+ packages:
4
+ - "apps/*"
5
+ - "packages/*"
6
+ {{/if}}
2
7
  allowBuilds:
3
8
  esbuild: true
4
9
  msgpackr-extract: true
@@ -1,11 +1,11 @@
1
1
  {{#if (eq authoring "typescript")}}
2
- src/prisma/generated/contract.json linguist-generated
3
- src/prisma/generated/contract.d.ts linguist-generated
2
+ {{#if (eq template "turborepo")}}packages/database/src{{else}}src/prisma{{/if}}/generated/contract.json linguist-generated
3
+ {{#if (eq template "turborepo")}}packages/database/src{{else}}src/prisma{{/if}}/generated/contract.d.ts linguist-generated
4
4
  {{else}}
5
- src/prisma/contract.json linguist-generated
6
- src/prisma/contract.d.ts linguist-generated
5
+ {{#if (eq template "turborepo")}}packages/database/src{{else}}src/prisma{{/if}}/contract.json linguist-generated
6
+ {{#if (eq template "turborepo")}}packages/database/src{{else}}src/prisma{{/if}}/contract.d.ts linguist-generated
7
7
  {{/if}}
8
- src/prisma/ops.json linguist-generated
9
- src/prisma/migration.json linguist-generated
8
+ {{#if (eq template "turborepo")}}packages/database/src{{else}}src/prisma{{/if}}/ops.json linguist-generated
9
+ {{#if (eq template "turborepo")}}packages/database/src{{else}}src/prisma{{/if}}/migration.json linguist-generated
10
10
  migrations/snapshots/**/contract.json linguist-generated
11
11
  migrations/snapshots/**/contract.d.ts linguist-generated
@@ -31,6 +31,50 @@ deno task contract:emit
31
31
  ```
32
32
 
33
33
  Prisma Compute does not support Deno deployments yet.
34
+ {{else if (eq template "turborepo")}}
35
+ A minimal Prisma 8 monorepo with Turborepo and a plain Node.js HTTP server.
36
+
37
+ ## Workspace layout
38
+
39
+ - `apps/server` — Hello World server; `/users` reads from the shared database package
40
+ - `packages/database` — Prisma contract, generated artifacts, runtime client, and seed data
41
+ - `module.ts` and `service.ts` — Composer deployment topology
42
+
43
+ ## Run locally
44
+
45
+ ```bash
46
+ {{runScriptCommand packageManager "dev:composer"}}
47
+ ```
48
+
49
+ This builds the workspace and starts it with Composer. PostgreSQL projects get a local Prisma Postgres database and apply the committed migrations automatically.
50
+
51
+ ## Deploy
52
+
53
+ ```bash
54
+ {{runScriptCommand packageManager "deploy"}}
55
+ ```
56
+
57
+ The deploy script builds the server with tsdown, provisions Prisma Postgres when selected, applies migrations, and deploys the server to Prisma Compute.
58
+
59
+ The home page returns `Hello World!` without querying the database. Visiting `/users` queries the shared Prisma package and inserts starter users idempotently from `packages/database/src/seed.ts`.
60
+
61
+ {{#if (eq provider "mongo")}}
62
+ MongoDB is not provisioned by Composer. Set `MONGODB_URL` before running Composer locally or deploying.
63
+ {{/if}}
64
+
65
+ ## Prisma
66
+
67
+ - Contract: `packages/database/src/contract{{#if (eq authoring "typescript")}}.ts{{else}}.prisma{{/if}}`
68
+ - Prisma and Composer config: `prisma.config.ts`
69
+ - Composer app: `module.ts` and `service.ts`
70
+
71
+ After changing the contract, run:
72
+
73
+ ```bash
74
+ {{runScriptCommand packageManager "contract:emit"}}
75
+ ```
76
+
77
+ To run the workspace's development tasks directly, use `{{runScriptCommand packageManager "dev"}}`. This direct mode requires `{{#if (eq provider "postgres")}}DATABASE_URL{{else}}MONGODB_URL{{/if}}`.
34
78
  {{else}}
35
79
  A minimal {{template}} app with Prisma 8 and Prisma Composer.
36
80
 
@@ -3,7 +3,7 @@ import { module } from "@prisma/composer";
3
3
  {{#if (eq provider "postgres")}}
4
4
  import { postgres } from "@prisma/composer-prisma-cloud/orm";
5
5
 
6
- import { appContract } from "./src/prisma/composer.ts";
6
+ import { appContract } from "./{{#if (eq template "turborepo")}}packages/database/src{{else}}src/prisma{{/if}}/composer.ts";
7
7
  {{else}}
8
8
  import { envSecret } from "@prisma/composer-prisma-cloud";
9
9
  {{/if}}
@@ -5,9 +5,9 @@ import { defineConfig as ormConfig } from "@prisma/orm-{{#if (eq provider "postg
5
5
 
6
6
  export default definePrismaConfig({
7
7
  orm: ormConfig({
8
- contract: "./src/prisma/contract{{#if (eq authoring "typescript")}}.ts{{else}}.prisma{{/if}}",
8
+ contract: "./{{#if (eq template "turborepo")}}packages/database/src{{else}}src/prisma{{/if}}/contract{{#if (eq authoring "typescript")}}.ts{{else}}.prisma{{/if}}",
9
9
  {{#if (eq authoring "typescript")}}
10
- output: "./src/prisma/generated",
10
+ output: "./{{#if (eq template "turborepo")}}packages/database/src{{else}}src/prisma{{/if}}/generated",
11
11
  {{/if}}
12
12
  db: {
13
13
  connection: process.env.{{#if (eq provider "postgres")}}DATABASE_URL{{else}}MONGODB_URL{{/if}}!,
@@ -23,9 +23,9 @@ export default definePrismaConfig({
23
23
  agents: [{{#each skillAgents}}"{{this}}"{{#unless @last}}, {{/unless}}{{/each}}],
24
24
  },
25
25
  orm: ormConfig({
26
- contract: "./src/prisma/contract{{#if (eq authoring "typescript")}}.ts{{else}}.prisma{{/if}}",
26
+ contract: "./{{#if (eq template "turborepo")}}packages/database/src{{else}}src/prisma{{/if}}/contract{{#if (eq authoring "typescript")}}.ts{{else}}.prisma{{/if}}",
27
27
  {{#if (eq authoring "typescript")}}
28
- output: "./src/prisma/generated",
28
+ output: "./{{#if (eq template "turborepo")}}packages/database/src{{else}}src/prisma{{/if}}/generated",
29
29
  {{/if}}
30
30
  db: {
31
31
  connection: process.env.{{#if (eq provider "postgres")}}DATABASE_URL{{else}}MONGODB_URL{{/if}}!,
@@ -12,7 +12,7 @@ import { compute } from "@prisma/composer-prisma-cloud";
12
12
  {{#if (eq provider "postgres")}}
13
13
  import { postgres } from "@prisma/composer-prisma-cloud/orm";
14
14
 
15
- import { appContract } from "./src/prisma/composer.ts";
15
+ import { appContract } from "./{{#if (eq template "turborepo")}}packages/database/src{{else}}src/prisma{{/if}}/composer.ts";
16
16
  {{/if}}
17
17
 
18
18
  export default compute({
@@ -29,6 +29,8 @@ export default compute({
29
29
  {{/if}}
30
30
  {{#if (eq template "next")}}
31
31
  build: nextjs({ module: import.meta.url, appDir: "." }),
32
+ {{else if (eq template "turborepo")}}
33
+ build: node({ module: import.meta.url, entry: "./apps/server/dist/server.mjs" }),
32
34
  {{else if (eq template "svelte")}}
33
35
  build: node({ module: import.meta.url, dir: "./build", entry: "index.js" }),
34
36
  {{else if (eq template "astro")}}
@@ -14,7 +14,7 @@ export const db = postgres<Contract>({ contractJson, url: databaseUrl });
14
14
  {{else}}
15
15
  import "temporal-polyfill/global";
16
16
 
17
- import service from "../../service.ts";
17
+ import service from "{{#if (eq template "turborepo")}}../../../service.ts{{else}}../../service.ts{{/if}}";
18
18
  import type { Contract } from "./{{#if (eq authoring "typescript")}}generated/{{/if}}contract.d.ts";
19
19
  import contractJson from "./{{#if (eq authoring "typescript")}}generated/{{/if}}contract.json" with { type: "json" };
20
20
 
@@ -35,7 +35,7 @@ export const db =
35
35
  {{else}}
36
36
  import mongo from "@prisma/orm-mongo/runtime";
37
37
 
38
- import service from "../../service.ts";
38
+ import service from "{{#if (eq template "turborepo")}}../../../service.ts{{else}}../../service.ts{{/if}}";
39
39
  import type { Contract } from "./{{#if (eq authoring "typescript")}}generated/{{/if}}contract.d.ts";
40
40
  import contractJson from "./{{#if (eq authoring "typescript")}}generated/{{/if}}contract.json" with { type: "json" };
41
41
 
@@ -0,0 +1,3 @@
1
+ {{#if (eq packageManager "yarn")}}
2
+ nodeLinker: node-modules
3
+ {{/if}}
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "@repo/server",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "tsx watch src/index.ts",
8
+ "build": "tsdown",
9
+ "start": "node dist/server.mjs",
10
+ "typecheck": "tsc --noEmit"
11
+ },
12
+ "engines": {
13
+ "node": "^22.18.0 || >=24.11.0"
14
+ }
15
+ }
@@ -0,0 +1,31 @@
1
+ import { createServer } from "node:http";
2
+
3
+ import { listUsers } from "@repo/database";
4
+
5
+ const port = Number(process.env.PORT ?? 3000);
6
+
7
+ createServer(async (request, response) => {
8
+ if (request.url === "/") {
9
+ response.writeHead(200, { "content-type": "text/plain" });
10
+ response.end("Hello World!");
11
+ return;
12
+ }
13
+
14
+ if (request.url !== "/users") {
15
+ response.writeHead(404, { "content-type": "text/plain" });
16
+ response.end("Not found");
17
+ return;
18
+ }
19
+
20
+ try {
21
+ const users = await listUsers();
22
+ response.writeHead(200, { "content-type": "application/json" });
23
+ response.end(JSON.stringify({ users }));
24
+ } catch (error) {
25
+ console.error("Failed to query users:", error);
26
+ response.writeHead(500, { "content-type": "application/json" });
27
+ response.end(JSON.stringify({ error: "Could not query users yet." }));
28
+ }
29
+ }).listen(port, "0.0.0.0", () => {
30
+ console.log(`Server running at http://localhost:${port}`);
31
+ });
@@ -0,0 +1,4 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "include": ["src/**/*.ts", "tsdown.config.ts"]
4
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "{{projectName}}",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ {{#if (packageManagerManifestValue packageManager)}}
6
+ "packageManager": "{{packageManagerManifestValue packageManager}}",
7
+ {{/if}}
8
+ "type": "module",
9
+ "workspaces": [
10
+ "apps/*",
11
+ "packages/*"
12
+ ],
13
+ "scripts": {
14
+ "build": "turbo run build",
15
+ "dev": "turbo run dev",
16
+ "start": "turbo run start",
17
+ "typecheck": "tsc --noEmit && turbo run typecheck"
18
+ },
19
+ "devDependencies": {}
20
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "@repo/database",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "exports": {
7
+ ".": "./src/users.ts",
8
+ "./db": "./src/db.ts"
9
+ },
10
+ "scripts": {
11
+ "typecheck": "tsc --noEmit --project tsconfig.json"
12
+ }
13
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "include": ["src/**/*.ts"]
4
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "lib": ["ES2022"],
5
+ "module": "ESNext",
6
+ "moduleResolution": "Bundler",
7
+ "allowImportingTsExtensions": true,
8
+ "noEmit": true,
9
+ "resolveJsonModule": true,
10
+ "skipLibCheck": true,
11
+ "strict": true,
12
+ "types": ["node"]
13
+ },
14
+ "include": [
15
+ "module.ts",
16
+ "service.ts",
17
+ "prisma.config.ts",
18
+ "prisma-composer.config.ts",
19
+ "packages/**/*.ts"
20
+ ],
21
+ "exclude": ["node_modules"]
22
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "$schema": "https://turbo.build/schema.json",
3
+ "globalDependencies": ["service.ts", "packages/database/src/**"],
4
+ "globalPassThroughEnv": ["PORT", "DATABASE_URL", "MONGODB_URL"],
5
+ "tasks": {
6
+ "build": {
7
+ "dependsOn": ["^build"],
8
+ "outputs": ["dist/**"]
9
+ },
10
+ "dev": {
11
+ "cache": false,
12
+ "persistent": true
13
+ },
14
+ "start": {
15
+ "cache": false,
16
+ "dependsOn": ["build"],
17
+ "persistent": true
18
+ },
19
+ "typecheck": {
20
+ "dependsOn": ["^typecheck"]
21
+ }
22
+ }
23
+ }