vovk-cli 0.0.1-draft.380 → 0.0.1-draft.381

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 CHANGED
@@ -1,29 +1,31 @@
1
- <p align="center">
2
- <picture>
3
- <source width="300" media="(prefers-color-scheme: dark)" srcset="https://vovk.dev/vovk-logo-white.svg">
4
- <source width="300" media="(prefers-color-scheme: light)" srcset="https://vovk.dev/vovk-logo.svg">
5
- <img width="300" alt="vovk" src="https://vovk.dev/vovk-logo.svg">
6
- </picture><br>
7
- <strong>RESTful + RPC = ♥️</strong>
8
- </p>
9
-
10
1
  <p align="center">
11
- Back-end meta-framework for <a href="https://nextjs.org/docs/app">Next.js</a>
2
+ <a href="https://vovk.dev">
3
+ <picture>
4
+ <source width="300" media="(prefers-color-scheme: dark)" srcset="https://vovk.dev/vovk-logo-white.svg">
5
+ <source width="300" media="(prefers-color-scheme: light)" srcset="https://vovk.dev/vovk-logo.svg">
6
+ <img width="300" alt="vovk" src="https://vovk.dev/vovk-logo.svg">
7
+ </picture>
8
+ </a>
9
+ <br>
10
+ <strong>Back-end for <a href="https://nextjs.org/">Next.js</a></strong>
12
11
  </p>
13
12
 
14
13
  ---
15
14
 
16
15
  ## vovk-cli [![npm version](https://badge.fury.io/js/vovk-cli.svg)](https://www.npmjs.com/package/vovk-cli)
17
16
 
