vovk-cli 0.0.1-draft.292 → 0.0.1-draft.295

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.
@@ -3,8 +3,11 @@ const { fetcher } = require('<%= t.imports.fetcher %>');
3
3
  const { createRPC } = require('<%= t.imports.createRPC %>');
4
4
  const { schema } = require('./schema.cjs');
5
5
  const { validateOnClient = null } = <%- t.imports.validateOnClient ? `require('${t.imports.validateOnClient}')` : '{}'%>;
6
- <% Object.values(t.schema.segments).filter((segment) => segment.emitSchema).forEach((segment) => {
7
- Object.keys(segment.controllers).forEach((rpcModuleName) => { %>
6
+ <% Object.values(t.schema.segments).filter((segment) => segment.emitSchema).forEach((segment) => { %>
7
+ <% Object.entries(t.segmentMeta[segment.segmentName].reExports).forEach(([reExportWhat, reExportFrom]) => { %>
8
+ exports[<%= reExportWhat.split(/\s+as\s+/)[1] ?? reExportWhat %>] = require('<%= reExportFrom %>')[<%= reExportWhat.split(/\s+as\s+/)[0] %>];
9
+ <% }) %>
10
+ <% Object.keys(segment.controllers).forEach((rpcModuleName) => { %>
8
11
  exports.<%= rpcModuleName %> = createRPC(
9
12
  schema, '<%= segment.segmentName %>', '<%= rpcModuleName %>', fetcher,
10
13
  { validateOnClient, <%- typeof t.segmentMeta[segment.segmentName].segmentNameOverride === 'string' ? `segmentNameOverride: '${t.segmentMeta[segment.segmentName].segmentNameOverride}', ` : '' %><%- segment.segmentType === 'mixin' ? '' : `apiRoot: '${t.segmentMeta[segment.segmentName].forceApiRoot ?? t.apiRoot}'` %> }
@@ -11,8 +11,11 @@ import type { Controllers as MixinControllers, Mixins } from "./mixins";
11
11
  <% } %>
12
12
 
13
13
  type Options = typeof fetcher extends VovkClientFetcher<infer U> ? U : never;
14
- <% Object.values(t.schema.segments).filter((segment) => segment.emitSchema).forEach((segment, i) => {
15
- Object.keys(segment.controllers).forEach((rpcModuleName) => { %>
14
+ <% Object.values(t.schema.segments).filter((segment) => segment.emitSchema).forEach((segment, i) => { %>
15
+ <% Object.entries(t.segmentMeta[segment.segmentName].reExports).forEach(([reExportWhat, reExportFrom]) => { %>
16
+ export { <%= reExportWhat %> } from '<%= reExportFrom %>';
17
+ <% }) %>
18
+ <% Object.keys(segment.controllers).forEach((rpcModuleName) => { %>
16
19
  export const <%= rpcModuleName %>: ReturnType<typeof createRPC<<%= segment.segmentType === 'mixin' ? `MixinControllers` : `Controllers${i}` %>["<%= rpcModuleName %>"], Options>>;
17
20
  <% })
18
21
  }) %>
@@ -11,8 +11,11 @@ import type { Controllers as MixinControllers, Mixins } from "./mixins";
11
11
  <% } %>
12
12
 
13
13
  type Options = typeof fetcher extends VovkClientFetcher<infer U> ? U : never;
14
- <% Object.values(t.schema.segments).filter((segment) => segment.emitSchema).forEach((segment, i) => {
15
- Object.keys(segment.controllers).forEach((rpcModuleName) => { %>
14
+ <% Object.values(t.schema.segments).filter((segment) => segment.emitSchema).forEach((segment, i) => { %>
15
+ <% Object.entries(t.segmentMeta[segment.segmentName].reExports).forEach(([reExportWhat, reExportFrom]) => { %>
16
+ export { <%= reExportWhat %> } from '<%= reExportFrom %>';
17
+ <% }) %>
18
+ <% Object.keys(segment.controllers).forEach((rpcModuleName) => { %>
16
19
  export const <%= rpcModuleName %>: ReturnType<typeof createRPC<<%= segment.segmentType === 'mixin' ? `MixinControllers` : `Controllers${i}` %>["<%= rpcModuleName %>"], Options>>;
17
20
  <% })
18
21
  }) %>
@@ -7,8 +7,11 @@ import { validateOnClient } from '<%= t.imports.module.validateOnClient %>';
7
7
  <% } else { %>
8
8
  const validateOnClient = undefined;
9
9
  <% }
10
- Object.values(t.schema.segments).filter((segment) => segment.emitSchema).forEach((segment, i) => {
11
- Object.keys(segment.controllers).forEach((rpcModuleName) => { %>
10
+ Object.values(t.schema.segments).filter((segment) => segment.emitSchema).forEach((segment, i) => { %>
11
+ <% Object.entries(t.segmentMeta[segment.segmentName].reExports).forEach(([reExportWhat, reExportFrom]) => { %>
12
+ export { <%= reExportWhat %> } from '<%= reExportFrom %>';
13
+ <% }) %>
14
+ <% Object.keys(segment.controllers).forEach((rpcModuleName) => { %>
12
15
  export const <%= rpcModuleName %> = createRPC(
13
16
  schema, '<%= segment.segmentName %>', '<%= rpcModuleName %>', fetcher,
14
17
  { validateOnClient, <%- typeof t.segmentMeta[segment.segmentName].segmentNameOverride === 'string' ? `segmentNameOverride: '${t.segmentMeta[segment.segmentName].segmentNameOverride}', ` : '' %><%- segment.segmentType === 'mixin' ? '' : `apiRoot: '${t.segmentMeta[segment.segmentName].forceApiRoot ?? t.apiRoot}'` %> }
@@ -16,8 +16,11 @@ import { validateOnClient } from '<%= t.imports.validateOnClient %>';
16
16
  const validateOnClient = undefined;
17
17
  <% } %>
18
18
  type Options = typeof fetcher extends VovkClientFetcher<infer U> ? U : never;
19
- <% Object.values(t.schema.segments).filter((segment) => segment.emitSchema).forEach((segment, i) => {
20
- Object.keys(segment.controllers).forEach((rpcModuleName) => { %>
19
+ <% Object.values(t.schema.segments).filter((segment) => segment.emitSchema).forEach((segment, i) => { %>
20
+ <% Object.entries(t.segmentMeta[segment.segmentName].reExports).forEach(([reExportWhat, reExportFrom]) => { %>
21
+ export { <%= reExportWhat %> } from '<%= reExportFrom %>';
22
+ <% }) %>
23
+ <% Object.keys(segment.controllers).forEach((rpcModuleName) => { %>
21
24
  export const <%= rpcModuleName %> = createRPC<<%= segment.segmentType === 'mixin' ? `MixinControllers` : `Controllers${i}` %>["<%= rpcModuleName %>"], Options>(
22
25
  schema, '<%= segment.segmentName %>', '<%= rpcModuleName %>', fetcher,
23
26
  { validateOnClient, <%- typeof t.segmentMeta[segment.segmentName].segmentNameOverride === 'string' ? `segmentNameOverride: '${t.segmentMeta[segment.segmentName].segmentNameOverride}', ` : '' %><%- segment.segmentType === 'mixin' ? '' : `apiRoot: '${t.segmentMeta[segment.segmentName].forceApiRoot ?? t.apiRoot}'` %> }
@@ -9,7 +9,7 @@ import pickSegmentFullSchema from '../utils/pickSegmentFullSchema.mjs';
9
9
  import removeUnlistedDirectories from '../utils/removeUnlistedDirectories.mjs';
10
10
  import getTemplateClientImports from './getTemplateClientImports.mjs';
11
11
  import mergePackages from './mergePackages.mjs';
12
- import writeOneClientFile from './writeOneClientFile.mjs';
12
+ import writeOneClientFile, { normalizeOutTemplatePath } from './writeOneClientFile.mjs';
13
13
  import { ROOT_SEGMENT_FILE_NAME } from '../dev/writeOneSegmentSchemaFile.mjs';
14
14
  import { getTsconfig } from 'get-tsconfig';
15
15
  import { normalizeOpenAPIMixins } from '../utils/normalizeOpenAPIMixins.mjs';
@@ -46,7 +46,7 @@ function logClientGenerationResults({ results, log, isEnsuringClient = false, fo
46
46
  if (writtenResults.length) {
47
47
  for (const [outAbsoluteDir, dirResults] of Object.entries(groupedByDir)) {
48
48
  const templateNames = _.uniq(dirResults.map(({ templateName }) => templateName));
49
- log.info(`${clientType} client${isEnsuringClient ? ' placeholder' : ''} is generated to ${chalkHighlightThing(outAbsoluteDir)} from template${templateNames.length !== 1 ? 's' : ''} ${chalkHighlightThing(templateNames.map((s) => `"${s}"`).join(', '))} in ${duration}ms`);
49
+ log.info(`${clientType} client${isEnsuringClient ? ' placeholder' : ''} is generated to ${chalkHighlightThing(normalizeOutTemplatePath(outAbsoluteDir, dirResults[0].package))} from template${templateNames.length !== 1 ? 's' : ''} ${chalkHighlightThing(templateNames.map((s) => `"${s}"`).join(', '))} in ${duration}ms`);
50
50
  }
51
51
  }
52
52
  else if (fromTemplates.length) {
@@ -56,7 +56,7 @@ function logClientGenerationResults({ results, log, isEnsuringClient = false, fo
56
56
  else if (!isEnsuringClient) {
57
57
  for (const [outAbsoluteDir, dirResults] of Object.entries(groupedByDir)) {
58
58
  const templateNames = _.uniq(dirResults.map(({ templateName }) => templateName));
59
- logOrDebug(`${clientType} client that was generated to ${chalkHighlightThing(outAbsoluteDir)} from template${templateNames.length !== 1 ? 's' : ''} ${chalkHighlightThing(templateNames.map((s) => `"${s}"`).join(', '))} is up to date and doesn't need to be regenerated (${duration}ms)`);
59
+ logOrDebug(`${clientType} client that was generated to ${chalkHighlightThing(normalizeOutTemplatePath(outAbsoluteDir, dirResults[0].package))} from template${templateNames.length !== 1 ? 's' : ''} ${chalkHighlightThing(templateNames.map((s) => `"${s}"`).join(', '))} is up to date and doesn't need to be regenerated (${duration}ms)`);
60
60
  }
61
61
  }
62
62
  }
@@ -177,6 +177,7 @@ export async function generate({ isEnsuringClient = false, projectInfo, forceNot
177
177
  written,
178
178
  templateName,
179
179
  outAbsoluteDir,
180
+ package: packageJson,
180
181
  };
181
182
  }));
182
183
  if (composedClientTemplateFiles.length) {
@@ -210,12 +211,12 @@ export async function generate({ isEnsuringClient = false, projectInfo, forceNot
210
211
  const matterResult = templateFilePath.endsWith('.ejs')
211
212
  ? matter(templateContent)
212
213
  : { data: { imports: [] }, content: templateContent };
214
+ const clientImports = await getTemplateClientImports({
215
+ config,
216
+ fullSchema,
217
+ outCwdRelativeDir,
218
+ });
213
219
  const results = await Promise.all(segmentNames.map(async (segmentName) => {
214
- const clientImports = await getTemplateClientImports({
215
- config,
216
- fullSchema,
217
- outCwdRelativeDir,
218
- });
219
220
  const packageJson = await mergePackages({
220
221
  log,
221
222
  rootPackageJson,
@@ -256,6 +257,7 @@ export async function generate({ isEnsuringClient = false, projectInfo, forceNot
256
257
  return {
257
258
  written,
258
259
  templateName,
260
+ package: packageJson,
259
261
  };
260
262
  }));
261
263
  const outAbsoluteDir = path.resolve(cwd, outCwdRelativeDir);
@@ -265,6 +267,7 @@ export async function generate({ isEnsuringClient = false, projectInfo, forceNot
265
267
  written: results.filter((result) => !!result).some(({ written }) => written),
266
268
  templateName,
267
269
  outAbsoluteDir,
270
+ package: results[0]?.package || {}, // TODO: Might be wrong in Python segmented client (unknown use case)
268
271
  };
269
272
  }));
270
273
  if (segmentedClientTemplateFiles.length) {
@@ -4,6 +4,7 @@ import type { ProjectInfo } from '../getProjectInfo/index.mjs';
4
4
  import type { ClientTemplateFile } from './getClientTemplateFiles.mjs';
5
5
  import type { ClientImports } from './getTemplateClientImports.mjs';
6
6
  import type { Segment } from '../locateSegments.mjs';
7
+ export declare function normalizeOutTemplatePath(out: string, packageJson: PackageJson): string;
7
8
  export default function writeOneClientFile({ cwd, projectInfo, clientTemplateFile, fullSchema, prettifyClient, segmentName, imports, templateContent, matterResult: { data, content }, package: packageJson, readme, isEnsuringClient, outCwdRelativeDir, origin, templateDef, locatedSegments, isNodeNextResolution, hasMixins, isVovkProject, vovkCliPackage, }: {
8
9
  cwd: string;
9
10
  projectInfo: ProjectInfo;
@@ -8,13 +8,14 @@ import TOML from '@iarna/toml';
8
8
  import prettify from '../utils/prettify.mjs';
9
9
  import { ROOT_SEGMENT_FILE_NAME } from '../dev/writeOneSegmentSchemaFile.mjs';
10
10
  import { compileJSONSchemaToTypeScriptType } from '../utils/compileJSONSchemaToTypeScriptType.mjs';
11
+ export function normalizeOutTemplatePath(out, packageJson) {
12
+ return out.replace('[package_name]', packageJson.name?.replace(/-/g, '_') ?? 'my_package_name');
13
+ }
11
14
  export default async function writeOneClientFile({ cwd, projectInfo, clientTemplateFile, fullSchema, prettifyClient, segmentName, imports, templateContent, matterResult: { data, content }, package: packageJson, readme, isEnsuringClient, outCwdRelativeDir, origin, templateDef, locatedSegments, isNodeNextResolution, hasMixins, isVovkProject, vovkCliPackage, }) {
12
15
  const { config, apiRoot } = projectInfo;
13
16
  const { templateFilePath, relativeDir } = clientTemplateFile;
14
17
  const locatedSegmentsByName = _.keyBy(locatedSegments, 'segmentName');
15
- const outPath = path
16
- .resolve(cwd, outCwdRelativeDir, typeof segmentName === 'string' ? segmentName || ROOT_SEGMENT_FILE_NAME : '', relativeDir, path.basename(templateFilePath).replace('.ejs', ''))
17
- .replace('[package_name]', packageJson.name?.replace(/-/g, '_') ?? 'my_package_name');
18
+ const outPath = normalizeOutTemplatePath(path.resolve(cwd, outCwdRelativeDir, typeof segmentName === 'string' ? segmentName || ROOT_SEGMENT_FILE_NAME : '', relativeDir, path.basename(templateFilePath).replace('.ejs', '')), packageJson);
18
19
  let placeholder = `// This is a temporary placeholder to avoid compilation errors if client is imported before it's generated.
19
20
  // If you still see this text, the client is not generated yet because of an unknown problem.
20
21
  // Feel free to report an issue at https://github.com/finom/vovk/issues`;
@@ -61,7 +62,7 @@ export default async function writeOneClientFile({ cwd, projectInfo, clientTempl
61
62
  const segmentImportPath = routeFilePath
62
63
  ? path.relative(path.resolve(cwd, outCwdRelativeDir, typeof segmentName === 'string' ? segmentName || ROOT_SEGMENT_FILE_NAME : '.'), path.resolve(cwd, routeFilePath))
63
64
  : null;
64
- const { origin: segmentConfigOrigin, rootEntry: segmentConfigRootEntry, segmentNameOverride, } = {
65
+ const { origin: segmentConfigOrigin, rootEntry: segmentConfigRootEntry, segmentNameOverride, reExports, } = {
65
66
  ...(config.segmentConfig ? config.segmentConfig[sName] : {}),
66
67
  ...(templateDef.segmentConfig ? templateDef.segmentConfig[sName] : {}),
67
68
  };
@@ -75,6 +76,9 @@ export default async function writeOneClientFile({ cwd, projectInfo, clientTempl
75
76
  routeFilePath,
76
77
  segmentImportPath,
77
78
  segmentNameOverride,
79
+ reExports: _.mapValues(reExports ?? {}, (p) => p.startsWith('.')
80
+ ? path.relative(path.join(outCwdRelativeDir, segmentName || ROOT_SEGMENT_FILE_NAME), path.resolve(cwd, p))
81
+ : p),
78
82
  },
79
83
  ];
80
84
  })),
@@ -86,6 +86,7 @@ export default function getConfig({ configPath, cwd }: {
86
86
  origin?: string;
87
87
  rootEntry?: string;
88
88
  segmentNameOverride?: string;
89
+ reExports?: Record<string, string>;
89
90
  };
90
91
  };
91
92
  openApiMixins?: {
@@ -231,7 +231,7 @@ export class Init {
231
231
  keys.push('emitDecoratorMetadata');
232
232
  }
233
233
  updateTsConfig = await confirm({
234
- message: `Do you want to add ${keys.map((k) => `"${k}"`).join(' and ')} to tsconfig.json?`,
234
+ message: `Do you want to add ${keys.map((k) => `"${k}"`).join(' and ')} to tsconfig.json? (recommended)`,
235
235
  });
236
236
  }
237
237
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vovk-cli",
3
- "version": "0.0.1-draft.292",
3
+ "version": "0.0.1-draft.295",
4
4
  "bin": {
5
5
  "vovk": "./dist/index.mjs"
6
6
  },
@@ -35,10 +35,10 @@
35
35
  },
36
36
  "homepage": "https://vovk.dev",
37
37
  "peerDependencies": {
38
- "vovk": "^3.0.0-draft.321"
38
+ "vovk": "^3.0.0-draft.323"
39
39
  },
40
40
  "optionalDependencies": {
41
- "vovk-python": "^0.0.1-draft.49"
41
+ "vovk-python": "^0.0.1-draft.52"
42
42
  },
43
43
  "dependencies": {
44
44
  "@iarna/toml": "^2.2.5",