@zintrust/core 0.4.18 → 0.4.20

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.
Files changed (58) hide show
  1. package/package.json +1 -1
  2. package/src/cli/commands/AddCommand.d.ts +16 -0
  3. package/src/cli/commands/AddCommand.d.ts.map +1 -1
  4. package/src/cli/commands/AddCommand.js +157 -28
  5. package/src/cli/commands/DockerCommand.d.ts.map +1 -1
  6. package/src/cli/commands/DockerCommand.js +32 -4
  7. package/src/cli/commands/StartCommand.d.ts +7 -0
  8. package/src/cli/commands/StartCommand.d.ts.map +1 -1
  9. package/src/cli/commands/StartCommand.js +109 -20
  10. package/src/config/middleware.d.ts +23 -0
  11. package/src/config/middleware.d.ts.map +1 -1
  12. package/src/config/middleware.js +66 -31
  13. package/src/functions/cloudflare.d.ts.map +1 -1
  14. package/src/functions/cloudflare.js +28 -12
  15. package/src/http/Kernel.d.ts.map +1 -1
  16. package/src/http/Kernel.js +27 -1
  17. package/src/index.d.ts +2 -0
  18. package/src/index.d.ts.map +1 -1
  19. package/src/index.js +5 -3
  20. package/src/middleware/AuthMiddleware.d.ts +2 -0
  21. package/src/middleware/AuthMiddleware.d.ts.map +1 -1
  22. package/src/middleware/AuthMiddleware.js +8 -1
  23. package/src/middleware/BulletproofAuthMiddleware.d.ts +2 -0
  24. package/src/middleware/BulletproofAuthMiddleware.d.ts.map +1 -1
  25. package/src/middleware/BulletproofAuthMiddleware.js +13 -5
  26. package/src/middleware/CsrfMiddleware.d.ts +2 -0
  27. package/src/middleware/CsrfMiddleware.d.ts.map +1 -1
  28. package/src/middleware/CsrfMiddleware.js +9 -3
  29. package/src/middleware/ErrorHandlerMiddleware.d.ts +5 -1
  30. package/src/middleware/ErrorHandlerMiddleware.d.ts.map +1 -1
  31. package/src/middleware/ErrorHandlerMiddleware.js +12 -2
  32. package/src/middleware/JwtAuthMiddleware.d.ts +2 -0
  33. package/src/middleware/JwtAuthMiddleware.d.ts.map +1 -1
  34. package/src/middleware/JwtAuthMiddleware.js +39 -4
  35. package/src/middleware/MiddlewareFailureResponder.d.ts +15 -0
  36. package/src/middleware/MiddlewareFailureResponder.d.ts.map +1 -0
  37. package/src/middleware/MiddlewareFailureResponder.js +15 -0
  38. package/src/middleware/RateLimiter.d.ts +2 -0
  39. package/src/middleware/RateLimiter.d.ts.map +1 -1
  40. package/src/middleware/RateLimiter.js +10 -4
  41. package/src/middleware/SecurityMiddleware.d.ts +1 -1
  42. package/src/middleware/SecurityMiddleware.d.ts.map +1 -1
  43. package/src/middleware/SecurityMiddleware.js +38 -7
  44. package/src/middleware/ValidationMiddleware.d.ts +11 -6
  45. package/src/middleware/ValidationMiddleware.d.ts.map +1 -1
  46. package/src/middleware/ValidationMiddleware.js +48 -19
  47. package/src/middleware/index.d.ts +1 -0
  48. package/src/middleware/index.d.ts.map +1 -1
  49. package/src/middleware/index.js +1 -0
  50. package/src/runtime/RuntimeAdapter.d.ts.map +1 -1
  51. package/src/runtime/RuntimeAdapter.js +12 -2
  52. package/src/runtime/WorkersModule.d.ts.map +1 -1
  53. package/src/runtime/WorkersModule.js +4 -3
  54. package/src/security/Xss.d.ts +2 -2
  55. package/src/security/Xss.d.ts.map +1 -1
  56. package/src/security/Xss.js +3 -4
  57. package/src/templates/project/basic/app/Middleware/AuthFailureResponder.ts.tpl +10 -0
  58. package/src/templates/project/basic/config/middleware.ts.tpl +18 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zintrust/core",
