@karmaniverous/smoz 0.2.13 → 0.2.14

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/dist/cjs/index.js CHANGED
@@ -867,14 +867,13 @@ function wrapHandler(functionConfig, business, opts) {
867
867
  assertKeysSubset(envConfig.stage.paramsSchema, envConfig.stage.envKeys, 'stage.envKeys');
868
868
  return async (event, context) => {
869
869
  // Compose typed env schema and parse process.env
870
- const all = deriveAllKeys(envConfig.global.envKeys, envConfig.stage.envKeys, (functionConfig.fnEnvKeys ?? []));
870
+ const all = deriveAllKeys(envConfig.global.envKeys, envConfig.stage.envKeys, functionConfig.fnEnvKeys ?? []);
871
871
  const { globalPick, stagePick } = splitKeysBySchema(all, envConfig.global.paramsSchema, envConfig.stage.paramsSchema);
872
872
  const envSchema = buildEnvSchema(globalPick, stagePick, envConfig.global.paramsSchema, envConfig.stage.paramsSchema);
873
873
  const env = parseTypedEnv(envSchema, process.env);
874
874
  const logger = console;
875
875
  // Non-HTTP: call business directly
876
- const httpTokens = opts?.httpEventTypeTokens ??
877
- defaultHttpEventTypeTokens;
876
+ const httpTokens = opts?.httpEventTypeTokens ?? defaultHttpEventTypeTokens;
878
877
  const isHttp = httpTokens.includes(functionConfig.eventType);
879
878
  if (!isHttp) {
880
879
  return business(event, context, { env, logger });
@@ -937,9 +936,7 @@ const createRegistry = (deps) => {
937
936
  ...(options.basePath ? { basePath: options.basePath } : {}),
938
937
  ...(options.httpContexts ? { httpContexts: options.httpContexts } : {}),
939
938
  ...(options.contentType ? { contentType: options.contentType } : {}),
940
- ...(mergedFnEnvKeys.length
941
- ? { fnEnvKeys: mergedFnEnvKeys }
942
- : {}),
939
+ ...(mergedFnEnvKeys.length ? { fnEnvKeys: mergedFnEnvKeys } : {}),
943
940
  ...(options.eventSchema ? { eventSchema: options.eventSchema } : {}),
944
941
  ...(options.responseSchema
945
942
  ? { responseSchema: options.responseSchema }
@@ -956,9 +953,7 @@ const createRegistry = (deps) => {
956
953
  ...(options.basePath ? { basePath: options.basePath } : {}),
957
954
  ...(options.httpContexts ? { httpContexts: options.httpContexts } : {}),
958
955
  ...(options.contentType ? { contentType: options.contentType } : {}),
959
- ...(mergedFnEnvKeys.length
960
- ? { fnEnvKeys: mergedFnEnvKeys }
961
- : {}),
956
+ ...(mergedFnEnvKeys.length ? { fnEnvKeys: mergedFnEnvKeys } : {}),
962
957
  ...(options.eventSchema ? { eventSchema: options.eventSchema } : {}),
963
958
  ...(options.responseSchema
964
959
  ? { responseSchema: options.responseSchema }
@@ -1125,7 +1120,7 @@ const buildAllServerlessFunctions = (registry, serverless, buildFnEnv) => {
1125
1120
  .split(path.sep)
1126
1121
  .join('/');
1127
1122
  const handler = `${handlerFileRel}.${serverless.defaultHandlerFileExport}`;
1128
- let events = [];
1123
+ let events;
1129
1124
  try {
1130
1125
  const { method, basePath, contexts } = resolveHttpFromFunctionConfig({
1131
1126
  functionName: r.functionName,
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
3
 
4
- var cliHost = require('@karmaniverous/get-dotenv/cliHost');
4
+ var cli = require('@karmaniverous/get-dotenv/cli');
5
5
  var plugins = require('@karmaniverous/get-dotenv/plugins');
6
+ var cliHost = require('@karmaniverous/get-dotenv/cliHost');
6
7
  var packageDirectory = require('package-directory');
7
8
  var fs = require('node:fs');
8
9
  var path = require('node:path');
@@ -1340,138 +1341,135 @@ const runInit = async (root, template = 'default', opts) => {
1340
1341
  * delegates to existing implementations. No business logic here.
1341
1342
  */
1342
1343
  const repoRoot = () => packageDirectory.packageDirectorySync() ?? process.cwd();
1343
- const smozPlugin = () => cliHost.definePlugin({
1344
- id: 'smoz',
1345
- setup(cli) {
1346
- // init
1347
- cli
1348
- .command('init')
1349
- .description('Scaffold a new SMOZ app from a template')
1350
- .option('-t, --template <name>', 'template name', 'default')
1351
- .option('-y, --yes', 'assume “example” on conflicts')
1352
- .option('--no-install', 'do not install dependencies')
1353
- .option('--install <pm>', 'explicit package manager (npm|pnpm|yarn|bun)')
1354
- .option('--conflict <policy>', 'overwrite|example|skip|ask')
1355
- .action(async (opts) => {
1356
- const root = repoRoot();
1357
- const template = typeof opts.template === 'string' ? opts.template : 'default';
1358
- const yes = Boolean(opts.yes);
1359
- const noInstall = opts.install === undefined &&
1360
- opts['noInstall'] !== undefined
1361
- ? Boolean(opts['noInstall'])
1362
- : Boolean(opts['noInstall']);
1363
- const pmRaw = opts.install ?? undefined;
1364
- const conflict = opts.conflict ?? undefined;
1365
- await runInit(root, template, {
1366
- ...(yes ? { yes } : {}),
1367
- ...(noInstall ? { noInstall } : {}),
1368
- ...(pmRaw ? { install: pmRaw } : {}),
1369
- ...(conflict ? { conflict } : {}),
1370
- });
1371
- });
1372
- // add
1373
- cli
1374
- .command('add')
1375
- .description('Scaffold a function under app/functions')
1376
- .argument('<spec>', 'spec: <eventType>/<segments...>/<method>')
1377
- .action(async (spec) => {
1378
- const root = repoRoot();
1379
- if (typeof spec !== 'string' || !spec.trim()) {
1380
- throw new Error('smoz add: missing <spec> (e.g., rest/foo/get)');
1381
- }
1382
- await runAdd(root, spec);
1383
- });
1384
- // register
1385
- cli
1386
- .command('register')
1387
- .description('Generate side-effect register files')
1388
- .action(async () => {
1389
- const root = repoRoot();
1390
- await runRegister(root);
1391
- });
1392
- // openapi
1393
- cli
1394
- .command('openapi')
1395
- .description('Generate OpenAPI document (app/generated/openapi.json)')
1396
- .option('-V, --verbose', 'verbose output')
1397
- .action(async (opts) => {
1398
- const root = repoRoot();
1399
- await runOpenapi(root, { verbose: !!opts.verbose });
1344
+ const setupSmozCommands = (cli) => {
1345
+ // init
1346
+ cli
1347
+ .command('init')
1348
+ .description('Scaffold a new SMOZ app from a template')
1349
+ .option('-t, --template <name>', 'template name', 'default')
1350
+ .option('-y, --yes', 'assume “example” on conflicts')
1351
+ .option('--no-install', 'do not install dependencies')
1352
+ .option('--install <pm>', 'explicit package manager (npm|pnpm|yarn|bun)')
1353
+ .option('--conflict <policy>', 'overwrite|example|skip|ask')
1354
+ .action(async (opts) => {
1355
+ const root = repoRoot();
1356
+ const template = typeof opts.template === 'string' ? opts.template : 'default';
1357
+ const yes = Boolean(opts.yes);
1358
+ const noInstall = Boolean(opts['noInstall']);
1359
+ const pmRaw = opts.install ?? undefined;
1360
+ const conflict = opts.conflict ?? undefined;
1361
+ await runInit(root, template, {
1362
+ ...(yes ? { yes } : {}),
1363
+ ...(noInstall ? { noInstall } : {}),
1364
+ ...(pmRaw ? { install: pmRaw } : {}),
1365
+ ...(conflict ? { conflict } : {}),
1400
1366
  });
1401
- // dev
1402
- cli
1403
- .command('dev')
1404
- .description('Dev loop: register/openapi + local backend (inline|offline)')
1405
- .option('-r, --register', 'run register step (default on)')
1406
- .option('-R, --no-register', 'disable register step')
1407
- .option('-o, --openapi', 'run openapi step (default on)')
1408
- .option('-O, --no-openapi', 'disable openapi step')
1409
- .option('-l, --local [mode]', 'local mode: inline | offline | false (default inline)')
1410
- .option('-s, --stage <name>', 'stage name')
1411
- .option('-p, --port <number>', 'port (0 = random free port)')
1412
- .option('-V, --verbose', 'verbose output')
1413
- .action(async (opts) => {
1414
- const root = repoRoot();
1415
- // register/openapi defaults (on); explicit negations take precedence.
1416
- const register = opts.register === true
1417
- ? true
1418
- : opts.noRegister
1419
- ? false
1420
- : true;
1421
- const openapi = opts.openapi === true
1422
- ? true
1423
- : opts.noOpenapi
1424
- ? false
1425
- : true;
1426
- // local mode parsing
1427
- const raw = opts.local;
1428
- let local = 'inline';
1429
- if (raw === 'inline' || raw === 'offline')
1430
- local = raw;
1431
- else if (raw === true)
1432
- local = 'inline';
1433
- else if (raw === 'false')
1434
- local = false;
1435
- const port = typeof opts.port === 'string'
1436
- ? Number(opts.port)
1437
- : typeof opts.port === 'number'
1438
- ? opts.port
1439
- : undefined;
1440
- await runDev(root, {
1441
- register,
1442
- openapi,
1443
- local,
1444
- ...(typeof opts.stage === 'string' ? { stage: opts.stage } : {}),
1445
- ...(typeof port === 'number' ? { port } : {}),
1446
- verbose: !!opts.verbose,
1447
- });
1367
+ });
1368
+ // add
1369
+ cli
1370
+ .command('add')
1371
+ .description('Scaffold a function under app/functions')
1372
+ .argument('<spec>', 'spec: <eventType>/<segments...>/<method>')
1373
+ .action(async (spec) => {
1374
+ const root = repoRoot();
1375
+ if (typeof spec !== 'string' || !spec.trim()) {
1376
+ throw new Error('smoz add: missing <spec> (e.g., rest/foo/get)');
1377
+ }
1378
+ await runAdd(root, spec);
1379
+ });
1380
+ // register
1381
+ cli
1382
+ .command('register')
1383
+ .description('Generate side-effect register files')
1384
+ .action(async () => {
1385
+ const root = repoRoot();
1386
+ await runRegister(root);
1387
+ });
1388
+ // openapi
1389
+ cli
1390
+ .command('openapi')
1391
+ .description('Generate OpenAPI document (app/generated/openapi.json)')
1392
+ .option('-V, --verbose', 'verbose output')
1393
+ .action(async (opts) => {
1394
+ const root = repoRoot();
1395
+ await runOpenapi(root, { verbose: !!opts.verbose });
1396
+ });
1397
+ // dev
1398
+ cli
1399
+ .command('dev')
1400
+ .description('Dev loop: register/openapi + local backend (inline|offline)')
1401
+ .option('-r, --register', 'run register step (default on)')
1402
+ .option('-R, --no-register', 'disable register step')
1403
+ .option('-o, --openapi', 'run openapi step (default on)')
1404
+ .option('-O, --no-openapi', 'disable openapi step')
1405
+ .option('-l, --local [mode]', 'local mode: inline | offline | false (default inline)')
1406
+ .option('-s, --stage <name>', 'stage name')
1407
+ .option('-p, --port <number>', 'port (0 = random free port)')
1408
+ .option('-V, --verbose', 'verbose output')
1409
+ .action(async (opts) => {
1410
+ const root = repoRoot();
1411
+ // register/openapi defaults (on); explicit negations take precedence.
1412
+ const register = opts.register === true
1413
+ ? true
1414
+ : opts.noRegister
1415
+ ? false
1416
+ : true;
1417
+ const openapi = opts.openapi === true
1418
+ ? true
1419
+ : opts.noOpenapi
1420
+ ? false
1421
+ : true;
1422
+ // local mode parsing
1423
+ const raw = opts.local;
1424
+ let local = 'inline';
1425
+ if (raw === 'inline' || raw === 'offline')
1426
+ local = raw;
1427
+ else if (raw === true)
1428
+ local = 'inline';
1429
+ else if (raw === 'false')
1430
+ local = false;
1431
+ const port = typeof opts.port === 'string'
1432
+ ? Number(opts.port)
1433
+ : typeof opts.port === 'number'
1434
+ ? opts.port
1435
+ : undefined;
1436
+ await runDev(root, {
1437
+ register,
1438
+ openapi,
1439
+ local,
1440
+ ...(typeof opts.stage === 'string' ? { stage: opts.stage } : {}),
1441
+ ...(typeof port === 'number' ? { port } : {}),
1442
+ verbose: !!opts.verbose,
1448
1443
  });
1449
- },
1444
+ });
1445
+ };
1446
+ const smozPlugin = () => cliHost.definePlugin({
1447
+ ns: 'smoz',
1448
+ setup: setupSmozCommands,
1450
1449
  });
1451
1450
 
1452
1451
  /**
1453
1452
  * SMOZ CLI — plugin-first host built on get-dotenv.
1454
1453
  *
1455
- * - Build a GetDotenvCli host, install included plugins (cmd/batch/aws),
1456
- * and install the SMOZ command plugin (init/add/register/openapi/dev).
1457
- * - Resolve dotenv context once, then parse argv.
1454
+ * - Create the supported GetDotenv CLI runner so root options, resolution hooks,
1455
+ * and plugin installation stay aligned with the get-dotenv host API.
1456
+ * - Install included plugins (cmd/batch/aws) and the SMOZ command plugin
1457
+ * (init/add/register/openapi/dev).
1458
1458
  */
1459
- const main = async () => {
1460
- const cli = new cliHost.GetDotenvCli('smoz');
1461
- await cli.brand({
1462
- importMetaUrl: (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)),
1463
- description: 'SMOZ CLI',
1464
- });
1465
- cli
1466
- .attachRootOptions()
1467
- .use(smozPlugin())
1468
- .use(plugins.awsPlugin())
1469
- .use(plugins.cmdPlugin({
1470
- asDefault: true,
1471
- optionAlias: '-c, --cmd <command...>',
1472
- }))
1473
- .use(plugins.batchPlugin())
1474
- .passOptions();
1475
- await cli.parseAsync();
1476
- };
1459
+ const main = cli.createCli({
1460
+ alias: 'smoz',
1461
+ compose: (cli) => {
1462
+ const setupResult = smozPlugin().setup(cli);
1463
+ if (setupResult !== undefined) {
1464
+ throw new Error('smozPlugin root setup must remain synchronous.');
1465
+ }
1466
+ return cli
1467
+ .use(plugins.awsPlugin())
1468
+ .use(plugins.cmdPlugin({
1469
+ asDefault: true,
1470
+ optionAlias: '-c, --cmd <command...>',
1471
+ }))
1472
+ .use(plugins.batchPlugin());
1473
+ },
1474
+ });
1477
1475
  void main();
@@ -190,8 +190,7 @@ const loadHandlers = async (root, app) => {
190
190
  if (typeof handler !== 'function')
191
191
  continue;
192
192
  for (const evt of def.events) {
193
- const httpEvt = evt
194
- .http;
193
+ const httpEvt = evt.http;
195
194
  const method = (httpEvt?.method ?? '').toUpperCase();
196
195
  const pattern = '/' + (httpEvt?.path ?? '').replace(/^\/+/, '');
197
196
  if (!method || !pattern)
package/dist/mjs/index.js CHANGED
@@ -865,14 +865,13 @@ function wrapHandler(functionConfig, business, opts) {
865
865
  assertKeysSubset(envConfig.stage.paramsSchema, envConfig.stage.envKeys, 'stage.envKeys');
866
866
  return async (event, context) => {
867
867
  // Compose typed env schema and parse process.env
868
- const all = deriveAllKeys(envConfig.global.envKeys, envConfig.stage.envKeys, (functionConfig.fnEnvKeys ?? []));
868
+ const all = deriveAllKeys(envConfig.global.envKeys, envConfig.stage.envKeys, functionConfig.fnEnvKeys ?? []);
869
869
  const { globalPick, stagePick } = splitKeysBySchema(all, envConfig.global.paramsSchema, envConfig.stage.paramsSchema);
870
870
  const envSchema = buildEnvSchema(globalPick, stagePick, envConfig.global.paramsSchema, envConfig.stage.paramsSchema);
871
871
  const env = parseTypedEnv(envSchema, process.env);
872
872
  const logger = console;
873
873
  // Non-HTTP: call business directly
874
- const httpTokens = opts?.httpEventTypeTokens ??
875
- defaultHttpEventTypeTokens;
874
+ const httpTokens = opts?.httpEventTypeTokens ?? defaultHttpEventTypeTokens;
876
875
  const isHttp = httpTokens.includes(functionConfig.eventType);
877
876
  if (!isHttp) {
878
877
  return business(event, context, { env, logger });
@@ -935,9 +934,7 @@ const createRegistry = (deps) => {
935
934
  ...(options.basePath ? { basePath: options.basePath } : {}),
936
935
  ...(options.httpContexts ? { httpContexts: options.httpContexts } : {}),
937
936
  ...(options.contentType ? { contentType: options.contentType } : {}),
938
- ...(mergedFnEnvKeys.length
939
- ? { fnEnvKeys: mergedFnEnvKeys }
940
- : {}),
937
+ ...(mergedFnEnvKeys.length ? { fnEnvKeys: mergedFnEnvKeys } : {}),
941
938
  ...(options.eventSchema ? { eventSchema: options.eventSchema } : {}),
942
939
  ...(options.responseSchema
943
940
  ? { responseSchema: options.responseSchema }
@@ -954,9 +951,7 @@ const createRegistry = (deps) => {
954
951
  ...(options.basePath ? { basePath: options.basePath } : {}),
955
952
  ...(options.httpContexts ? { httpContexts: options.httpContexts } : {}),
956
953
  ...(options.contentType ? { contentType: options.contentType } : {}),
957
- ...(mergedFnEnvKeys.length
958
- ? { fnEnvKeys: mergedFnEnvKeys }
959
- : {}),
954
+ ...(mergedFnEnvKeys.length ? { fnEnvKeys: mergedFnEnvKeys } : {}),
960
955
  ...(options.eventSchema ? { eventSchema: options.eventSchema } : {}),
961
956
  ...(options.responseSchema
962
957
  ? { responseSchema: options.responseSchema }
@@ -1123,7 +1118,7 @@ const buildAllServerlessFunctions = (registry, serverless, buildFnEnv) => {
1123
1118
  .split(sep)
1124
1119
  .join('/');
1125
1120
  const handler = `${handlerFileRel}.${serverless.defaultHandlerFileExport}`;
1126
- let events = [];
1121
+ let events;
1127
1122
  try {
1128
1123
  const { method, basePath, contexts } = resolveHttpFromFunctionConfig({
1129
1124
  functionName: r.functionName,
package/package.json CHANGED
@@ -13,64 +13,63 @@
13
13
  "url": "https://github.com/karmaniverous/smoz/issues"
14
14
  },
15
15
  "dependencies": {
16
- "@karmaniverous/get-dotenv": "^5.2.6",
17
- "@middy/core": "^6.4.5",
18
- "@middy/http-content-negotiation": "^6.4.5",
19
- "@middy/http-cors": "^6.4.5",
20
- "@middy/http-error-handler": "^6.4.5",
21
- "@middy/http-event-normalizer": "^6.4.5",
22
- "@middy/http-header-normalizer": "^6.4.5",
23
- "@middy/http-json-body-parser": "^6.4.5",
24
- "@middy/http-response-serializer": "^6.4.5",
16
+ "@karmaniverous/get-dotenv": "^7.0.11",
17
+ "@middy/core": "^7.7.0",
18
+ "@middy/http-content-negotiation": "^7.7.0",
19
+ "@middy/http-cors": "^7.7.0",
20
+ "@middy/http-error-handler": "^7.7.0",
21
+ "@middy/http-event-normalizer": "^7.7.0",
22
+ "@middy/http-header-normalizer": "^7.7.0",
23
+ "@middy/http-json-body-parser": "^7.7.0",
24
+ "@middy/http-response-serializer": "^7.7.0",
25
25
  "aws-lambda": "^1.0.7",
26
- "chokidar": "^4.0.3",
26
+ "chokidar": "^5.0.0",
27
27
  "http-errors": "^2.0.1",
28
- "package-directory": "^8.1.0",
28
+ "package-directory": "^8.2.0",
29
29
  "radash": "^12.1.1",
30
- "zod": "^4.1.13"
30
+ "zod": "^4.4.3"
31
31
  },
32
32
  "description": "John Galt Services back end.",
33
33
  "devDependencies": {
34
- "@dotenvx/dotenvx": "^1.51.1",
35
- "@eslint/js": "^9.39.1",
34
+ "@dotenvx/dotenvx": "^2.10.0",
35
+ "@eslint/js": "^10.0.1",
36
36
  "@rollup/plugin-alias": "^6.0.0",
37
37
  "@rollup/plugin-typescript": "^12.3.0",
38
- "@serverless/typescript": "^4.23.0",
39
- "@types/aws-lambda": "^8.10.159",
38
+ "@serverless/typescript": "^4.30.0",
39
+ "@types/aws-lambda": "^8.10.162",
40
40
  "@types/fs-extra": "^11.0.4",
41
41
  "@types/http-errors": "^2.0.5",
42
- "@types/node": "^24",
43
- "@types/serverless": "^3.12.27",
44
- "@vitest/coverage-v8": "^4.0.13",
45
- "auto-changelog": "^2.5.0",
46
- "eslint": "^9.39.1",
42
+ "@types/node": "^26",
43
+ "@types/serverless": "^3.12.28",
44
+ "@vitest/coverage-v8": "^4.1.10",
45
+ "auto-changelog": "^2.6.0",
46
+ "eslint": "^10.7.0",
47
47
  "eslint-config-prettier": "^10.1.8",
48
- "eslint-plugin-prettier": "^5.5.4",
49
- "eslint-plugin-simple-import-sort": "^12.1.1",
50
- "fs-extra": "^11.3.2",
51
- "knip": "^5.70.2",
52
- "lefthook": "^2.0.4",
53
- "prettier": "^3.6.2",
54
- "release-it": "^19.0.6",
55
- "rimraf": "^6.1.2",
56
- "rollup": "^4.53.3",
57
- "rollup-plugin-dts": "^6.2.3",
58
- "serverless": "^4.25.0",
48
+ "eslint-plugin-prettier": "^5.5.6",
49
+ "eslint-plugin-simple-import-sort": "^13.0.0",
50
+ "fs-extra": "^11.3.6",
51
+ "knip": "^6.27.0",
52
+ "lefthook": "^2.1.10",
53
+ "prettier": "^3.9.5",
54
+ "release-it": "^20.2.1",
55
+ "rimraf": "^6.1.3",
56
+ "rollup": "^4.62.2",
57
+ "rollup-plugin-dts": "^6.4.1",
58
+ "serverless": "^4.39.0",
59
59
  "serverless-apigateway-log-retention": "^1.1.0",
60
60
  "serverless-deployment-bucket": "^1.6.0",
61
- "serverless-domain-manager": "^8.0.0",
62
- "serverless-offline": "^14.4.0",
61
+ "serverless-domain-manager": "^10.2.0",
62
+ "serverless-offline": "^14.7.4",
63
63
  "serverless-plugin-common-excludes": "^4.0.0",
64
- "tsx": "^4.20.6",
65
- "typedoc": "^0.28.14",
66
- "typedoc-plugin-mdn-links": "^5.0.10",
64
+ "tsx": "^4.23.1",
65
+ "typedoc": "^0.28.20",
66
+ "typedoc-plugin-mdn-links": "^5.1.1",
67
67
  "typedoc-plugin-replace-text": "^4.2.0",
68
68
  "typedoc-plugin-zod": "^1.4.3",
69
- "typescript": "^5.9.3",
70
- "typescript-eslint": "^8.48.0",
71
- "vite-tsconfig-paths": "^5.1.4",
72
- "vitest": "^4.0.13",
73
- "zod-openapi": "^5.4.3"
69
+ "typescript": "^6.0.3",
70
+ "typescript-eslint": "^8.64.0",
71
+ "vitest": "^4.1.10",
72
+ "zod-openapi": "^6.0.0"
74
73
  },
75
74
  "engines": {
76
75
  "node": ">=22.19.0"
@@ -184,7 +183,7 @@
184
183
  "templates:lint": "eslint --fix -c templates/default/eslint.config.ts \"templates/default/**/*.{ts,tsx,js,jsx}\" \"templates/default/eslint.config.ts\""
185
184
  },
186
185
  "type": "module",
187
- "version": "0.2.13",
186
+ "version": "0.2.14",
188
187
  "volta": {
189
188
  "node": "22.19.0"
190
189
  }