@veloxts/cli 0.4.14 → 0.6.23
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 +2 -48
- package/dist/cli.d.ts +5 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +7 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +71 -7
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/introspect.d.ts +16 -0
- package/dist/commands/introspect.d.ts.map +1 -0
- package/dist/commands/introspect.js +559 -0
- package/dist/commands/introspect.js.map +1 -0
- package/dist/commands/make.d.ts.map +1 -1
- package/dist/commands/make.js +18 -8
- package/dist/commands/make.js.map +1 -1
- package/dist/commands/procedures.d.ts.map +1 -1
- package/dist/commands/procedures.js +16 -0
- package/dist/commands/procedures.js.map +1 -1
- package/dist/dev/error-parser.d.ts.map +1 -1
- package/dist/dev/error-parser.js +24 -8
- package/dist/dev/error-parser.js.map +1 -1
- package/dist/dev/hmr-runner.d.ts.map +1 -1
- package/dist/dev/hmr-runner.js +6 -1
- package/dist/dev/hmr-runner.js.map +1 -1
- package/dist/dev/index.d.ts +3 -3
- package/dist/dev/index.d.ts.map +1 -1
- package/dist/dev/index.js +3 -3
- package/dist/dev/index.js.map +1 -1
- package/dist/dev/reload-reporter.d.ts +2 -2
- package/dist/dev/reload-reporter.d.ts.map +1 -1
- package/dist/dev/reload-reporter.js +2 -2
- package/dist/dev/reload-reporter.js.map +1 -1
- package/dist/errors/catalog.d.ts +48 -0
- package/dist/errors/catalog.d.ts.map +1 -0
- package/dist/errors/catalog.js +421 -0
- package/dist/errors/catalog.js.map +1 -0
- package/dist/errors/index.d.ts +26 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +28 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/velox-error.d.ts +122 -0
- package/dist/errors/velox-error.d.ts.map +1 -0
- package/dist/errors/velox-error.js +216 -0
- package/dist/errors/velox-error.js.map +1 -0
- package/dist/generators/base.d.ts.map +1 -1
- package/dist/generators/base.js +26 -0
- package/dist/generators/base.js.map +1 -1
- package/dist/generators/fields/__tests__/helpers.d.ts +66 -0
- package/dist/generators/fields/__tests__/helpers.d.ts.map +1 -0
- package/dist/generators/fields/__tests__/helpers.js +142 -0
- package/dist/generators/fields/__tests__/helpers.js.map +1 -0
- package/dist/generators/fields/actions.d.ts +58 -0
- package/dist/generators/fields/actions.d.ts.map +1 -0
- package/dist/generators/fields/actions.js +230 -0
- package/dist/generators/fields/actions.js.map +1 -0
- package/dist/generators/fields/display.d.ts +28 -0
- package/dist/generators/fields/display.d.ts.map +1 -0
- package/dist/generators/fields/display.js +214 -0
- package/dist/generators/fields/display.js.map +1 -0
- package/dist/generators/fields/index.d.ts +12 -0
- package/dist/generators/fields/index.d.ts.map +1 -0
- package/dist/generators/fields/index.js +12 -0
- package/dist/generators/fields/index.js.map +1 -0
- package/dist/generators/fields/prompts.d.ts +31 -0
- package/dist/generators/fields/prompts.d.ts.map +1 -0
- package/dist/generators/fields/prompts.js +366 -0
- package/dist/generators/fields/prompts.js.map +1 -0
- package/dist/generators/fields/templates.d.ts +49 -0
- package/dist/generators/fields/templates.d.ts.map +1 -0
- package/dist/generators/fields/templates.js +230 -0
- package/dist/generators/fields/templates.js.map +1 -0
- package/dist/generators/fields/types.d.ts +95 -0
- package/dist/generators/fields/types.d.ts.map +1 -0
- package/dist/generators/fields/types.js +150 -0
- package/dist/generators/fields/types.js.map +1 -0
- package/dist/generators/generators/action.d.ts +37 -0
- package/dist/generators/generators/action.d.ts.map +1 -0
- package/dist/generators/generators/action.js +109 -0
- package/dist/generators/generators/action.js.map +1 -0
- package/dist/generators/generators/exception.d.ts +38 -0
- package/dist/generators/generators/exception.d.ts.map +1 -0
- package/dist/generators/generators/exception.js +109 -0
- package/dist/generators/generators/exception.js.map +1 -0
- package/dist/generators/generators/guard.d.ts +38 -0
- package/dist/generators/generators/guard.d.ts.map +1 -0
- package/dist/generators/generators/guard.js +109 -0
- package/dist/generators/generators/guard.js.map +1 -0
- package/dist/generators/generators/index.d.ts +8 -0
- package/dist/generators/generators/index.d.ts.map +1 -1
- package/dist/generators/generators/index.js +27 -0
- package/dist/generators/generators/index.js.map +1 -1
- package/dist/generators/generators/layout.d.ts +36 -0
- package/dist/generators/generators/layout.d.ts.map +1 -0
- package/dist/generators/generators/layout.js +111 -0
- package/dist/generators/generators/layout.js.map +1 -0
- package/dist/generators/generators/middleware.d.ts +38 -0
- package/dist/generators/generators/middleware.d.ts.map +1 -0
- package/dist/generators/generators/middleware.js +109 -0
- package/dist/generators/generators/middleware.js.map +1 -0
- package/dist/generators/generators/model.d.ts +16 -4
- package/dist/generators/generators/model.d.ts.map +1 -1
- package/dist/generators/generators/model.js +88 -7
- package/dist/generators/generators/model.js.map +1 -1
- package/dist/generators/generators/page.d.ts +36 -0
- package/dist/generators/generators/page.d.ts.map +1 -0
- package/dist/generators/generators/page.js +112 -0
- package/dist/generators/generators/page.js.map +1 -0
- package/dist/generators/generators/policy.d.ts +37 -0
- package/dist/generators/generators/policy.d.ts.map +1 -0
- package/dist/generators/generators/policy.js +100 -0
- package/dist/generators/generators/policy.js.map +1 -0
- package/dist/generators/generators/resource.d.ts +42 -4
- package/dist/generators/generators/resource.d.ts.map +1 -1
- package/dist/generators/generators/resource.js +450 -9
- package/dist/generators/generators/resource.js.map +1 -1
- package/dist/generators/generators/service.d.ts +38 -0
- package/dist/generators/generators/service.d.ts.map +1 -0
- package/dist/generators/generators/service.js +109 -0
- package/dist/generators/generators/service.js.map +1 -0
- package/dist/generators/registry.d.ts.map +1 -1
- package/dist/generators/registry.js +10 -1
- package/dist/generators/registry.js.map +1 -1
- package/dist/generators/templates/action.d.ts +28 -0
- package/dist/generators/templates/action.d.ts.map +1 -0
- package/dist/generators/templates/action.js +359 -0
- package/dist/generators/templates/action.js.map +1 -0
- package/dist/generators/templates/exception.d.ts +26 -0
- package/dist/generators/templates/exception.d.ts.map +1 -0
- package/dist/generators/templates/exception.js +671 -0
- package/dist/generators/templates/exception.js.map +1 -0
- package/dist/generators/templates/guard.d.ts +26 -0
- package/dist/generators/templates/guard.d.ts.map +1 -0
- package/dist/generators/templates/guard.js +555 -0
- package/dist/generators/templates/guard.js.map +1 -0
- package/dist/generators/templates/layout.d.ts +28 -0
- package/dist/generators/templates/layout.d.ts.map +1 -0
- package/dist/generators/templates/layout.js +147 -0
- package/dist/generators/templates/layout.js.map +1 -0
- package/dist/generators/templates/middleware.d.ts +26 -0
- package/dist/generators/templates/middleware.d.ts.map +1 -0
- package/dist/generators/templates/middleware.js +411 -0
- package/dist/generators/templates/middleware.js.map +1 -0
- package/dist/generators/templates/model.d.ts +3 -0
- package/dist/generators/templates/model.d.ts.map +1 -1
- package/dist/generators/templates/model.js +183 -28
- package/dist/generators/templates/model.js.map +1 -1
- package/dist/generators/templates/page.d.ts +36 -0
- package/dist/generators/templates/page.d.ts.map +1 -0
- package/dist/generators/templates/page.js +147 -0
- package/dist/generators/templates/page.js.map +1 -0
- package/dist/generators/templates/policy.d.ts +24 -0
- package/dist/generators/templates/policy.d.ts.map +1 -0
- package/dist/generators/templates/policy.js +499 -0
- package/dist/generators/templates/policy.js.map +1 -0
- package/dist/generators/templates/resource.d.ts +65 -0
- package/dist/generators/templates/resource.d.ts.map +1 -1
- package/dist/generators/templates/resource.js +228 -43
- package/dist/generators/templates/resource.js.map +1 -1
- package/dist/generators/templates/service.d.ts +26 -0
- package/dist/generators/templates/service.d.ts.map +1 -0
- package/dist/generators/templates/service.js +511 -0
- package/dist/generators/templates/service.js.map +1 -0
- package/dist/generators/types.d.ts +26 -14
- package/dist/generators/types.d.ts.map +1 -1
- package/dist/generators/types.js +8 -25
- package/dist/generators/types.js.map +1 -1
- package/dist/generators/utils/ast-helpers.d.ts +147 -0
- package/dist/generators/utils/ast-helpers.d.ts.map +1 -0
- package/dist/generators/utils/ast-helpers.js +350 -0
- package/dist/generators/utils/ast-helpers.js.map +1 -0
- package/dist/generators/utils/prisma-migration.d.ts +59 -0
- package/dist/generators/utils/prisma-migration.d.ts.map +1 -0
- package/dist/generators/utils/prisma-migration.js +161 -0
- package/dist/generators/utils/prisma-migration.js.map +1 -0
- package/dist/generators/utils/prisma-schema.d.ts +97 -0
- package/dist/generators/utils/prisma-schema.d.ts.map +1 -0
- package/dist/generators/utils/prisma-schema.js +235 -0
- package/dist/generators/utils/prisma-schema.js.map +1 -0
- package/dist/generators/utils/router-integration.d.ts +70 -0
- package/dist/generators/utils/router-integration.d.ts.map +1 -0
- package/dist/generators/utils/router-integration.js +305 -0
- package/dist/generators/utils/router-integration.js.map +1 -0
- package/dist/generators/utils/snapshot.d.ts +93 -0
- package/dist/generators/utils/snapshot.d.ts.map +1 -0
- package/dist/generators/utils/snapshot.js +178 -0
- package/dist/generators/utils/snapshot.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/seeding/errors.d.ts +11 -24
- package/dist/seeding/errors.d.ts.map +1 -1
- package/dist/seeding/errors.js +11 -50
- package/dist/seeding/errors.js.map +1 -1
- package/dist/utils/paths.d.ts +19 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +45 -0
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/schema-patterns.d.ts +26 -0
- package/dist/utils/schema-patterns.d.ts.map +1 -0
- package/dist/utils/schema-patterns.js +40 -0
- package/dist/utils/schema-patterns.js.map +1 -0
- package/package.json +12 -10
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prisma Migration Runner
|
|
3
|
+
*
|
|
4
|
+
* Executes Prisma commands (db push, generate) with proper error handling
|
|
5
|
+
* and user feedback.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from 'node:child_process';
|
|
8
|
+
import * as p from '@clack/prompts';
|
|
9
|
+
import pc from 'picocolors';
|
|
10
|
+
import { GeneratorError, GeneratorErrorCode } from '../types.js';
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Command Execution
|
|
13
|
+
// ============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Execute a command and capture output
|
|
16
|
+
*/
|
|
17
|
+
function execCommand(command, args, cwd, timeout = 60000) {
|
|
18
|
+
return new Promise((resolve) => {
|
|
19
|
+
let stdout = '';
|
|
20
|
+
let stderr = '';
|
|
21
|
+
let timedOut = false;
|
|
22
|
+
const proc = spawn(command, args, {
|
|
23
|
+
cwd,
|
|
24
|
+
stdio: 'pipe',
|
|
25
|
+
});
|
|
26
|
+
// Set timeout
|
|
27
|
+
const timeoutId = setTimeout(() => {
|
|
28
|
+
timedOut = true;
|
|
29
|
+
proc.kill('SIGTERM');
|
|
30
|
+
}, timeout);
|
|
31
|
+
proc.stdout?.on('data', (data) => {
|
|
32
|
+
stdout += data.toString();
|
|
33
|
+
});
|
|
34
|
+
proc.stderr?.on('data', (data) => {
|
|
35
|
+
stderr += data.toString();
|
|
36
|
+
});
|
|
37
|
+
proc.on('close', (code) => {
|
|
38
|
+
clearTimeout(timeoutId);
|
|
39
|
+
if (timedOut) {
|
|
40
|
+
resolve({
|
|
41
|
+
success: false,
|
|
42
|
+
exitCode: -1,
|
|
43
|
+
stdout,
|
|
44
|
+
stderr: `${stderr}\nCommand timed out`,
|
|
45
|
+
});
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
resolve({
|
|
49
|
+
success: code === 0,
|
|
50
|
+
exitCode: code ?? 1,
|
|
51
|
+
stdout,
|
|
52
|
+
stderr,
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
proc.on('error', (err) => {
|
|
56
|
+
clearTimeout(timeoutId);
|
|
57
|
+
resolve({
|
|
58
|
+
success: false,
|
|
59
|
+
exitCode: 1,
|
|
60
|
+
stdout,
|
|
61
|
+
stderr: err.message,
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
// ============================================================================
|
|
67
|
+
// Prisma Commands
|
|
68
|
+
// ============================================================================
|
|
69
|
+
/**
|
|
70
|
+
* Run `prisma db push` to sync schema with database
|
|
71
|
+
*/
|
|
72
|
+
export async function runPrismaDbPush(options) {
|
|
73
|
+
const { cwd, timeout = 60000 } = options;
|
|
74
|
+
const result = await execCommand('npx', ['prisma', 'db', 'push', '--skip-generate'], cwd, timeout);
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Run `prisma generate` to regenerate Prisma Client
|
|
79
|
+
*/
|
|
80
|
+
export async function runPrismaGenerate(options) {
|
|
81
|
+
const { cwd, timeout = 60000 } = options;
|
|
82
|
+
const result = await execCommand('npx', ['prisma', 'generate'], cwd, timeout);
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Run `prisma format` to format schema file
|
|
87
|
+
*/
|
|
88
|
+
export async function runPrismaFormat(options) {
|
|
89
|
+
const { cwd, timeout = 30000 } = options;
|
|
90
|
+
const result = await execCommand('npx', ['prisma', 'format'], cwd, timeout);
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
// ============================================================================
|
|
94
|
+
// Interactive Migration Flow
|
|
95
|
+
// ============================================================================
|
|
96
|
+
/**
|
|
97
|
+
* Prompt user and run database migration
|
|
98
|
+
*
|
|
99
|
+
* @returns true if migration was run and succeeded, false otherwise
|
|
100
|
+
*/
|
|
101
|
+
export async function promptAndRunMigration(options) {
|
|
102
|
+
const { skip, autoRun } = options;
|
|
103
|
+
// Skip if requested
|
|
104
|
+
if (skip) {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
// Prompt user unless autoRun is enabled
|
|
108
|
+
if (!autoRun) {
|
|
109
|
+
const shouldMigrate = await p.confirm({
|
|
110
|
+
message: 'Push schema changes to database?',
|
|
111
|
+
initialValue: true,
|
|
112
|
+
});
|
|
113
|
+
if (p.isCancel(shouldMigrate) || !shouldMigrate) {
|
|
114
|
+
console.log(pc.dim(' Skipped database migration'));
|
|
115
|
+
console.log(pc.dim(` Run manually: npx prisma db push`));
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Run db push with spinner
|
|
120
|
+
const s = p.spinner();
|
|
121
|
+
s.start('Pushing schema to database...');
|
|
122
|
+
const pushResult = await runPrismaDbPush(options);
|
|
123
|
+
if (!pushResult.success) {
|
|
124
|
+
s.stop(pc.red('Database push failed'));
|
|
125
|
+
console.log(pc.dim(`\n Error: ${pushResult.stderr}`));
|
|
126
|
+
console.log(pc.dim(` Run manually: npx prisma db push`));
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
s.stop(pc.green('Database schema updated'));
|
|
130
|
+
// Run generate with spinner
|
|
131
|
+
s.start('Generating Prisma Client...');
|
|
132
|
+
const generateResult = await runPrismaGenerate(options);
|
|
133
|
+
if (!generateResult.success) {
|
|
134
|
+
s.stop(pc.yellow('Prisma Client generation failed'));
|
|
135
|
+
console.log(pc.dim(`\n Error: ${generateResult.stderr}`));
|
|
136
|
+
console.log(pc.dim(` Run manually: npx prisma generate`));
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
s.stop(pc.green('Prisma Client generated'));
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
// ============================================================================
|
|
143
|
+
// Validation
|
|
144
|
+
// ============================================================================
|
|
145
|
+
/**
|
|
146
|
+
* Check if Prisma CLI is available
|
|
147
|
+
*/
|
|
148
|
+
export async function checkPrismaAvailable(cwd) {
|
|
149
|
+
const result = await execCommand('npx', ['prisma', '--version'], cwd, 10000);
|
|
150
|
+
return result.success;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Validate schema before migration
|
|
154
|
+
*/
|
|
155
|
+
export async function validatePrismaSchema(cwd) {
|
|
156
|
+
const result = await execCommand('npx', ['prisma', 'validate'], cwd, 30000);
|
|
157
|
+
if (!result.success) {
|
|
158
|
+
throw new GeneratorError(GeneratorErrorCode.MIGRATION_FAILED, 'Prisma schema validation failed', `Error: ${result.stderr}\n\nFix the schema errors and try again.`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=prisma-migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-migration.js","sourceRoot":"","sources":["../../../src/generators/utils/prisma-migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prisma Schema Parser and Injector
|
|
3
|
+
*
|
|
4
|
+
* Parses Prisma schema files to find models/enums and enables safe injection
|
|
5
|
+
* of new definitions without breaking existing code.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Represents a parsed Prisma schema
|
|
9
|
+
*/
|
|
10
|
+
export interface PrismaSchemaAnalysis {
|
|
11
|
+
/** Original file content */
|
|
12
|
+
readonly content: string;
|
|
13
|
+
/** File path */
|
|
14
|
+
readonly filePath: string;
|
|
15
|
+
/** All model names found */
|
|
16
|
+
readonly models: Set<string>;
|
|
17
|
+
/** All enum names found */
|
|
18
|
+
readonly enums: Set<string>;
|
|
19
|
+
/** Position after last model block */
|
|
20
|
+
readonly lastModelEnd: number;
|
|
21
|
+
/** Position after last enum block */
|
|
22
|
+
readonly lastEnumEnd: number;
|
|
23
|
+
/** Position where models start (after datasource/generator blocks) */
|
|
24
|
+
readonly modelSectionStart: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Model definition to inject
|
|
28
|
+
*/
|
|
29
|
+
export interface PrismaModelDefinition {
|
|
30
|
+
/** Model name (PascalCase) */
|
|
31
|
+
readonly name: string;
|
|
32
|
+
/** Full Prisma model content (including `model Name { ... }`) */
|
|
33
|
+
readonly content: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Enum definition to inject
|
|
37
|
+
*/
|
|
38
|
+
export interface PrismaEnumDefinition {
|
|
39
|
+
/** Enum name (PascalCase) */
|
|
40
|
+
readonly name: string;
|
|
41
|
+
/** Full Prisma enum content (including `enum Name { ... }`) */
|
|
42
|
+
readonly content: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Result of injecting into schema
|
|
46
|
+
*/
|
|
47
|
+
export interface SchemaInjectionResult {
|
|
48
|
+
/** Modified schema content */
|
|
49
|
+
readonly content: string;
|
|
50
|
+
/** Models that were added */
|
|
51
|
+
readonly addedModels: string[];
|
|
52
|
+
/** Enums that were added */
|
|
53
|
+
readonly addedEnums: string[];
|
|
54
|
+
/** Models that were skipped (already exist) */
|
|
55
|
+
readonly skippedModels: string[];
|
|
56
|
+
/** Enums that were skipped (already exist) */
|
|
57
|
+
readonly skippedEnums: string[];
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Find the Prisma schema file in a project
|
|
61
|
+
*/
|
|
62
|
+
export declare function findPrismaSchema(projectRoot: string): string | null;
|
|
63
|
+
/**
|
|
64
|
+
* Parse a Prisma schema file
|
|
65
|
+
*/
|
|
66
|
+
export declare function analyzePrismaSchema(filePath: string): PrismaSchemaAnalysis;
|
|
67
|
+
/**
|
|
68
|
+
* Check if a model exists in the schema
|
|
69
|
+
*/
|
|
70
|
+
export declare function hasModel(analysis: PrismaSchemaAnalysis, modelName: string): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Check if an enum exists in the schema
|
|
73
|
+
*/
|
|
74
|
+
export declare function hasEnum(analysis: PrismaSchemaAnalysis, enumName: string): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Inject models and enums into a Prisma schema
|
|
77
|
+
*
|
|
78
|
+
* - Enums are added before models (Prisma convention)
|
|
79
|
+
* - Models are added at the end of the file
|
|
80
|
+
* - Existing models/enums are skipped (not duplicated)
|
|
81
|
+
*/
|
|
82
|
+
export declare function injectIntoSchema(analysis: PrismaSchemaAnalysis, models: PrismaModelDefinition[], enums?: PrismaEnumDefinition[]): SchemaInjectionResult;
|
|
83
|
+
/**
|
|
84
|
+
* Validate that required models/enums don't already exist
|
|
85
|
+
*
|
|
86
|
+
* Throws if any model or enum already exists (prevents accidental overwrites)
|
|
87
|
+
*/
|
|
88
|
+
export declare function validateNoConflicts(analysis: PrismaSchemaAnalysis, models: PrismaModelDefinition[], enums?: PrismaEnumDefinition[]): void;
|
|
89
|
+
/**
|
|
90
|
+
* Generate a minimal Prisma model string
|
|
91
|
+
*/
|
|
92
|
+
export declare function generatePrismaModel(name: string, fields: string[], tableName?: string): string;
|
|
93
|
+
/**
|
|
94
|
+
* Generate a Prisma enum string
|
|
95
|
+
*/
|
|
96
|
+
export declare function generatePrismaEnum(name: string, values: string[]): string;
|
|
97
|
+
//# sourceMappingURL=prisma-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-schema.d.ts","sourceRoot":"","sources":["../../../src/generators/utils/prisma-schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,4BAA4B;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gBAAgB;IAChB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,4BAA4B;IAC5B,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,sCAAsC;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,qCAAqC;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,sEAAsE;IACtE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,6BAA6B;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,8BAA8B;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,6BAA6B;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAC/B,4BAA4B;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;IAC9B,+CAA+C;IAC/C,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;IACjC,8CAA8C;IAC9C,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;CACjC;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAcnE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB,CA6D1E;AAqDD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAEnF;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEjF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,EAAE,qBAAqB,EAAE,EAC/B,KAAK,GAAE,oBAAoB,EAAO,GACjC,qBAAqB,CAkEvB;AAMD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,EAAE,qBAAqB,EAAE,EAC/B,KAAK,GAAE,oBAAoB,EAAO,GACjC,IAAI,CAoBN;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAO9F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAMzE"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prisma Schema Parser and Injector
|
|
3
|
+
*
|
|
4
|
+
* Parses Prisma schema files to find models/enums and enables safe injection
|
|
5
|
+
* of new definitions without breaking existing code.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
8
|
+
import { GeneratorError, GeneratorErrorCode } from '../types.js';
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Schema Parsing
|
|
11
|
+
// ============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* Find the Prisma schema file in a project
|
|
14
|
+
*/
|
|
15
|
+
export function findPrismaSchema(projectRoot) {
|
|
16
|
+
const possiblePaths = [
|
|
17
|
+
`${projectRoot}/prisma/schema.prisma`,
|
|
18
|
+
`${projectRoot}/schema.prisma`,
|
|
19
|
+
`${projectRoot}/prisma/schema/schema.prisma`,
|
|
20
|
+
];
|
|
21
|
+
for (const path of possiblePaths) {
|
|
22
|
+
if (existsSync(path)) {
|
|
23
|
+
return path;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Parse a Prisma schema file
|
|
30
|
+
*/
|
|
31
|
+
export function analyzePrismaSchema(filePath) {
|
|
32
|
+
if (!existsSync(filePath)) {
|
|
33
|
+
throw new GeneratorError(GeneratorErrorCode.PROJECT_STRUCTURE, `Prisma schema not found: ${filePath}`, 'Ensure prisma/schema.prisma exists in your project.');
|
|
34
|
+
}
|
|
35
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
36
|
+
const models = new Set();
|
|
37
|
+
const enums = new Set();
|
|
38
|
+
let lastModelEnd = 0;
|
|
39
|
+
let lastEnumEnd = 0;
|
|
40
|
+
let modelSectionStart = 0;
|
|
41
|
+
// Find all models
|
|
42
|
+
const modelRegex = /^model\s+(\w+)\s*\{/gm;
|
|
43
|
+
for (const match of content.matchAll(modelRegex)) {
|
|
44
|
+
models.add(match[1]);
|
|
45
|
+
const blockEnd = findBlockEnd(content, match.index ?? 0);
|
|
46
|
+
lastModelEnd = Math.max(lastModelEnd, blockEnd);
|
|
47
|
+
// Track where models section starts
|
|
48
|
+
if (modelSectionStart === 0) {
|
|
49
|
+
modelSectionStart = match.index ?? 0;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Find all enums
|
|
53
|
+
const enumRegex = /^enum\s+(\w+)\s*\{/gm;
|
|
54
|
+
for (const match of content.matchAll(enumRegex)) {
|
|
55
|
+
enums.add(match[1]);
|
|
56
|
+
const blockEnd = findBlockEnd(content, match.index ?? 0);
|
|
57
|
+
lastEnumEnd = Math.max(lastEnumEnd, blockEnd);
|
|
58
|
+
// Enums typically come before models, update section start if earlier
|
|
59
|
+
const matchIndex = match.index ?? 0;
|
|
60
|
+
if (matchIndex < modelSectionStart || modelSectionStart === 0) {
|
|
61
|
+
modelSectionStart = matchIndex;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// If no models/enums found, put section start after generator/datasource blocks
|
|
65
|
+
if (modelSectionStart === 0) {
|
|
66
|
+
modelSectionStart = findEndOfConfigBlocks(content);
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
content,
|
|
70
|
+
filePath,
|
|
71
|
+
models,
|
|
72
|
+
enums,
|
|
73
|
+
lastModelEnd,
|
|
74
|
+
lastEnumEnd,
|
|
75
|
+
modelSectionStart,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Find the end of a Prisma block (matching closing brace)
|
|
80
|
+
*/
|
|
81
|
+
function findBlockEnd(content, startIndex) {
|
|
82
|
+
let braceCount = 0;
|
|
83
|
+
let inBlock = false;
|
|
84
|
+
for (let i = startIndex; i < content.length; i++) {
|
|
85
|
+
const char = content[i];
|
|
86
|
+
if (char === '{') {
|
|
87
|
+
braceCount++;
|
|
88
|
+
inBlock = true;
|
|
89
|
+
}
|
|
90
|
+
else if (char === '}') {
|
|
91
|
+
braceCount--;
|
|
92
|
+
if (inBlock && braceCount === 0) {
|
|
93
|
+
return i + 1; // Position after closing brace
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return content.length;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Find the end of datasource/generator config blocks
|
|
101
|
+
*/
|
|
102
|
+
function findEndOfConfigBlocks(content) {
|
|
103
|
+
// Find the last generator or datasource block
|
|
104
|
+
const generatorRegex = /^generator\s+\w+\s*\{/gm;
|
|
105
|
+
const datasourceRegex = /^datasource\s+\w+\s*\{/gm;
|
|
106
|
+
let lastEnd = 0;
|
|
107
|
+
for (const match of content.matchAll(generatorRegex)) {
|
|
108
|
+
const blockEnd = findBlockEnd(content, match.index ?? 0);
|
|
109
|
+
lastEnd = Math.max(lastEnd, blockEnd);
|
|
110
|
+
}
|
|
111
|
+
for (const match of content.matchAll(datasourceRegex)) {
|
|
112
|
+
const blockEnd = findBlockEnd(content, match.index ?? 0);
|
|
113
|
+
lastEnd = Math.max(lastEnd, blockEnd);
|
|
114
|
+
}
|
|
115
|
+
return lastEnd;
|
|
116
|
+
}
|
|
117
|
+
// ============================================================================
|
|
118
|
+
// Schema Modification
|
|
119
|
+
// ============================================================================
|
|
120
|
+
/**
|
|
121
|
+
* Check if a model exists in the schema
|
|
122
|
+
*/
|
|
123
|
+
export function hasModel(analysis, modelName) {
|
|
124
|
+
return analysis.models.has(modelName);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Check if an enum exists in the schema
|
|
128
|
+
*/
|
|
129
|
+
export function hasEnum(analysis, enumName) {
|
|
130
|
+
return analysis.enums.has(enumName);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Inject models and enums into a Prisma schema
|
|
134
|
+
*
|
|
135
|
+
* - Enums are added before models (Prisma convention)
|
|
136
|
+
* - Models are added at the end of the file
|
|
137
|
+
* - Existing models/enums are skipped (not duplicated)
|
|
138
|
+
*/
|
|
139
|
+
export function injectIntoSchema(analysis, models, enums = []) {
|
|
140
|
+
const addedModels = [];
|
|
141
|
+
const addedEnums = [];
|
|
142
|
+
const skippedModels = [];
|
|
143
|
+
const skippedEnums = [];
|
|
144
|
+
// Prepare content modifications
|
|
145
|
+
const modifications = [];
|
|
146
|
+
// Process enums (add before models)
|
|
147
|
+
for (const enumDef of enums) {
|
|
148
|
+
if (hasEnum(analysis, enumDef.name)) {
|
|
149
|
+
skippedEnums.push(enumDef.name);
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
// Insert enum before first model, or at model section start
|
|
153
|
+
const insertPos = analysis.lastEnumEnd > 0
|
|
154
|
+
? analysis.lastEnumEnd
|
|
155
|
+
: analysis.modelSectionStart > 0
|
|
156
|
+
? analysis.modelSectionStart
|
|
157
|
+
: analysis.content.length;
|
|
158
|
+
modifications.push({
|
|
159
|
+
position: insertPos,
|
|
160
|
+
content: `\n${enumDef.content}\n`,
|
|
161
|
+
});
|
|
162
|
+
addedEnums.push(enumDef.name);
|
|
163
|
+
}
|
|
164
|
+
// Process models (add at end)
|
|
165
|
+
for (const model of models) {
|
|
166
|
+
if (hasModel(analysis, model.name)) {
|
|
167
|
+
skippedModels.push(model.name);
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
// Insert model at end of file (or after last model)
|
|
171
|
+
const insertPos = analysis.lastModelEnd > 0 ? analysis.lastModelEnd : analysis.content.length;
|
|
172
|
+
modifications.push({
|
|
173
|
+
position: insertPos,
|
|
174
|
+
content: `\n${model.content}\n`,
|
|
175
|
+
});
|
|
176
|
+
addedModels.push(model.name);
|
|
177
|
+
}
|
|
178
|
+
// Apply modifications (sort by position descending to avoid offset issues)
|
|
179
|
+
let modifiedContent = analysis.content;
|
|
180
|
+
modifications.sort((a, b) => b.position - a.position);
|
|
181
|
+
for (const mod of modifications) {
|
|
182
|
+
modifiedContent =
|
|
183
|
+
modifiedContent.slice(0, mod.position) + mod.content + modifiedContent.slice(mod.position);
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
content: modifiedContent,
|
|
187
|
+
addedModels,
|
|
188
|
+
addedEnums,
|
|
189
|
+
skippedModels,
|
|
190
|
+
skippedEnums,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
// ============================================================================
|
|
194
|
+
// Validation
|
|
195
|
+
// ============================================================================
|
|
196
|
+
/**
|
|
197
|
+
* Validate that required models/enums don't already exist
|
|
198
|
+
*
|
|
199
|
+
* Throws if any model or enum already exists (prevents accidental overwrites)
|
|
200
|
+
*/
|
|
201
|
+
export function validateNoConflicts(analysis, models, enums = []) {
|
|
202
|
+
for (const model of models) {
|
|
203
|
+
if (hasModel(analysis, model.name)) {
|
|
204
|
+
throw new GeneratorError(GeneratorErrorCode.FILE_ALREADY_EXISTS, `Model "${model.name}" already exists in Prisma schema`, `Use a different entity name or remove the existing model from prisma/schema.prisma`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
for (const enumDef of enums) {
|
|
208
|
+
if (hasEnum(analysis, enumDef.name)) {
|
|
209
|
+
throw new GeneratorError(GeneratorErrorCode.FILE_ALREADY_EXISTS, `Enum "${enumDef.name}" already exists in Prisma schema`, `Use a different enum name or remove the existing enum from prisma/schema.prisma`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// ============================================================================
|
|
214
|
+
// Helpers
|
|
215
|
+
// ============================================================================
|
|
216
|
+
/**
|
|
217
|
+
* Generate a minimal Prisma model string
|
|
218
|
+
*/
|
|
219
|
+
export function generatePrismaModel(name, fields, tableName) {
|
|
220
|
+
const mapDirective = tableName ? `\n @@map("${tableName}")` : '';
|
|
221
|
+
const fieldsString = fields.map((f) => ` ${f}`).join('\n');
|
|
222
|
+
return `model ${name} {
|
|
223
|
+
${fieldsString}${mapDirective}
|
|
224
|
+
}`;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Generate a Prisma enum string
|
|
228
|
+
*/
|
|
229
|
+
export function generatePrismaEnum(name, values) {
|
|
230
|
+
const valuesString = values.map((v) => ` ${v}`).join('\n');
|
|
231
|
+
return `enum ${name} {
|
|
232
|
+
${valuesString}
|
|
233
|
+
}`;
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=prisma-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-schema.js","sourceRoot":"","sources":["../../../src/generators/utils/prisma-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Router Integration Utilities
|
|
3
|
+
*
|
|
4
|
+
* Detects project router patterns and registers new procedures automatically.
|
|
5
|
+
* Supports three patterns:
|
|
6
|
+
* - Object-based: const router = { users: userProcedures }
|
|
7
|
+
* - Array-based: const collections = [userProcedures]
|
|
8
|
+
* - Centralized: exports in src/procedures/index.ts
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Detected router pattern in a project
|
|
12
|
+
*/
|
|
13
|
+
export type RouterPattern = {
|
|
14
|
+
type: 'object-based';
|
|
15
|
+
indexPath: string;
|
|
16
|
+
} | {
|
|
17
|
+
type: 'array-based';
|
|
18
|
+
indexPath: string;
|
|
19
|
+
} | {
|
|
20
|
+
type: 'centralized';
|
|
21
|
+
indexPath: string;
|
|
22
|
+
proceduresIndexPath: string;
|
|
23
|
+
} | {
|
|
24
|
+
type: 'unknown';
|
|
25
|
+
indexPath: string | null;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Result of registering procedures
|
|
29
|
+
*/
|
|
30
|
+
export interface RegistrationResult {
|
|
31
|
+
/** Whether registration was successful */
|
|
32
|
+
readonly success: boolean;
|
|
33
|
+
/** Files that were modified */
|
|
34
|
+
readonly modifiedFiles: string[];
|
|
35
|
+
/** What was registered */
|
|
36
|
+
readonly registrations: {
|
|
37
|
+
/** Import added to index.ts */
|
|
38
|
+
importAdded: boolean;
|
|
39
|
+
/** Added to collections array */
|
|
40
|
+
addedToArray: boolean;
|
|
41
|
+
/** Added to router object */
|
|
42
|
+
addedToObject: boolean;
|
|
43
|
+
/** Export added to procedures/index.ts */
|
|
44
|
+
exportAdded: boolean;
|
|
45
|
+
};
|
|
46
|
+
/** Error message if failed */
|
|
47
|
+
readonly error?: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Detect the router pattern used in a project
|
|
51
|
+
*/
|
|
52
|
+
export declare function detectRouterPattern(projectRoot: string): RouterPattern;
|
|
53
|
+
/**
|
|
54
|
+
* Register procedures in detected router pattern
|
|
55
|
+
*
|
|
56
|
+
* @param projectRoot - Project root directory
|
|
57
|
+
* @param entityName - Entity name (e.g., 'post', 'users')
|
|
58
|
+
* @param procedureVar - Procedure variable name (e.g., 'postProcedures')
|
|
59
|
+
* @param dryRun - If true, don't write files
|
|
60
|
+
*/
|
|
61
|
+
export declare function registerProcedures(projectRoot: string, entityName: string, procedureVar: string, dryRun?: boolean): RegistrationResult;
|
|
62
|
+
/**
|
|
63
|
+
* Check if procedures are already registered
|
|
64
|
+
*/
|
|
65
|
+
export declare function isProcedureRegistered(projectRoot: string, procedureVar: string): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Validate that registration is possible
|
|
68
|
+
*/
|
|
69
|
+
export declare function validateCanRegister(projectRoot: string): void;
|
|
70
|
+
//# sourceMappingURL=router-integration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router-integration.d.ts","sourceRoot":"","sources":["../../../src/generators/utils/router-integration.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoBH;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,+BAA+B;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;IACjC,0BAA0B;IAC1B,QAAQ,CAAC,aAAa,EAAE;QACtB,+BAA+B;QAC/B,WAAW,EAAE,OAAO,CAAC;QACrB,iCAAiC;QACjC,YAAY,EAAE,OAAO,CAAC;QACtB,6BAA6B;QAC7B,aAAa,EAAE,OAAO,CAAC;QACvB,0CAA0C;QAC1C,WAAW,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,8BAA8B;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CA8CtE;AAMD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,MAAM,UAAQ,GACb,kBAAkB,CA0BpB;AAiND;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAgCxF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAU7D"}
|