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.
- package/CHANGELOG.md +89 -16
- package/dist/effect/join-table.d.ts.map +1 -1
- package/dist/effect/type.d.ts +1 -1
- package/dist/effect/type.d.ts.map +1 -1
- package/dist/effect/type.js +18 -12
- package/dist/effect/type.js.map +1 -1
- package/dist/generator/config.d.ts +58 -0
- package/dist/generator/config.d.ts.map +1 -0
- package/dist/generator/config.js +109 -0
- package/dist/generator/config.js.map +1 -0
- package/dist/generator/contract-scaffolder.d.ts +45 -0
- package/dist/generator/contract-scaffolder.d.ts.map +1 -0
- package/dist/generator/contract-scaffolder.js +244 -0
- package/dist/generator/contract-scaffolder.js.map +1 -0
- package/dist/generator/domain-detector.d.ts +50 -0
- package/dist/generator/domain-detector.d.ts.map +1 -0
- package/dist/generator/domain-detector.js +187 -0
- package/dist/generator/domain-detector.js.map +1 -0
- package/dist/generator/orchestrator.d.ts +24 -4
- package/dist/generator/orchestrator.d.ts.map +1 -1
- package/dist/generator/orchestrator.js +124 -16
- package/dist/generator/orchestrator.js.map +1 -1
- package/dist/kysely/helpers.d.ts +5 -1
- package/dist/kysely/helpers.d.ts.map +1 -1
- package/dist/kysely/helpers.js +54 -27
- package/dist/kysely/helpers.js.map +1 -1
- package/dist/kysely/type.d.ts.map +1 -1
- package/dist/utils/annotations.d.ts.map +1 -1
- package/dist/utils/codegen.d.ts.map +1 -1
- package/dist/utils/naming.d.ts.map +1 -1
- package/package.json +2 -1
|
@@ -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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"}
|