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.
- package/client-templates/cjs/index.cjs.ejs +5 -2
- package/client-templates/cjs/index.d.cts.ejs +5 -2
- package/client-templates/mjs/index.d.mts.ejs +5 -2
- package/client-templates/mjs/index.mjs.ejs +5 -2
- package/client-templates/ts/index.ts.ejs +5 -2
- package/dist/generate/generate.mjs +11 -8
- package/dist/generate/writeOneClientFile.d.mts +1 -0
- package/dist/generate/writeOneClientFile.mjs +8 -4
- package/dist/getProjectInfo/getConfig/index.d.mts +1 -0
- package/dist/init/index.mjs +1 -1
- package/package.json +3 -3
|
@@ -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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
})),
|
package/dist/init/index.mjs
CHANGED
|
@@ -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.
|
|
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.
|
|
38
|
+
"vovk": "^3.0.0-draft.323"
|
|
39
39
|
},
|
|
40
40
|
"optionalDependencies": {
|
|
41
|
-
"vovk-python": "^0.0.1-draft.
|
|
41
|
+
"vovk-python": "^0.0.1-draft.52"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@iarna/toml": "^2.2.5",
|