@opensaas/stack-cli 0.21.0 → 0.23.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.
Files changed (48) hide show
  1. package/README.md +1 -1
  2. package/dist/commands/generate.d.ts.map +1 -1
  3. package/dist/commands/generate.js +21 -13
  4. package/dist/commands/generate.js.map +1 -1
  5. package/dist/commands/migrate.d.ts +25 -0
  6. package/dist/commands/migrate.d.ts.map +1 -1
  7. package/dist/commands/migrate.js +54 -3
  8. package/dist/commands/migrate.js.map +1 -1
  9. package/dist/generator/context.d.ts +5 -2
  10. package/dist/generator/context.d.ts.map +1 -1
  11. package/dist/generator/context.js +12 -4
  12. package/dist/generator/context.js.map +1 -1
  13. package/dist/generator/index.d.ts +2 -0
  14. package/dist/generator/index.d.ts.map +1 -1
  15. package/dist/generator/index.js +1 -0
  16. package/dist/generator/index.js.map +1 -1
  17. package/dist/generator/output-paths.d.ts +104 -0
  18. package/dist/generator/output-paths.d.ts.map +1 -0
  19. package/dist/generator/output-paths.js +94 -0
  20. package/dist/generator/output-paths.js.map +1 -0
  21. package/dist/generator/prisma-config.d.ts +5 -2
  22. package/dist/generator/prisma-config.d.ts.map +1 -1
  23. package/dist/generator/prisma-config.js +12 -4
  24. package/dist/generator/prisma-config.js.map +1 -1
  25. package/dist/generator/prisma-extensions.d.ts +5 -2
  26. package/dist/generator/prisma-extensions.d.ts.map +1 -1
  27. package/dist/generator/prisma-extensions.js +12 -4
  28. package/dist/generator/prisma-extensions.js.map +1 -1
  29. package/dist/generator/prisma.d.ts +31 -3
  30. package/dist/generator/prisma.d.ts.map +1 -1
  31. package/dist/generator/prisma.js +132 -19
  32. package/dist/generator/prisma.js.map +1 -1
  33. package/dist/generator/types.d.ts.map +1 -1
  34. package/dist/generator/types.js +29 -6
  35. package/dist/generator/types.js.map +1 -1
  36. package/dist/mcp/lib/wizards/migration-wizard.d.ts.map +1 -1
  37. package/dist/mcp/lib/wizards/migration-wizard.js +2 -1
  38. package/dist/mcp/lib/wizards/migration-wizard.js.map +1 -1
  39. package/dist/migration/generators/migration-generator.d.ts.map +1 -1
  40. package/dist/migration/generators/migration-generator.js +4 -0
  41. package/dist/migration/generators/migration-generator.js.map +1 -1
  42. package/dist/migration/introspectors/keystone-introspector.d.ts.map +1 -1
  43. package/dist/migration/introspectors/keystone-introspector.js +6 -1
  44. package/dist/migration/introspectors/keystone-introspector.js.map +1 -1
  45. package/dist/migration/introspectors/prisma-introspector.d.ts.map +1 -1
  46. package/dist/migration/introspectors/prisma-introspector.js +4 -1
  47. package/dist/migration/introspectors/prisma-introspector.js.map +1 -1
  48. package/package.json +2 -2
@@ -23,8 +23,13 @@ import * as path from 'path';
23
23
  * the `??` fallback. The local helper returns `undefined` for missing variables
24
24
  * so the fallback can take effect.
25
25
  */