3
- "version": "0.4.18",
3
+ "version": "0.4.20",
4
4
  "description": "Production-grade TypeScript backend framework for JavaScript",
5
5
  "homepage": "https://zintrust.com",
6
6
  "repository": {
@@ -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":"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"}
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) => /^[a-z]+$/.test(v) || 'Must be lowercase letters only',
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) => /^[a-z_]+$/.test(v) || 'Must be snake_case',
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 = CommonUtils.toSnakeCase(model).replaceAll(/[^a-z0-9_]+/g, '_');
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 = CommonUtils.toSnakeCase(column).replaceAll(/[^a-z0-9_]+/g, '_');
196
- const modelSnake = CommonUtils.toSnakeCase(model).replaceAll(/[^a-z0-9_]+/g, '_');
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(CommonUtils.toSnakeCase(modelArg).replaceAll(/[^a-z0-9_]+/g, '_'));
350
+ table = pluralize(toSafeSnakeCase(modelArg));
230
351
  // Store the normalized column name for generator placeholder.
231
- column = CommonUtils.toSnakeCase(columnArg).replaceAll(/[^a-z0-9_]+/g, '_');
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) => /^[A-Z][a-zA-Z\d]*$/.test(v) || 'Must be PascalCase',
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) => /^[A-Z][a-zA-Z\d]*Controller$/.test(v) || 'Must be PascalCase ending with "Controller"',
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 /^[A-Z][a-zA-Z\d]*Middleware$/.test(value)
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.replace(/Middleware$/, '');
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 routeBlockPattern = /route:\s*\{([\s\S]*?)\n\s*\},/;
419
- if (routeBlockPattern.test(configSource)) {
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.replace(routeBlockPattern, (_match, inner) => {
422
- const prefix = inner.trim() === '' ? '' : inner.replace(/\s*$/, '');
423
- const nextInner = prefix === ''
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
- const closingPattern = /\n\} as MiddlewaresType;\s*$/;
432
- if (!closingPattern.test(configSource)) {
551
+ if (!hasTrailingMiddlewaresTypeCast(configSource)) {
433
552
  return { content: configSource, updated: false };
434
553
  }
435
- const inserted = configSource.replace(closingPattern, `\n global: [],\n route: {\n ${middlewareKey}: ${middlewareName},\n },\n} as MiddlewaresType;\n`);
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 (!/^[A-Z][a-zA-Z\d]*Middleware$/.test(name)) {
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) => /^[A-Z][a-zA-Z\d]*Factory$/.test(v) || 'Must be PascalCase ending with "Factory"',
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) => /^[A-Z][a-zA-Z\d]*$/.test(v) || 'Must be PascalCase',
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) => /^[A-Z][a-zA-Z\d]*Seeder$/.test(v) || 'Must be PascalCase ending with "Seeder"',
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) => /^[A-Z][a-zA-Z\d]*$/.test(v) || 'Must be PascalCase',
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":"AACA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA+JrE,eAAO,MAAM,aAAa;cACd,YAAY;EAuBtB,CAAC"}
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 = join(cwd, `${name}.disabled-by-zin-${nonce}`);
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;AA26BvF,eAAO,MAAM,YAAY;cACb,YAAY;EAmCtB,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 isWranglerVarName = (value) => /^[A-Za-z_]\w*$/.test(value);
14
- const isAbsolutePath = (value) => value.startsWith('/') || /^[A-Za-z]:[\\/]/.test(value);
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 = existsSync(targetPath)
285
- ? `${targetPath}.disabled-by-zin-${generateUuid()}`
286
- : undefined;
287
- if (backupPath !== undefined) {
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
- if (backupPath !== undefined) {
303
- try {
304
- if (existsSync(backupPath))
305
- renameSync(backupPath, targetPath);
306
- }
307
- catch {
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 = /\bzin(?:trust)?\b/.test(devScript);
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;AAwD9D,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,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;AAoOxD,wBAAgB,sBAAsB,IAAI,oBAAoB,CAwC7D;AAID;;;GAGG;AACH,eAAO,MAAM,0BAA0B,QAAO,IAE7C,CAAC;AAwBF,eAAO,MAAM,gBAAgB,EAAE,oBAY7B,CAAC;AAEH,eAAe,gBAAgB,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"}