prisma-effect-kysely 1.11.0 → 1.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.
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ /**
3
+ * Generator Configuration
4
+ *
5
+ * Defines configuration options for prisma-effect-kysely generator
6
+ * with support for multi-domain organization and library scaffolding.
7
+ * Uses Effect Schema for strict validation.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.parseGeneratorConfig = parseGeneratorConfig;
11
+ exports.isMultiDomainEnabled = isMultiDomainEnabled;
12
+ exports.isScaffoldingEnabled = isScaffoldingEnabled;
13
+ const effect_1 = require("effect");
14
+ /**
15
+ * Boolean string schema - strictly validates 'true' or 'false'
16
+ */
17
+ const BooleanString = effect_1.Schema.Literal('true', 'false');
18
+ /**
19
+ * Generator configuration schema
20
+ */
21
+ const GeneratorConfigSchema = effect_1.Schema.Struct({
22
+ /**
23
+ * Output directory for generated Effect schemas
24
+ */
25
+ output: effect_1.Schema.String,
26
+ /**
27
+ * Enable multi-domain detection from schema file structure
28
+ */
29
+ multiFileDomains: BooleanString,
30
+ /**
31
+ * Automatically scaffold contract libraries for detected domains
32
+ */
33
+ scaffoldLibraries: BooleanString,
34
+ /**
35
+ * Path to monorepo-library-generator for library scaffolding
36
+ */
37
+ libraryGenerator: effect_1.Schema.optional(effect_1.Schema.String),
38
+ /**
39
+ * Preview features to enable
40
+ */
41
+ previewFeatures: effect_1.Schema.Array(effect_1.Schema.String),
42
+ });
43
+ /**
44
+ * Parse and validate generator configuration from Prisma options
45
+ */
46
+ function parseGeneratorConfig(options) {
47
+ const { generator } = options;
48
+ // Validate required output path
49
+ const output = generator.output?.value;
50
+ if (!output) {
51
+ throw new Error('Prisma Effect Generator: output path not configured.\n' +
52
+ 'Add "output" to your generator block in schema.prisma');
53
+ }
54
+ // Extract configuration values
55
+ const config = generator.config || {};
56
+ const rawConfig = {
57
+ output,
58
+ multiFileDomains: getStringValue(config, 'multiFileDomains') ?? 'false',
59
+ scaffoldLibraries: getStringValue(config, 'scaffoldLibraries') ?? 'false',
60
+ libraryGenerator: getStringValue(config, 'libraryGenerator'),
61
+ previewFeatures: getArrayValue(config, 'previewFeatures'),
62
+ };
63
+ // Validate with Effect Schema - throws on invalid input
64
+ return effect_1.Schema.decodeUnknownSync(GeneratorConfigSchema)(rawConfig);
65
+ }
66
+ /**
67
+ * Extract string value from config
68
+ */
69
+ function getStringValue(config, key) {
70
+ const value = config[key];
71
+ if (typeof value === 'string') {
72
+ return value;
73
+ }
74
+ return undefined;
75
+ }
76
+ /**
77
+ * Extract array value from config
78
+ */
79
+ function getArrayValue(config, key) {
80
+ const value = config[key];
81
+ if (!value)
82
+ return [];
83
+ if (Array.isArray(value)) {
84
+ return value;
85
+ }
86
+ if (typeof value === 'string') {
87
+ try {
88
+ const parsed = JSON.parse(value);
89
+ return Array.isArray(parsed) ? parsed : [];
90
+ }
91
+ catch {
92
+ return value.split(',').map((v) => v.trim());
93
+ }
94
+ }
95
+ return [];
96
+ }
97
+ /**
98
+ * Check if multi-domain mode is enabled
99
+ */
100
+ function isMultiDomainEnabled(config) {
101
+ return config.multiFileDomains === 'true';
102
+ }
103
+ /**
104
+ * Check if library scaffolding is enabled
105
+ */
106
+ function isScaffoldingEnabled(config) {
107
+ return config.scaffoldLibraries === 'true' && isMultiDomainEnabled(config);
108
+ }
109
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/generator/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Contract Library Scaffolding
3
+ *
4
+ * Scaffolds contract libraries for detected domains.
5
+ * Uses monorepo-library-generator if available, falls back to manual scaffolding.
6
+ * Uses Effect Schema for strict validation.
7
+ */
8
+ import { Schema } from 'effect';
9
+ import type { DomainInfo } from './domain-detector';
10
+ import type { GeneratorConfig } from './config';
11
+ /**
12
+ * Scaffold result schema
13
+ */
14
+ declare const ScaffoldResultSchema: Schema.Struct<{
15
+ domain: typeof Schema.String;
16
+ outputPath: typeof Schema.String;
17
+ scaffolded: typeof Schema.Boolean;
18
+ method: Schema.Literal<["generator", "manual", "existing"]>;
19
+ error: Schema.optional<typeof Schema.String>;
20
+ }>;
21
+ /**
22
+ * Scaffold result type derived from schema
23
+ */
24
+ export type ScaffoldResult = Schema.Schema.Type<typeof ScaffoldResultSchema>;
25
+ /**
26
+ * Scaffold contract libraries for all domains
27
+ *
28
+ * For each domain:
29
+ * 1. Check if contract library already exists
30
+ * 2. Use monorepo-library-generator if available and configured
31
+ * 3. Fall back to manual scaffolding if generator not available
32
+ */
33
+ export declare function scaffoldContractLibraries(domains: DomainInfo[], config: GeneratorConfig): Promise<{
34
+ readonly domain: string;
35
+ readonly outputPath: string;
36
+ readonly scaffolded: boolean;
37
+ readonly method: "generator" | "manual" | "existing";
38
+ readonly error?: string | undefined;
39
+ }[]>;
40
+ /**
41
+ * Log scaffolding results
42
+ */
43
+ export declare function logScaffoldResults(results: ScaffoldResult[]): void;
44
+ export {};
45
+ //# sourceMappingURL=contract-scaffolder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-scaffolder.d.ts","sourceRoot":"","sources":["../../src/generator/contract-scaffolder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAOhD;;GAEG;AACH,QAAA,MAAM,oBAAoB;;;;;;EAMxB,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAO7E;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,eAAe;;;;;;KAqB7F;AAgKD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,QAkB3D"}
@@ -0,0 +1,244 @@
1
+ "use strict";
2
+ /**
3
+ * Contract Library Scaffolding
4
+ *
5
+ * Scaffolds contract libraries for detected domains.
6
+ * Uses monorepo-library-generator if available, falls back to manual scaffolding.
7
+ * Uses Effect Schema for strict validation.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.scaffoldContractLibraries = scaffoldContractLibraries;
44
+ exports.logScaffoldResults = logScaffoldResults;
45
+ const path = __importStar(require("path"));
46
+ const fs = __importStar(require("fs"));
47
+ const child_process_1 = require("child_process");
48
+ const effect_1 = require("effect");
49
+ /**
50
+ * Scaffold method schema
51
+ */
52
+ const ScaffoldMethod = effect_1.Schema.Literal('generator', 'manual', 'existing');
53
+ /**
54
+ * Scaffold result schema
55
+ */
56
+ const ScaffoldResultSchema = effect_1.Schema.Struct({
57
+ domain: effect_1.Schema.String,
58
+ outputPath: effect_1.Schema.String,
59
+ scaffolded: effect_1.Schema.Boolean,
60
+ method: ScaffoldMethod,
61
+ error: effect_1.Schema.optional(effect_1.Schema.String),
62
+ });
63
+ /**
64
+ * Create a validated scaffold result
65
+ */
66
+ const createResult = effect_1.Schema.decodeUnknownSync(ScaffoldResultSchema);
67
+ /**
68
+ * Scaffold contract libraries for all domains
69
+ *
70
+ * For each domain:
71
+ * 1. Check if contract library already exists
72
+ * 2. Use monorepo-library-generator if available and configured
73
+ * 3. Fall back to manual scaffolding if generator not available
74
+ */
75
+ async function scaffoldContractLibraries(domains, config) {
76
+ const results = [];
77
+ for (const domain of domains) {
78
+ try {
79
+ const result = await scaffoldDomainLibrary(domain, config);
80
+ results.push(result);
81
+ }
82
+ catch (error) {
83
+ results.push(createResult({
84
+ domain: domain.name,
85
+ outputPath: '',
86
+ scaffolded: false,
87
+ method: 'manual',
88
+ error: error instanceof Error ? error.message : String(error),
89
+ }));
90
+ }
91
+ }
92
+ return results;
93
+ }
94
+ /**
95
+ * Scaffold a contract library for a single domain
96
+ */
97
+ async function scaffoldDomainLibrary(domain, config) {
98
+ const outputPath = getContractOutputPath(config.output, domain.name);
99
+ // Check if library already exists
100
+ if (fs.existsSync(outputPath)) {
101
+ console.log(`[Contract Scaffolder] Library already exists: ${domain.name}`);
102
+ return createResult({
103
+ domain: domain.name,
104
+ outputPath,
105
+ scaffolded: false,
106
+ method: 'existing',
107
+ });
108
+ }
109
+ // Try using monorepo-library-generator
110
+ if (config.libraryGenerator) {
111
+ const generatorResult = await tryGeneratorScaffold(domain, config);
112
+ if (generatorResult) {
113
+ return generatorResult;
114
+ }
115
+ }
116
+ // Fall back to manual scaffolding
117
+ return manualScaffold(domain, config);
118
+ }
119
+ /**
120
+ * Try scaffolding using monorepo-library-generator
121
+ */
122
+ async function tryGeneratorScaffold(domain, config) {
123
+ const generatorPath = config.libraryGenerator;
124
+ if (!generatorPath) {
125
+ return null;
126
+ }
127
+ try {
128
+ // Check if generator exists
129
+ if (!fs.existsSync(generatorPath)) {
130
+ console.warn(`[Contract Scaffolder] Generator not found at: ${generatorPath}, using manual scaffolding`);
131
+ return null;
132
+ }
133
+ // Use the contract generator from monorepo-library-generator
134
+ const command = `node ${generatorPath}/dist/cli/index.js generate contract ${domain.name} --description "Contract library for ${domain.name} domain (generated by prisma-effect-kysely)"`;
135
+ console.log(`[Contract Scaffolder] Running: ${command}`);
136
+ (0, child_process_1.execSync)(command, { stdio: 'inherit' });
137
+ const outputPath = getContractOutputPath(config.output, domain.name);
138
+ return createResult({
139
+ domain: domain.name,
140
+ outputPath,
141
+ scaffolded: true,
142
+ method: 'generator',
143
+ });
144
+ }
145
+ catch (error) {
146
+ console.warn(`[Contract Scaffolder] Generator failed for ${domain.name}:`, error instanceof Error ? error.message : String(error));
147
+ return null;
148
+ }
149
+ }
150
+ /**
151
+ * Manual scaffolding fallback
152
+ *
153
+ * Creates minimal contract library structure:
154
+ * - package.json
155
+ * - tsconfig.json
156
+ * - src/index.ts
157
+ * - src/generated/ (for Prisma-generated schemas)
158
+ */
159
+ async function manualScaffold(domain, config) {
160
+ const outputPath = getContractOutputPath(config.output, domain.name);
161
+ console.log(`[Contract Scaffolder] Manually scaffolding: ${domain.name}`);
162
+ // Create directory structure
163
+ fs.mkdirSync(path.join(outputPath, 'src', 'generated'), { recursive: true });
164
+ // Create package.json
165
+ const packageJson = {
166
+ name: `@proj/contract-${domain.name}`,
167
+ version: '0.0.1',
168
+ type: 'module',
169
+ main: './src/index.ts',
170
+ exports: {
171
+ '.': {
172
+ import: './src/index.ts',
173
+ types: './src/index.ts',
174
+ },
175
+ },
176
+ dependencies: {},
177
+ peerDependencies: {
178
+ effect: '^3.0.0',
179
+ kysely: '^0.28.0',
180
+ },
181
+ };
182
+ fs.writeFileSync(path.join(outputPath, 'package.json'), JSON.stringify(packageJson, null, 2));
183
+ // Create tsconfig.json
184
+ const tsConfig = {
185
+ extends: '../../../tsconfig.base.json',
186
+ compilerOptions: {
187
+ outDir: `../../../dist/libs/contract/${domain.name}`,
188
+ composite: true,
189
+ declaration: true,
190
+ declarationMap: true,
191
+ },
192
+ include: ['src/**/*.ts'],
193
+ exclude: ['node_modules', 'dist', '**/*.spec.ts'],
194
+ };
195
+ fs.writeFileSync(path.join(outputPath, 'tsconfig.json'), JSON.stringify(tsConfig, null, 2));
196
+ // Create src/index.ts
197
+ const indexContent = `/**
198
+ * ${domain.name.charAt(0).toUpperCase() + domain.name.slice(1)} Domain Contract
199
+ *
200
+ * Generated by prisma-effect-kysely
201
+ * This file re-exports generated schemas from the generated/ directory.
202
+ */
203
+
204
+ export * from './generated';
205
+ `;
206
+ fs.writeFileSync(path.join(outputPath, 'src', 'index.ts'), indexContent);
207
+ // Create .gitkeep in generated directory
208
+ fs.writeFileSync(path.join(outputPath, 'src', 'generated', '.gitkeep'), '');
209
+ return createResult({
210
+ domain: domain.name,
211
+ outputPath,
212
+ scaffolded: true,
213
+ method: 'manual',
214
+ });
215
+ }
216
+ /**
217
+ * Get output path for a domain's contract library
218
+ *
219
+ * @example
220
+ * getContractOutputPath("../libs/contract", "user")
221
+ * // => "../libs/contract/user"
222
+ */
223
+ function getContractOutputPath(baseOutput, domainName) {
224
+ return path.join(baseOutput, domainName);
225
+ }
226
+ /**
227
+ * Log scaffolding results
228
+ */
229
+ function logScaffoldResults(results) {
230
+ console.log('\n[Contract Scaffolder] Scaffolding Summary:');
231
+ for (const result of results) {
232
+ const status = result.scaffolded ? '✓' : result.error ? '✗' : '○';
233
+ const method = result.method === 'generator'
234
+ ? '(generator)'
235
+ : result.method === 'manual'
236
+ ? '(manual)'
237
+ : '(existing)';
238
+ console.log(` ${status} ${result.domain} ${method}`);
239
+ if (result.error) {
240
+ console.log(` Error: ${result.error}`);
241
+ }
242
+ }
243
+ }
244
+ //# sourceMappingURL=contract-scaffolder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-scaffolder.js","sourceRoot":"","sources":["../../src/generator/contract-scaffolder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Domain Detection
3
+ *
4
+ * Detects domains from Prisma multi-file schema organization.
5
+ * Supports Prisma's multi-file schema feature (v5.15.0+) where schemas
6
+ * are organized in separate files per domain (e.g., user.prisma, product.prisma).
7
+ */
8
+ import type { DMMF } from '@prisma/generator-helper';
9
+ /**
10
+ * Information about a detected domain
11
+ */
12
+ export interface DomainInfo {
13
+ /**
14
+ * Domain name (e.g., "user", "product")
15
+ * Derived from schema file name
16
+ */
17
+ name: string;
18
+ /**
19
+ * Models belonging to this domain
20
+ */
21
+ models: readonly DMMF.Model[];
22
+ /**
23
+ * Source file path for this domain
24
+ * @example "prisma/schemas/user.prisma"
25
+ */
26
+ sourceFile?: string;
27
+ }
28
+ /**
29
+ * Detect domains from Prisma schema file structure
30
+ *
31
+ * Strategy:
32
+ * 1. If multiSchema preview feature is enabled, use DMMF schema information
33
+ * 2. Otherwise, scan prisma/schemas/ directory for *.prisma files
34
+ * 3. Group models by domain based on file names
35
+ * 4. Default domain is "shared" for models without explicit domain
36
+ *
37
+ * @param dmmf - Prisma DMMF (Data Model Meta Format)
38
+ * @param schemaPath - Path to prisma schema directory
39
+ * @returns Array of detected domains with their models
40
+ */
41
+ export declare function detectDomains(dmmf: DMMF.Document, schemaPath?: string): DomainInfo[];
42
+ /**
43
+ * Get all unique domain names from detected domains
44
+ */
45
+ export declare function getDomainNames(domains: DomainInfo[]): string[];
46
+ /**
47
+ * Get models for a specific domain
48
+ */
49
+ export declare function getModelsForDomain(domains: DomainInfo[], domainName: string): readonly DMMF.Model[];
50
+ //# sourceMappingURL=domain-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-detector.d.ts","sourceRoot":"","sources":["../../src/generator/domain-detector.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAIrD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,MAAM,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC;IAE9B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE,CAsBpF;AAgHD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAE9D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,UAAU,EAAE,EACrB,UAAU,EAAE,MAAM,GACjB,SAAS,IAAI,CAAC,KAAK,EAAE,CAGvB"}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ /**
3
+ * Domain Detection
4
+ *
5
+ * Detects domains from Prisma multi-file schema organization.
6
+ * Supports Prisma's multi-file schema feature (v5.15.0+) where schemas
7
+ * are organized in separate files per domain (e.g., user.prisma, product.prisma).
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.detectDomains = detectDomains;
44
+ exports.getDomainNames = getDomainNames;
45
+ exports.getModelsForDomain = getModelsForDomain;
46
+ const path = __importStar(require("path"));
47
+ const fs = __importStar(require("fs"));
48
+ /**
49
+ * Detect domains from Prisma schema file structure
50
+ *
51
+ * Strategy:
52
+ * 1. If multiSchema preview feature is enabled, use DMMF schema information
53
+ * 2. Otherwise, scan prisma/schemas/ directory for *.prisma files
54
+ * 3. Group models by domain based on file names
55
+ * 4. Default domain is "shared" for models without explicit domain
56
+ *
57
+ * @param dmmf - Prisma DMMF (Data Model Meta Format)
58
+ * @param schemaPath - Path to prisma schema directory
59
+ * @returns Array of detected domains with their models
60
+ */
61
+ function detectDomains(dmmf, schemaPath) {
62
+ // Strategy 1: Use DMMF schema locations if available (Prisma 5.15.0+)
63
+ const domainsByDmmf = detectDomainsFromDMMF(dmmf);
64
+ if (domainsByDmmf.length > 0) {
65
+ return domainsByDmmf;
66
+ }
67
+ // Strategy 2: Scan file system for schema files
68
+ if (schemaPath) {
69
+ const domainsByFiles = detectDomainsFromFiles(dmmf, schemaPath);
70
+ if (domainsByFiles.length > 0) {
71
+ return domainsByFiles;
72
+ }
73
+ }
74
+ // Fallback: Single "shared" domain with all models
75
+ return [
76
+ {
77
+ name: 'shared',
78
+ models: dmmf.datamodel.models,
79
+ },
80
+ ];
81
+ }
82
+ /**
83
+ * Detect domains from DMMF schema metadata (Prisma 5.15.0+)
84
+ */
85
+ function detectDomainsFromDMMF(dmmf) {
86
+ const domains = new Map();
87
+ // Check if models have schema location metadata
88
+ for (const model of dmmf.datamodel.models) {
89
+ // @ts-expect-error - schema location may not be in type definitions yet
90
+ const schemaLocation = model.schemaLocation;
91
+ if (schemaLocation && typeof schemaLocation === 'string') {
92
+ const domainName = extractDomainFromPath(schemaLocation);
93
+ const existing = domains.get(domainName) || [];
94
+ // Cast to readonly to match DMMF type signature
95
+ domains.set(domainName, [...existing, model]);
96
+ }
97
+ }
98
+ // Convert map to DomainInfo array
99
+ return Array.from(domains.entries()).map(([name, models]) => ({
100
+ name,
101
+ models,
102
+ }));
103
+ }
104
+ /**
105
+ * Detect domains by scanning prisma/schemas/ directory
106
+ */
107
+ function detectDomainsFromFiles(dmmf, schemaPath) {
108
+ const schemasDir = path.join(path.dirname(schemaPath), 'schemas');
109
+ // Check if schemas directory exists
110
+ if (!fs.existsSync(schemasDir)) {
111
+ return [];
112
+ }
113
+ const domainModels = new Map();
114
+ const domainSourceFiles = new Map();
115
+ // Read all .prisma files in schemas directory
116
+ const schemaFiles = fs.readdirSync(schemasDir).filter((file) => file.endsWith('.prisma'));
117
+ if (schemaFiles.length === 0) {
118
+ return [];
119
+ }
120
+ // Create domain entries for each schema file
121
+ for (const file of schemaFiles) {
122
+ const domainName = path.basename(file, '.prisma');
123
+ const sourceFile = path.join(schemasDir, file);
124
+ domainModels.set(domainName, []);
125
+ domainSourceFiles.set(domainName, sourceFile);
126
+ }
127
+ // Assign models to domains based on file content
128
+ // For now, we rely on naming conventions or explicit comments
129
+ // This is a heuristic - in practice, Prisma's DMMF should provide this
130
+ for (const model of dmmf.datamodel.models) {
131
+ const domainName = inferDomainFromModel(model, domainModels);
132
+ const models = domainModels.get(domainName);
133
+ if (models) {
134
+ domainModels.set(domainName, [...models, model]);
135
+ }
136
+ }
137
+ // Build final DomainInfo array
138
+ return Array.from(domainModels.entries()).map(([name, models]) => ({
139
+ name,
140
+ models: models,
141
+ sourceFile: domainSourceFiles.get(name),
142
+ }));
143
+ }
144
+ /**
145
+ * Extract domain name from schema file path
146
+ *
147
+ * @example
148
+ * extractDomainFromPath("prisma/schemas/user.prisma") // "user"
149
+ * extractDomainFromPath("schemas/product.prisma") // "product"
150
+ */
151
+ function extractDomainFromPath(filePath) {
152
+ const fileName = path.basename(filePath, '.prisma');
153
+ return fileName.toLowerCase();
154
+ }
155
+ /**
156
+ * Infer domain from model name using heuristics
157
+ *
158
+ * Strategy:
159
+ * 1. Check if model name starts with domain name (UserProfile → user)
160
+ * 2. Check for common prefixes (User, Product, Order, etc.)
161
+ * 3. Fall back to "shared" domain
162
+ */
163
+ function inferDomainFromModel(model, domainModels) {
164
+ const modelName = model.name.toLowerCase();
165
+ // Try exact domain prefix match
166
+ for (const domainName of domainModels.keys()) {
167
+ if (modelName.startsWith(domainName)) {
168
+ return domainName;
169
+ }
170
+ }
171
+ // Fall back to "shared" domain
172
+ return domainModels.has('shared') ? 'shared' : Array.from(domainModels.keys())[0] || 'shared';
173
+ }
174
+ /**
175
+ * Get all unique domain names from detected domains
176
+ */
177
+ function getDomainNames(domains) {
178
+ return domains.map((d) => d.name);
179
+ }
180
+ /**
181
+ * Get models for a specific domain
182
+ */
183
+ function getModelsForDomain(domains, domainName) {
184
+ const domain = domains.find((d) => d.name === domainName);
185
+ return domain?.models || [];
186
+ }
187
+ //# sourceMappingURL=domain-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-detector.js","sourceRoot":"","sources":["../../src/generator/domain-detector.ts"],"names":[],"mappings":"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"}