@zintrust/core 0.4.18 → 0.4.19
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/package.json +1 -1
- package/src/cli/commands/AddCommand.d.ts +16 -0
- package/src/cli/commands/AddCommand.d.ts.map +1 -1
- package/src/cli/commands/AddCommand.js +157 -28
- package/src/cli/commands/DockerCommand.d.ts.map +1 -1
- package/src/cli/commands/DockerCommand.js +32 -4
- package/src/cli/commands/StartCommand.d.ts +7 -0
- package/src/cli/commands/StartCommand.d.ts.map +1 -1
- package/src/cli/commands/StartCommand.js +109 -20
- package/src/config/middleware.d.ts +23 -0
- package/src/config/middleware.d.ts.map +1 -1
- package/src/config/middleware.js +66 -31
- package/src/index.d.ts +2 -0
- package/src/index.d.ts.map +1 -1
- package/src/index.js +5 -3
- package/src/middleware/AuthMiddleware.d.ts +2 -0
- package/src/middleware/AuthMiddleware.d.ts.map +1 -1
- package/src/middleware/AuthMiddleware.js +8 -1
- package/src/middleware/BulletproofAuthMiddleware.d.ts +2 -0
- package/src/middleware/BulletproofAuthMiddleware.d.ts.map +1 -1
- package/src/middleware/BulletproofAuthMiddleware.js +13 -5
- package/src/middleware/CsrfMiddleware.d.ts +2 -0
- package/src/middleware/CsrfMiddleware.d.ts.map +1 -1
- package/src/middleware/CsrfMiddleware.js +9 -3
- package/src/middleware/ErrorHandlerMiddleware.d.ts +5 -1
- package/src/middleware/ErrorHandlerMiddleware.d.ts.map +1 -1
- package/src/middleware/ErrorHandlerMiddleware.js +12 -2
- package/src/middleware/JwtAuthMiddleware.d.ts +2 -0
- package/src/middleware/JwtAuthMiddleware.d.ts.map +1 -1
- package/src/middleware/JwtAuthMiddleware.js +39 -4
- package/src/middleware/MiddlewareFailureResponder.d.ts +15 -0
- package/src/middleware/MiddlewareFailureResponder.d.ts.map +1 -0
- package/src/middleware/MiddlewareFailureResponder.js +15 -0
- package/src/middleware/RateLimiter.d.ts +2 -0
- package/src/middleware/RateLimiter.d.ts.map +1 -1
- package/src/middleware/RateLimiter.js +10 -4
- package/src/middleware/ValidationMiddleware.d.ts +11 -6
- package/src/middleware/ValidationMiddleware.d.ts.map +1 -1
- package/src/middleware/ValidationMiddleware.js +48 -19
- package/src/middleware/index.d.ts +1 -0
- package/src/middleware/index.d.ts.map +1 -1
- package/src/middleware/index.js +1 -0
- package/src/runtime/WorkersModule.d.ts.map +1 -1
- package/src/runtime/WorkersModule.js +4 -3
- package/src/security/Xss.d.ts +2 -2
- package/src/security/Xss.d.ts.map +1 -1
- package/src/security/Xss.js +3 -4
- package/src/templates/project/basic/app/Middleware/AuthFailureResponder.ts.tpl +10 -0
- package/src/templates/project/basic/config/middleware.ts.tpl +18 -0
package/package.json
CHANGED
|
@@ -94,6 +94,22 @@ export declare const AddCommand: Readonly<{
|
|
|
94
94
|
platform: "lambda" | "fargate" | "cloudflare" | "deno" | "all";
|
|
95
95
|
}>;
|
|
96
96
|
getDefaultResponseFields: (responseType: string) => ResponseField[];
|
|
97
|
+
isPascalCaseBase: (value: string) => boolean;
|
|
98
|
+
toSafeSnakeCase: (value: string) => string;
|
|
99
|
+
stripSuffix: (value: string, suffix: string) => string;
|
|
100
|
+
skipInlineWhitespace: (value: string, startIndex: number) => number;
|
|
101
|
+
findMatchingObjectBrace: (value: string, startIndex: number) => number | undefined;
|
|
102
|
+
findRouteBlockBounds: (configSource: string) => {
|
|
103
|
+
blockStart: number;
|
|
104
|
+
innerStart: number;
|
|
105
|
+
innerEnd: number;
|
|
106
|
+
blockEnd: number;
|
|
107
|
+
} | undefined;
|
|
108
|
+
hasTrailingMiddlewaresTypeCast: (configSource: string) => boolean;
|
|
109
|
+
registerMiddlewareRouteKey: (configSource: string, middlewareName: string, middlewareKey: string) => {
|
|
110
|
+
content: string;
|
|
111
|
+
updated: boolean;
|
|
112
|
+
};
|
|
97
113
|
};
|
|
98
114
|
}>;
|
|
99
115
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/AddCommand.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAarE,OAAO,KAAK,EAEV,aAAa,EACd,MAAM,2CAA2C,CAAC;AAwCnD,UAAU,oBAAoB;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,GAAG,UAAU,CAAC;IAChC,IAAI,EAAE,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;CAC7C;AAED,UAAU,oBAAoB;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,sBAAsB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,UAAU,uBAAuB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,mBAAmB;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,uBAAuB;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,oBAAoB;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,mBAAmB;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,2BAA2B;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,4BAA4B;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"AddCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/AddCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,127 @@ import fs from '../../node-singletons/fs.js';
|
|
|
22
22
|
import * as path from '../../node-singletons/path.js';
|
|
23
23
|
import { PluginManager } from '../../runtime/PluginManager.js';
|
|
24
24
|
import inquirer from 'inquirer';
|
|
25
|
+
const isAsciiLowercaseLetter = (value) => value >= 'a' && value <= 'z';
|
|
26
|
+
const isAsciiUppercaseLetter = (value) => value >= 'A' && value <= 'Z';
|
|
27
|
+
const isAsciiDigit = (value) => value >= '0' && value <= '9';
|
|
28
|
+
const isAsciiLetter = (value) => isAsciiLowercaseLetter(value) || isAsciiUppercaseLetter(value);
|
|
29
|
+
const isLowercaseLettersOnly = (value) => {
|
|
30
|
+
if (value.length === 0)
|
|
31
|
+
return false;
|
|
32
|
+
for (const char of value) {
|
|
33
|
+
if (!isAsciiLowercaseLetter(char))
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
return true;
|
|
37
|
+
};
|
|
38
|
+
const isSnakeCaseName = (value) => {
|
|
39
|
+
if (value.length === 0)
|
|
40
|
+
return false;
|
|
41
|
+
for (const char of value) {
|
|
42
|
+
if (isAsciiLowercaseLetter(char) || char === '_')
|
|
43
|
+
continue;
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
};
|
|
48
|
+
const isPascalCaseBase = (value) => {
|
|
49
|
+
if (value.length === 0)
|
|
50
|
+
return false;
|
|
51
|
+
if (!isAsciiUppercaseLetter(value[0] ?? ''))
|
|
52
|
+
return false;
|
|
53
|
+
for (let index = 1; index < value.length; index += 1) {
|
|
54
|
+
const char = value[index] ?? '';
|
|
55
|
+
if (isAsciiLetter(char) || isAsciiDigit(char))
|
|
56
|
+
continue;
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
return true;
|
|
60
|
+
};
|
|
61
|
+
const hasPascalCaseSuffix = (value, suffix) => {
|
|
62
|
+
if (!value.endsWith(suffix))
|
|
63
|
+
return false;
|
|
64
|
+
const base = value.slice(0, -suffix.length);
|
|
65
|
+
return isPascalCaseBase(base);
|
|
66
|
+
};
|
|
67
|
+
const toSafeSnakeCase = (value) => {
|
|
68
|
+
const snake = CommonUtils.toSnakeCase(value);
|
|
69
|
+
let output = '';
|
|
70
|
+
let previousWasUnderscore = false;
|
|
71
|
+
for (const char of snake) {
|
|
72
|
+
const isAllowed = isAsciiLowercaseLetter(char) || isAsciiDigit(char) || char === '_';
|
|
73
|
+
const nextChar = isAllowed ? char : '_';
|
|
74
|
+
if (nextChar === '_') {
|
|
75
|
+
if (previousWasUnderscore)
|
|
76
|
+
continue;
|
|
77
|
+
previousWasUnderscore = true;
|
|
78
|
+
output += '_';
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
previousWasUnderscore = false;
|
|
82
|
+
output += nextChar;
|
|
83
|
+
}
|
|
84
|
+
let start = 0;
|
|
85
|
+
while (start < output.length && output[start] === '_')
|
|
86
|
+
start += 1;
|
|
87
|
+
let end = output.length;
|
|
88
|
+
while (end > start && output[end - 1] === '_')
|
|
89
|
+
end -= 1;
|
|
90
|
+
return output.slice(start, end);
|
|
91
|
+
};
|
|
92
|
+
const stripSuffix = (value, suffix) => value.endsWith(suffix) ? value.slice(0, -suffix.length) : value;
|
|
93
|
+
const skipInlineWhitespace = (value, startIndex) => {
|
|
94
|
+
let nextIndex = startIndex;
|
|
95
|
+
while (nextIndex < value.length) {
|
|
96
|
+
const nextChar = value[nextIndex];
|
|
97
|
+
if (nextChar === ' ' || nextChar === '\t' || nextChar === '\r') {
|
|
98
|
+
nextIndex += 1;
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
return nextIndex;
|
|
104
|
+
};
|
|
105
|
+
const findMatchingObjectBrace = (value, startIndex) => {
|
|
106
|
+
let depth = 0;
|
|
107
|
+
for (let index = startIndex; index < value.length; index += 1) {
|
|
108
|
+
const char = value[index];
|
|
109
|
+
if (char === '{') {
|
|
110
|
+
depth += 1;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (char !== '}')
|
|
114
|
+
continue;
|
|
115
|
+
depth -= 1;
|
|
116
|
+
if (depth === 0)
|
|
117
|
+
return index;
|
|
118
|
+
}
|
|
119
|
+
return undefined;
|
|
120
|
+
};
|
|
121
|
+
const findRouteBlockBounds = (configSource) => {
|
|
122
|
+
const routeLabel = 'route:';
|
|
123
|
+
const routeIndex = configSource.indexOf(routeLabel);
|
|
124
|
+
if (routeIndex === -1)
|
|
125
|
+
return undefined;
|
|
126
|
+
const braceStart = configSource.indexOf('{', routeIndex + routeLabel.length);
|
|
127
|
+
if (braceStart === -1)
|
|
128
|
+
return undefined;
|
|
129
|
+
const braceEnd = findMatchingObjectBrace(configSource, braceStart);
|
|
130
|
+
if (braceEnd === undefined)
|
|
131
|
+
return undefined;
|
|
132
|
+
const nextIndex = skipInlineWhitespace(configSource, braceEnd + 1);
|
|
133
|
+
if (configSource[nextIndex] !== ',')
|
|
134
|
+
return undefined;
|
|
135
|
+
return {
|
|
136
|
+
blockStart: routeIndex,
|
|
137
|
+
innerStart: braceStart + 1,
|
|
138
|
+
innerEnd: braceEnd,
|
|
139
|
+
blockEnd: nextIndex + 1,
|
|
140
|
+
};
|
|
141
|
+
};
|
|
142
|
+
const hasTrailingMiddlewaresTypeCast = (configSource) => {
|
|
143
|
+
const trimmed = configSource.trimEnd();
|
|
144
|
+
return trimmed.endsWith('} as MiddlewaresType;');
|
|
145
|
+
};
|
|
25
146
|
const addOptions = (command) => {
|
|
26
147
|
command
|
|
27
148
|
.argument('<type>', 'What to add: service, feature, migration, model, controller, routes, middleware, factory, seeder, requestfactory, responsefactory, workflow, or governance')
|
|
@@ -54,7 +175,7 @@ const promptServiceConfig = async (defaultName) => {
|
|
|
54
175
|
name: 'name',
|
|
55
176
|
message: 'Service name (lowercase, no spaces):',
|
|
56
177
|
default: defaultName,
|
|
57
|
-
validate: (v) =>
|
|
178
|
+
validate: (v) => isLowercaseLettersOnly(v) || 'Must be lowercase letters only',
|
|
58
179
|
},
|
|
59
180
|
{
|
|
60
181
|
type: 'input',
|
|
@@ -167,7 +288,7 @@ const promptMigrationConfig = async () => {
|
|
|
167
288
|
type: 'input',
|
|
168
289
|
name: 'name',
|
|
169
290
|
message: 'Migration name (snake_case, e.g., create_users_table):',
|
|
170
|
-
validate: (v) =>
|
|
291
|
+
validate: (v) => isSnakeCaseName(v) || 'Must be snake_case',
|
|
171
292
|
},
|
|
172
293
|
{
|
|
173
294
|
type: 'list',
|
|
@@ -187,13 +308,13 @@ const findMigrationBySuffix = (migrationsPath, suffix) => {
|
|
|
187
308
|
return undefined;
|
|
188
309
|
};
|
|
189
310
|
const buildCreateTableMigrationName = (model) => {
|
|
190
|
-
const modelSnake =
|
|
311
|
+
const modelSnake = toSafeSnakeCase(model);
|
|
191
312
|
const tablePlural = pluralize(modelSnake);
|
|
192
313
|
return `create_${tablePlural}_table`;
|
|
193
314
|
};
|
|
194
315
|
const buildAddColumnMigrationName = (column, model) => {
|
|
195
|
-
const colSnake =
|
|
196
|
-
const modelSnake =
|
|
316
|
+
const colSnake = toSafeSnakeCase(column);
|
|
317
|
+
const modelSnake = toSafeSnakeCase(model);
|
|
197
318
|
const tablePlural = pluralize(modelSnake);
|
|
198
319
|
return `add_${colSnake}_${tablePlural}_table`;
|
|
199
320
|
};
|
|
@@ -226,9 +347,9 @@ const addMigration = async (cmd, migrationArgs, opts) => {
|
|
|
226
347
|
throw ErrorFactory.createCliError(`Missing required create migration for model '${modelArg}'. Create it first: zin create migration ${modelArg}`);
|
|
227
348
|
}
|
|
228
349
|
name = buildAddColumnMigrationName(columnArg, modelArg);
|
|
229
|
-
table = pluralize(
|
|
350
|
+
table = pluralize(toSafeSnakeCase(modelArg));
|
|
230
351
|
// Store the normalized column name for generator placeholder.
|
|
231
|
-
column =
|
|
352
|
+
column = toSafeSnakeCase(columnArg);
|
|
232
353
|
}
|
|
233
354
|
cmd.info(`Creating migration: ${name}...`);
|
|
234
355
|
const result = await MigrationGenerator.generateMigration({
|
|
@@ -250,7 +371,7 @@ const promptModelConfig = async () => {
|
|
|
250
371
|
type: 'input',
|
|
251
372
|
name: 'name',
|
|
252
373
|
message: 'Model name (PascalCase, e.g., User, Post):',
|
|
253
|
-
validate: (v) =>
|
|
374
|
+
validate: (v) => isPascalCaseBase(v) || 'Must be PascalCase',
|
|
254
375
|
},
|
|
255
376
|
{
|
|
256
377
|
type: 'confirm',
|
|
@@ -298,7 +419,7 @@ const promptControllerConfig = async () => {
|
|
|
298
419
|
type: 'input',
|
|
299
420
|
name: 'name',
|
|
300
421
|
message: 'Controller name (PascalCase, e.g., UserController):',
|
|
301
|
-
validate: (v) =>
|
|
422
|
+
validate: (v) => hasPascalCaseSuffix(v, 'Controller') || 'Must be PascalCase ending with "Controller"',
|
|
302
423
|
},
|
|
303
424
|
{
|
|
304
425
|
type: 'list',
|
|
@@ -376,7 +497,7 @@ const promptMiddlewareConfig = async () => {
|
|
|
376
497
|
name: 'name',
|
|
377
498
|
message: 'Middleware name (PascalCase, e.g., AuthMiddleware):',
|
|
378
499
|
validate: (value) => {
|
|
379
|
-
return
|
|
500
|
+
return hasPascalCaseSuffix(value, 'Middleware')
|
|
380
501
|
? true
|
|
381
502
|
: 'Must be PascalCase ending with "Middleware"';
|
|
382
503
|
},
|
|
@@ -384,7 +505,7 @@ const promptMiddlewareConfig = async () => {
|
|
|
384
505
|
]);
|
|
385
506
|
};
|
|
386
507
|
const buildMiddlewareKey = (middlewareName) => {
|
|
387
|
-
const withoutSuffix = middlewareName
|
|
508
|
+
const withoutSuffix = stripSuffix(middlewareName, 'Middleware');
|
|
388
509
|
return `${CommonUtils.camelCase(withoutSuffix)}Middleware`;
|
|
389
510
|
};
|
|
390
511
|
const buildMiddlewareSource = (middlewareName) => {
|
|
@@ -415,24 +536,24 @@ const registerMiddlewareRouteKey = (configSource, middlewareName, middlewareKey)
|
|
|
415
536
|
if (configSource.includes(`${middlewareKey}: ${middlewareName}`)) {
|
|
416
537
|
return { content: configSource, updated: true };
|
|
417
538
|
}
|
|
418
|
-
const
|
|
419
|
-
if (
|
|
539
|
+
const routeBlock = findRouteBlockBounds(configSource);
|
|
540
|
+
if (routeBlock !== undefined) {
|
|
541
|
+
const currentInner = configSource.slice(routeBlock.innerStart, routeBlock.innerEnd);
|
|
542
|
+
const middlewareEntry = `\n ${middlewareKey}: ${middlewareName},`;
|
|
543
|
+
const routeInner = currentInner.trim() === '' ? middlewareEntry : `${currentInner.trimEnd()}${middlewareEntry}`;
|
|
420
544
|
return {
|
|
421
|
-
content: configSource.
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
? `\n ${middlewareKey}: ${middlewareName},`
|
|
425
|
-
: `${prefix}\n ${middlewareKey}: ${middlewareName},`;
|
|
426
|
-
return `route: {${nextInner}\n },`;
|
|
427
|
-
}),
|
|
545
|
+
content: configSource.slice(0, routeBlock.blockStart) +
|
|
546
|
+
`route: {${routeInner}\n },` +
|
|
547
|
+
configSource.slice(routeBlock.blockEnd),
|
|
428
548
|
updated: true,
|
|
429
549
|
};
|
|
430
550
|
}
|
|
431
|
-
|
|
432
|
-
if (!closingPattern.test(configSource)) {
|
|
551
|
+
if (!hasTrailingMiddlewaresTypeCast(configSource)) {
|
|
433
552
|
return { content: configSource, updated: false };
|
|
434
553
|
}
|
|
435
|
-
const
|
|
554
|
+
const trimmed = configSource.trimEnd();
|
|
555
|
+
const middlewareBlock = `\n global: [],\n route: {\n ${middlewareKey}: ${middlewareName},\n },\n} as MiddlewaresType;\n`;
|
|
556
|
+
const inserted = `${trimmed.slice(0, -'} as MiddlewaresType;'.length)}${middlewareBlock}`;
|
|
436
557
|
return { content: inserted, updated: true };
|
|
437
558
|
};
|
|
438
559
|
const printManualMiddlewareRegistrationSnippet = (cmd, middlewareName, middlewareKey) => {
|
|
@@ -451,7 +572,7 @@ const addMiddleware = async (cmd, middlewareName, opts) => {
|
|
|
451
572
|
else if (name === '') {
|
|
452
573
|
throw ErrorFactory.createValidationError('Middleware name is required');
|
|
453
574
|
}
|
|
454
|
-
if (
|
|
575
|
+
if (!hasPascalCaseSuffix(name, 'Middleware')) {
|
|
455
576
|
throw ErrorFactory.createValidationError('Middleware name must be PascalCase ending with "Middleware"');
|
|
456
577
|
}
|
|
457
578
|
const middlewareDir = path.join(projectRoot, 'app', 'Middleware');
|
|
@@ -501,13 +622,13 @@ const promptFactoryConfig = async () => {
|
|
|
501
622
|
type: 'input',
|
|
502
623
|
name: 'name',
|
|
503
624
|
message: 'Factory name (PascalCase, must end with "Factory", e.g., UserFactory):',
|
|
504
|
-
validate: (v) =>
|
|
625
|
+
validate: (v) => hasPascalCaseSuffix(v, 'Factory') || 'Must be PascalCase ending with "Factory"',
|
|
505
626
|
},
|
|
506
627
|
{
|
|
507
628
|
type: 'input',
|
|
508
629
|
name: 'model',
|
|
509
630
|
message: 'Model name (e.g., User, Post):',
|
|
510
|
-
validate: (v) =>
|
|
631
|
+
validate: (v) => isPascalCaseBase(v) || 'Must be PascalCase',
|
|
511
632
|
},
|
|
512
633
|
{
|
|
513
634
|
type: 'confirm',
|
|
@@ -599,14 +720,14 @@ const promptSeederConfig = async () => {
|
|
|
599
720
|
type: 'input',
|
|
600
721
|
name: 'name',
|
|
601
722
|
message: 'Seeder name (PascalCase, must end with "Seeder", e.g., UserSeeder):',
|
|
602
|
-
validate: (v) =>
|
|
723
|
+
validate: (v) => hasPascalCaseSuffix(v, 'Seeder') || 'Must be PascalCase ending with "Seeder"',
|
|
603
724
|
},
|
|
604
725
|
{
|
|
605
726
|
type: 'input',
|
|
606
727
|
name: 'model',
|
|
607
728
|
message: 'Model name (e.g., User, Post):',
|
|
608
729
|
when: (ans) => ans.name !== 'DatabaseSeeder',
|
|
609
|
-
validate: (v) =>
|
|
730
|
+
validate: (v) => isPascalCaseBase(v) || 'Must be PascalCase',
|
|
610
731
|
},
|
|
611
732
|
{
|
|
612
733
|
type: 'input',
|
|
@@ -1043,5 +1164,13 @@ export const AddCommand = Object.freeze({
|
|
|
1043
1164
|
promptResponseFactoryConfig,
|
|
1044
1165
|
promptWorkflowConfig,
|
|
1045
1166
|
getDefaultResponseFields,
|
|
1167
|
+
isPascalCaseBase,
|
|
1168
|
+
toSafeSnakeCase,
|
|
1169
|
+
stripSuffix,
|
|
1170
|
+
skipInlineWhitespace,
|
|
1171
|
+
findMatchingObjectBrace,
|
|
1172
|
+
findRouteBlockBounds,
|
|
1173
|
+
hasTrailingMiddlewaresTypeCast,
|
|
1174
|
+
registerMiddlewareRouteKey,
|
|
1046
1175
|
},
|
|
1047
1176
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DockerCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/DockerCommand.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DockerCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/DockerCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAqMrE,eAAO,MAAM,aAAa;cACd,YAAY;EAuBtB,CAAC"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { generateUuid } from '../../common/utility.js';
|
|
2
1
|
import { BaseCommand } from '../BaseCommand.js';
|
|
3
2
|
import { DockerPushCommand } from '../commands/DockerPushCommand.js';
|
|
4
3
|
import { SpawnUtil } from '../utils/spawn.js';
|
|
5
4
|
import { Logger } from '../../config/logger.js';
|
|
6
5
|
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
7
|
-
import { existsSync, renameSync } from '../../node-singletons/fs.js';
|
|
6
|
+
import { existsSync, readdirSync, renameSync, unlinkSync } from '../../node-singletons/fs.js';
|
|
8
7
|
import { join } from '../../node-singletons/path.js';
|
|
9
8
|
const resolveDefaultWranglerConfig = (cwd) => {
|
|
10
9
|
const candidates = [
|
|
@@ -52,15 +51,44 @@ const isContainersProxyConfig = (config) => {
|
|
|
52
51
|
base === 'wrangler.containers-proxy.toml' ||
|
|
53
52
|
base.startsWith('wrangler.containers-proxy.'));
|
|
54
53
|
};
|
|
54
|
+
const getDevVarsBackupPath = (cwd, name) => join(cwd, `${name}.disabled-by-zin`);
|
|
55
|
+
const clearLegacyDevVarsBackups = (cwd, name) => {
|
|
56
|
+
const legacyPrefix = `${name}.disabled-by-zin-`;
|
|
57
|
+
const entries = readdirSync(cwd);
|
|
58
|
+
for (const entry of entries) {
|
|
59
|
+
if (!entry.startsWith(legacyPrefix))
|
|
60
|
+
continue;
|
|
61
|
+
try {
|
|
62
|
+
unlinkSync(join(cwd, entry));
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// noop
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const reconcileDevVarsBackup = (cwd, name) => {
|
|
70
|
+
const targetPath = join(cwd, name);
|
|
71
|
+
const backupPath = getDevVarsBackupPath(cwd, name);
|
|
72
|
+
clearLegacyDevVarsBackups(cwd, name);
|
|
73
|
+
const hasTarget = existsSync(targetPath);
|
|
74
|
+
const hasBackup = existsSync(backupPath);
|
|
75
|
+
if (!hasBackup)
|
|
76
|
+
return backupPath;
|
|
77
|
+
if (!hasTarget) {
|
|
78
|
+
renameSync(backupPath, targetPath);
|
|
79
|
+
return backupPath;
|
|
80
|
+
}
|
|
81
|
+
unlinkSync(backupPath);
|
|
82
|
+
return backupPath;
|
|
83
|
+
};
|
|
55
84
|
const withDevVarsForConfig = async (cwd, config, envName, fn) => {
|
|
56
|
-
const nonce = generateUuid();
|
|
57
85
|
const moved = [];
|
|
58
86
|
const swappedIn = [];
|
|
59
87
|
const disable = (name) => {
|
|
60
88
|
const from = join(cwd, name);
|
|
61
89
|
if (!existsSync(from))
|
|
62
90
|
return;
|
|
63
|
-
const to =
|
|
91
|
+
const to = reconcileDevVarsBackup(cwd, name);
|
|
64
92
|
renameSync(from, to);
|
|
65
93
|
moved.push({ from, to });
|
|
66
94
|
};
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { type IBaseCommand } from '../BaseCommand';
|
|
2
2
|
export declare const StartCommand: Readonly<{
|
|
3
3
|
create(): IBaseCommand;
|
|
4
|
+
_helpers: {
|
|
5
|
+
isWranglerVarName: (value: string) => boolean;
|
|
6
|
+
toUpperSnakeCaseIdentifier: (value: string) => string;
|
|
7
|
+
isWindowsDriveAbsolutePath: (value: string) => boolean;
|
|
8
|
+
containsCommandToken: (value: string, command: string) => boolean;
|
|
9
|
+
containsZinCommand: (value: string) => boolean;
|
|
10
|
+
};
|
|
4
11
|
}>;
|
|
5
12
|
//# sourceMappingURL=StartCommand.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StartCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/StartCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"StartCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/StartCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAmhCvF,eAAO,MAAM,YAAY;cACb,YAAY;;mCAr9BU,MAAM,KAAG,OAAO;4CAaP,MAAM,KAAG,MAAM;4CA4Bf,MAAM,KAAG,OAAO;sCAetB,MAAM,WAAW,MAAM,KAAG,OAAO;oCAmBnC,MAAM,KAAG,OAAO;;EAq7BjD,CAAC"}
|
|
@@ -4,14 +4,85 @@ import { EnvFileLoader } from '../utils/EnvFileLoader.js';
|
|
|
4
4
|
import { SpawnUtil } from '../utils/spawn.js';
|
|
5
5
|
import { readEnvString } from '../../common/ExternalServiceUtils.js';
|
|
6
6
|
import * as Common from '../../common/index.js';
|
|
7
|
-
import { generateUuid } from '../../common/utility.js';
|
|
8
7
|
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
9
8
|
import { isNonEmptyString } from '../../helper/index.js';
|
|
10
9
|
import { existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from '../../node-singletons/fs.js';
|
|
11
10
|
import * as path from '../../node-singletons/path.js';
|
|
12
11
|
import { ProjectRuntime } from '../../runtime/ProjectRuntime.js';
|
|
13
|
-
const
|
|
14
|
-
const
|
|
12
|
+
const isAsciiUppercaseLetter = (value) => value >= 'A' && value <= 'Z';
|
|
13
|
+
const isAsciiLowercaseLetter = (value) => value >= 'a' && value <= 'z';
|
|
14
|
+
const isAsciiLetter = (value) => isAsciiUppercaseLetter(value) || isAsciiLowercaseLetter(value);
|
|
15
|
+
const isAsciiDigit = (value) => value >= '0' && value <= '9';
|
|
16
|
+
const isWordCharacter = (value) => isAsciiLetter(value) || isAsciiDigit(value) || value === '_';
|
|
17
|
+
const isWranglerVarName = (value) => {
|
|
18
|
+
if (value.length === 0)
|
|
19
|
+
return false;
|
|
20
|
+
const first = value[0] ?? '';
|
|
21
|
+
if (!(isAsciiLetter(first) || first === '_'))
|
|
22
|
+
return false;
|
|
23
|
+
for (let index = 1; index < value.length; index += 1) {
|
|
24
|
+
if (!isWordCharacter(value[index] ?? ''))
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
return true;
|
|
28
|
+
};
|
|
29
|
+
const toUpperSnakeCaseIdentifier = (value) => {
|
|
30
|
+
let output = '';
|
|
31
|
+
let previousWasUnderscore = false;
|
|
32
|
+
for (const char of value) {
|
|
33
|
+
const isAllowed = isAsciiLetter(char) || isAsciiDigit(char);
|
|
34
|
+
const nextChar = isAllowed ? char.toUpperCase() : '_';
|
|
35
|
+
if (nextChar === '_') {
|
|
36
|
+
if (previousWasUnderscore)
|
|
37
|
+
continue;
|
|
38
|
+
previousWasUnderscore = true;
|
|
39
|
+
output += '_';
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
previousWasUnderscore = false;
|
|
43
|
+
output += nextChar;
|
|
44
|
+
}
|
|
45
|
+
let start = 0;
|
|
46
|
+
while (start < output.length && output[start] === '_')
|
|
47
|
+
start += 1;
|
|
48
|
+
let end = output.length;
|
|
49
|
+
while (end > start && output[end - 1] === '_')
|
|
50
|
+
end -= 1;
|
|
51
|
+
return output.slice(start, end);
|
|
52
|
+
};
|
|
53
|
+
const isWindowsDriveAbsolutePath = (value) => {
|
|
54
|
+
if (value.length < 3)
|
|
55
|
+
return false;
|
|
56
|
+
const drive = value[0] ?? '';
|
|
57
|
+
const colon = value[1] ?? '';
|
|
58
|
+
const separator = value[2] ?? '';
|
|
59
|
+
return isAsciiLetter(drive) && colon === ':' && (separator === '\\' || separator === '/');
|
|
60
|
+
};
|
|
61
|
+
const isCommandTokenBoundary = (char) => {
|
|
62
|
+
if (char === undefined)
|
|
63
|
+
return true;
|
|
64
|
+
return !isAsciiLetter(char) && !isAsciiDigit(char);
|
|
65
|
+
};
|
|
66
|
+
const containsCommandToken = (value, command) => {
|
|
67
|
+
let startIndex = 0;
|
|
68
|
+
while (startIndex < value.length) {
|
|
69
|
+
const foundIndex = value.indexOf(command, startIndex);
|
|
70
|
+
if (foundIndex === -1)
|
|
71
|
+
return false;
|
|
72
|
+
const before = foundIndex === 0 ? undefined : value[foundIndex - 1];
|
|
73
|
+
const afterIndex = foundIndex + command.length;
|
|
74
|
+
const after = afterIndex >= value.length ? undefined : value[afterIndex];
|
|
75
|
+
if (isCommandTokenBoundary(before) && isCommandTokenBoundary(after))
|
|
76
|
+
return true;
|
|
77
|
+
startIndex = foundIndex + command.length;
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
};
|
|
81
|
+
const containsZinCommand = (value) => {
|
|
82
|
+
const lower = value.toLowerCase();
|
|
83
|
+
return containsCommandToken(lower, 'zintrust') || containsCommandToken(lower, 'zin');
|
|
84
|
+
};
|
|
85
|
+
const isAbsolutePath = (value) => value.startsWith('/') || isWindowsDriveAbsolutePath(value);
|
|
15
86
|
const resolveNpmPath = () => {
|
|
16
87
|
try {
|
|
17
88
|
return typeof Common.resolveNpmPath === 'function' ? Common.resolveNpmPath() : 'npm';
|
|
@@ -68,10 +139,7 @@ const resolveStandaloneServicePortEnvValue = (cwd) => {
|
|
|
68
139
|
if (!normalizedCwd.includes(serviceRootMarker))
|
|
69
140
|
return '';
|
|
70
141
|
const serviceName = path.basename(normalizedCwd).trim();
|
|
71
|
-
const servicePortKey = serviceName
|
|
72
|
-
.replaceAll(/[^A-Za-z0-9]+/g, '_')
|
|
73
|
-
.replaceAll(/^_+|_+$/g, '')
|
|
74
|
-
.toUpperCase();
|
|
142
|
+
const servicePortKey = toUpperSnakeCaseIdentifier(serviceName);
|
|
75
143
|
const candidateKeys = [
|
|
76
144
|
servicePortKey === '' ? '' : `${servicePortKey}_PORT`,
|
|
77
145
|
'SERVICE_PORT',
|
|
@@ -277,14 +345,30 @@ const buildWorkerDevVarsContent = () => {
|
|
|
277
345
|
.map(([key, value]) => `${key}=${JSON.stringify(value)}`)
|
|
278
346
|
.join('\n') + '\n');
|
|
279
347
|
};
|
|
348
|
+
const getWranglerEnvBackupPath = (targetPath) => `${targetPath}.disabled-by-zin`;
|
|
349
|
+
const reconcileWranglerEnvBackup = (targetPath, backupPath) => {
|
|
350
|
+
const hasTarget = existsSync(targetPath);
|
|
351
|
+
const hasBackup = existsSync(backupPath);
|
|
352
|
+
if (!hasBackup)
|
|
353
|
+
return;
|
|
354
|
+
if (!hasTarget) {
|
|
355
|
+
renameSync(backupPath, targetPath);
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
unlinkSync(backupPath);
|
|
359
|
+
};
|
|
280
360
|
async function withWranglerEnvSnapshot(cwd, envName, fn) {
|
|
281
361
|
const normalizedEnv = typeof envName === 'string' ? envName.trim() : '';
|
|
282
362
|
const targetName = normalizedEnv === '' ? '.dev.vars' : `.dev.vars.${normalizedEnv}`;
|
|
283
363
|
const targetPath = path.join(cwd, targetName);
|
|
284
|
-
const backupPath =
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
364
|
+
const backupPath = getWranglerEnvBackupPath(targetPath);
|
|
365
|
+
try {
|
|
366
|
+
reconcileWranglerEnvBackup(targetPath, backupPath);
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
// noop
|
|
370
|
+
}
|
|
371
|
+
if (existsSync(targetPath)) {
|
|
288
372
|
renameSync(targetPath, backupPath);
|
|
289
373
|
}
|
|
290
374
|
try {
|
|
@@ -299,14 +383,12 @@ async function withWranglerEnvSnapshot(cwd, envName, fn) {
|
|
|
299
383
|
catch {
|
|
300
384
|
// noop
|
|
301
385
|
}
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
// noop
|
|
309
|
-
}
|
|
386
|
+
try {
|
|
387
|
+
if (existsSync(backupPath))
|
|
388
|
+
renameSync(backupPath, targetPath);
|
|
389
|
+
}
|
|
390
|
+
catch {
|
|
391
|
+
// noop
|
|
310
392
|
}
|
|
311
393
|
}
|
|
312
394
|
}
|
|
@@ -404,7 +486,7 @@ const resolveNodeDevCommand = (cwd, packageJson) => {
|
|
|
404
486
|
// IMPORTANT: avoid calling `npm run dev` when the dev script itself invokes `zin`/`zintrust`
|
|
405
487
|
// (e.g. "dev": "zin s"), which would cause infinite recursion.
|
|
406
488
|
const devScript = typeof packageJson.scripts?.['dev'] === 'string' ? String(packageJson.scripts['dev']) : '';
|
|
407
|
-
const devScriptCallsZin =
|
|
489
|
+
const devScriptCallsZin = containsZinCommand(devScript);
|
|
408
490
|
if (hasDevScript(packageJson) && !devScriptCallsZin) {
|
|
409
491
|
const npm = resolveNpmPath();
|
|
410
492
|
return { command: npm, args: ['run', 'dev'] };
|
|
@@ -727,4 +809,11 @@ export const StartCommand = Object.freeze({
|
|
|
727
809
|
});
|
|
728
810
|
return cmd;
|
|
729
811
|
},
|
|
812
|
+
_helpers: {
|
|
813
|
+
isWranglerVarName,
|
|
814
|
+
toUpperSnakeCaseIdentifier,
|
|
815
|
+
isWindowsDriveAbsolutePath,
|
|
816
|
+
containsCommandToken,
|
|
817
|
+
containsZinCommand,
|
|
818
|
+
},
|
|
730
819
|
});
|
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
import type { MiddlewareConfigType } from './type';
|
|
2
2
|
import type { Middleware } from '../middleware/MiddlewareStack';
|
|
3
|
+
import type { MiddlewareFailureResponder } from '../middleware/MiddlewareFailureResponder';
|
|
4
|
+
type SharedMiddlewares = {
|
|
5
|
+
log: Middleware;
|
|
6
|
+
error: Middleware;
|
|
7
|
+
security: Middleware;
|
|
8
|
+
rateLimit: Middleware;
|
|
9
|
+
sanitizeBody: Middleware;
|
|
10
|
+
fillRateLimit: Middleware;
|
|
11
|
+
authRateLimit: Middleware;
|
|
12
|
+
userMutationRateLimit: Middleware;
|
|
13
|
+
csrf: Middleware;
|
|
14
|
+
auth: Middleware;
|
|
15
|
+
jwt: Middleware;
|
|
16
|
+
bulletproof: Middleware;
|
|
17
|
+
validateLogin: Middleware;
|
|
18
|
+
validateRegister: Middleware;
|
|
19
|
+
validateUserStore: Middleware;
|
|
20
|
+
validateUserUpdate: Middleware;
|
|
21
|
+
validateUserFill: Middleware;
|
|
22
|
+
};
|
|
23
|
+
type MiddlewareResponderKey = keyof SharedMiddlewares;
|
|
24
|
+
type MiddlewareResponderConfig = Partial<Record<MiddlewareResponderKey, MiddlewareFailureResponder>>;
|
|
3
25
|
export declare const MiddlewareBody: {
|
|
4
26
|
readonly email: "email";
|
|
5
27
|
readonly password: "password";
|
|
@@ -23,6 +45,7 @@ export type MiddlewaresType = {
|
|
|
23
45
|
max: number;
|
|
24
46
|
message: string;
|
|
25
47
|
};
|
|
48
|
+
responders?: MiddlewareResponderConfig;
|
|
26
49
|
global?: ReadonlyArray<Middleware>;
|
|
27
50
|
route?: Record<string, Middleware>;
|
|
28
51
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/config/middleware.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAUzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/config/middleware.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAUzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAK9D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAC;AAgCzF,KAAK,iBAAiB,GAAG;IACvB,GAAG,EAAE,UAAU,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,UAAU,CAAC;IACrB,SAAS,EAAE,UAAU,CAAC;IACtB,YAAY,EAAE,UAAU,CAAC;IACzB,aAAa,EAAE,UAAU,CAAC;IAC1B,aAAa,EAAE,UAAU,CAAC;IAC1B,qBAAqB,EAAE,UAAU,CAAC;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,GAAG,EAAE,UAAU,CAAC;IAChB,WAAW,EAAE,UAAU,CAAC;IACxB,aAAa,EAAE,UAAU,CAAC;IAC1B,gBAAgB,EAAE,UAAU,CAAC;IAC7B,iBAAiB,EAAE,UAAU,CAAC;IAC9B,kBAAkB,EAAE,UAAU,CAAC;IAC/B,gBAAgB,EAAE,UAAU,CAAC;CAC9B,CAAC;AAEF,KAAK,sBAAsB,GAAG,MAAM,iBAAiB,CAAC;AACtD,KAAK,yBAAyB,GAAG,OAAO,CACtC,MAAM,CAAC,sBAAsB,EAAE,0BAA0B,CAAC,CAC3D,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;CAKjB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACjC,aAAa,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,aAAa,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,qBAAqB,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,UAAU,CAAC,EAAE,yBAAyB,CAAC;IACvC,MAAM,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;EAkBuB,CAAC;AAEnD,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,cAAc,CAAC;AA2RxD,wBAAgB,sBAAsB,IAAI,oBAAoB,CA0C7D;AAID;;;GAGG;AACH,eAAO,MAAM,0BAA0B,QAAO,IAE7C,CAAC;AAwBF,eAAO,MAAM,gBAAgB,EAAE,oBAY7B,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
|