18
- The Vovk.ts CLI that generates schema and client but also provides some useful utilities for the development process.
17
+ The Vovk.ts [CLI](https://vovk.dev/cli) that will be used as a devDependency in a Vovk.ts app.
19
18
 
20
19
  ```sh
21
20
  npm install -D vovk-cli
22
21
  ```
23
22
 
24
- - [vovk dev](https://vovk.dev/cli/vovk-dev) - starts the development script that watches the changes in controllers and regenerates the schema and client.
25
- - [vovk generate](https://vovk.dev/cli/vovk-generate) - generates the client based on the schema.
26
- - [vovk init](https://vovk.dev/cli/vovk-init) - initializes the Vovk.ts project.
27
- - [vovk new](https://vovk.dev/cli/vovk-new) - generates a new controller, service or a custom module.
23
+ - [vovk dev](https://vovk.dev/dev) - starts the development script that watches the changes in [controllers](https://vovk.dev/controller) and regenerates the [schema](https://vovk.dev/schema) and [client](https://vovk.dev/typescript).
24
+ - [vovk generate](https://vovk.dev/generate) - generates the client based on the schema.
25
+ - [vovk bundle](https://vovk.dev/bundle) - bundles the client with [tsdown](https://tsdown.dev/).
26
+ - [vovk init](https://vovk.dev/init) - initializes Vovk.ts project.
27
+ - [vovk new](https://vovk.dev/new) - generates a new controller, service or a custom module.
28
28
 
29
- For more information, please visit the [CLI documentation](https://vovk.dev/cli) or use `npx vovk-cli --help` to get the list of available commands and options.
29
+ ```sh
30
+ npx vovk-cli --help
31
+ ```
@@ -18,9 +18,9 @@
18
18
  ## <%= controllerSchema.rpcModuleName %>
19
19
  <% Object.entries(controllerSchema.handlers).forEach(([handlerName, handlerSchema]) => { %>
20
20
  ### <%= controllerSchema.rpcModuleName %>.<%= handlerName %>
21
- <%- handlerSchema.openapi?.summary ? `> ${handlerSchema.openapi.summary}` : '' %>
21
+ <%- handlerSchema.operationObject?.summary ? `> ${handlerSchema.operationObject.summary}` : '' %>
22
22
 
23
- <%- handlerSchema.openapi?.description ? `${handlerSchema.openapi.description}` : '' %>
23
+ <%- handlerSchema.operationObject?.description ? `${handlerSchema.operationObject.description}` : '' %>
24
24
 
25
25
  <% const forceApiRoot = t.segmentMeta[segment.segmentName].forceApiRoot ?? controllerSchema.forceApiRoot; %>
26
26
  `<%= handlerSchema.httpMethod %> <%= [...(forceApiRoot ? [forceApiRoot] : [t.apiRoot, segmentName]), controllerSchema.prefix, handlerSchema.path].map((part, i) => i > 0 ? t._.trim(part, '/') : part).filter(Boolean).join('/') %>`
@@ -1,23 +1,39 @@
1
1
  import path from 'node:path';
2
2
  import fs from 'node:fs/promises';
3
- import { build } from 'tsdown';
4
3
  import groupBy from 'lodash/groupBy.js';
5
4
  import { generate } from '../generate/generate.mjs';
6
5
  import { BuiltInTemplateName } from '../getProjectInfo/getConfig/getTemplateDefs.mjs';
7
6
  import chalkHighlightThing from '../utils/chalkHighlightThing.mjs';
8
7
  import { locateSegments } from '../locateSegments.mjs';
8
+ /*
9
+ async function tsdownBundle({
10
+ outDirAbsolute,
11
+ tsFullClientOutAbsoluteDirInput,
12
+ }: {
13
+ outDirAbsolute: string;
14
+ tsFullClientOutAbsoluteDirInput: string;
15
+ }) {
16
+ const { build } = await import('tsdown');
17
+
18
+ await build({
19
+ entry: path.join(tsFullClientOutAbsoluteDirInput, './index.ts'),
20
+ dts: true,
21
+ format: ['cjs', 'esm'],
22
+ hash: false,
23
+ fixedExtension: true,
24
+ clean: true,
25
+ ...tsdownBuildOptions,
26
+ outDir: outDirAbsolute,
27
+ });
28
+ } */
9
29
  export async function bundle({ projectInfo, fullSchema, cliBundleOptions, }) {
10
30
  const { config, log, cwd, apiDirAbsolutePath } = projectInfo;
11
31
  const locatedSegments = await locateSegments({ dir: apiDirAbsolutePath, config, log });
12
32
  const { bundle: bundleConfig } = config;
13
- const tsFullClientOutAbsoluteDirInput = path.join(cwd, bundleConfig.prebundleOutDir);
14
- const prebundleOutDir = cliBundleOptions?.prebundleOutDir ?? bundleConfig.prebundleOutDir;
15
33
  const keepPrebundleDir = cliBundleOptions?.keepPrebundleDir ?? bundleConfig?.keepPrebundleDir ?? false;
16
- if (!prebundleOutDir) {
17
- throw new Error('No output directory specified for composed client');
18
- }
19
- const outDir = cliBundleOptions?.outDir ?? bundleConfig.tsdownBuildOptions.outDir;
20
- const tsconfig = cliBundleOptions?.tsconfig ?? bundleConfig.tsdownBuildOptions.tsconfig;
34
+ const prebundleOutDirAbsolute = path.resolve(cwd, cliBundleOptions?.prebundleOutDir ?? bundleConfig.prebundleOutDir);
35
+ const entry = path.join(prebundleOutDirAbsolute, 'index.ts');
36
+ const outDir = cliBundleOptions?.outDir ?? bundleConfig.outDir;
21
37
  if (!outDir) {
22
38
  throw new Error('No output directory specified for bundling');
23
39
  }
@@ -37,47 +53,19 @@ export async function bundle({ projectInfo, fullSchema, cliBundleOptions, }) {
37
53
  openapiGetMethodName: cliBundleOptions?.openapiGetMethodName,
38
54
  openapiRootUrl: cliBundleOptions?.openapiRootUrl,
39
55
  composedFrom: [BuiltInTemplateName.ts],
40
- composedOut: prebundleOutDir,
56
+ composedOut: prebundleOutDirAbsolute,
41
57
  composedOnly: true,
42
58
  composedIncludeSegments: cliBundleOptions.includeSegments ?? bundleConfig.includeSegments,
43
59
  composedExcludeSegments: cliBundleOptions.excludeSegments ?? bundleConfig.excludeSegments,
44
60
  },
45
61
  });
46
- log.debug('Bundling index.ts');
47
- await build({
48
- entry: path.join(tsFullClientOutAbsoluteDirInput, './index.ts'),
49
- dts: true,
50
- format: ['cjs', 'esm'],
51
- hash: false,
52
- fixedExtension: true,
53
- clean: true,
54
- ...bundleConfig.tsdownBuildOptions,
62
+ log.debug(`Bundling ${chalkHighlightThing(entry)} to ${chalkHighlightThing(outDirAbsolute)}`);
63
+ await bundleConfig.build({
55
64
  outDir: outDirAbsolute,
56
- tsconfig,
65
+ prebundleDir: prebundleOutDirAbsolute,
66
+ entry,
57
67
  });
58
68
  log.debug(`Bundled index.ts to ${chalkHighlightThing(outDirAbsolute)}`);
59
- log.debug('Bundling schema.ts');
60
- await build({
61
- entry: path.join(tsFullClientOutAbsoluteDirInput, './schema.ts'),
62
- dts: true,
63
- format: ['cjs'],
64
- fixedExtension: true,
65
- outDir: outDirAbsolute,
66
- clean: false,
67
- tsconfig,
68
- });
69
- log.debug(`Bundled schema.ts to ${chalkHighlightThing(outDirAbsolute)}`);
70
- log.debug('Bundling openapi.ts');
71
- await build({
72
- entry: path.join(tsFullClientOutAbsoluteDirInput, './openapi.ts'),
73
- dts: true,
74
- format: ['cjs'],
75
- fixedExtension: true,
76
- outDir: outDirAbsolute,
77
- clean: false,
78
- tsconfig,
79
- });
80
- log.debug(`Bundled openapi.ts to ${chalkHighlightThing(outDirAbsolute)}`);
81
69
  const requiresGroup = groupBy(Object.entries(bundleConfig.requires), ([, relativePath]) => relativePath);
82
70
  for (const [relativePath, group] of Object.entries(requiresGroup)) {
83
71
  await generate({
@@ -96,11 +84,11 @@ export async function bundle({ projectInfo, fullSchema, cliBundleOptions, }) {
96
84
  });
97
85
  }
98
86
  if (!keepPrebundleDir) {
99
- await fs.rm(tsFullClientOutAbsoluteDirInput, { recursive: true, force: true });
100
- log.debug(`Deleted temporary TypeScript client output directory: ${chalkHighlightThing(tsFullClientOutAbsoluteDirInput)}`);
87
+ await fs.rm(prebundleOutDirAbsolute, { recursive: true, force: true });
88
+ log.debug(`Deleted temporary TypeScript client output directory: ${chalkHighlightThing(prebundleOutDirAbsolute)}`);
101
89
  }
102
90
  else {
103
- log.debug(`Temporary TypeScript client output directory not deleted: ${chalkHighlightThing(tsFullClientOutAbsoluteDirInput)}`);
91
+ log.debug(`Temporary TypeScript client output directory not deleted because it is marked to keep: ${chalkHighlightThing(prebundleOutDirAbsolute)}`);
104
92
  }
105
93
  log.info(`Bundled TypeScript client to ${chalkHighlightThing(outDirAbsolute)}`);
106
94
  }
@@ -94,7 +94,7 @@ export async function generate({ isEnsuringClient = false, isBundle = false, pro
94
94
  .map((segment) => ({ ...segment }))),
95
95
  };
96
96
  const { config, cwd, log, srcRoot, vovkCliPackage, packageJson: projectPackageJson } = projectInfo;
97
- Object.entries(config.generatorConfig.segments ?? {})
97
+ Object.entries(config.outputConfig.segments ?? {})
98
98
  .filter(([, segmentConfig]) => segmentConfig.openAPIMixin)
99
99
  .forEach(([segmentName, segmentConfig]) => {
100
100
  fullSchema.segments = {
@@ -144,7 +144,7 @@ export async function generate({ isEnsuringClient = false, isBundle = false, pro
144
144
  : { data: { imports: [] }, content: templateContent };
145
145
  const { package: packageJson, readme, origin, samples, reExports, } = resolveGeneratorConfigValues({
146
146
  schema: fullSchema,
147
- configs: [{ origin: cliGenerateOptions?.origin }, templateDef.generatorConfig ?? {}],
147
+ configs: [{ origin: cliGenerateOptions?.origin }, templateDef.outputConfig ?? {}],
148
148
  projectPackageJson,
149
149
  isBundle,
150
150
  segmentName: null,
@@ -229,7 +229,7 @@ export async function generate({ isEnsuringClient = false, isBundle = false, pro
229
229
  const results = await Promise.all(segmentNames.map(async (segmentName) => {
230
230
  const { package: packageJson, readme, origin, samples, reExports, } = resolveGeneratorConfigValues({
231
231
  schema: fullSchema,
232
- configs: [{ origin: cliGenerateOptions?.origin }, templateDef.generatorConfig ?? {}],
232
+ configs: [{ origin: cliGenerateOptions?.origin }, templateDef.outputConfig ?? {}],
233
233
  projectPackageJson,
234
234
  segmentName,
235
235
  isBundle,
@@ -73,7 +73,7 @@ export default async function getClientTemplateFiles({ config, cwd, log, configK
73
73
  }
74
74
  def = {
75
75
  ...def,
76
- generatorConfig: merge({}, templateDef?.generatorConfig, def.generatorConfig),
76
+ outputConfig: merge({}, templateDef?.outputConfig, def.outputConfig),
77
77
  composedClient: merge(omit(templateDef?.composedClient ?? {}, ['outDir']), def.composedClient),
78
78
  segmentedClient: merge(omit(templateDef?.segmentedClient ?? {}, ['outDir']), def.segmentedClient),
79
79
  };
@@ -23,7 +23,7 @@ export default function writeOneClientFile({ cwd, projectInfo, clientTemplateFil
23
23
  package: PackageJson;
24
24
  readme: VovkReadmeConfig;
25
25
  samples: VovkSamplesConfig;
26
- reExports: VovkStrictConfig['generatorConfig']['reExports'];
26
+ reExports: VovkStrictConfig['outputConfig']['reExports'];
27
27
  isEnsuringClient: boolean;
28
28
  outCwdRelativeDir: string;
29
29
  templateDef: VovkStrictConfig['clientTemplateDefs'][string];
@@ -85,8 +85,8 @@ locatedSegments, isNodeNextResolution, hasMixins, isVovkProject, vovkCliPackage,
85
85
  ? path.relative(path.resolve(cwd, outCwdRelativeDir, typeof segmentName === 'string' ? segmentName || ROOT_SEGMENT_FILE_NAME : '.'), path.resolve(cwd, routeFilePath))
86
86
  : null;
87
87
  const segmentConfig = {
88
- ...config.generatorConfig.segments?.[sName],
89
- // ...templateDef.generatorConfig?.segments?.[sName],
88
+ ...config.outputConfig.segments?.[sName],
89
+ // ...templateDef.outputConfig?.segments?.[sName],
90
90
  };
91
91
  const { origin: segmentConfigOrigin, rootEntry: segmentConfigRootEntry, segmentNameOverride } = segmentConfig;
92
92
  return [
@@ -149,9 +149,9 @@ export default function getTemplateDefs(userTemplateDefs = {}) {
149
149
  ...builtIn.segmentedClient,
150
150
  ...templateDef.segmentedClient,
151
151
  },
152
- generatorConfig: {
153
- ...builtIn.generatorConfig,
154
- ...templateDef.generatorConfig,
152
+ outputConfig: {
153
+ ...builtIn.outputConfig,
154
+ ...templateDef.outputConfig,
155
155
  },
156
156
  // 'requires' and other props will be overridden
157
157
  };
@@ -48,10 +48,13 @@ export default function getConfig({ configPath, cwd, logLevel, }: {
48
48
  requires?: Record<string, string>;
49
49
  prebundleOutDir?: string;
50
50
  keepPrebundleDir?: boolean;
51
- tsdownBuildOptions?: Parameters<typeof import("tsdown/index.mjs") extends {
52
- build: infer T;
53
- } ? T : never>[0];
54
- generatorConfig?: import("vovk").VovkGeneratorConfig<{
51
+ outDir?: string;
52
+ build: (options: {
53
+ outDir: string;
54
+ prebundleDir: string;
55
+ entry: string;
56
+ }) => Promise<void>;
57
+ outputConfig?: import("vovk").VovkOutputConfig<{
55
58
  fetcher?: string | [string, string] | [string];
56
59
  validateOnClient?: string | [string, string] | [string] | null;
57
60
  createRPC?: string | [string, string] | [string];
@@ -70,7 +73,7 @@ export default function getConfig({ configPath, cwd, logLevel, }: {
70
73
  controller?: string;
71
74
  [key: string]: string | undefined;
72
75
  };
73
- generatorConfig?: import("vovk").VovkGeneratorConfig<{
76
+ outputConfig?: import("vovk").VovkOutputConfig<{
74
77
  fetcher?: string | [string, string] | [string];
75
78
  validateOnClient?: string | [string, string] | [string] | null;
76
79
  createRPC?: string | [string, string] | [string];
@@ -38,16 +38,17 @@ export default async function getConfig({ configPath, cwd, logLevel, }) {
38
38
  bundle: {
39
39
  prebundleOutDir: conf.bundle?.prebundleOutDir ?? 'tmp_prebundle',
40
40
  keepPrebundleDir: conf.bundle?.keepPrebundleDir ?? false,
41
+ outDir: conf.bundle?.outDir ?? 'dist',
41
42
  requires: {
42
43
  [BuiltInTemplateName.readme]: '.',
43
44
  [BuiltInTemplateName.packageJson]: '.',
44
45
  },
45
- generatorConfig: {},
46
+ outputConfig: {},
47
+ build: conf.bundle?.build ??
48
+ (() => {
49
+ throw new Error('No bundle.build function specified');
50
+ }),
46
51
  ...conf.bundle,
47
- tsdownBuildOptions: {
48
- outDir: conf.bundle?.tsdownBuildOptions?.outDir ?? 'dist',
49
- ...conf.bundle?.tsdownBuildOptions,
50
- },
51
52
  },
52
53
  modulesDir: conf.modulesDir ?? path.join(srcRoot ?? '.', 'modules'),
53
54
  schemaOutDir: env.VOVK_SCHEMA_OUT_DIR ?? conf.schemaOutDir ?? './.vovk-schema',
@@ -61,10 +62,10 @@ export default async function getConfig({ configPath, cwd, logLevel, }) {
61
62
  ...conf.moduleTemplates,
62
63
  },
63
64
  libs: conf.libs ?? {},
64
- generatorConfig: {
65
- ...conf.generatorConfig,
66
- origin: (env.VOVK_ORIGIN ?? conf?.generatorConfig?.origin ?? '').replace(/\/$/, ''), // Remove trailing slash
67
- segments: Object.fromEntries(await Promise.all(Object.entries(conf.generatorConfig?.segments ?? {}).map(async ([key, value]) => [
65
+ outputConfig: {
66
+ ...conf.outputConfig,
67
+ origin: (env.VOVK_ORIGIN ?? conf?.outputConfig?.origin ?? '').replace(/\/$/, ''), // Remove trailing slash
68
+ segments: Object.fromEntries(await Promise.all(Object.entries(conf.outputConfig?.segments ?? {}).map(async ([key, value]) => [
68
69
  key,
69
70
  {
70
71
  ...value,
@@ -10,12 +10,12 @@ export default function getMetaSchema({ config, useEmitConfig }) {
10
10
  ? (config
11
11
  ? pick({
12
12
  ...config,
13
- generatorConfig: config.generatorConfig
13
+ outputConfig: config.outputConfig
14
14
  ? {
15
- ...config.generatorConfig,
15
+ ...config.outputConfig,
16
16
  // TODO: Dirty fix! Need to think of a better way to avoid emission of mixins.
17
- segments: config.generatorConfig.segments
18
- ? mapValues(config.generatorConfig.segments, (segment) => omit(segment, ['openAPIMixin']))
17
+ segments: config.outputConfig.segments
18
+ ? mapValues(config.outputConfig.segments, (segment) => omit(segment, ['openAPIMixin']))
19
19
  : undefined,
20
20
  }
21
21
  : undefined,
@@ -18,7 +18,7 @@ export default async function getProjectInfo({ port: givenPort, cwd = process.cw
18
18
  if (srcRootRequired && !srcRoot) {
19
19
  throw new Error(`Could not find app router directory at ${cwd}. Check Next.js docs for more info.`);
20
20
  }
21
- const apiRoot = `${config.generatorConfig.origin ?? ''}/${config.rootEntry}`;
21
+ const apiRoot = `${config.outputConfig.origin ?? ''}/${config.rootEntry}`;
22
22
  const apiDirAbsolutePath = srcRoot ? path.resolve(cwd, srcRoot, 'app', config.rootEntry) : null;
23
23
  if (configAbsolutePaths.length > 1) {
24
24
  log.warn(`Multiple config files found. Using the first one: ${configAbsolutePaths[0]}`);
package/dist/index.mjs CHANGED
@@ -126,7 +126,6 @@ program
126
126
  .option('--schema, --schema-path <path>', 'path to schema folder (default: .vovk-schema)')
127
127
  .option('--config, --config-path <config>', 'path to config file')
128
128
  .option('--origin <url>', 'set the origin URL for the generated client')
129
- .option('--tsconfig <path>', 'path to tsconfig.json for bundling by tsdown')
130
129
  .option('--openapi, --openapi-spec <openapi_path_or_urls...>', 'use OpenAPI schema instead of Vovk schema')
131
130
  .option('--openapi-get-module-name <names...>', 'module names corresponding to the index of --openapi option')
132
131
  .option('--openapi-get-method-name <names...>', 'method names corresponding to the index of --openapi option')
@@ -37,9 +37,9 @@ export default async function createConfig({ root, log, options: { validationLib
37
37
  },
38
38
  }[validationLibrary ?? 'type'],
39
39
  };
40
- config.generatorConfig ??= {};
41
- config.generatorConfig.imports ??= {};
42
- config.generatorConfig.imports.validateOnClient =
40
+ config.outputConfig ??= {};
41
+ config.outputConfig.imports ??= {};
42
+ config.outputConfig.imports.validateOnClient =
43
43
  validationLibrary === 'class-validator' ? 'vovk-dto/validateOnClient' : 'vovk-ajv';
44
44
  if (validationLibrary && !moduleTemplates) {
45
45
  try {
package/dist/types.d.mts CHANGED
@@ -40,12 +40,12 @@ export interface GenerateOptions {
40
40
  logLevel?: LogLevelNames;
41
41
  }
42
42
  export interface BundleOptions extends Partial<Pick<VovkStrictConfig['bundle'], 'prebundleOutDir' | 'keepPrebundleDir' | 'includeSegments' | 'excludeSegments'>> {
43
+ bundler?: 'tsdown' | 'ncc';
43
44
  configPath?: string;
44
45
  schemaPath?: string;
45
46
  schema?: string;
46
47
  outDir?: string;
47
48
  origin?: string;
48
- tsconfig?: string;
49
49
  openapiSpec?: string[];
50
50
  openapiGetModuleName?: string[];
51
51
  openapiGetMethodName?: string[];
@@ -8,7 +8,7 @@ export type GetOpenAPINameFn = (config: {
8
8
  openAPIObject: OpenAPIObject;
9
9
  }) => string;
10
10
  export declare function normalizeOpenAPIMixin({ mixinModule, log, cwd, }: {
11
- mixinModule: NonNullable<NonNullable<NonNullable<NonNullable<VovkConfig['generatorConfig']>['segments']>[string]>['openAPIMixin']>;
11
+ mixinModule: NonNullable<NonNullable<NonNullable<NonNullable<VovkConfig['outputConfig']>['segments']>[string]>['openAPIMixin']>;
12
12
  log: ProjectInfo['log'];
13
13
  cwd?: string;
14
- }): Promise<NonNullable<NonNullable<NonNullable<NonNullable<VovkStrictConfig['generatorConfig']>['segments']>[string]>['openAPIMixin']>>;
14
+ }): Promise<NonNullable<NonNullable<NonNullable<NonNullable<VovkStrictConfig['outputConfig']>['segments']>[string]>['openAPIMixin']>>;
@@ -61,7 +61,7 @@ export default class <%= vars.ModuleName %> {
61
61
  // ...
62
62
  };
63
63
 
64
- @del(':id')
64
+ @del('{id}')
65
65
  static delete<%= t.TheThing %> = () => {
66
66
  // ...
67
67
  };
@@ -49,7 +49,7 @@ export default class <%= vars.ControllerName %> {
49
49
  // ...
50
50
  };
51
51
 
52
- @del(':id')
52
+ @del('{id}')
53
53
  static delete<%= t.TheThing %> = () => {
54
54
  // ...
55
55
  };
@@ -61,7 +61,7 @@ export default class <%= vars.ModuleName %> {
61
61
  // ...
62
62
  };
63
63
 
64
- @del(':id')
64
+ @del('{id}')
65
65
  static delete<%= t.TheThing %> = () => {
66
66
  // ...
67
67
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vovk-cli",
3
- "version": "0.0.1-draft.380",
3
+ "version": "0.0.1-draft.381",
4
4
  "bin": {
5
5
  "vovk": "./dist/index.mjs"
6
6
  },
@@ -35,14 +35,14 @@
35
35
  },
36
36
  "homepage": "https://vovk.dev",
37
37
  "peerDependencies": {
38
- "vovk": "^3.0.0-draft.461",
39
- "vovk-ajv": "^0.0.0-draft.108",
40
- "vovk-client": "^0.0.4-draft.135",
41
- "vovk-python": "^0.0.1-draft.77",
42
- "vovk-rust": "^0.0.1-draft.63"
38
+ "vovk": "^3.0.0-draft.463",
39
+ "vovk-ajv": "^0.0.0-draft.109",
40
+ "vovk-client": "^0.0.4-draft.136",
41
+ "vovk-python": "^0.0.1-draft.78",
42
+ "vovk-rust": "^0.0.1-draft.64"
43
43
  },
44
44
  "optionalDependencies": {
45
- "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.41"
45
+ "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.44"
46
46
  },
47
47
  "dependencies": {
48
48
  "@iarna/toml": "^2.2.5",
@@ -68,7 +68,6 @@
68
68
  "prettier": "^3.6.2",
69
69
  "tar-stream": "^3.1.7",
70
70
  "ts-morph": "^27.0.0",
71
- "tsdown": "^0.15.7",
72
71
  "type-fest": "^5.0.1",
73
72
  "undici": "^7.16.0",
74
73
  "yaml": "^2.8.1"
@@ -84,6 +83,7 @@
84
83
  "create-next-app": "^15.5.4",
85
84
  "http-server": "^14.1.1",
86
85
  "node-pty": "^1.0.0",
86
+ "tsdown": "^0.15.9",
87
87
  "zod": "^4.1.11"
88
88
  }
89
89
  }