@opensaas/stack-cli 0.21.0 → 0.22.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 +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +21 -13
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/migrate.d.ts +25 -0
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +54 -3
- package/dist/commands/migrate.js.map +1 -1
- package/dist/generator/context.d.ts +5 -2
- package/dist/generator/context.d.ts.map +1 -1
- package/dist/generator/context.js +12 -4
- package/dist/generator/context.js.map +1 -1
- package/dist/generator/index.d.ts +2 -0
- package/dist/generator/index.d.ts.map +1 -1
- package/dist/generator/index.js +1 -0
- package/dist/generator/index.js.map +1 -1
- package/dist/generator/output-paths.d.ts +104 -0
- package/dist/generator/output-paths.d.ts.map +1 -0
- package/dist/generator/output-paths.js +94 -0
- package/dist/generator/output-paths.js.map +1 -0
- package/dist/generator/prisma-config.d.ts +5 -2
- package/dist/generator/prisma-config.d.ts.map +1 -1
- package/dist/generator/prisma-config.js +12 -4
- package/dist/generator/prisma-config.js.map +1 -1
- package/dist/generator/prisma-extensions.d.ts +5 -2
- package/dist/generator/prisma-extensions.d.ts.map +1 -1
- package/dist/generator/prisma-extensions.js +12 -4
- package/dist/generator/prisma-extensions.js.map +1 -1
- package/dist/generator/prisma.d.ts +31 -3
- package/dist/generator/prisma.d.ts.map +1 -1
- package/dist/generator/prisma.js +132 -19
- package/dist/generator/prisma.js.map +1 -1
- package/dist/generator/types.d.ts.map +1 -1
- package/dist/generator/types.js +29 -6
- package/dist/generator/types.js.map +1 -1
- package/dist/mcp/lib/wizards/migration-wizard.d.ts.map +1 -1
- package/dist/mcp/lib/wizards/migration-wizard.js +2 -1
- package/dist/mcp/lib/wizards/migration-wizard.js.map +1 -1
- package/dist/migration/generators/migration-generator.d.ts.map +1 -1
- package/dist/migration/generators/migration-generator.js +4 -0
- package/dist/migration/generators/migration-generator.js.map +1 -1
- package/dist/migration/introspectors/keystone-introspector.d.ts.map +1 -1
- package/dist/migration/introspectors/keystone-introspector.js +6 -1
- package/dist/migration/introspectors/keystone-introspector.js.map +1 -1
- package/dist/migration/introspectors/prisma-introspector.d.ts.map +1 -1
- package/dist/migration/introspectors/prisma-introspector.js +4 -1
- package/dist/migration/introspectors/prisma-introspector.js.map +1 -1
- 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(
|
|
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;
|
|
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,
|
|
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(
|
|
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":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAsB;
|
|
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;
|
|
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"}
|
package/dist/generator/prisma.js
CHANGED
|
@@ -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 = "
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
//
|
|
146
|
-
|
|
147
|
-
|
|
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":"
|
|
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,
|
|
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"}
|
package/dist/generator/types.js
CHANGED
|
@@ -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,
|
|
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
|
|
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
|
-
|
|
130
|
-
|
|
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 = [
|
|
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.
|
|
909
|
+
lines.push(generateModelOutputType(listName, listConfig, config.db, !!listConfig.isSingleton));
|
|
887
910
|
lines.push('');
|
|
888
911
|
lines.push(generateModelTypeAlias(listName));
|
|
889
912
|
lines.push('');
|