26
- export function generatePrismaConfig(_config) {
26
+ export function generatePrismaConfig(_config, schemaPath) {
27
27
  const lines = [];
28
+ // The schema path Prisma's CLI resolves (a directory or a `.prisma` file).
29
+ // Defaults to the historical `prisma` directory so existing projects are
30
+ // unaffected; the output-path resolver supplies the configured location when
31
+ // the schema is relocated via the `output` config block.
32
+ const schema = schemaPath ?? 'prisma';
28
33
  // Import dotenv for environment variable loading
29
34
  lines.push("import 'dotenv/config'");
30
35
  lines.push("import { defineConfig } from 'prisma/config'");
@@ -36,7 +41,7 @@ export function generatePrismaConfig(_config) {
36
41
  lines.push('const env = (name: string): string | undefined => process.env[name]');
37
42
  lines.push('');
38
43
  lines.push('export default defineConfig({');
39
- lines.push(" schema: 'prisma',");
44
+ lines.push(` schema: '${schema}',`);
40
45
  lines.push(' datasource: {');
41
46
  lines.push(" url: env('DIRECT_DATABASE_URL') ?? env('DATABASE_URL'),");
42
47
  lines.push(' },');
@@ -46,9 +51,12 @@ export function generatePrismaConfig(_config) {
46
51
  }
47
52
  /**
48
53
  * Write Prisma config to file
54
+ *
55
+ * @param schemaPath - Optional override for the `schema` field, forwarded to
56
+ * {@link generatePrismaConfig}.
49
57
  */
50
- export function writePrismaConfig(config, outputPath) {
51
- const prismaConfig = generatePrismaConfig(config);
58
+ export function writePrismaConfig(config, outputPath, schemaPath) {
59
+ const prismaConfig = generatePrismaConfig(config, schemaPath);
52
60
  // Ensure directory exists
53
61
  const dir = path.dirname(outputPath);
54
62
  if (!fs.existsSync(dir)) {
@@ -1 +1 @@
1
- {"version":3,"file":"prisma-config.js","sourceRoot":"","sources":["../../src/generator/prisma-config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAuB;IAC1D,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,iDAAiD;IACjD,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;IACpC,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAA;IAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAA;IACpF,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAA;IAC5E,KAAK,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAA;IACnF,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IAC3B,KAAK,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAA;IACjF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;IAC3C,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;IACjC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAC7B,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAA;IACzE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAClB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAsB,EAAE,UAAkB;IAC1E,MAAM,YAAY,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAA;IAEjD,0BAA0B;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACpC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACxC,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC,CAAA;AACrD,CAAC"}
1
+ {"version":3,"file":"prisma-config.js","sourceRoot":"","sources":["../../src/generator/prisma-config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAuB,EAAE,UAAmB;IAC/E,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,2EAA2E;IAC3E,yEAAyE;IACzE,6EAA6E;IAC7E,yDAAyD;IACzD,MAAM,MAAM,GAAG,UAAU,IAAI,QAAQ,CAAA;IAErC,iDAAiD;IACjD,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;IACpC,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAA;IAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAA;IACpF,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAA;IAC5E,KAAK,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAA;IACnF,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IAC3B,KAAK,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAA;IACjF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;IAC3C,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,IAAI,CAAC,CAAA;IACpC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAC7B,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAA;IACzE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAClB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAsB,EACtB,UAAkB,EAClB,UAAmB;IAEnB,MAAM,YAAY,GAAG,oBAAoB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAE7D,0BAA0B;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACpC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACxC,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC,CAAA;AACrD,CAAC"}
@@ -3,9 +3,12 @@ import type { OpenSaasConfig } from '@opensaas/stack-core';
3
3
  * Generate Prisma result extensions configuration
4
4
  * This creates a Prisma client extension that calls field resolveOutput hooks
5
5
  */
6
- export declare function generatePrismaExtensions(config: OpenSaasConfig): string;
6
+ export declare function generatePrismaExtensions(config: OpenSaasConfig, configImport?: string): string;
7
7
  /**
8
8
  * Write Prisma extensions configuration to file
9
+ *
10
+ * @param configImport - Optional override for the `opensaas.config` import
11
+ * specifier, forwarded to {@link generatePrismaExtensions}.
9
12
  */
10
- export declare function writePrismaExtensions(config: OpenSaasConfig, outputPath: string): void;
13
+ export declare function writePrismaExtensions(config: OpenSaasConfig, outputPath: string, configImport?: string): void;
11
14
  //# sourceMappingURL=prisma-extensions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prisma-extensions.d.ts","sourceRoot":"","sources":["../../src/generator/prisma-extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,sBAAsB,CAAA;AAIvE;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAuIvE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAUtF"}
1
+ {"version":3,"file":"prisma-extensions.d.ts","sourceRoot":"","sources":["../../src/generator/prisma-extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,sBAAsB,CAAA;AAIvE;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,cAAc,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CA6I9F;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,GACpB,IAAI,CAUN"}
@@ -4,8 +4,13 @@ import * as path from 'path';
4
4
  * Generate Prisma result extensions configuration
5
5
  * This creates a Prisma client extension that calls field resolveOutput hooks
6
6
  */
7
- export function generatePrismaExtensions(config) {
7
+ export function generatePrismaExtensions(config, configImport) {
8
8
  const lines = [];
9
+ // Module specifier for importing the project's opensaas.config from inside
10
+ // the `.opensaas` bundle. Defaults to the legacy `../opensaas.config`; the
11
+ // output-path resolver supplies a recomputed value when the bundle is
12
+ // relocated via the `output` config block.
13
+ const configImportPath = configImport ?? '../opensaas.config';
9
14
  // Add header comment
10
15
  lines.push('/**');
11
16
  lines.push(' * Generated Prisma result extensions from OpenSaas configuration');
@@ -14,7 +19,7 @@ export function generatePrismaExtensions(config) {
14
19
  lines.push('');
15
20
  // Add imports
16
21
  lines.push("import { Prisma } from './prisma-client/client'");
17
- lines.push("import configOrPromise from '../opensaas.config'");
22
+ lines.push(`import configOrPromise from '${configImportPath}'`);
18
23
  lines.push('');
19
24
  // Resolve config synchronously if possible (will be resolved by context.ts anyway)
20
25
  lines.push('// Resolve config - may be a promise if plugins are present');
@@ -121,9 +126,12 @@ export function generatePrismaExtensions(config) {
121
126
  }
122
127
  /**
123
128
  * Write Prisma extensions configuration to file
129
+ *
130
+ * @param configImport - Optional override for the `opensaas.config` import
131
+ * specifier, forwarded to {@link generatePrismaExtensions}.
124
132
  */
125
- export function writePrismaExtensions(config, outputPath) {
126
- const extensions = generatePrismaExtensions(config);
133
+ export function writePrismaExtensions(config, outputPath, configImport) {
134
+ const extensions = generatePrismaExtensions(config, configImport);
127
135
  // Ensure directory exists
128
136
  const dir = path.dirname(outputPath);
129
137
  if (!fs.existsSync(dir)) {
@@ -1 +1 @@
1
- {"version":3,"file":"prisma-extensions.js","sourceRoot":"","sources":["../../src/generator/prisma-extensions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prisma-extensions.js","sourceRoot":"","sources":["../../src/generator/prisma-extensions.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,38 @@
1
- import type { OpenSaasConfig } from '@opensaas/stack-core';
1
+ import type { OpenSaasConfig, ListConfig, DatabaseConfig } from '@opensaas/stack-core';
2
+ import type { TypeInfo } from '@opensaas/stack-core/extend';
3
+ /**
4
+ * Decide which auto-timestamp columns the generator should inject into a list's model.
5
+ *
6
+ * Auto-timestamps are OFF by default (matching Keystone 6, which never adds them
7
+ * automatically — see ADR-0004). They are enabled globally via `db: { timestamps: true }`
8
+ * and can be overridden per-list via the list's `db.timestamps` option (which takes
9
+ * precedence over the global setting).
10
+ *
11
+ * When timestamps resolve to enabled, the auto column is skipped for any timestamp field
12
+ * the list already declares itself (`createdAt`/`updatedAt`), so Prisma never sees a
13
+ * duplicate field (`P1012`).
14
+ *
15
+ * @returns flags indicating whether to emit each auto column.
16
+ */
17
+ export declare function resolveListTimestamps(listConfig: ListConfig<TypeInfo>, dbConfig: DatabaseConfig): {
18
+ createdAt: boolean;
19
+ updatedAt: boolean;
20
+ };
2
21
  /**
3
22
  * Generate Prisma schema from OpenSaas config
23
+ *
24
+ * @param prismaClientOutput - Module specifier for the patched Prisma client's
25
+ * `generator { output }`, relative to the schema file's directory. Defaults to
26
+ * the legacy `../<opensaasPath>/prisma-client` so existing projects are
27
+ * unaffected; the output-path resolver supplies a recomputed value when the
28
+ * schema or `.opensaas` dir is relocated via the `output` config block.
4
29
  */
5
- export declare function generatePrismaSchema(config: OpenSaasConfig): string;
30
+ export declare function generatePrismaSchema(config: OpenSaasConfig, prismaClientOutput?: string): string;
6
31
  /**
7
32
  * Write Prisma schema to file
33
+ *
34
+ * @param prismaClientOutput - Optional override for the patched Prisma client
35
+ * output path, forwarded to {@link generatePrismaSchema}.
8
36
  */
9
- export declare function writePrismaSchema(config: OpenSaasConfig, outputPath: string): void;
37
+ export declare function writePrismaSchema(config: OpenSaasConfig, outputPath: string, prismaClientOutput?: string): void;
10
38
  //# sourceMappingURL=prisma.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prisma.d.ts","sourceRoot":"","sources":["../../src/generator/prisma.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,sBAAsB,CAAA;AA2CvE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAiKnE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAUlF"}
1
+ {"version":3,"file":"prisma.d.ts","sourceRoot":"","sources":["../../src/generator/prisma.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAe,MAAM,sBAAsB,CAAA;AACnG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAK3D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CAGnC,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,EAChC,QAAQ,EAAE,cAAc,GACvB;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAkB5C;AA0CD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,MAAM,CAqQhG;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,MAAM,EAClB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,IAAI,CAUN"}
@@ -1,12 +1,45 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
+ /**
4
+ * Decide which auto-timestamp columns the generator should inject into a list's model.
5
+ *
6
+ * Auto-timestamps are OFF by default (matching Keystone 6, which never adds them
7
+ * automatically — see ADR-0004). They are enabled globally via `db: { timestamps: true }`
8
+ * and can be overridden per-list via the list's `db.timestamps` option (which takes
9
+ * precedence over the global setting).
10
+ *
11
+ * When timestamps resolve to enabled, the auto column is skipped for any timestamp field
12
+ * the list already declares itself (`createdAt`/`updatedAt`), so Prisma never sees a
13
+ * duplicate field (`P1012`).
14
+ *
15
+ * @returns flags indicating whether to emit each auto column.
16
+ */
17
+ export function resolveListTimestamps(
18
+ // ListConfig is generic over per-list TypeInfo; the generator only reads `db`/`fields`,
19
+ // which are invariant across that generic, so the default `TypeInfo` is sufficient.
20
+ listConfig, dbConfig) {
21
+ // Per-list override wins over the global setting; otherwise fall back to the global
22
+ // default (off when unset).
23
+ const enabled = listConfig.db?.timestamps ?? dbConfig.timestamps ?? false;
24
+ if (!enabled) {
25
+ return { createdAt: false, updatedAt: false };
26
+ }
27
+ // Skip the auto column for any timestamp the list already declares to avoid a
28
+ // duplicate-field error (Prisma P1012).
29
+ const declaresCreatedAt = Object.prototype.hasOwnProperty.call(listConfig.fields, 'createdAt');
30
+ const declaresUpdatedAt = Object.prototype.hasOwnProperty.call(listConfig.fields, 'updatedAt');
31
+ return {
32
+ createdAt: !declaresCreatedAt,
33
+ updatedAt: !declaresUpdatedAt,
34
+ };
35
+ }
3
36
  /**
4
37
  * Map OpenSaas field types to Prisma field types
5
38
  */
6
- function mapFieldTypeToPrisma(fieldName, field, provider, listName) {
39
+ function mapFieldTypeToPrisma(fieldName, field, provider, listName, keystoneCompat) {
7
40
  // Use field's own Prisma type generator if available
8
41
  if (field.getPrismaType) {
9
- const result = field.getPrismaType(fieldName, provider, listName);
42
+ const result = field.getPrismaType(fieldName, provider, listName, keystoneCompat);
10
43
  return result.type;
11
44
  }
12
45
  // Fallback for fields without generator methods
@@ -15,10 +48,10 @@ function mapFieldTypeToPrisma(fieldName, field, provider, listName) {
15
48
  /**
16
49
  * Get field modifiers (?, @default, @unique, etc.)
17
50
  */
18
- function getFieldModifiers(fieldName, field, provider, listName) {
51
+ function getFieldModifiers(fieldName, field, provider, listName, keystoneCompat) {
19
52
  // Use field's own Prisma type generator if available
20
53
  if (field.getPrismaType) {
21
- const result = field.getPrismaType(fieldName, provider, listName);
54
+ const result = field.getPrismaType(fieldName, provider, listName, keystoneCompat);
22
55
  return result.modifiers || '';
23
56
  }
24
57
  // Fallback for fields without generator methods
@@ -26,40 +59,72 @@ function getFieldModifiers(fieldName, field, provider, listName) {
26
59
  }
27
60
  /**
28
61
  * Generate Prisma schema from OpenSaas config
62
+ *
63
+ * @param prismaClientOutput - Module specifier for the patched Prisma client's
64
+ * `generator { output }`, relative to the schema file's directory. Defaults to
65
+ * the legacy `../<opensaasPath>/prisma-client` so existing projects are
66
+ * unaffected; the output-path resolver supplies a recomputed value when the
67
+ * schema or `.opensaas` dir is relocated via the `output` config block.
29
68
  */
30
- export function generatePrismaSchema(config) {
69
+ export function generatePrismaSchema(config, prismaClientOutput) {
31
70
  const lines = [];
32
71
  const opensaasPath = config.opensaasPath || '.opensaas';
72
+ const clientOutput = prismaClientOutput ?? `../${opensaasPath}/prisma-client`;
73
+ // Keystone-compat mode: when on, non-null text without an explicit default
74
+ // gets Keystone's implicit empty-string default. Threaded to fields via
75
+ // getPrismaType, the same way provider/listName already reach them.
76
+ const keystoneCompat = config.db.keystoneCompat ?? false;
77
+ // Postgres multi-schema: when the datasource declares more than one schema,
78
+ // Prisma requires the `multiSchema` preview feature and a `schemas = [...]`
79
+ // array on the datasource. Each model then carries a `@@schema(...)`.
80
+ const schemas = config.db.schemas;
81
+ const multiSchema = Array.isArray(schemas) && schemas.length > 0;
33
82
  // Generator and datasource
34
83
  lines.push('generator client {');
35
84
  lines.push(' provider = "prisma-client"');
36
- lines.push(` output = "../${opensaasPath}/prisma-client"`);
85
+ lines.push(` output = "${clientOutput}"`);
86
+ if (multiSchema) {
87
+ lines.push(' previewFeatures = ["multiSchema"]');
88
+ }
37
89
  lines.push('}');
38
90
  lines.push('');
39
91
  lines.push('datasource db {');
40
92
  lines.push(` provider = "${config.db.provider}"`);
93
+ if (multiSchema) {
94
+ lines.push(` schemas = [${schemas.map((s) => `"${s}"`).join(', ')}]`);
95
+ }
41
96
  lines.push('}');
42
97
  lines.push('');
43
- // Collect enum definitions from all fields (first pass)
44
98
  const enumDefinitions = new Map();
45
99
  for (const [listName, listConfig] of Object.entries(config.lists)) {
46
100
  for (const [fieldName, fieldConfig] of Object.entries(listConfig.fields)) {
47
101
  if (fieldConfig.type === 'relationship' || fieldConfig.virtual)
48
102
  continue;
49
103
  if (fieldConfig.getPrismaType) {
50
- const result = fieldConfig.getPrismaType(fieldName, config.db.provider, listName);
104
+ const result = fieldConfig.getPrismaType(fieldName, config.db.provider, listName, keystoneCompat);
51
105
  if (result.enumValues && result.enumValues.length > 0) {
52
- enumDefinitions.set(result.type, result.enumValues);
106
+ // The enum lives in the owning model's schema (so an enum used by an
107
+ // `auth`-schema model lands in `auth`, not `public`). Default to
108
+ // `public` when the list declares no schema.
109
+ enumDefinitions.set(result.type, {
110
+ values: result.enumValues,
111
+ schema: listConfig.db?.schema ?? 'public',
112
+ });
53
113
  }
54
114
  }
55
115
  }
56
116
  }
57
117
  // Generate enum blocks
58
- for (const [enumName, values] of enumDefinitions) {
118
+ for (const [enumName, { values, schema: enumSchema }] of enumDefinitions) {
59
119
  lines.push(`enum ${enumName} {`);
60
120
  for (const value of values) {
61
121
  lines.push(` ${value}`);
62
122
  }
123
+ // In multi-schema mode every enum must declare an `@@schema(...)` or Prisma
124
+ // rejects the schema (P1012). Greenfield (single schema) output is unchanged.
125
+ if (multiSchema) {
126
+ lines.push(` @@schema("${enumSchema}")`);
127
+ }
63
128
  lines.push('}');
64
129
  lines.push('');
65
130
  }
@@ -96,9 +161,11 @@ export function generatePrismaSchema(config) {
96
161
  // Generate models for each list
97
162
  for (const [listName, listConfig] of Object.entries(config.lists)) {
98
163
  lines.push(`model ${listName} {`);
99
- // Add id field - singleton lists use Int @id (always 1) to match Keystone 6 behaviour
164
+ // Add id field - singleton lists emit a bare `id Int @id` (no `@default(1)`) to
165
+ // match Keystone 6, which emits no column default for singleton ids (see ADR-0004).
166
+ // Non-singleton lists are unchanged: `id String @id @default(cuid())`.
100
167
  if (listConfig.isSingleton) {
101
- lines.push(' id Int @id @default(1)');
168
+ lines.push(' id Int @id');
102
169
  }
103
170
  else {
104
171
  lines.push(' id String @id @default(cuid())');
@@ -115,10 +182,33 @@ export function generatePrismaSchema(config) {
115
182
  relationshipFieldNames.push(fieldName);
116
183
  continue;
117
184
  }
118
- const prismaType = mapFieldTypeToPrisma(fieldName, fieldConfig, config.db.provider, listName);
185
+ // Multi-column fields (e.g. storage image()/file() in Keystone-parity
186
+ // mode) emit several physical columns instead of one. The generator stays
187
+ // neutral: it places whatever lines the field returns, the same way it
188
+ // delegates to relationship fields via getPrismaRelation. See ADR-0006.
189
+ if (fieldConfig.getPrismaColumns) {
190
+ const columns = fieldConfig.getPrismaColumns(fieldName);
191
+ if (columns && columns.length > 0) {
192
+ for (const column of columns) {
193
+ const colMods = (column.modifiers ?? '').trimStart();
194
+ const colNull = colMods.startsWith('?') ? '?' : '';
195
+ let colAttrs = colMods.startsWith('?') ? colMods.slice(1).trimStart() : colMods;
196
+ // Append @map to bind the column to its physical name (the live
197
+ // Keystone column). Emitted whenever a `map` is supplied so the
198
+ // mapping is explicit and configurable.
199
+ if (column.map) {
200
+ colAttrs = `${colAttrs ? colAttrs + ' ' : ''}@map("${column.map}")`;
201
+ }
202
+ const paddedColName = column.name.padEnd(12);
203
+ lines.push(` ${paddedColName} ${column.type}${colNull}${colAttrs ? ' ' + colAttrs : ''}`);
204
+ }
205
+ continue;
206
+ }
207
+ }
208
+ const prismaType = mapFieldTypeToPrisma(fieldName, fieldConfig, config.db.provider, listName, keystoneCompat);
119
209
  if (!prismaType)
120
210
  continue; // Skip if no type returned
121
- const modifiers = getFieldModifiers(fieldName, fieldConfig, config.db.provider, listName);
211
+ const modifiers = getFieldModifiers(fieldName, fieldConfig, config.db.provider, listName, keystoneCompat);
122
212
  // Format with proper spacing: '?' attaches to type directly, other modifiers get a space
123
213
  const paddedName = fieldName.padEnd(12);
124
214
  const modStr = modifiers.trimStart();
@@ -142,9 +232,16 @@ export function generatePrismaSchema(config) {
142
232
  lines.push(line);
143
233
  }
144
234
  }
145
- // Always add timestamps
146
- lines.push(' createdAt DateTime @default(now())');
147
- lines.push(' updatedAt DateTime @default(now()) @updatedAt');
235
+ // Add auto-timestamps when enabled (off by default — see ADR-0004). The auto
236
+ // column is skipped for any timestamp the list declares itself (handled inside
237
+ // resolveListTimestamps) so Prisma never sees a duplicate field (P1012).
238
+ const timestamps = resolveListTimestamps(listConfig, config.db);
239
+ if (timestamps.createdAt) {
240
+ lines.push(' createdAt DateTime @default(now())');
241
+ }
242
+ if (timestamps.updatedAt) {
243
+ lines.push(' updatedAt DateTime @default(now()) @updatedAt');
244
+ }
148
245
  // Add indexes for foreign key fields
149
246
  for (const index of foreignKeyIndexes) {
150
247
  if (index.indexType === 'unique') {
@@ -154,6 +251,19 @@ export function generatePrismaSchema(config) {
154
251
  lines.push(` @@index([${index.foreignKeyField}])`);
155
252
  }
156
253
  }
254
+ // Map the model to a custom table name when configured (e.g. adopting
255
+ // existing tables whose physical name differs from the list key).
256
+ if (listConfig.db?.map) {
257
+ lines.push(` @@map("${listConfig.db.map}")`);
258
+ }
259
+ // Place the model in a specific database schema (Postgres multi-schema).
260
+ // In multi-schema mode every model must declare an `@@schema(...)` or Prisma
261
+ // rejects the schema (P1012). A list inherits its own `db.schema` when set,
262
+ // otherwise it defaults to `public` (mirroring the enum default added in
263
+ // #504). Greenfield (single schema) output is unchanged — no `@@schema`.
264
+ if (multiSchema) {
265
+ lines.push(` @@schema("${listConfig.db?.schema ?? 'public'}")`);
266
+ }
157
267
  lines.push('}');
158
268
  lines.push('');
159
269
  }
@@ -169,9 +279,12 @@ export function generatePrismaSchema(config) {
169
279
  }
170
280
  /**
171
281
  * Write Prisma schema to file
282
+ *
283
+ * @param prismaClientOutput - Optional override for the patched Prisma client
284
+ * output path, forwarded to {@link generatePrismaSchema}.
172
285
  */
173
- export function writePrismaSchema(config, outputPath) {
174
- const schema = generatePrismaSchema(config);
286
+ export function writePrismaSchema(config, outputPath, prismaClientOutput) {
287
+ const schema = generatePrismaSchema(config, prismaClientOutput);
175
288
  // Ensure directory exists
176
289
  const dir = path.dirname(outputPath);
177
290
  if (!fs.existsSync(dir)) {
@@ -1 +1 @@
1
- {"version":3,"file":"prisma.js","sourceRoot":"","sources":["../../src/generator/prisma.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prisma.js","sourceRoot":"","sources":["../../src/generator/prisma.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/generator/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,sBAAsB,CAAA;AA08BvE;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA0G5D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAU3E"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/generator/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAA2C,MAAM,sBAAsB,CAAA;AAo+BnG;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA0G5D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAU3E"}
@@ -1,5 +1,6 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
+ import { resolveListTimestamps } from './prisma.js';
3
4
  /**
4
5
  * Map OpenSaas field types to TypeScript types
5
6
  */
@@ -97,10 +98,16 @@ function generateTransformedFieldsType(listName, fields) {
97
98
  * Generate TypeScript Output type for a model (includes virtual fields)
98
99
  * This is kept for backwards compatibility but CustomDB uses Prisma's GetPayload + VirtualFields
99
100
  */
100
- function generateModelOutputType(listName, fields, isSingleton) {
101
+ function generateModelOutputType(listName,
102
+ // ListConfig is generic over per-list TypeInfo; we only read `db`/`fields`, which are
103
+ // invariant across that generic, so the permissive default arg is intentional.
104
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
105
+ listConfig, dbConfig, isSingleton) {
106
+ const fields = listConfig.fields;
101
107
  const lines = [];
102
108
  lines.push(`export type ${listName}Output = {`);
103
- // Singleton lists use Int @id (always 1) matching Keystone 6 behaviour
109
+ // Singleton lists use an Int id (bare `id Int @id`, see ADR-0004) matching
110
+ // Keystone 6, so the TypeScript id type is `number` rather than `string`.
104
111
  lines.push(isSingleton ? ' id: number' : ' id: string');
105
112
  for (const [fieldName, fieldConfig] of Object.entries(fields)) {
106
113
  // Skip virtual fields - they're in VirtualFields type
@@ -126,8 +133,15 @@ function generateModelOutputType(listName, fields, isSingleton) {
126
133
  lines.push(` ${fieldName}: ${tsType}${nullability}`);
127
134
  }
128
135
  }
129
- lines.push(' createdAt: Date');
130
- lines.push(' updatedAt: Date');
136
+ // Auto-timestamp columns mirror the Prisma schema: only emitted when timestamps are
137
+ // enabled (off by default — ADR-0004) and not already declared as a field above.
138
+ const timestamps = resolveListTimestamps(listConfig, dbConfig);
139
+ if (timestamps.createdAt) {
140
+ lines.push(' createdAt: Date');
141
+ }
142
+ if (timestamps.updatedAt) {
143
+ lines.push(' updatedAt: Date');
144
+ }
131
145
  lines.push('} & ' + listName + 'VirtualFields'); // Include virtual fields
132
146
  return lines.join('\n');
133
147
  }
@@ -395,6 +409,11 @@ function generateGetPayloadType(listName, fields) {
395
409
  const transformedFieldNames = Object.entries(fields)
396
410
  .filter(([_, config]) => config.resultExtension)
397
411
  .map(([name, _]) => name);
412
+ // Multi-column fields (e.g. storage image()/file() in Keystone-parity mode)
413
+ // back several raw Prisma columns that must be stripped from the public
414
+ // payload: only the assembled logical field (added back via TransformedFields)
415
+ // is exposed. Collect those raw column names for omission. See ADR-0006.
416
+ const multiColumnRawNames = Object.entries(fields).flatMap(([name, config]) => config.getColumnNames ? config.getColumnNames(name) : []);
398
417
  // Get relationship fields to override with custom GetPayload types
399
418
  const relationshipFields = Object.entries(fields)
400
419
  .filter(([_, config]) => config.type === 'relationship')
@@ -435,7 +454,11 @@ function generateGetPayloadType(listName, fields) {
435
454
  // Build the base type (Prisma's GetPayload minus relationship and transformed fields)
436
455
  // When virtual fields exist, strip them from T before passing to Prisma so Prisma never
437
456
  // tries to resolve a virtual field name (which would produce `never` in its payload type).
438
- const fieldsToOmit = [...transformedFieldNames, ...relationshipFields.map((r) => r.name)];
457
+ const fieldsToOmit = [
458
+ ...transformedFieldNames,
459
+ ...relationshipFields.map((r) => r.name),
460
+ ...multiColumnRawNames,
461
+ ];
439
462
  const prismaT = virtualFields.length > 0 ? `StripVirtualFromArgs<T, keyof ${listName}VirtualFields>` : 'T';
440
463
  if (fieldsToOmit.length > 0) {
441
464
  lines.push(` Omit<Prisma.${listName}GetPayload<${prismaT}>, ${fieldsToOmit.map((n) => `'${n}'`).join(' | ')}> &`);
@@ -883,7 +906,7 @@ export function generateTypes(config) {
883
906
  // Generate TransformedFields type (needed by CustomDB)
884
907
  lines.push(generateTransformedFieldsType(listName, listConfig.fields));
885
908
  lines.push('');
886
- lines.push(generateModelOutputType(listName, listConfig.fields, !!listConfig.isSingleton));
909
+ lines.push(generateModelOutputType(listName, listConfig, config.db, !!listConfig.isSingleton));
887
910
  lines.push('');
888
911
  lines.push(generateModelTypeAlias(listName));
889
912
  lines.push('');