vovk-cli 0.0.1-draft.17 → 0.0.1-draft.170
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/LICENSE +1 -1
- package/README.md +29 -1
- package/client-templates/cjs/index.cjs.ejs +14 -0
- package/client-templates/cjs/index.d.cts.ejs +15 -0
- package/client-templates/mjs/index.d.mts.ejs +15 -0
- package/client-templates/mjs/index.mjs.ejs +20 -0
- package/client-templates/packageJson/package.json.ejs +1 -0
- package/client-templates/readme/README.md.ejs +41 -0
- package/client-templates/schemaCjs/schema.cjs.ejs +12 -0
- package/client-templates/schemaCjs/schema.d.cts.ejs +10 -0
- package/client-templates/schemaJson/schema.json.ejs +1 -0
- package/client-templates/schemaTs/schema.ts.ejs +14 -0
- package/client-templates/ts/index.ts.ejs +23 -0
- package/dist/bundle/index.d.mts +8 -0
- package/dist/bundle/index.mjs +80 -0
- package/dist/dev/diffSegmentSchema.d.mts +36 -0
- package/dist/dev/{diffSchema.mjs → diffSegmentSchema.mjs} +4 -12
- package/dist/dev/ensureSchemaFiles.d.mts +3 -0
- package/dist/dev/ensureSchemaFiles.mjs +14 -30
- package/dist/dev/index.d.mts +2 -2
- package/dist/dev/index.mjs +153 -71
- package/dist/dev/logDiffResult.d.mts +1 -1
- package/dist/dev/logDiffResult.mjs +6 -43
- package/dist/dev/writeConfigJson.d.mts +2 -0
- package/dist/dev/writeConfigJson.mjs +15 -0
- package/dist/dev/writeOneSegmentSchemaFile.d.mts +12 -0
- package/dist/dev/{writeOneSchemaFile.mjs → writeOneSegmentSchemaFile.mjs} +10 -6
- package/dist/generate/ensureClient.d.mts +3 -0
- package/dist/generate/ensureClient.mjs +26 -0
- package/dist/generate/getClientTemplateFiles.d.mts +20 -0
- package/dist/generate/getClientTemplateFiles.mjs +77 -0
- package/dist/generate/getFullSchemaFromJSON.d.mts +3 -0
- package/dist/generate/getFullSchemaFromJSON.mjs +54 -0
- package/dist/generate/getTemplateClientImports.d.mts +18 -0
- package/dist/generate/getTemplateClientImports.mjs +38 -0
- package/dist/generate/index.d.mts +12 -0
- package/dist/generate/index.mjs +203 -0
- package/dist/generate/mergePackages.d.mts +7 -0
- package/dist/generate/mergePackages.mjs +70 -0
- package/dist/generate/writeOneClientFile.d.mts +30 -0
- package/dist/generate/writeOneClientFile.mjs +84 -0
- package/dist/getProjectInfo/getConfig/getConfigAbsolutePaths.d.mts +5 -0
- package/dist/getProjectInfo/{getConfigAbsolutePaths.mjs → getConfig/getConfigAbsolutePaths.mjs} +4 -1
- package/dist/getProjectInfo/{getRelativeSrcRoot.d.mts → getConfig/getRelativeSrcRoot.d.mts} +1 -1
- package/dist/getProjectInfo/{getRelativeSrcRoot.mjs → getConfig/getRelativeSrcRoot.mjs} +2 -2
- package/dist/getProjectInfo/getConfig/getTemplateDefs.d.mts +14 -0
- package/dist/getProjectInfo/getConfig/getTemplateDefs.mjs +85 -0
- package/dist/getProjectInfo/{getUserConfig.d.mts → getConfig/getUserConfig.d.mts} +3 -2
- package/dist/getProjectInfo/{getUserConfig.mjs → getConfig/getUserConfig.mjs} +6 -4
- package/dist/getProjectInfo/{importUncachedModule.mjs → getConfig/importUncachedModule.mjs} +1 -5
- package/dist/getProjectInfo/{importUncachedModuleWorker.mjs → getConfig/importUncachedModuleWorker.mjs} +0 -1
- package/dist/getProjectInfo/getConfig/index.d.mts +17 -0
- package/dist/getProjectInfo/getConfig/index.mjs +83 -0
- package/dist/getProjectInfo/index.d.mts +6 -8
- package/dist/getProjectInfo/index.mjs +12 -21
- package/dist/index.d.mts +2 -5
- package/dist/index.mjs +86 -56
- package/dist/init/createConfig.d.mts +2 -2
- package/dist/init/createConfig.mjs +14 -12
- package/dist/init/getTemplateFilesFromPackage.mjs +7 -5
- package/dist/init/index.d.mts +1 -1
- package/dist/init/index.mjs +57 -32
- package/dist/init/installDependencies.mjs +4 -2
- package/dist/init/logUpdateDependenciesError.d.mts +3 -1
- package/dist/init/logUpdateDependenciesError.mjs +7 -1
- package/dist/init/updateDependenciesWithoutInstalling.mjs +41 -13
- package/dist/init/updateNPMScripts.d.mts +3 -1
- package/dist/init/updateNPMScripts.mjs +10 -7
- package/dist/init/updateTypeScriptConfig.d.mts +4 -1
- package/dist/init/updateTypeScriptConfig.mjs +11 -7
- package/dist/initProgram.d.mts +2 -0
- package/dist/initProgram.mjs +21 -0
- package/dist/locateSegments.d.mts +8 -1
- package/dist/locateSegments.mjs +12 -4
- package/dist/new/addClassToSegmentCode.d.mts +1 -2
- package/dist/new/addClassToSegmentCode.mjs +3 -3
- package/dist/new/addCommonTerms.mjs +1 -0
- package/dist/new/index.d.mts +1 -1
- package/dist/new/index.mjs +3 -2
- package/dist/new/newModule.d.mts +2 -1
- package/dist/new/newModule.mjs +21 -21
- package/dist/new/newSegment.d.mts +2 -1
- package/dist/new/newSegment.mjs +17 -9
- package/dist/new/render.d.mts +6 -3
- package/dist/new/render.mjs +23 -8
- package/dist/types.d.mts +32 -41
- package/dist/utils/debounceWithArgs.d.mts +2 -2
- package/dist/utils/debounceWithArgs.mjs +24 -9
- package/dist/utils/formatLoggedSegmentName.d.mts +2 -1
- package/dist/utils/formatLoggedSegmentName.mjs +2 -2
- package/dist/utils/getAvailablePort.mjs +1 -1
- package/dist/utils/getPublicModuleNameFromPath.d.mts +4 -0
- package/dist/utils/getPublicModuleNameFromPath.mjs +9 -0
- package/dist/utils/pickSegmentFullSchema.d.mts +3 -0
- package/dist/utils/pickSegmentFullSchema.mjs +15 -0
- package/dist/utils/removeUnlistedDirectories.d.mts +10 -0
- package/dist/utils/removeUnlistedDirectories.mjs +61 -0
- package/dist/utils/resolveAbsoluteModulePath.d.mts +2 -0
- package/dist/utils/resolveAbsoluteModulePath.mjs +31 -0
- package/module-templates/controller.ts.ejs +50 -0
- package/module-templates/service.ts.ejs +28 -0
- package/package.json +33 -21
- package/dist/dev/diffSchema.d.mts +0 -43
- package/dist/dev/ensureClient.d.mts +0 -5
- package/dist/dev/ensureClient.mjs +0 -31
- package/dist/dev/isMetadataEmpty.d.mts +0 -2
- package/dist/dev/isMetadataEmpty.mjs +0 -4
- package/dist/dev/writeOneSchemaFile.d.mts +0 -11
- package/dist/generateClient.d.mts +0 -7
- package/dist/generateClient.mjs +0 -97
- package/dist/getProjectInfo/getConfig.d.mts +0 -11
- package/dist/getProjectInfo/getConfig.mjs +0 -29
- package/dist/getProjectInfo/getConfigAbsolutePaths.d.mts +0 -4
- package/dist/postinstall.d.mts +0 -1
- package/dist/postinstall.mjs +0 -24
- package/templates/controller.ejs +0 -51
- package/templates/service.ejs +0 -27
- package/templates/worker.ejs +0 -24
- /package/dist/getProjectInfo/{importUncachedModule.d.mts → getConfig/importUncachedModule.d.mts} +0 -0
- /package/dist/getProjectInfo/{importUncachedModuleWorker.d.mts → getConfig/importUncachedModuleWorker.d.mts} +0 -0
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -1 +1,29 @@
|
|
|
1
|
-
|
|
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
|
+
<p align="center">
|
|
11
|
+
Back-end meta-framework for <a href="https://nextjs.org/docs/app">Next.js</a>
|
|
12
|
+
</p>
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## vovk-cli [](https://www.npmjs.com/package/vovk-cli)
|
|
17
|
+
|
|
18
|
+
The Vovk.ts CLI that generates schema and client but also provides some useful utilities for the development process.
|
|
19
|
+
|
|
20
|
+
```sh
|
|
21
|
+
npm install -D vovk-cli
|
|
22
|
+
```
|
|
23
|
+
|
|
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.
|
|
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.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<%- `// auto-generated ${new Date().toISOString()}\n/* eslint-disable */` %>
|
|
2
|
+
const { fetcher } = require('<%= t.imports.fetcher %>');
|
|
3
|
+
const { createRPC } = require('<%= t.imports.createRPC %>');
|
|
4
|
+
const { schema } = require('./schema.cjs');
|
|
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) => { %>
|
|
8
|
+
exports.<%= rpcModuleName %> = createRPC(
|
|
9
|
+
schema, '<%= segment.segmentName %>', '<%= rpcModuleName %>',
|
|
10
|
+
{ fetcher, validateOnClient, defaultOptions: { apiRoot: '<%= segment.segmentApiRoot ?? t.apiRoot %>' } }
|
|
11
|
+
);
|
|
12
|
+
<% })
|
|
13
|
+
}) %>
|
|
14
|
+
exports.schema = schema;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
|
|
2
|
+
<%- `// auto-generated ${new Date().toISOString()}\n/* eslint-disable */` %>
|
|
3
|
+
import type { VovkClientFetcher } from 'vovk';
|
|
4
|
+
import type { fetcher } from '<%= t.imports.module.fetcher %>';
|
|
5
|
+
import type { createRPC } from '<%= t.imports.module.createRPC %>';
|
|
6
|
+
<% Object.values(t.schema.segments).filter((segment) => segment.emitSchema).forEach((segment, i) => { %>
|
|
7
|
+
import type { Controllers as Controllers<%= i %> } from "<%= t.segmentMeta[segment.segmentName].segmentImportPath %>";
|
|
8
|
+
<% }) %>
|
|
9
|
+
type Options = typeof fetcher extends VovkClientFetcher<infer U> ? U : never;
|
|
10
|
+
<% Object.values(t.schema.segments).filter((segment) => segment.emitSchema).forEach((segment, i) => {
|
|
11
|
+
Object.keys(segment.controllers).forEach((rpcModuleName) => { %>
|
|
12
|
+
export const <%= rpcModuleName %>: ReturnType<typeof createRPC<Controllers<%= i %>["<%= rpcModuleName %>"], Options>>;
|
|
13
|
+
<% })
|
|
14
|
+
}) %>
|
|
15
|
+
export { schema } from './schema.cjs';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
|
|
2
|
+
<%- `// auto-generated ${new Date().toISOString()}\n/* eslint-disable */` %>
|
|
3
|
+
import type { VovkClientFetcher } from 'vovk';
|
|
4
|
+
import type { fetcher } from '<%= t.imports.module.fetcher %>';
|
|
5
|
+
import type { createRPC } from '<%= t.imports.module.createRPC %>';
|
|
6
|
+
<% Object.values(t.schema.segments).filter((segment) => segment.emitSchema).forEach((segment, i) => { %>
|
|
7
|
+
import type { Controllers as Controllers<%= i %> } from "<%= t.segmentMeta[segment.segmentName].segmentImportPath %>";
|
|
8
|
+
<% }) %>
|
|
9
|
+
type Options = typeof fetcher extends VovkClientFetcher<infer U> ? U : never;
|
|
10
|
+
<% Object.values(t.schema.segments).filter((segment) => segment.emitSchema).forEach((segment, i) => {
|
|
11
|
+
Object.keys(segment.controllers).forEach((rpcModuleName) => { %>
|
|
12
|
+
export const <%= rpcModuleName %>: ReturnType<typeof createRPC<Controllers<%= i %>["<%= rpcModuleName %>"], Options>>;
|
|
13
|
+
<% })
|
|
14
|
+
}) %>
|
|
15
|
+
export { schema } from './schema.cjs';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<%- `// auto-generated ${new Date().toISOString()}\n/* eslint-disable */` %>
|
|
2
|
+
import { fetcher } from '<%= t.imports.module.fetcher %>';
|
|
3
|
+
import { createRPC } from '<%= t.imports.module.createRPC %>';
|
|
4
|
+
import { schema } from './schema.cjs';
|
|
5
|
+
<% if (t.imports.module.validateOnClient) { %>
|
|
6
|
+
import { validateOnClient } from '<%= t.imports.module.validateOnClient %>';
|
|
7
|
+
<% } else { %>
|
|
8
|
+
const validateOnClient = undefined;
|
|
9
|
+
<% } %>
|
|
10
|
+
<% Object.values(t.schema.segments).filter((segment) => segment.emitSchema).forEach((segment, i) => {
|
|
11
|
+
Object.keys(segment.controllers).forEach((rpcModuleName) => { %>
|
|
12
|
+
export const <%= rpcModuleName %> = createRPC(
|
|
13
|
+
schema, '<%= segment.segmentName %>', '<%= rpcModuleName %>',
|
|
14
|
+
{ fetcher, validateOnClient, defaultOptions: { apiRoot: '<%= segment.segmentApiRoot ?? t.apiRoot %>' } }
|
|
15
|
+
);
|
|
16
|
+
<%
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
%>
|
|
20
|
+
export { schema };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%- JSON.stringify(t.package, null, 2) %>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
imports: ['vovk-openapi']
|
|
3
|
+
---
|
|
4
|
+
<% const vars = {
|
|
5
|
+
createCodeExamples: t.imports['vovk-openapi'].createCodeExamples,
|
|
6
|
+
}; %>
|
|
7
|
+
|
|
8
|
+
# <%= t.package.name %> v<%= t.package.version %>
|
|
9
|
+
|
|
10
|
+
<%- t.package.description ? `> ${t.package.description}` : '' %>
|
|
11
|
+
|
|
12
|
+
<%- t.package.license ? `License: **${t.package.license}**` : '' %>
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# Install the package
|
|
16
|
+
npm install <%= t.package.name.replace(/-/g, '_') %>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
<% Object.entries(t.schema.segments).forEach(([segmentName, segment]) => {
|
|
20
|
+
Object.values(segment.controllers).forEach((controllerSchema) => { %>
|
|
21
|
+
|
|
22
|
+
## <%= controllerSchema.rpcModuleName %>
|
|
23
|
+
<% Object.entries(controllerSchema.handlers).forEach(([handlerName, handlerSchema]) => { %>
|
|
24
|
+
### <%= controllerSchema.rpcModuleName %>.<%= handlerName %>
|
|
25
|
+
<%- handlerSchema.openapi?.summary ? `> ${handlerSchema.openapi.summary}` : '' %>
|
|
26
|
+
|
|
27
|
+
<%- handlerSchema.openapi?.description ? `${handlerSchema.openapi.description}` : '' %>
|
|
28
|
+
|
|
29
|
+
Endpoint: <%= t.apiRoot %>/<%= segmentName %>/<%= controllerSchema.prefix %>/<%= handlerSchema.path %>
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
<%- vars.createCodeExamples({
|
|
33
|
+
handlerSchema,
|
|
34
|
+
handlerName,
|
|
35
|
+
controllerSchema,
|
|
36
|
+
package: t.package,
|
|
37
|
+
}).ts %>
|
|
38
|
+
```
|
|
39
|
+
<% }) %>
|
|
40
|
+
<% }) %>
|
|
41
|
+
<% }) %>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<%- `// auto-generated ${new Date().toISOString()}\n/* eslint-disable */` %>
|
|
2
|
+
const config = require('./<%= t.schemaOutDir %>/config.json');
|
|
3
|
+
const segments = {<% Object.values(t.schema.segments).filter((segment) => segment.emitSchema).forEach((segment) => { %>
|
|
4
|
+
'<%= segment.segmentName %>': require('./<%= t.schemaOutDir %>/<%= t.SEGMENTS_SCHEMA_DIR_NAME %>/<%= segment.segmentName || t.ROOT_SEGMENT_SCHEMA_NAME %>.json'),<% }) %>
|
|
5
|
+
};
|
|
6
|
+
const schema = {
|
|
7
|
+
$schema: '<%- t.VovkSchemaIdEnum.FULL %>',
|
|
8
|
+
config,
|
|
9
|
+
segments,
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
module.exports.schema = schema;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<%- `// auto-generated ${new Date().toISOString()}\n/* eslint-disable */` %>
|
|
2
|
+
import type { VovkStrictConfig, VovkSegmentSchema, VovkSchemaIdEnum } from 'vovk';
|
|
3
|
+
|
|
4
|
+
export const schema: {
|
|
5
|
+
$schema: '<%- t.VovkSchemaIdEnum.FULL %>';
|
|
6
|
+
config: Partial<VovkStrictConfig>;
|
|
7
|
+
segments: {<% Object.values(t.schema.segments).filter((segment) => segment.emitSchema).forEach((segment) => { %>
|
|
8
|
+
'<%= segment.segmentName %>': VovkSegmentSchema;<% }) %>
|
|
9
|
+
};
|
|
10
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%- JSON.stringify(t.schema, null, 2) %>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<%- `// auto-generated ${new Date().toISOString()}\n/* eslint-disable */` %>
|
|
2
|
+
import config from './<%= t.schemaOutDir %>/config.json' with { type: "json" };
|
|
3
|
+
<% Object.values(t.schema.segments).filter((segment) => segment.emitSchema).forEach((segment, i) => { %>
|
|
4
|
+
import segment<%= i %> from './<%= t.schemaOutDir %>/<%= t.SEGMENTS_SCHEMA_DIR_NAME %>/<%= segment.segmentName || t.ROOT_SEGMENT_SCHEMA_NAME %>.json' with { type: "json" };
|
|
5
|
+
<% }) %>
|
|
6
|
+
const segments = {<% Object.values(t.schema.segments).filter((segment) => segment.emitSchema).forEach((segment, i) => { %>
|
|
7
|
+
'<%= segment.segmentName %>': segment<%= i %>,<% }) %>
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export const schema = {
|
|
11
|
+
$schema: '<%- t.VovkSchemaIdEnum.FULL %>',
|
|
12
|
+
config,
|
|
13
|
+
segments,
|
|
14
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<%- `// auto-generated ${new Date().toISOString()}\n/* eslint-disable */` %>
|
|
2
|
+
import type { VovkClientFetcher } from 'vovk';
|
|
3
|
+
import { fetcher } from '<%= t.imports.fetcher %>';
|
|
4
|
+
import { createRPC } from '<%= t.imports.createRPC %>';
|
|
5
|
+
import { schema } from './schema.ts';
|
|
6
|
+
<% Object.values(t.schema.segments).filter((segment) => segment.emitSchema).forEach((segment, i) => { %>
|
|
7
|
+
import type { Controllers as Controllers<%= i %> } from "<%= t.segmentMeta[segment.segmentName].segmentImportPath %>";
|
|
8
|
+
<% }) %>
|
|
9
|
+
<% if (t.imports.validateOnClient) { %>
|
|
10
|
+
import { validateOnClient } from '<%= t.imports.validateOnClient %>';
|
|
11
|
+
<% } else { %>
|
|
12
|
+
const validateOnClient = undefined;
|
|
13
|
+
<% } %>
|
|
14
|
+
type Options = typeof fetcher extends VovkClientFetcher<infer U> ? U : never;
|
|
15
|
+
<% Object.values(t.schema.segments).filter((segment) => segment.emitSchema).forEach((segment, i) => { %>
|
|
16
|
+
<% Object.keys(segment.controllers).forEach((rpcModuleName) => { %>
|
|
17
|
+
export const <%= rpcModuleName %> = createRPC<Controllers<%= i %>["<%= rpcModuleName %>"], Options>(
|
|
18
|
+
schema, '<%= segment.segmentName %>', '<%= rpcModuleName %>',
|
|
19
|
+
{ fetcher, validateOnClient, defaultOptions: { apiRoot: '<%= segment.segmentApiRoot ?? t.apiRoot %>' } }
|
|
20
|
+
);
|
|
21
|
+
<% }) %>
|
|
22
|
+
<% }) %>
|
|
23
|
+
export { schema };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { VovkSchema } from 'vovk';
|
|
2
|
+
import type { ProjectInfo } from '../getProjectInfo/index.mjs';
|
|
3
|
+
import type { BundleOptions } from '../types.mjs';
|
|
4
|
+
export default function bundle({ projectInfo, fullSchema, cliBundleOptions, }: {
|
|
5
|
+
projectInfo: ProjectInfo;
|
|
6
|
+
fullSchema: VovkSchema;
|
|
7
|
+
cliBundleOptions: BundleOptions;
|
|
8
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import { build } from 'tsdown';
|
|
4
|
+
import groupBy from 'lodash/groupBy.js';
|
|
5
|
+
import generate from '../generate/index.mjs';
|
|
6
|
+
import { BuiltInTemplateName } from '../getProjectInfo/getConfig/getTemplateDefs.mjs';
|
|
7
|
+
import chalkHighlightThing from '../utils/chalkHighlightThing.mjs';
|
|
8
|
+
import locateSegments from '../locateSegments.mjs';
|
|
9
|
+
export default async function bundle({ projectInfo, fullSchema, cliBundleOptions, }) {
|
|
10
|
+
const { config, log, cwd, apiDir } = projectInfo;
|
|
11
|
+
const locatedSegments = await locateSegments({ dir: path.join(cwd, apiDir), config, log });
|
|
12
|
+
const { bundle: bundleConfig } = config;
|
|
13
|
+
const tsFullClientOutAbsoluteDirInput = path.join(cwd, bundleConfig.tsClientOutDir);
|
|
14
|
+
const tsClientOutDir = cliBundleOptions?.tsClientOutDir ?? bundleConfig.tsClientOutDir;
|
|
15
|
+
const dontDeleteTsClientOutDirAfter = cliBundleOptions?.dontDeleteTsClientOutDirAfter ?? bundleConfig?.dontDeleteTsClientOutDirAfter ?? false;
|
|
16
|
+
const sourcemap = cliBundleOptions?.sourcemap ?? bundleConfig?.sourcemap;
|
|
17
|
+
if (!tsClientOutDir) {
|
|
18
|
+
throw new Error('No output directory specified for composed client');
|
|
19
|
+
}
|
|
20
|
+
const outDir = cliBundleOptions?.outDir ?? bundleConfig.outDir;
|
|
21
|
+
if (!outDir) {
|
|
22
|
+
throw new Error('No output directory specified for bundling');
|
|
23
|
+
}
|
|
24
|
+
await generate({
|
|
25
|
+
isEnsuringClient: false,
|
|
26
|
+
projectInfo,
|
|
27
|
+
forceNothingWrittenLog: true,
|
|
28
|
+
fullSchema,
|
|
29
|
+
locatedSegments,
|
|
30
|
+
cliGenerateOptions: {
|
|
31
|
+
composedFrom: [BuiltInTemplateName.ts],
|
|
32
|
+
composedOut: tsClientOutDir,
|
|
33
|
+
composedOnly: true,
|
|
34
|
+
composedIncludeSegments: cliBundleOptions.includeSegments ?? bundleConfig.includeSegments,
|
|
35
|
+
composedExcludeSegments: cliBundleOptions.excludeSegments ?? bundleConfig.excludeSegments,
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
await build({
|
|
39
|
+
entry: path.join(tsFullClientOutAbsoluteDirInput, './index.ts'),
|
|
40
|
+
dts: true,
|
|
41
|
+
format: ['cjs', 'esm'],
|
|
42
|
+
fixedExtension: true,
|
|
43
|
+
outDir,
|
|
44
|
+
sourcemap: bundleConfig.sourcemap,
|
|
45
|
+
});
|
|
46
|
+
const outDirAbsolute = path.resolve(cwd, outDir);
|
|
47
|
+
log.info(`Bundled index.ts to ${chalkHighlightThing(outDirAbsolute)}`);
|
|
48
|
+
await build({
|
|
49
|
+
entry: path.join(tsFullClientOutAbsoluteDirInput, './schema.ts'),
|
|
50
|
+
dts: true,
|
|
51
|
+
format: ['cjs'],
|
|
52
|
+
fixedExtension: true,
|
|
53
|
+
outDir,
|
|
54
|
+
clean: false,
|
|
55
|
+
sourcemap,
|
|
56
|
+
});
|
|
57
|
+
log.info(`Bundled schema.ts to ${chalkHighlightThing(outDirAbsolute)}`);
|
|
58
|
+
const requiresGroup = groupBy(Object.entries(bundleConfig.requires), ([, relativePath]) => relativePath);
|
|
59
|
+
for (const [relativePath, group] of Object.entries(requiresGroup)) {
|
|
60
|
+
await generate({
|
|
61
|
+
isEnsuringClient: false,
|
|
62
|
+
projectInfo,
|
|
63
|
+
forceNothingWrittenLog: true,
|
|
64
|
+
fullSchema,
|
|
65
|
+
locatedSegments,
|
|
66
|
+
cliGenerateOptions: {
|
|
67
|
+
composedFrom: group.map(([templateName]) => templateName),
|
|
68
|
+
composedOut: path.resolve(outDir, relativePath),
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
if (!dontDeleteTsClientOutDirAfter) {
|
|
73
|
+
await fs.rm(tsFullClientOutAbsoluteDirInput, { recursive: true, force: true });
|
|
74
|
+
log.debug(`Deleted temporary TypeScript client output directory: ${chalkHighlightThing(tsFullClientOutAbsoluteDirInput)}`);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
log.debug(`Temporary TypeScript client output directory not deleted: ${chalkHighlightThing(tsFullClientOutAbsoluteDirInput)}`);
|
|
78
|
+
}
|
|
79
|
+
log.info(`Bundled TypeScript client to ${outDirAbsolute}`);
|
|
80
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { VovkControllerSchema, VovkSegmentSchema } from 'vovk';
|
|
2
|
+
interface HandlersDiff {
|
|
3
|
+
nameOfClass: string;
|
|
4
|
+
added: string[];
|
|
5
|
+
removed: string[];
|
|
6
|
+
changed: string[];
|
|
7
|
+
}
|
|
8
|
+
interface ControllersDiff {
|
|
9
|
+
added: string[];
|
|
10
|
+
removed: string[];
|
|
11
|
+
handlers: HandlersDiff[];
|
|
12
|
+
}
|
|
13
|
+
export interface DiffResult {
|
|
14
|
+
controllers: ControllersDiff;
|
|
15
|
+
}
|
|
16
|
+
export declare function diffHandlers<T extends VovkControllerSchema['handlers']>(oldHandlers: T, newHandlers: T, nameOfClass: string): HandlersDiff;
|
|
17
|
+
export declare function diffControllers<T extends VovkSegmentSchema['controllers']>(oldItems: T, newItems: T): ControllersDiff;
|
|
18
|
+
/**
|
|
19
|
+
example output:
|
|
20
|
+
{
|
|
21
|
+
controllers: {
|
|
22
|
+
added: ["ControllerC"],
|
|
23
|
+
removed: ["ControllerB"],
|
|
24
|
+
handlers: [
|
|
25
|
+
{
|
|
26
|
+
nameOfClass: "ControllerA",
|
|
27
|
+
added: ["handlerF"],
|
|
28
|
+
removed: [],
|
|
29
|
+
changed: ["handlerD"]
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
*/
|
|
35
|
+
export default function diffSegmentSchema(oldJson: VovkSegmentSchema, newJson: VovkSegmentSchema): DiffResult;
|
|
36
|
+
export {};
|
|
@@ -18,7 +18,7 @@ export function diffHandlers(oldHandlers, newHandlers, nameOfClass) {
|
|
|
18
18
|
}
|
|
19
19
|
return { nameOfClass, added, removed, changed };
|
|
20
20
|
}
|
|
21
|
-
export function
|
|
21
|
+
export function diffControllers(oldItems, newItems) {
|
|
22
22
|
const added = [];
|
|
23
23
|
const removed = [];
|
|
24
24
|
const handlersDiff = [];
|
|
@@ -27,7 +27,7 @@ export function diffWorkersOrControllers(oldItems, newItems) {
|
|
|
27
27
|
added.push(item);
|
|
28
28
|
}
|
|
29
29
|
else {
|
|
30
|
-
const handlers = diffHandlers(oldItems[item].
|
|
30
|
+
const handlers = diffHandlers(oldItems[item].handlers, newItem.handlers, item);
|
|
31
31
|
if (handlers.added.length || handlers.removed.length || handlers.changed.length) {
|
|
32
32
|
handlersDiff.push(handlers);
|
|
33
33
|
}
|
|
@@ -43,11 +43,6 @@ export function diffWorkersOrControllers(oldItems, newItems) {
|
|
|
43
43
|
/**
|
|
44
44
|
example output:
|
|
45
45
|
{
|
|
46
|
-
workers: {
|
|
47
|
-
added: ["WorkerC"],
|
|
48
|
-
removed: ["WorkerA"],
|
|
49
|
-
handlers: []
|
|
50
|
-
},
|
|
51
46
|
controllers: {
|
|
52
47
|
added: ["ControllerC"],
|
|
53
48
|
removed: ["ControllerB"],
|
|
@@ -62,11 +57,8 @@ example output:
|
|
|
62
57
|
}
|
|
63
58
|
}
|
|
64
59
|
*/
|
|
65
|
-
export default function
|
|
66
|
-
const workersDiff = diffWorkersOrControllers(oldJson.workers ?? {}, newJson.workers ?? {});
|
|
67
|
-
const controllersDiff = diffWorkersOrControllers(oldJson.controllers ?? {}, newJson.controllers ?? {});
|
|
60
|
+
export default function diffSegmentSchema(oldJson, newJson) {
|
|
68
61
|
return {
|
|
69
|
-
|
|
70
|
-
controllers: controllersDiff,
|
|
62
|
+
controllers: diffControllers(oldJson.controllers ?? {}, newJson.controllers ?? {}),
|
|
71
63
|
};
|
|
72
64
|
}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
import { ProjectInfo } from '../getProjectInfo/index.mjs';
|
|
2
|
+
/**
|
|
3
|
+
* Ensure that the schema files are created to avoid any import errors.
|
|
4
|
+
*/
|
|
2
5
|
export default function ensureSchemaFiles(projectInfo: ProjectInfo | null, schemaOutAbsolutePath: string, segmentNames: string[]): Promise<void>;
|
|
3
6
|
export declare const debouncedEnsureSchemaFiles: import("lodash").DebouncedFunc<typeof ensureSchemaFiles>;
|
|
@@ -1,44 +1,28 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import debounce from 'lodash/debounce.js';
|
|
4
|
-
import
|
|
4
|
+
import { VovkSchemaIdEnum } from 'vovk';
|
|
5
|
+
import writeOneSchemaFile, { SEGMENTS_SCHEMA_DIR_NAME, ROOT_SEGMENT_SCHEMA_NAME, } from './writeOneSegmentSchemaFile.mjs';
|
|
5
6
|
import formatLoggedSegmentName from '../utils/formatLoggedSegmentName.mjs';
|
|
7
|
+
import writeConfigJson from './writeConfigJson.mjs';
|
|
8
|
+
/**
|
|
9
|
+
* Ensure that the schema files are created to avoid any import errors.
|
|
10
|
+
*/
|
|
6
11
|
export default async function ensureSchemaFiles(projectInfo, schemaOutAbsolutePath, segmentNames) {
|
|
7
12
|
const now = Date.now();
|
|
8
13
|
let hasChanged = false;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
.map((segmentName) => {
|
|
13
|
-
return `module.exports['${segmentName}'] = require('./${segmentName || ROOT_SEGMENT_SCHEMA_NAME}.json');`;
|
|
14
|
-
})
|
|
15
|
-
.join('\n')}`;
|
|
16
|
-
const dTsContent = `// auto-generated
|
|
17
|
-
import type { VovkSchema } from 'vovk';
|
|
18
|
-
declare const segmentSchema: {
|
|
19
|
-
${segmentNames.map((segmentName) => ` '${segmentName}': VovkSchema;`).join('\n')}
|
|
20
|
-
};
|
|
21
|
-
export default segmentSchema;`;
|
|
22
|
-
const jsAbsolutePath = path.join(schemaOutAbsolutePath, 'index.js');
|
|
23
|
-
const dTsAbsolutePath = path.join(schemaOutAbsolutePath, 'index.d.ts');
|
|
24
|
-
const existingJs = await fs.readFile(jsAbsolutePath, 'utf-8').catch(() => null);
|
|
25
|
-
const existingDTs = await fs.readFile(dTsAbsolutePath, 'utf-8').catch(() => null);
|
|
26
|
-
await fs.mkdir(schemaOutAbsolutePath, { recursive: true });
|
|
27
|
-
if (existingJs !== indexContent) {
|
|
28
|
-
await fs.writeFile(jsAbsolutePath, indexContent);
|
|
29
|
-
}
|
|
30
|
-
if (existingDTs !== dTsContent) {
|
|
31
|
-
await fs.writeFile(dTsAbsolutePath, dTsContent);
|
|
32
|
-
}
|
|
14
|
+
const schemaJsonOutAbsolutePath = path.join(schemaOutAbsolutePath, SEGMENTS_SCHEMA_DIR_NAME);
|
|
15
|
+
await fs.mkdir(schemaJsonOutAbsolutePath, { recursive: true });
|
|
16
|
+
await writeConfigJson(schemaOutAbsolutePath, projectInfo);
|
|
33
17
|
// Create JSON files (if not exist) with name [segmentName].json (where segmentName can include /, which means the folder structure can be nested)
|
|
34
18
|
await Promise.all(segmentNames.map(async (segmentName) => {
|
|
35
19
|
const { isCreated } = await writeOneSchemaFile({
|
|
36
20
|
schemaOutAbsolutePath,
|
|
37
|
-
|
|
21
|
+
segmentSchema: {
|
|
22
|
+
$schema: VovkSchemaIdEnum.SEGMENT,
|
|
38
23
|
emitSchema: false,
|
|
39
24
|
segmentName,
|
|
40
25
|
controllers: {},
|
|
41
|
-
workers: {},
|
|
42
26
|
},
|
|
43
27
|
skipIfExists: true,
|
|
44
28
|
});
|
|
@@ -64,7 +48,7 @@ export default segmentSchema;`;
|
|
|
64
48
|
}
|
|
65
49
|
}
|
|
66
50
|
else if (entry.isFile() && entry.name.endsWith('.json')) {
|
|
67
|
-
const relativePath = path.relative(
|
|
51
|
+
const relativePath = path.relative(schemaJsonOutAbsolutePath, absolutePath);
|
|
68
52
|
const segmentName = relativePath.replace(/\\/g, '/').slice(0, -5); // Remove '.json' extension
|
|
69
53
|
if (!segmentNames.includes(segmentName) &&
|
|
70
54
|
!segmentNames.includes(segmentName.replace(ROOT_SEGMENT_SCHEMA_NAME, ''))) {
|
|
@@ -76,8 +60,8 @@ export default segmentSchema;`;
|
|
|
76
60
|
}));
|
|
77
61
|
}
|
|
78
62
|
// Start the recursive deletion from the root directory
|
|
79
|
-
await deleteUnnecessaryJsonFiles(
|
|
63
|
+
await deleteUnnecessaryJsonFiles(schemaJsonOutAbsolutePath);
|
|
80
64
|
if (hasChanged)
|
|
81
|
-
projectInfo?.log.info(`
|
|
65
|
+
projectInfo?.log.info(`Created empty schema files in ${Date.now() - now}ms`);
|
|
82
66
|
}
|
|
83
67
|
export const debouncedEnsureSchemaFiles = debounce(ensureSchemaFiles, 1000);
|
package/dist/dev/index.d.mts
CHANGED