@tsed/cli 7.0.0-beta.1 → 7.0.0-beta.3
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/lib/esm/bin/tsed-mcp.js +42 -0
- package/lib/esm/commands/init/InitCmd.js +9 -9
- package/lib/esm/commands/init/config/InitSchema.js +27 -0
- package/lib/esm/index.js +3 -0
- package/lib/esm/mcp/resources/index.js +3 -0
- package/lib/esm/mcp/resources/projectInfoResource.js +43 -0
- package/lib/esm/mcp/resources/serverInfoResource.js +40 -0
- package/lib/esm/mcp/schema/ProjectPreferencesSchema.js +16 -0
- package/lib/esm/mcp/tools/generateTool.js +105 -0
- package/lib/esm/mcp/tools/getTemplateTool.js +47 -0
- package/lib/esm/mcp/tools/index.js +6 -0
- package/lib/esm/mcp/tools/listTemplatesTool.js +37 -0
- package/lib/esm/mcp/tools/setWorkspaceTool.js +64 -0
- package/lib/esm/services/CliProjectService.js +7 -3
- package/lib/esm/services/CliStats.js +45 -0
- package/lib/esm/services/CliTemplatesService.js +13 -4
- package/lib/esm/templates/asyncFactory.template.js +4 -3
- package/lib/esm/templates/barrels.template.js +0 -3
- package/lib/esm/templates/command.template.js +1 -0
- package/lib/esm/templates/controller.template.js +7 -0
- package/lib/esm/templates/decorator.template.js +22 -11
- package/lib/esm/templates/dockerfile.template.js +5 -0
- package/lib/esm/templates/exception-filter.template.js +1 -0
- package/lib/esm/templates/factory.template.js +4 -3
- package/lib/esm/templates/index.logger.template.js +0 -1
- package/lib/esm/templates/interceptor.template.js +1 -0
- package/lib/esm/templates/interface.template.js +1 -0
- package/lib/esm/templates/middleware.template.js +14 -4
- package/lib/esm/templates/model.template.js +1 -0
- package/lib/esm/templates/module.template.js +1 -0
- package/lib/esm/templates/pipe.template.js +1 -0
- package/lib/esm/templates/prisma.service.template.js +1 -0
- package/lib/esm/templates/repository.template.js +1 -0
- package/lib/esm/templates/response-filter.template.js +1 -0
- package/lib/esm/templates/service.template.js +1 -0
- package/lib/esm/templates/value.template.js +1 -0
- package/lib/esm/utils/resolveSchema.js +17 -0
- package/lib/esm/utils/summarizeSchema.js +24 -0
- package/lib/tsconfig.esm.tsbuildinfo +1 -1
- package/lib/types/bin/tsed-mcp.d.ts +2 -0
- package/lib/types/commands/generate/GenerateCmd.d.ts +38 -1
- package/lib/types/commands/init/InitCmd.d.ts +1 -1
- package/lib/types/commands/init/config/InitSchema.d.ts +13 -0
- package/lib/types/index.d.ts +3 -0
- package/lib/types/mcp/resources/index.d.ts +2 -0
- package/lib/types/mcp/resources/projectInfoResource.d.ts +1 -0
- package/lib/types/mcp/resources/serverInfoResource.d.ts +1 -0
- package/lib/types/mcp/schema/ProjectPreferencesSchema.d.ts +9 -0
- package/lib/types/mcp/tools/generateTool.d.ts +88 -0
- package/lib/types/mcp/tools/getTemplateTool.d.ts +86 -0
- package/lib/types/mcp/tools/index.d.ts +2 -0
- package/lib/types/mcp/tools/listTemplatesTool.d.ts +86 -0
- package/lib/types/mcp/tools/setWorkspaceTool.d.ts +91 -0
- package/lib/types/pipes/SymbolNamePipe.d.ts +1 -1
- package/lib/types/services/CliProjectService.d.ts +1 -1
- package/lib/types/services/CliStats.d.ts +36 -0
- package/lib/types/services/CliTemplatesService.d.ts +6 -5
- package/lib/types/templates/asyncFactory.template.d.ts +1 -0
- package/lib/types/templates/barrels.template.d.ts +1 -0
- package/lib/types/templates/command.template.d.ts +1 -0
- package/lib/types/templates/config.template.d.ts +1 -0
- package/lib/types/templates/controller.template.d.ts +1 -0
- package/lib/types/templates/decorator.template.d.ts +1 -0
- package/lib/types/templates/docker-compose.template.d.ts +1 -0
- package/lib/types/templates/exception-filter.template.d.ts +1 -0
- package/lib/types/templates/factory.template.d.ts +1 -0
- package/lib/types/templates/index.command.template.d.ts +1 -0
- package/lib/types/templates/index.config.utils.template.d.ts +1 -0
- package/lib/types/templates/index.controller.template.d.ts +1 -0
- package/lib/types/templates/index.logger.template.d.ts +3 -2
- package/lib/types/templates/index.template.d.ts +1 -0
- package/lib/types/templates/interceptor.template.d.ts +1 -0
- package/lib/types/templates/interface.template.d.ts +1 -0
- package/lib/types/templates/middleware.template.d.ts +1 -0
- package/lib/types/templates/model.template.d.ts +1 -0
- package/lib/types/templates/module.template.d.ts +1 -0
- package/lib/types/templates/pipe.template.d.ts +1 -0
- package/lib/types/templates/prisma.service.template.d.ts +1 -0
- package/lib/types/templates/readme.template.d.ts +1 -0
- package/lib/types/templates/repository.template.d.ts +1 -0
- package/lib/types/templates/response-filter.template.d.ts +1 -0
- package/lib/types/templates/server.template.d.ts +1 -0
- package/lib/types/templates/service.template.d.ts +1 -0
- package/lib/types/templates/tsconfig.spec.template.d.ts +1 -0
- package/lib/types/templates/value.template.d.ts +1 -0
- package/lib/types/utils/defineTemplate.d.ts +11 -0
- package/lib/types/utils/resolveSchema.d.ts +2 -0
- package/lib/types/utils/summarizeSchema.d.ts +8 -0
- package/package.json +15 -10
- package/lib/esm/commands/init/config/InitFileSchema.js +0 -49
- package/lib/types/commands/init/config/InitFileSchema.d.ts +0 -49
|
@@ -3,12 +3,13 @@ import { camelCase, pascalCase } from "change-case";
|
|
|
3
3
|
export default defineTemplate({
|
|
4
4
|
id: "async.factory",
|
|
5
5
|
label: "Async Factory",
|
|
6
|
+
description: "Generate an async factory token for Ts.ED DI in src/services.",
|
|
6
7
|
fileName: "{{symbolName}}.factory?",
|
|
7
8
|
outputDir: "{{srcDir}}/services",
|
|
8
9
|
render(symbolName) {
|
|
9
10
|
const camelName = camelCase(symbolName);
|
|
10
11
|
const optName = pascalCase(symbolName + "Options");
|
|
11
|
-
return `import {injectable} from "@tsed/di";
|
|
12
|
+
return `import {injectable, constant} from "@tsed/di";
|
|
12
13
|
|
|
13
14
|
interface ${optName} {
|
|
14
15
|
|
|
@@ -17,7 +18,7 @@ interface ${optName} {
|
|
|
17
18
|
declare global {
|
|
18
19
|
namespace TsED {
|
|
19
20
|
interface Configuration extends Record<string, any> {
|
|
20
|
-
${camelName}:
|
|
21
|
+
${camelName}: ${optName};
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
24
|
}
|
|
@@ -33,6 +34,6 @@ export const ${symbolName} = injectable(Symbol.for("${symbolName}"))
|
|
|
33
34
|
})
|
|
34
35
|
.token();
|
|
35
36
|
|
|
36
|
-
export type {
|
|
37
|
+
export type ${symbolName} = typeof ${symbolName};`;
|
|
37
38
|
}
|
|
38
39
|
});
|
|
@@ -3,6 +3,7 @@ import { kebabCase } from "change-case";
|
|
|
3
3
|
export default defineTemplate({
|
|
4
4
|
id: "command",
|
|
5
5
|
label: "Command",
|
|
6
|
+
description: "Create a CLI command provider with prompts, context mapping and tasks in src/bin/commands.",
|
|
6
7
|
fileName: "{{symbolName}}.command",
|
|
7
8
|
outputDir: "{{srcDir}}/bin/commands",
|
|
8
9
|
render(symbolName) {
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { defineTemplate } from "../utils/defineTemplate.js";
|
|
2
|
+
import { object, string } from "@tsed/schema";
|
|
2
3
|
export default defineTemplate({
|
|
3
4
|
id: "controller",
|
|
4
5
|
label: "Controller",
|
|
6
|
+
description: "Create a new controller class with a sample GET endpoint in src/controllers.",
|
|
5
7
|
fileName: "{{symbolName}}.controller",
|
|
6
8
|
outputDir: "{{srcDir}}/controllers",
|
|
9
|
+
// Validation schema specific to this template (do not include global fields `type` and `name`)
|
|
10
|
+
schema: object({
|
|
11
|
+
route: string().pattern(/^\//).description("Route starting with '/' (e.g., '/users')"),
|
|
12
|
+
directory: string().description("Sub-directory under src/controllers")
|
|
13
|
+
}),
|
|
7
14
|
prompts(context) {
|
|
8
15
|
return [
|
|
9
16
|
{
|
|
@@ -1,9 +1,30 @@
|
|
|
1
1
|
import { defineTemplate } from "../utils/defineTemplate.js";
|
|
2
|
+
import { s } from "@tsed/schema";
|
|
3
|
+
const choices = [
|
|
4
|
+
{ name: "Class Decorator", value: "class" },
|
|
5
|
+
{ name: "Generic Decorator (class, property)", value: "generic" },
|
|
6
|
+
{ name: "Method Decorator", value: "method" },
|
|
7
|
+
{ name: "Parameter Decorator", value: "param" },
|
|
8
|
+
{ name: "Property Decorator", value: "property" },
|
|
9
|
+
{ name: "Property Decorator (with @Property)", value: "prop" },
|
|
10
|
+
{ name: "Parameters Decorator", value: "parameters" },
|
|
11
|
+
{ name: "Endpoint Decorator", value: "endpoint" },
|
|
12
|
+
{ name: "Middleware Decorator", value: "middleware" }
|
|
13
|
+
];
|
|
2
14
|
export default defineTemplate({
|
|
3
15
|
id: "decorator",
|
|
4
16
|
label: "Decorator",
|
|
17
|
+
description: "Scaffold a custom decorator with variants (class, generic, method, parameter, property, endpoint, middleware) in src/decorators.",
|
|
5
18
|
fileName: "{{symbolName}}",
|
|
6
19
|
outputDir: "{{srcDir}}/decorators",
|
|
20
|
+
schema: s.object({
|
|
21
|
+
templateType: s
|
|
22
|
+
.string()
|
|
23
|
+
.enum("class", "generic", "method", "param", "property", "prop", "parameters", "endpoint", "middleware")
|
|
24
|
+
.customKey("x-choices", choices)
|
|
25
|
+
.default("class")
|
|
26
|
+
.description("sub-type of the template to generate the decorator")
|
|
27
|
+
}),
|
|
7
28
|
prompts(context) {
|
|
8
29
|
return [
|
|
9
30
|
{
|
|
@@ -13,17 +34,7 @@ export default defineTemplate({
|
|
|
13
34
|
when(state) {
|
|
14
35
|
return !!(["decorator"].includes(state.type || context.type) || context.templateType);
|
|
15
36
|
},
|
|
16
|
-
choices
|
|
17
|
-
{ name: "Class Decorator", value: "class" },
|
|
18
|
-
{ name: "Generic Decorator (class, property)", value: "generic" },
|
|
19
|
-
{ name: "Method Decorator", value: "method" },
|
|
20
|
-
{ name: "Parameter Decorator", value: "param" },
|
|
21
|
-
{ name: "Property Decorator", value: "property" },
|
|
22
|
-
{ name: "Property Decorator (with @Property)", value: "prop" },
|
|
23
|
-
{ name: "Parameters Decorator", value: "parameters" },
|
|
24
|
-
{ name: "Endpoint Decorator", value: "endpoint" },
|
|
25
|
-
{ name: "Middleware Decorator", value: "middleware" }
|
|
26
|
-
],
|
|
37
|
+
choices,
|
|
27
38
|
default: "class"
|
|
28
39
|
}
|
|
29
40
|
];
|
|
@@ -33,6 +33,7 @@ ENV NODE_ENV production`;
|
|
|
33
33
|
defineTemplate({
|
|
34
34
|
id: "dockerfile.yarn",
|
|
35
35
|
label: "Dockerfile (Yarn classic)",
|
|
36
|
+
description: "Generate a multi-stage Dockerfile for production builds using Yarn classic.",
|
|
36
37
|
fileName: "Dockerfile",
|
|
37
38
|
outputDir: ".",
|
|
38
39
|
ext: null,
|
|
@@ -72,6 +73,7 @@ CMD ["pm2-runtime", "start", "processes.config.cjs", "--env", "production"]
|
|
|
72
73
|
defineTemplate({
|
|
73
74
|
id: "dockerfile.yarn_berry",
|
|
74
75
|
label: "Dockerfile (Yarn Berry)",
|
|
76
|
+
description: "Generate a multi-stage Dockerfile for production builds using Yarn Berry (modern Yarn).",
|
|
75
77
|
fileName: "Dockerfile",
|
|
76
78
|
outputDir: ".",
|
|
77
79
|
ext: null,
|
|
@@ -114,6 +116,7 @@ CMD ["pm2-runtime", "start", "processes.config.cjs", "--env", "production"]
|
|
|
114
116
|
defineTemplate({
|
|
115
117
|
id: "dockerfile.npm",
|
|
116
118
|
label: "Dockerfile (NPM)",
|
|
119
|
+
description: "Generate a multi-stage Dockerfile for production builds using NPM.",
|
|
117
120
|
fileName: "Dockerfile",
|
|
118
121
|
outputDir: ".",
|
|
119
122
|
ext: null,
|
|
@@ -152,6 +155,7 @@ CMD ["pm2-runtime", "start", "processes.config.cjs", "--env", "production"]`;
|
|
|
152
155
|
defineTemplate({
|
|
153
156
|
id: "dockerfile.pnpm",
|
|
154
157
|
label: "Dockerfile (PNPM)",
|
|
158
|
+
description: "Generate a multi-stage Dockerfile for production builds using PNPM.",
|
|
155
159
|
fileName: "Dockerfile",
|
|
156
160
|
outputDir: ".",
|
|
157
161
|
ext: null,
|
|
@@ -191,6 +195,7 @@ CMD ["pm2-runtime", "start", "processes.config.cjs", "--env", "production"]
|
|
|
191
195
|
defineTemplate({
|
|
192
196
|
id: "dockerfile.bun",
|
|
193
197
|
label: "Dockerfile (Bun)",
|
|
198
|
+
description: "Generate a multi-stage Dockerfile for production builds using Bun.",
|
|
194
199
|
fileName: "Dockerfile",
|
|
195
200
|
outputDir: ".",
|
|
196
201
|
ext: null,
|
|
@@ -2,6 +2,7 @@ import { defineTemplate } from "../utils/defineTemplate.js";
|
|
|
2
2
|
export default defineTemplate({
|
|
3
3
|
id: "exception-filter",
|
|
4
4
|
label: "Exception Filter",
|
|
5
|
+
description: "Create an exception filter class annotated with @Catch to handle thrown errors in src/filters.",
|
|
5
6
|
fileName: "{{symbolName}}.exception-filter",
|
|
6
7
|
outputDir: "{{srcDir}}/filters",
|
|
7
8
|
render(symbolName) {
|
|
@@ -3,12 +3,13 @@ import { camelCase, pascalCase } from "change-case";
|
|
|
3
3
|
export default defineTemplate({
|
|
4
4
|
id: "factory",
|
|
5
5
|
label: "Factory",
|
|
6
|
+
description: "Generate a synchronous factory token for Ts.ED DI in src/services.",
|
|
6
7
|
fileName: "{{symbolName}}.factory?",
|
|
7
8
|
outputDir: "{{srcDir}}/services",
|
|
8
9
|
render(symbolName) {
|
|
9
10
|
const camelName = camelCase(symbolName);
|
|
10
11
|
const optName = pascalCase(symbolName + "Options");
|
|
11
|
-
return `import {injectable} from "@tsed/di";
|
|
12
|
+
return `import {injectable, constant} from "@tsed/di";
|
|
12
13
|
|
|
13
14
|
interface ${optName} {
|
|
14
15
|
|
|
@@ -17,7 +18,7 @@ interface ${optName} {
|
|
|
17
18
|
declare global {
|
|
18
19
|
namespace TsED {
|
|
19
20
|
interface Configuration extends Record<string, any> {
|
|
20
|
-
${camelName}:
|
|
21
|
+
${camelName}: ${optName};
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
24
|
}
|
|
@@ -32,6 +33,6 @@ export const ${symbolName} = injectable(Symbol.for("${symbolName}"))
|
|
|
32
33
|
})
|
|
33
34
|
.token();
|
|
34
35
|
|
|
35
|
-
export type {
|
|
36
|
+
export type ${symbolName} = typeof ${symbolName};`;
|
|
36
37
|
}
|
|
37
38
|
});
|
|
@@ -2,6 +2,7 @@ import { defineTemplate } from "../utils/defineTemplate.js";
|
|
|
2
2
|
export default defineTemplate({
|
|
3
3
|
id: "interceptor",
|
|
4
4
|
label: "Interceptor",
|
|
5
|
+
description: "Create an interceptor class that can transform requests/responses in src/interceptors.",
|
|
5
6
|
fileName: "{{symbolName}}.interceptor",
|
|
6
7
|
outputDir: "{{srcDir}}/interceptors",
|
|
7
8
|
render(symbolName) {
|
|
@@ -2,6 +2,7 @@ import { defineTemplate } from "../utils/defineTemplate.js";
|
|
|
2
2
|
export default defineTemplate({
|
|
3
3
|
id: "interface",
|
|
4
4
|
label: "Interface",
|
|
5
|
+
description: "Create a TypeScript interface file in src/interfaces.",
|
|
5
6
|
fileName: "{{symbolName}}.interface",
|
|
6
7
|
outputDir: "{{srcDir}}/interfaces",
|
|
7
8
|
render(symbolName) {
|
|
@@ -1,19 +1,29 @@
|
|
|
1
1
|
import { defineTemplate } from "../utils/defineTemplate.js";
|
|
2
|
+
import { s } from "@tsed/schema";
|
|
3
|
+
const choices = [
|
|
4
|
+
{ name: "Before the endpoint", value: "before" },
|
|
5
|
+
{ name: "After the endpoint", value: "after" }
|
|
6
|
+
];
|
|
2
7
|
export default defineTemplate({
|
|
3
8
|
id: "middleware",
|
|
4
9
|
label: "Middleware",
|
|
10
|
+
description: "Create a middleware class implementing MiddlewareMethods in src/middlewares.",
|
|
5
11
|
fileName: "{{symbolName}}.middleware",
|
|
6
12
|
outputDir: "{{srcDir}}/middlewares",
|
|
13
|
+
schema: s.object({
|
|
14
|
+
middlewarePosition: s
|
|
15
|
+
.string()
|
|
16
|
+
.enum("before", "after")
|
|
17
|
+
.customKey("x-choices", choices)
|
|
18
|
+
.description("Middleware position (before, after).")
|
|
19
|
+
}),
|
|
7
20
|
prompts(context) {
|
|
8
21
|
return [
|
|
9
22
|
{
|
|
10
23
|
type: "list",
|
|
11
24
|
name: "middlewarePosition",
|
|
12
25
|
message: () => `The middleware should be called:`,
|
|
13
|
-
choices
|
|
14
|
-
{ name: "Before the endpoint", value: "before" },
|
|
15
|
-
{ name: "After the endpoint", value: "after" }
|
|
16
|
-
],
|
|
26
|
+
choices,
|
|
17
27
|
when(state) {
|
|
18
28
|
return !!((["decorator"].includes(state.type || context.type) && ["middleware"].includes(state.templateType)) ||
|
|
19
29
|
context.middlewarePosition);
|
|
@@ -2,6 +2,7 @@ import { defineTemplate } from "../utils/defineTemplate.js";
|
|
|
2
2
|
export default defineTemplate({
|
|
3
3
|
id: "model",
|
|
4
4
|
label: "Model",
|
|
5
|
+
description: "Create a model class with a sample @Property in src/models.",
|
|
5
6
|
fileName: "{{symbolName}}.model",
|
|
6
7
|
outputDir: "{{srcDir}}/models",
|
|
7
8
|
render(symbolName) {
|
|
@@ -2,6 +2,7 @@ import { defineTemplate } from "../utils/defineTemplate.js";
|
|
|
2
2
|
export default defineTemplate({
|
|
3
3
|
id: "module",
|
|
4
4
|
label: "Module",
|
|
5
|
+
description: "Create a Ts.ED module class in src.",
|
|
5
6
|
fileName: "{{symbolName}}.module",
|
|
6
7
|
outputDir: "{{srcDir}}",
|
|
7
8
|
render(symbolName) {
|
|
@@ -2,6 +2,7 @@ import { defineTemplate } from "../utils/defineTemplate.js";
|
|
|
2
2
|
export default defineTemplate({
|
|
3
3
|
id: "pipe",
|
|
4
4
|
label: "Pipe",
|
|
5
|
+
description: "Create a custom pipe class implementing PipeMethods in src/pipes.",
|
|
5
6
|
fileName: "{{symbolName}}.pipe",
|
|
6
7
|
outputDir: "{{srcDir}}/pipes",
|
|
7
8
|
render(symbolName) {
|
|
@@ -2,6 +2,7 @@ import { defineTemplate } from "../utils/defineTemplate.js";
|
|
|
2
2
|
export default defineTemplate({
|
|
3
3
|
id: "prisma.service",
|
|
4
4
|
label: "Prisma Service",
|
|
5
|
+
description: "Generate a service based on PrismaClient with $onInit/$onDestroy hooks to manage the database connection.",
|
|
5
6
|
fileName: "prisma.service",
|
|
6
7
|
outputDir: "{{srcDir}}/services",
|
|
7
8
|
render(symbolName) {
|
|
@@ -2,6 +2,7 @@ import { defineTemplate } from "../utils/defineTemplate.js";
|
|
|
2
2
|
export default defineTemplate({
|
|
3
3
|
id: "repository",
|
|
4
4
|
label: "Repository",
|
|
5
|
+
description: "Create a repository class (service-like) for data access in src/services.",
|
|
5
6
|
fileName: "{{symbolName}}.repository",
|
|
6
7
|
outputDir: "{{srcDir}}/services",
|
|
7
8
|
render(symbolName) {
|
|
@@ -2,6 +2,7 @@ import { defineTemplate } from "../utils/defineTemplate.js";
|
|
|
2
2
|
export default defineTemplate({
|
|
3
3
|
id: "response-filter",
|
|
4
4
|
label: "Response Filter",
|
|
5
|
+
description: "Create a response filter that transforms output data (e.g., to XML) in src/filters.",
|
|
5
6
|
fileName: "{{symbolName}}.response-filter",
|
|
6
7
|
outputDir: "{{srcDir}}/filters",
|
|
7
8
|
render(symbolName) {
|
|
@@ -2,6 +2,7 @@ import { defineTemplate } from "../utils/defineTemplate.js";
|
|
|
2
2
|
export default defineTemplate({
|
|
3
3
|
id: "service",
|
|
4
4
|
label: "Service",
|
|
5
|
+
description: "Generate an injectable Ts.ED service (class decorated with @Injectable) in src/services.",
|
|
5
6
|
fileName: "{{symbolName}}.service",
|
|
6
7
|
outputDir: "{{srcDir}}/services",
|
|
7
8
|
render(symbolName) {
|
|
@@ -2,6 +2,7 @@ import { defineTemplate } from "../utils/defineTemplate.js";
|
|
|
2
2
|
export default defineTemplate({
|
|
3
3
|
id: "value",
|
|
4
4
|
label: "Value",
|
|
5
|
+
description: "Create a DI value token initialized with a constant object in src/services.",
|
|
5
6
|
fileName: "{{symbolName}}.value",
|
|
6
7
|
outputDir: "{{srcDir}}/services",
|
|
7
8
|
render(symbolName) {
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { JsonSchema } from "@tsed/schema";
|
|
2
|
+
export async function resolveSchema(schema) {
|
|
3
|
+
if (!schema) {
|
|
4
|
+
return undefined;
|
|
5
|
+
}
|
|
6
|
+
const result = Object.entries(schema.get("properties")).map(async ([key, value]) => {
|
|
7
|
+
if (value instanceof JsonSchema && !value.get("x-choices")) {
|
|
8
|
+
const fn = value.get("x-remote-choices");
|
|
9
|
+
if (fn) {
|
|
10
|
+
value.customKey("x-choices", await fn());
|
|
11
|
+
value.customKey("x-remote-choices", undefined);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
await Promise.all(result);
|
|
16
|
+
return schema.toJSON({ customKeys: true });
|
|
17
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const summarizeSchema = (tpl) => {
|
|
2
|
+
if (!tpl.schema) {
|
|
3
|
+
return undefined;
|
|
4
|
+
}
|
|
5
|
+
const json = tpl.schema.toJSON();
|
|
6
|
+
if (!json.properties) {
|
|
7
|
+
return {};
|
|
8
|
+
}
|
|
9
|
+
const properties = {};
|
|
10
|
+
for (const [k, v] of Object.entries(json.properties)) {
|
|
11
|
+
const vv = v;
|
|
12
|
+
properties[k] = {
|
|
13
|
+
type: Array.isArray(vv.type) ? vv.type.join("|") : vv.type,
|
|
14
|
+
enum: vv.enum,
|
|
15
|
+
pattern: vv.pattern,
|
|
16
|
+
description: vv.description
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
const required = json.required || [];
|
|
20
|
+
return {
|
|
21
|
+
required: required.length ? required : undefined,
|
|
22
|
+
properties: Object.keys(properties).length ? properties : undefined
|
|
23
|
+
};
|
|
24
|
+
};
|