@decohere/scaffold 0.0.1-dev.18 → 0.0.1-dev.80
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/commonjs/src/add-api.action.js +39 -0
- package/commonjs/src/add-api.command.js +41 -0
- package/commonjs/src/add.command.js +24 -0
- package/commonjs/src/add.module.js +26 -0
- package/commonjs/src/cli.js +9 -0
- package/commonjs/src/create.command.js +24 -0
- package/commonjs/src/create.module.js +26 -0
- package/commonjs/src/domain/prompt.js +64 -0
- package/commonjs/src/index.js +38 -0
- package/commonjs/src/models/compose.model.js +150 -0
- package/commonjs/src/models/config-yaml.model.js +88 -0
- package/commonjs/src/models/const.js +32 -0
- package/commonjs/src/models/dev-container.model.js +116 -0
- package/commonjs/src/models/docker-image.model.js +259 -0
- package/commonjs/src/models/env-file.model.js +50 -0
- package/commonjs/src/models/gitignore.model.js +43 -0
- package/commonjs/src/models/launch-json.model.js +74 -0
- package/commonjs/src/models/package-json.model.js +149 -0
- package/commonjs/src/models/project.model.js +134 -0
- package/commonjs/src/models/source-file.js +6 -0
- package/commonjs/src/models/tsconfig.model.js +34 -0
- package/commonjs/src/models/vitest-config.model.js +35 -0
- package/commonjs/src/models/vscode-settings.model.js +31 -0
- package/commonjs/src/program.js +57 -0
- package/commonjs/src/resolve-target-dir.js +19 -0
- package/commonjs/src/services/scaffold.service.js +62 -0
- package/commonjs/src/version.js +57 -0
- package/commonjs/src/webapi/api-name.js +95 -0
- package/commonjs/src/webapi/cli-options.js +101 -0
- package/commonjs/src/webapi/const.js +50 -0
- package/commonjs/src/webapi/create-api.js +237 -0
- package/commonjs/src/webapi/devcontainer/codebase-rag-mcp.js +166 -0
- package/commonjs/src/webapi/devcontainer/codebase-rag-mcp.ts +182 -0
- package/commonjs/src/webapi/devcontainer/host-scripts.js +52 -0
- package/commonjs/src/webapi/devcontainer/templates/codebase-rag.env.example +3 -0
- package/commonjs/src/webapi/devcontainer/templates/initialize.sh +169 -0
- package/commonjs/src/webapi/devcontainer/templates/post-create.sh +35 -0
- package/commonjs/src/webapi/devcontainer/templates/post-start.sh +65 -0
- package/commonjs/src/webapi/devcontainer/templates/tty-prompt.sh +38 -0
- package/commonjs/src/webapi/features/auth.feature.js +441 -0
- package/commonjs/src/webapi/features/auth0-cli.js +435 -0
- package/commonjs/src/webapi/features/biome-format.js +49 -0
- package/commonjs/src/webapi/features/database.feature.js +433 -0
- package/commonjs/src/webapi/features/finalize.feature.js +95 -0
- package/commonjs/src/webapi/features/postman.feature.js +324 -0
- package/commonjs/src/webapi/models/api-package-json.model.js +60 -0
- package/commonjs/src/webapi/models/auth-config.model.js +26 -0
- package/commonjs/src/webapi/models/controller-source-file.model.js +193 -0
- package/commonjs/src/webapi/models/github-ci.model.js +193 -0
- package/commonjs/src/webapi/models/main-source-file.model.js +167 -0
- package/commonjs/src/webapi/models/production-dockerfile.model.js +157 -0
- package/commonjs/src/webapi/models/sample-files.model.js +60 -0
- package/commonjs/src/webapi/models/webapi-image.model.js +27 -0
- package/commonjs/src/webapi/postman/hello-openapi.js +175 -0
- package/commonjs/src/webapi/postman/local-view.js +184 -0
- package/commonjs/src/webapi/postman/openapi-to-postman.js +202 -0
- package/commonjs/src/webapi/workspace-readme.js +110 -0
- package/commonjs/src/webapi.action.js +30 -0
- package/commonjs/src/webapi.command.js +45 -0
- package/es6/src/add-api.action.js +29 -0
- package/es6/src/add-api.command.js +31 -0
- package/es6/src/add.command.js +14 -0
- package/es6/src/add.module.js +16 -0
- package/es6/src/cli.js +5 -0
- package/es6/src/create.command.js +14 -0
- package/es6/src/create.module.js +16 -0
- package/es6/src/domain/prompt.js +43 -0
- package/es6/src/index.js +8 -0
- package/es6/src/models/compose.model.js +144 -0
- package/es6/src/models/config-yaml.model.js +76 -0
- package/es6/src/models/const.js +22 -0
- package/es6/src/models/dev-container.model.js +106 -0
- package/es6/src/models/docker-image.model.js +217 -0
- package/es6/src/models/env-file.model.js +46 -0
- package/es6/src/models/gitignore.model.js +33 -0
- package/es6/src/models/launch-json.model.js +64 -0
- package/es6/src/models/package-json.model.js +137 -0
- package/es6/src/models/project.model.js +119 -0
- package/es6/src/models/source-file.js +3 -0
- package/es6/src/models/tsconfig.model.js +24 -0
- package/es6/src/models/vitest-config.model.js +25 -0
- package/es6/src/models/vscode-settings.model.js +21 -0
- package/es6/src/program.js +39 -0
- package/es6/src/resolve-target-dir.js +9 -0
- package/es6/src/services/scaffold.service.js +52 -0
- package/es6/src/version.js +36 -0
- package/es6/src/webapi/api-name.js +59 -0
- package/es6/src/webapi/cli-options.js +36 -0
- package/es6/src/webapi/const.js +20 -0
- package/es6/src/webapi/create-api.js +217 -0
- package/es6/src/webapi/devcontainer/codebase-rag-mcp.js +156 -0
- package/es6/src/webapi/devcontainer/codebase-rag-mcp.ts +182 -0
- package/es6/src/webapi/devcontainer/host-scripts.js +31 -0
- package/es6/src/webapi/devcontainer/templates/codebase-rag.env.example +3 -0
- package/es6/src/webapi/devcontainer/templates/initialize.sh +169 -0
- package/es6/src/webapi/devcontainer/templates/post-create.sh +35 -0
- package/es6/src/webapi/devcontainer/templates/post-start.sh +65 -0
- package/es6/src/webapi/devcontainer/templates/tty-prompt.sh +38 -0
- package/es6/src/webapi/features/auth.feature.js +390 -0
- package/es6/src/webapi/features/auth0-cli.js +375 -0
- package/es6/src/webapi/features/biome-format.js +42 -0
- package/es6/src/webapi/features/database.feature.js +423 -0
- package/es6/src/webapi/features/finalize.feature.js +85 -0
- package/es6/src/webapi/features/postman.feature.js +258 -0
- package/es6/src/webapi/models/api-package-json.model.js +55 -0
- package/es6/src/webapi/models/auth-config.model.js +22 -0
- package/es6/src/webapi/models/controller-source-file.model.js +184 -0
- package/es6/src/webapi/models/github-ci.model.js +186 -0
- package/es6/src/webapi/models/main-source-file.model.js +163 -0
- package/es6/src/webapi/models/production-dockerfile.model.js +148 -0
- package/es6/src/webapi/models/sample-files.model.js +42 -0
- package/es6/src/webapi/models/webapi-image.model.js +20 -0
- package/es6/src/webapi/postman/hello-openapi.js +168 -0
- package/es6/src/webapi/postman/local-view.js +169 -0
- package/es6/src/webapi/postman/openapi-to-postman.js +179 -0
- package/es6/src/webapi/workspace-readme.js +89 -0
- package/es6/src/webapi.action.js +20 -0
- package/es6/src/webapi.command.js +35 -0
- package/package.json +8 -8
- package/types/src/add-api.action.d.ts +13 -0
- package/types/src/add-api.command.d.ts +7 -0
- package/types/src/add.command.d.ts +6 -0
- package/types/src/add.module.d.ts +14 -0
- package/types/src/cli.d.ts +2 -0
- package/types/src/create.command.d.ts +6 -0
- package/types/src/create.module.d.ts +14 -0
- package/types/src/domain/prompt.d.ts +4 -0
- package/types/src/models/compose.model.d.ts +64 -0
- package/types/src/models/config-yaml.model.d.ts +27 -0
- package/types/src/models/const.d.ts +20 -0
- package/types/src/models/dev-container.model.d.ts +37 -0
- package/types/src/models/docker-image.model.d.ts +84 -0
- package/types/src/models/env-file.model.d.ts +16 -0
- package/types/src/models/gitignore.model.d.ts +7 -0
- package/types/src/models/launch-json.model.d.ts +7 -0
- package/types/src/models/package-json.model.d.ts +35 -0
- package/types/src/models/project.model.d.ts +60 -0
- package/{src/models/source-file.ts → types/src/models/source-file.d.ts} +4 -6
- package/types/src/models/tsconfig.model.d.ts +5 -0
- package/types/src/models/vitest-config.model.d.ts +5 -0
- package/types/src/models/vscode-settings.model.d.ts +7 -0
- package/types/src/program.d.ts +3 -0
- package/{src/resolve-target-dir.ts → types/src/resolve-target-dir.d.ts} +1 -4
- package/types/src/services/scaffold.service.d.ts +22 -0
- package/types/src/version.d.ts +6 -0
- package/types/src/webapi/api-name.d.ts +14 -0
- package/types/src/webapi/cli-options.d.ts +6 -0
- package/{src/webapi/const.ts → types/src/webapi/const.d.ts} +7 -21
- package/types/src/webapi/create-api.d.ts +15 -0
- package/types/src/webapi/devcontainer/codebase-rag-mcp.d.ts +32 -0
- package/types/src/webapi/devcontainer/codebase-rag-mcp.ts +182 -0
- package/types/src/webapi/devcontainer/host-scripts.d.ts +7 -0
- package/types/src/webapi/devcontainer/templates/codebase-rag.env.example +3 -0
- package/types/src/webapi/devcontainer/templates/initialize.sh +169 -0
- package/types/src/webapi/devcontainer/templates/post-create.sh +35 -0
- package/types/src/webapi/devcontainer/templates/post-start.sh +65 -0
- package/types/src/webapi/devcontainer/templates/tty-prompt.sh +38 -0
- package/types/src/webapi/features/auth.feature.d.ts +10 -0
- package/types/src/webapi/features/auth0-cli.d.ts +80 -0
- package/types/src/webapi/features/biome-format.d.ts +5 -0
- package/types/src/webapi/features/database.feature.d.ts +7 -0
- package/types/src/webapi/features/finalize.feature.d.ts +2 -0
- package/types/src/webapi/features/postman.feature.d.ts +16 -0
- package/types/src/webapi/models/api-package-json.model.d.ts +18 -0
- package/types/src/webapi/models/auth-config.model.d.ts +26 -0
- package/types/src/webapi/models/controller-source-file.model.d.ts +46 -0
- package/types/src/webapi/models/github-ci.model.d.ts +9 -0
- package/types/src/webapi/models/main-source-file.model.d.ts +54 -0
- package/types/src/webapi/models/production-dockerfile.model.d.ts +23 -0
- package/types/src/webapi/models/sample-files.model.d.ts +7 -0
- package/types/src/webapi/models/webapi-image.model.d.ts +12 -0
- package/types/src/webapi/postman/hello-openapi.d.ts +19 -0
- package/types/src/webapi/postman/local-view.d.ts +17 -0
- package/types/src/webapi/postman/openapi-to-postman.d.ts +62 -0
- package/types/src/webapi/workspace-readme.d.ts +18 -0
- package/types/src/webapi.action.d.ts +14 -0
- package/types/src/webapi.command.d.ts +11 -0
- package/src/add-api.action.ts +0 -25
- package/src/add-api.command.ts +0 -31
- package/src/add.command.ts +0 -20
- package/src/add.module.ts +0 -11
- package/src/cli.ts +0 -4
- package/src/create.command.ts +0 -20
- package/src/create.module.ts +0 -11
- package/src/domain/prompt.ts +0 -50
- package/src/models/compose.model.ts +0 -205
- package/src/models/config-yaml.model.ts +0 -83
- package/src/models/const.ts +0 -20
- package/src/models/dev-container.model.ts +0 -136
- package/src/models/docker-image.model.ts +0 -343
- package/src/models/env-file.model.ts +0 -45
- package/src/models/gitignore.model.ts +0 -35
- package/src/models/launch-json.model.ts +0 -60
- package/src/models/package-json.model.ts +0 -169
- package/src/models/project.model.ts +0 -141
- package/src/models/tsconfig.model.ts +0 -29
- package/src/models/vitest-config.model.ts +0 -26
- package/src/models/vscode-settings.model.ts +0 -24
- package/src/program.ts +0 -63
- package/src/services/scaffold.service.ts +0 -89
- package/src/version.ts +0 -56
- package/src/webapi/api-name.ts +0 -73
- package/src/webapi/cli-options.ts +0 -56
- package/src/webapi/create-api.ts +0 -275
- package/src/webapi/devcontainer/host-scripts.ts +0 -35
- package/src/webapi/features/auth.feature.ts +0 -454
- package/src/webapi/features/auth0-cli.ts +0 -421
- package/src/webapi/features/biome-format.ts +0 -34
- package/src/webapi/features/database.feature.ts +0 -522
- package/src/webapi/features/finalize.feature.ts +0 -112
- package/src/webapi/features/postman.feature.ts +0 -287
- package/src/webapi/models/api-package-json.model.ts +0 -60
- package/src/webapi/models/auth-config.model.ts +0 -36
- package/src/webapi/models/controller-source-file.model.ts +0 -232
- package/src/webapi/models/github-ci.model.ts +0 -188
- package/src/webapi/models/main-source-file.model.ts +0 -208
- package/src/webapi/models/production-dockerfile.model.ts +0 -162
- package/src/webapi/models/sample-files.model.ts +0 -45
- package/src/webapi/models/webapi-image.model.ts +0 -21
- package/src/webapi/postman/hello-openapi.ts +0 -92
- package/src/webapi/postman/local-view.ts +0 -195
- package/src/webapi/postman/openapi-to-postman.ts +0 -208
- package/src/webapi/workspace-readme.ts +0 -192
- package/src/webapi.action.ts +0 -22
- package/src/webapi.command.ts +0 -41
- package/tests/auth-postman.wiring.spec.ts +0 -263
- package/tests/auth0-cli.spec.ts +0 -232
- package/tests/biome-format.spec.ts +0 -49
- package/tests/cli.integration.spec.ts +0 -658
- package/tests/compose.model.spec.ts +0 -51
- package/tests/container-image.model.spec.ts +0 -162
- package/tests/dev-container.model.spec.ts +0 -29
- package/tests/devcontainer-base-image.spec.ts +0 -32
- package/tests/hello-di-inject.scaffold.spec.ts +0 -18
- package/tests/hello-route.contract.spec.ts +0 -94
- package/tests/package-json.order.spec.ts +0 -59
- package/tests/postman-from-openapi.spec.ts +0 -197
- package/tests/seed-devcontainer-templates.ts +0 -40
- package/tests/webapi/devcontainer/codebase-rag-mcp.spec.ts +0 -96
- /package/{src/index.ts → types/src/index.d.ts} +0 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get CREATE_IMAGE_REPOSITORY () {
|
|
13
|
+
return CREATE_IMAGE_REPOSITORY;
|
|
14
|
+
},
|
|
15
|
+
get CREATE_VERSION () {
|
|
16
|
+
return CREATE_VERSION;
|
|
17
|
+
},
|
|
18
|
+
get DEVCONTAINER_IMAGE_REPOSITORY () {
|
|
19
|
+
return DEVCONTAINER_IMAGE_REPOSITORY;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
const _nodemodule = require("node:module");
|
|
23
|
+
const _nodepath = require("node:path");
|
|
24
|
+
const _nodeurl = require("node:url");
|
|
25
|
+
const _require = (0, _nodemodule.createRequire)(require("url").pathToFileURL(__filename).toString());
|
|
26
|
+
const DEFAULT_CREATE_VERSION = "0.0.1-dev";
|
|
27
|
+
const DEFAULT_CREATE_IMAGE_REPOSITORY = "ghcr.io/typesmiths/decohere/create";
|
|
28
|
+
const DEFAULT_DEVCONTAINER_IMAGE_REPOSITORY = "ghcr.io/typesmiths/decohere/devcontainer";
|
|
29
|
+
function resolveCreateMetadata() {
|
|
30
|
+
let dir = (0, _nodepath.dirname)((0, _nodeurl.fileURLToPath)(require("url").pathToFileURL(__filename).toString()));
|
|
31
|
+
for(let i = 0; i < 5; i++){
|
|
32
|
+
try {
|
|
33
|
+
const pkg = _require((0, _nodepath.join)(dir, "package.json"));
|
|
34
|
+
if (pkg.name === "@decohere/scaffold") {
|
|
35
|
+
return {
|
|
36
|
+
version: pkg.version ?? DEFAULT_CREATE_VERSION,
|
|
37
|
+
imageRepository: pkg.decohere?.dockerImageRepository ?? DEFAULT_CREATE_IMAGE_REPOSITORY,
|
|
38
|
+
devcontainerImageRepository: pkg.decohere?.devcontainerImageRepository ?? DEFAULT_DEVCONTAINER_IMAGE_REPOSITORY
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
} catch {}
|
|
42
|
+
const parent = (0, _nodepath.dirname)(dir);
|
|
43
|
+
if (parent === dir) break;
|
|
44
|
+
dir = parent;
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
version: DEFAULT_CREATE_VERSION,
|
|
48
|
+
imageRepository: DEFAULT_CREATE_IMAGE_REPOSITORY,
|
|
49
|
+
devcontainerImageRepository: DEFAULT_DEVCONTAINER_IMAGE_REPOSITORY
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const createMetadata = resolveCreateMetadata();
|
|
53
|
+
const CREATE_VERSION = createMetadata.version;
|
|
54
|
+
const CREATE_IMAGE_REPOSITORY = createMetadata.imageRepository;
|
|
55
|
+
const DEVCONTAINER_IMAGE_REPOSITORY = createMetadata.devcontainerImageRepository;
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy92ZXJzaW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5cbmNvbnN0IF9yZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuXG50eXBlIENyZWF0ZVBhY2thZ2VNZXRhZGF0YSA9IHtcblx0bmFtZT86IHN0cmluZztcblx0dmVyc2lvbj86IHN0cmluZztcblx0ZGVjb2hlcmU/OiB7XG5cdFx0ZG9ja2VySW1hZ2VSZXBvc2l0b3J5Pzogc3RyaW5nO1xuXHRcdGRldmNvbnRhaW5lckltYWdlUmVwb3NpdG9yeT86IHN0cmluZztcblx0fTtcbn07XG5cbmNvbnN0IERFRkFVTFRfQ1JFQVRFX1ZFUlNJT04gPSBcIjAuMC4xLWRldlwiO1xuY29uc3QgREVGQVVMVF9DUkVBVEVfSU1BR0VfUkVQT1NJVE9SWSA9IFwiZ2hjci5pby90eXBlc21pdGhzL2RlY29oZXJlL2NyZWF0ZVwiO1xuY29uc3QgREVGQVVMVF9ERVZDT05UQUlORVJfSU1BR0VfUkVQT1NJVE9SWSA9IFwiZ2hjci5pby90eXBlc21pdGhzL2RlY29oZXJlL2RldmNvbnRhaW5lclwiO1xuXG5mdW5jdGlvbiByZXNvbHZlQ3JlYXRlTWV0YWRhdGEoKSB7XG5cdGxldCBkaXIgPSBkaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHBrZyA9IF9yZXF1aXJlKGpvaW4oZGlyLCBcInBhY2thZ2UuanNvblwiKSkgYXMgQ3JlYXRlUGFja2FnZU1ldGFkYXRhO1xuXHRcdFx0aWYgKHBrZy5uYW1lID09PSBcIkBkZWNvaGVyZS9zY2FmZm9sZFwiKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0dmVyc2lvbjogcGtnLnZlcnNpb24gPz8gREVGQVVMVF9DUkVBVEVfVkVSU0lPTixcblx0XHRcdFx0XHRpbWFnZVJlcG9zaXRvcnk6XG5cdFx0XHRcdFx0XHRwa2cuZGVjb2hlcmU/LmRvY2tlckltYWdlUmVwb3NpdG9yeSA/PyBERUZBVUxUX0NSRUFURV9JTUFHRV9SRVBPU0lUT1JZLFxuXHRcdFx0XHRcdGRldmNvbnRhaW5lckltYWdlUmVwb3NpdG9yeTpcblx0XHRcdFx0XHRcdHBrZy5kZWNvaGVyZT8uZGV2Y29udGFpbmVySW1hZ2VSZXBvc2l0b3J5ID8/IERFRkFVTFRfREVWQ09OVEFJTkVSX0lNQUdFX1JFUE9TSVRPUlksXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCB7fVxuXHRcdGNvbnN0IHBhcmVudCA9IGRpcm5hbWUoZGlyKTtcblx0XHRpZiAocGFyZW50ID09PSBkaXIpIGJyZWFrO1xuXHRcdGRpciA9IHBhcmVudDtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0dmVyc2lvbjogREVGQVVMVF9DUkVBVEVfVkVSU0lPTixcblx0XHRpbWFnZVJlcG9zaXRvcnk6IERFRkFVTFRfQ1JFQVRFX0lNQUdFX1JFUE9TSVRPUlksXG5cdFx0ZGV2Y29udGFpbmVySW1hZ2VSZXBvc2l0b3J5OiBERUZBVUxUX0RFVkNPTlRBSU5FUl9JTUFHRV9SRVBPU0lUT1JZLFxuXHR9O1xufVxuXG5jb25zdCBjcmVhdGVNZXRhZGF0YSA9IHJlc29sdmVDcmVhdGVNZXRhZGF0YSgpO1xuXG4vKiogVmVyc2lvbiBvZiBAZGVjb2hlcmUvY3JlYXRlLCB1c2VkIHRvIHBpbiBzY2FmZm9sZGVkIEBkZWNvaGVyZS8qIGRlcGVuZGVuY2llcy4gKi9cbmV4cG9ydCBjb25zdCBDUkVBVEVfVkVSU0lPTiA9IGNyZWF0ZU1ldGFkYXRhLnZlcnNpb247XG5cbi8qKiBDYW5vbmljYWwgcHVibGlzaGVkIERvY2tlciByZXBvc2l0b3J5IGZvciB0aGUgQGRlY29oZXJlL2NyZWF0ZSBidWlsZGVyIGltYWdlLiAqL1xuZXhwb3J0IGNvbnN0IENSRUFURV9JTUFHRV9SRVBPU0lUT1JZID0gY3JlYXRlTWV0YWRhdGEuaW1hZ2VSZXBvc2l0b3J5O1xuXG4vKiogUHVibGlzaGVkIGFwcCBEZXYgQ29udGFpbmVyIGJhc2UgKGBkb2NrZXIgcHVsbGAgdXBkYXRlcyBzaGFyZWQgbGF5ZXJzKS4gKi9cbmV4cG9ydCBjb25zdCBERVZDT05UQUlORVJfSU1BR0VfUkVQT1NJVE9SWSA9IGNyZWF0ZU1ldGFkYXRhLmRldmNvbnRhaW5lckltYWdlUmVwb3NpdG9yeTtcbiJdLCJuYW1lcyI6WyJDUkVBVEVfSU1BR0VfUkVQT1NJVE9SWSIsIkNSRUFURV9WRVJTSU9OIiwiREVWQ09OVEFJTkVSX0lNQUdFX1JFUE9TSVRPUlkiLCJfcmVxdWlyZSIsImNyZWF0ZVJlcXVpcmUiLCJERUZBVUxUX0NSRUFURV9WRVJTSU9OIiwiREVGQVVMVF9DUkVBVEVfSU1BR0VfUkVQT1NJVE9SWSIsIkRFRkFVTFRfREVWQ09OVEFJTkVSX0lNQUdFX1JFUE9TSVRPUlkiLCJyZXNvbHZlQ3JlYXRlTWV0YWRhdGEiLCJkaXIiLCJkaXJuYW1lIiwiZmlsZVVSTFRvUGF0aCIsImkiLCJwa2ciLCJqb2luIiwibmFtZSIsInZlcnNpb24iLCJpbWFnZVJlcG9zaXRvcnkiLCJkZWNvaGVyZSIsImRvY2tlckltYWdlUmVwb3NpdG9yeSIsImRldmNvbnRhaW5lckltYWdlUmVwb3NpdG9yeSIsInBhcmVudCIsImNyZWF0ZU1ldGFkYXRhIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztRQW9EYUE7ZUFBQUE7O1FBSEFDO2VBQUFBOztRQU1BQztlQUFBQTs7OzRCQXZEaUI7MEJBQ0E7eUJBQ0E7QUFFOUIsTUFBTUMsV0FBV0MsSUFBQUEseUJBQWEsRUFBQztBQVcvQixNQUFNQyx5QkFBeUI7QUFDL0IsTUFBTUMsa0NBQWtDO0FBQ3hDLE1BQU1DLHdDQUF3QztBQUU5QyxTQUFTQztJQUNSLElBQUlDLE1BQU1DLElBQUFBLGlCQUFPLEVBQUNDLElBQUFBLHNCQUFhLEVBQUM7SUFDaEMsSUFBSyxJQUFJQyxJQUFJLEdBQUdBLElBQUksR0FBR0EsSUFBSztRQUMzQixJQUFJO1lBQ0gsTUFBTUMsTUFBTVYsU0FBU1csSUFBQUEsY0FBSSxFQUFDTCxLQUFLO1lBQy9CLElBQUlJLElBQUlFLElBQUksS0FBSyxzQkFBc0I7Z0JBQ3RDLE9BQU87b0JBQ05DLFNBQVNILElBQUlHLE9BQU8sSUFBSVg7b0JBQ3hCWSxpQkFDQ0osSUFBSUssUUFBUSxFQUFFQyx5QkFBeUJiO29CQUN4Q2MsNkJBQ0NQLElBQUlLLFFBQVEsRUFBRUUsK0JBQStCYjtnQkFDL0M7WUFDRDtRQUNELEVBQUUsT0FBTSxDQUFDO1FBQ1QsTUFBTWMsU0FBU1gsSUFBQUEsaUJBQU8sRUFBQ0Q7UUFDdkIsSUFBSVksV0FBV1osS0FBSztRQUNwQkEsTUFBTVk7SUFDUDtJQUVBLE9BQU87UUFDTkwsU0FBU1g7UUFDVFksaUJBQWlCWDtRQUNqQmMsNkJBQTZCYjtJQUM5QjtBQUNEO0FBRUEsTUFBTWUsaUJBQWlCZDtBQUdoQixNQUFNUCxpQkFBaUJxQixlQUFlTixPQUFPO0FBRzdDLE1BQU1oQiwwQkFBMEJzQixlQUFlTCxlQUFlO0FBRzlELE1BQU1mLGdDQUFnQ29CLGVBQWVGLDJCQUEyQiJ9
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get API_NAME_PATTERN () {
|
|
13
|
+
return API_NAME_PATTERN;
|
|
14
|
+
},
|
|
15
|
+
get CreateCliError () {
|
|
16
|
+
return CreateCliError;
|
|
17
|
+
},
|
|
18
|
+
get apiEnvPrefix () {
|
|
19
|
+
return apiEnvPrefix;
|
|
20
|
+
},
|
|
21
|
+
get apiNameFromProjectDir () {
|
|
22
|
+
return apiNameFromProjectDir;
|
|
23
|
+
},
|
|
24
|
+
get assertValidApiName () {
|
|
25
|
+
return assertValidApiName;
|
|
26
|
+
},
|
|
27
|
+
get isDecohereWorkspace () {
|
|
28
|
+
return isDecohereWorkspace;
|
|
29
|
+
},
|
|
30
|
+
get listExistingApiNames () {
|
|
31
|
+
return listExistingApiNames;
|
|
32
|
+
},
|
|
33
|
+
get parseApiNames () {
|
|
34
|
+
return parseApiNames;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
const _nodefs = require("node:fs");
|
|
38
|
+
const _nodepath = require("node:path");
|
|
39
|
+
const _const = require("./const.js");
|
|
40
|
+
const API_NAME_PATTERN = /^[a-z][a-z0-9-]*$/;
|
|
41
|
+
class CreateCliError extends Error {
|
|
42
|
+
constructor(message){
|
|
43
|
+
super(message);
|
|
44
|
+
this.name = "CreateCliError";
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function assertValidApiName(name) {
|
|
48
|
+
if (!API_NAME_PATTERN.test(name)) {
|
|
49
|
+
throw new CreateCliError(`Invalid API name "${name}". Use a lowercase slug starting with a letter, then letters, digits, or hyphens (e.g. billing).`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function parseApiNames(raw) {
|
|
53
|
+
const names = raw != null && raw.length > 0 ? [
|
|
54
|
+
...raw
|
|
55
|
+
] : [
|
|
56
|
+
_const.DEFAULT_WEBAPI_NAME
|
|
57
|
+
];
|
|
58
|
+
const seen = new Set();
|
|
59
|
+
for (const name of names){
|
|
60
|
+
assertValidApiName(name);
|
|
61
|
+
if (seen.has(name)) {
|
|
62
|
+
throw new CreateCliError(`Duplicate API name "${name}".`);
|
|
63
|
+
}
|
|
64
|
+
seen.add(name);
|
|
65
|
+
}
|
|
66
|
+
return names;
|
|
67
|
+
}
|
|
68
|
+
function isDecohereWorkspace(dir) {
|
|
69
|
+
try {
|
|
70
|
+
const pkg = JSON.parse((0, _nodefs.readFileSync)((0, _nodepath.join)(dir, "package.json"), "utf8"));
|
|
71
|
+
const build = pkg.scripts?.build;
|
|
72
|
+
return typeof build === "string" && build.includes("forge");
|
|
73
|
+
} catch {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function listExistingApiNames(dir) {
|
|
78
|
+
const projectsDir = (0, _nodepath.join)(dir, "projects");
|
|
79
|
+
try {
|
|
80
|
+
return (0, _nodefs.readdirSync)(projectsDir, {
|
|
81
|
+
withFileTypes: true
|
|
82
|
+
}).filter((entry)=>entry.isDirectory() && (0, _nodefs.existsSync)((0, _nodepath.join)(projectsDir, entry.name, "package.json"))).map((entry)=>entry.name).sort();
|
|
83
|
+
} catch {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function apiEnvPrefix(apiName) {
|
|
88
|
+
return apiName.replace(/-/g, "_").toUpperCase();
|
|
89
|
+
}
|
|
90
|
+
function apiNameFromProjectDir(dir) {
|
|
91
|
+
const slash = dir.lastIndexOf("/");
|
|
92
|
+
return slash >= 0 ? dir.slice(slash + 1) : dir;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy93ZWJhcGkvYXBpLW5hbWUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZGRpclN5bmMsIHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgREVGQVVMVF9XRUJBUElfTkFNRSB9IGZyb20gXCIuL2NvbnN0LmpzXCI7XG5cbi8qKiBMb3dlcmNhc2UgbnBtLXNhZmUgZGlyZWN0b3J5IHNsdWc6IGBiaWxsaW5nYCwgYGFkbWluLWFwaWAuICovXG5leHBvcnQgY29uc3QgQVBJX05BTUVfUEFUVEVSTiA9IC9eW2Etel1bYS16MC05LV0qJC87XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVDbGlFcnJvciBleHRlbmRzIEVycm9yIHtcblx0cHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuXHRcdHN1cGVyKG1lc3NhZ2UpO1xuXHRcdHRoaXMubmFtZSA9IFwiQ3JlYXRlQ2xpRXJyb3JcIjtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VmFsaWRBcGlOYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRpZiAoIUFQSV9OQU1FX1BBVFRFUk4udGVzdChuYW1lKSkge1xuXHRcdHRocm93IG5ldyBDcmVhdGVDbGlFcnJvcihcblx0XHRcdGBJbnZhbGlkIEFQSSBuYW1lIFwiJHtuYW1lfVwiLiBVc2UgYSBsb3dlcmNhc2Ugc2x1ZyBzdGFydGluZyB3aXRoIGEgbGV0dGVyLCB0aGVuIGxldHRlcnMsIGRpZ2l0cywgb3IgaHlwaGVucyAoZS5nLiBiaWxsaW5nKS5gLFxuXHRcdCk7XG5cdH1cbn1cblxuLyoqIERlZmF1bHQgYFtcImFwaVwiXWAgd2hlbiB0aGUgY2FsbGVyIG9taXR0ZWQgYC0tbmFtZWAuIFJlamVjdHMgZHVwbGljYXRlcyBhbmQgaW52YWxpZCBzbHVncy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUFwaU5hbWVzKHJhdzogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG5cdGNvbnN0IG5hbWVzID0gcmF3ICE9IG51bGwgJiYgcmF3Lmxlbmd0aCA+IDAgPyBbLi4ucmF3XSA6IFtERUZBVUxUX1dFQkFQSV9OQU1FXTtcblx0Y29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcblx0XHRhc3NlcnRWYWxpZEFwaU5hbWUobmFtZSk7XG5cdFx0aWYgKHNlZW4uaGFzKG5hbWUpKSB7XG5cdFx0XHR0aHJvdyBuZXcgQ3JlYXRlQ2xpRXJyb3IoYER1cGxpY2F0ZSBBUEkgbmFtZSBcIiR7bmFtZX1cIi5gKTtcblx0XHR9XG5cdFx0c2Vlbi5hZGQobmFtZSk7XG5cdH1cblx0cmV0dXJuIG5hbWVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEZWNvaGVyZVdvcmtzcGFjZShkaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHR0cnkge1xuXHRcdGNvbnN0IHBrZyA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGpvaW4oZGlyLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGY4XCIpKSBhcyB7XG5cdFx0XHRzY3JpcHRzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblx0XHR9O1xuXHRcdGNvbnN0IGJ1aWxkID0gcGtnLnNjcmlwdHM/LmJ1aWxkO1xuXHRcdHJldHVybiB0eXBlb2YgYnVpbGQgPT09IFwic3RyaW5nXCIgJiYgYnVpbGQuaW5jbHVkZXMoXCJmb3JnZVwiKTtcblx0fSBjYXRjaCB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbi8qKiBEaXJlY3RvcnkgbmFtZXMgdW5kZXIgYHByb2plY3RzL2AgdGhhdCBhbHJlYWR5IGhhdmUgYSBgcGFja2FnZS5qc29uYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0RXhpc3RpbmdBcGlOYW1lcyhkaXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0Y29uc3QgcHJvamVjdHNEaXIgPSBqb2luKGRpciwgXCJwcm9qZWN0c1wiKTtcblx0dHJ5IHtcblx0XHRyZXR1cm4gcmVhZGRpclN5bmMocHJvamVjdHNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuXHRcdFx0LmZpbHRlcihcblx0XHRcdFx0KGVudHJ5KSA9PlxuXHRcdFx0XHRcdGVudHJ5LmlzRGlyZWN0b3J5KCkgJiYgZXhpc3RzU3luYyhqb2luKHByb2plY3RzRGlyLCBlbnRyeS5uYW1lLCBcInBhY2thZ2UuanNvblwiKSksXG5cdFx0XHQpXG5cdFx0XHQubWFwKChlbnRyeSkgPT4gZW50cnkubmFtZSlcblx0XHRcdC5zb3J0KCk7XG5cdH0gY2F0Y2gge1xuXHRcdHJldHVybiBbXTtcblx0fVxufVxuXG4vKiogYGJpbGxpbmdgIOKGkiBgQklMTElOR2AsIGBhZG1pbi1hcGlgIOKGkiBgQURNSU5fQVBJYCDigJQgcHJlZml4IGZvciBge1BSRUZJWH1fREJfSE9TVGAuICovXG5leHBvcnQgZnVuY3Rpb24gYXBpRW52UHJlZml4KGFwaU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiBhcGlOYW1lLnJlcGxhY2UoLy0vZywgXCJfXCIpLnRvVXBwZXJDYXNlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcGlOYW1lRnJvbVByb2plY3REaXIoZGlyOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBzbGFzaCA9IGRpci5sYXN0SW5kZXhPZihcIi9cIik7XG5cdHJldHVybiBzbGFzaCA+PSAwID8gZGlyLnNsaWNlKHNsYXNoICsgMSkgOiBkaXI7XG59XG4iXSwibmFtZXMiOlsiQVBJX05BTUVfUEFUVEVSTiIsIkNyZWF0ZUNsaUVycm9yIiwiYXBpRW52UHJlZml4IiwiYXBpTmFtZUZyb21Qcm9qZWN0RGlyIiwiYXNzZXJ0VmFsaWRBcGlOYW1lIiwiaXNEZWNvaGVyZVdvcmtzcGFjZSIsImxpc3RFeGlzdGluZ0FwaU5hbWVzIiwicGFyc2VBcGlOYW1lcyIsIkVycm9yIiwibWVzc2FnZSIsIm5hbWUiLCJ0ZXN0IiwicmF3IiwibmFtZXMiLCJsZW5ndGgiLCJERUZBVUxUX1dFQkFQSV9OQU1FIiwic2VlbiIsIlNldCIsImhhcyIsImFkZCIsImRpciIsInBrZyIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlU3luYyIsImpvaW4iLCJidWlsZCIsInNjcmlwdHMiLCJpbmNsdWRlcyIsInByb2plY3RzRGlyIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwiZmlsdGVyIiwiZW50cnkiLCJpc0RpcmVjdG9yeSIsImV4aXN0c1N5bmMiLCJtYXAiLCJzb3J0IiwiYXBpTmFtZSIsInJlcGxhY2UiLCJ0b1VwcGVyQ2FzZSIsInNsYXNoIiwibGFzdEluZGV4T2YiLCJzbGljZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7UUFLYUE7ZUFBQUE7O1FBRUFDO2VBQUFBOztRQTBER0M7ZUFBQUE7O1FBSUFDO2VBQUFBOztRQXZEQUM7ZUFBQUE7O1FBc0JBQztlQUFBQTs7UUFhQUM7ZUFBQUE7O1FBMUJBQztlQUFBQTs7O3dCQXZCc0M7MEJBQ2pDO3VCQUNlO0FBRzdCLE1BQU1QLG1CQUFtQjtBQUV6QixNQUFNQyx1QkFBdUJPO0lBQ25DLFlBQW1CQyxPQUFlLENBQUU7UUFDbkMsS0FBSyxDQUFDQTtRQUNOLElBQUksQ0FBQ0MsSUFBSSxHQUFHO0lBQ2I7QUFDRDtBQUVPLFNBQVNOLG1CQUFtQk0sSUFBWTtJQUM5QyxJQUFJLENBQUNWLGlCQUFpQlcsSUFBSSxDQUFDRCxPQUFPO1FBQ2pDLE1BQU0sSUFBSVQsZUFDVCxDQUFDLGtCQUFrQixFQUFFUyxLQUFLLGdHQUFnRyxDQUFDO0lBRTdIO0FBQ0Q7QUFHTyxTQUFTSCxjQUFjSyxHQUFrQztJQUMvRCxNQUFNQyxRQUFRRCxPQUFPLFFBQVFBLElBQUlFLE1BQU0sR0FBRyxJQUFJO1dBQUlGO0tBQUksR0FBRztRQUFDRywwQkFBbUI7S0FBQztJQUM5RSxNQUFNQyxPQUFPLElBQUlDO0lBQ2pCLEtBQUssTUFBTVAsUUFBUUcsTUFBTztRQUN6QlQsbUJBQW1CTTtRQUNuQixJQUFJTSxLQUFLRSxHQUFHLENBQUNSLE9BQU87WUFDbkIsTUFBTSxJQUFJVCxlQUFlLENBQUMsb0JBQW9CLEVBQUVTLEtBQUssRUFBRSxDQUFDO1FBQ3pEO1FBQ0FNLEtBQUtHLEdBQUcsQ0FBQ1Q7SUFDVjtJQUNBLE9BQU9HO0FBQ1I7QUFFTyxTQUFTUixvQkFBb0JlLEdBQVc7SUFDOUMsSUFBSTtRQUNILE1BQU1DLE1BQU1DLEtBQUtDLEtBQUssQ0FBQ0MsSUFBQUEsb0JBQVksRUFBQ0MsSUFBQUEsY0FBSSxFQUFDTCxLQUFLLGlCQUFpQjtRQUcvRCxNQUFNTSxRQUFRTCxJQUFJTSxPQUFPLEVBQUVEO1FBQzNCLE9BQU8sT0FBT0EsVUFBVSxZQUFZQSxNQUFNRSxRQUFRLENBQUM7SUFDcEQsRUFBRSxPQUFNO1FBQ1AsT0FBTztJQUNSO0FBQ0Q7QUFHTyxTQUFTdEIscUJBQXFCYyxHQUFXO0lBQy9DLE1BQU1TLGNBQWNKLElBQUFBLGNBQUksRUFBQ0wsS0FBSztJQUM5QixJQUFJO1FBQ0gsT0FBT1UsSUFBQUEsbUJBQVcsRUFBQ0QsYUFBYTtZQUFFRSxlQUFlO1FBQUssR0FDcERDLE1BQU0sQ0FDTixDQUFDQyxRQUNBQSxNQUFNQyxXQUFXLE1BQU1DLElBQUFBLGtCQUFVLEVBQUNWLElBQUFBLGNBQUksRUFBQ0ksYUFBYUksTUFBTXZCLElBQUksRUFBRSxrQkFFakUwQixHQUFHLENBQUMsQ0FBQ0gsUUFBVUEsTUFBTXZCLElBQUksRUFDekIyQixJQUFJO0lBQ1AsRUFBRSxPQUFNO1FBQ1AsT0FBTyxFQUFFO0lBQ1Y7QUFDRDtBQUdPLFNBQVNuQyxhQUFhb0MsT0FBZTtJQUMzQyxPQUFPQSxRQUFRQyxPQUFPLENBQUMsTUFBTSxLQUFLQyxXQUFXO0FBQzlDO0FBRU8sU0FBU3JDLHNCQUFzQmlCLEdBQVc7SUFDaEQsTUFBTXFCLFFBQVFyQixJQUFJc0IsV0FBVyxDQUFDO0lBQzlCLE9BQU9ELFNBQVMsSUFBSXJCLElBQUl1QixLQUFLLENBQUNGLFFBQVEsS0FBS3JCO0FBQzVDIn0=
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get addWebapiFeatureOptions () {
|
|
13
|
+
return addWebapiFeatureOptions;
|
|
14
|
+
},
|
|
15
|
+
get collectName () {
|
|
16
|
+
return collectName;
|
|
17
|
+
},
|
|
18
|
+
get runScaffoldApi () {
|
|
19
|
+
return runScaffoldApi;
|
|
20
|
+
},
|
|
21
|
+
get toApiOptions () {
|
|
22
|
+
return toApiOptions;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
const _resolvetargetdir = require("../resolve-target-dir.js");
|
|
26
|
+
const _apiname = require("./api-name.js");
|
|
27
|
+
const _createapi = require("./create-api.js");
|
|
28
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
29
|
+
if (typeof WeakMap !== "function") return null;
|
|
30
|
+
var cacheBabelInterop = new WeakMap();
|
|
31
|
+
var cacheNodeInterop = new WeakMap();
|
|
32
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
33
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
34
|
+
})(nodeInterop);
|
|
35
|
+
}
|
|
36
|
+
function _interop_require_wildcard(obj, nodeInterop) {
|
|
37
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
38
|
+
return obj;
|
|
39
|
+
}
|
|
40
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
41
|
+
return {
|
|
42
|
+
default: obj
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
46
|
+
if (cache && cache.has(obj)) {
|
|
47
|
+
return cache.get(obj);
|
|
48
|
+
}
|
|
49
|
+
var newObj = {
|
|
50
|
+
__proto__: null
|
|
51
|
+
};
|
|
52
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
53
|
+
for(var key in obj){
|
|
54
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
55
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
56
|
+
if (desc && (desc.get || desc.set)) {
|
|
57
|
+
Object.defineProperty(newObj, key, desc);
|
|
58
|
+
} else {
|
|
59
|
+
newObj[key] = obj[key];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
newObj.default = obj;
|
|
64
|
+
if (cache) {
|
|
65
|
+
cache.set(obj, newObj);
|
|
66
|
+
}
|
|
67
|
+
return newObj;
|
|
68
|
+
}
|
|
69
|
+
function collectName(value, previous) {
|
|
70
|
+
previous.push(value);
|
|
71
|
+
return previous;
|
|
72
|
+
}
|
|
73
|
+
function addWebapiFeatureOptions(cmd) {
|
|
74
|
+
return cmd.option("--database <provider>", "Database provider: none | postgres/typeorm").option("--auth <provider>", "Auth provider: none | auth0").option("--postman <provider>", "Postman provider: none | local | api").option("-y, --yes", "Install dependencies without prompting").option("--install <mode>", "Dependency install mode: ask | yes | no", "ask");
|
|
75
|
+
}
|
|
76
|
+
function toApiOptions(directory, opts, extra = {}) {
|
|
77
|
+
const installMode = String(opts.install ?? "ask").toLowerCase();
|
|
78
|
+
const names = Array.isArray(opts.name) ? opts.name : typeof opts.name === "string" ? [
|
|
79
|
+
opts.name
|
|
80
|
+
] : extra.names;
|
|
81
|
+
return {
|
|
82
|
+
d: (0, _resolvetargetdir.resolveTargetDir)(directory, typeof opts.d === "string" ? opts.d : undefined),
|
|
83
|
+
databaseProvider: opts.database,
|
|
84
|
+
authProvider: opts.auth,
|
|
85
|
+
postmanProvider: opts.postman,
|
|
86
|
+
installDependencies: opts.yes === true ? "yes" : installMode === "yes" || installMode === "no" ? installMode : undefined,
|
|
87
|
+
names,
|
|
88
|
+
...extra
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
async function runScaffoldApi(normalized) {
|
|
92
|
+
(0, _apiname.parseApiNames)(normalized.names);
|
|
93
|
+
const { closePrompt } = await Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../domain/prompt.js")));
|
|
94
|
+
try {
|
|
95
|
+
await (0, _createapi.scaffoldApi)(normalized);
|
|
96
|
+
} finally{
|
|
97
|
+
closePrompt();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy93ZWJhcGkvY2xpLW9wdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHsgcmVzb2x2ZVRhcmdldERpciB9IGZyb20gXCIuLi9yZXNvbHZlLXRhcmdldC1kaXIuanNcIjtcbmltcG9ydCB7IHBhcnNlQXBpTmFtZXMgfSBmcm9tIFwiLi9hcGktbmFtZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBBcGlPcHRpb25zIH0gZnJvbSBcIi4vY3JlYXRlLWFwaS5qc1wiO1xuaW1wb3J0IHsgc2NhZmZvbGRBcGkgfSBmcm9tIFwiLi9jcmVhdGUtYXBpLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0TmFtZSh2YWx1ZTogc3RyaW5nLCBwcmV2aW91czogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG5cdHByZXZpb3VzLnB1c2godmFsdWUpO1xuXHRyZXR1cm4gcHJldmlvdXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRXZWJhcGlGZWF0dXJlT3B0aW9ucyhjbWQ6IENvbW1hbmQpOiBDb21tYW5kIHtcblx0cmV0dXJuIGNtZFxuXHRcdC5vcHRpb24oXCItLWRhdGFiYXNlIDxwcm92aWRlcj5cIiwgXCJEYXRhYmFzZSBwcm92aWRlcjogbm9uZSB8IHBvc3RncmVzL3R5cGVvcm1cIilcblx0XHQub3B0aW9uKFwiLS1hdXRoIDxwcm92aWRlcj5cIiwgXCJBdXRoIHByb3ZpZGVyOiBub25lIHwgYXV0aDBcIilcblx0XHQub3B0aW9uKFwiLS1wb3N0bWFuIDxwcm92aWRlcj5cIiwgXCJQb3N0bWFuIHByb3ZpZGVyOiBub25lIHwgbG9jYWwgfCBhcGlcIilcblx0XHQub3B0aW9uKFwiLXksIC0teWVzXCIsIFwiSW5zdGFsbCBkZXBlbmRlbmNpZXMgd2l0aG91dCBwcm9tcHRpbmdcIilcblx0XHQub3B0aW9uKFwiLS1pbnN0YWxsIDxtb2RlPlwiLCBcIkRlcGVuZGVuY3kgaW5zdGFsbCBtb2RlOiBhc2sgfCB5ZXMgfCBub1wiLCBcImFza1wiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQXBpT3B0aW9ucyhcblx0ZGlyZWN0b3J5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG9wdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRleHRyYTogUGFydGlhbDxBcGlPcHRpb25zPiA9IHt9LFxuKTogQXBpT3B0aW9ucyB7XG5cdGNvbnN0IGluc3RhbGxNb2RlID0gU3RyaW5nKG9wdHMuaW5zdGFsbCA/PyBcImFza1wiKS50b0xvd2VyQ2FzZSgpO1xuXHRjb25zdCBuYW1lcyA9IEFycmF5LmlzQXJyYXkob3B0cy5uYW1lKVxuXHRcdD8gKG9wdHMubmFtZSBhcyBzdHJpbmdbXSlcblx0XHQ6IHR5cGVvZiBvcHRzLm5hbWUgPT09IFwic3RyaW5nXCJcblx0XHRcdD8gW29wdHMubmFtZV1cblx0XHRcdDogZXh0cmEubmFtZXM7XG5cdHJldHVybiB7XG5cdFx0ZDogcmVzb2x2ZVRhcmdldERpcihkaXJlY3RvcnksIHR5cGVvZiBvcHRzLmQgPT09IFwic3RyaW5nXCIgPyBvcHRzLmQgOiB1bmRlZmluZWQpLFxuXHRcdGRhdGFiYXNlUHJvdmlkZXI6IG9wdHMuZGF0YWJhc2UgYXMgQXBpT3B0aW9uc1tcImRhdGFiYXNlUHJvdmlkZXJcIl0sXG5cdFx0YXV0aFByb3ZpZGVyOiBvcHRzLmF1dGggYXMgQXBpT3B0aW9uc1tcImF1dGhQcm92aWRlclwiXSxcblx0XHRwb3N0bWFuUHJvdmlkZXI6IG9wdHMucG9zdG1hbiBhcyBBcGlPcHRpb25zW1wicG9zdG1hblByb3ZpZGVyXCJdLFxuXHRcdGluc3RhbGxEZXBlbmRlbmNpZXM6XG5cdFx0XHRvcHRzLnllcyA9PT0gdHJ1ZVxuXHRcdFx0XHQ/IFwieWVzXCJcblx0XHRcdFx0OiBpbnN0YWxsTW9kZSA9PT0gXCJ5ZXNcIiB8fCBpbnN0YWxsTW9kZSA9PT0gXCJub1wiXG5cdFx0XHRcdFx0PyBpbnN0YWxsTW9kZVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdG5hbWVzLFxuXHRcdC4uLmV4dHJhLFxuXHR9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuU2NhZmZvbGRBcGkobm9ybWFsaXplZDogQXBpT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuXHRwYXJzZUFwaU5hbWVzKG5vcm1hbGl6ZWQubmFtZXMpO1xuXHRjb25zdCB7IGNsb3NlUHJvbXB0IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9kb21haW4vcHJvbXB0LmpzXCIpO1xuXHR0cnkge1xuXHRcdGF3YWl0IHNjYWZmb2xkQXBpKG5vcm1hbGl6ZWQpO1xuXHR9IGZpbmFsbHkge1xuXHRcdGNsb3NlUHJvbXB0KCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJhZGRXZWJhcGlGZWF0dXJlT3B0aW9ucyIsImNvbGxlY3ROYW1lIiwicnVuU2NhZmZvbGRBcGkiLCJ0b0FwaU9wdGlvbnMiLCJ2YWx1ZSIsInByZXZpb3VzIiwicHVzaCIsImNtZCIsIm9wdGlvbiIsImRpcmVjdG9yeSIsIm9wdHMiLCJleHRyYSIsImluc3RhbGxNb2RlIiwiU3RyaW5nIiwiaW5zdGFsbCIsInRvTG93ZXJDYXNlIiwibmFtZXMiLCJBcnJheSIsImlzQXJyYXkiLCJuYW1lIiwiZCIsInJlc29sdmVUYXJnZXREaXIiLCJ1bmRlZmluZWQiLCJkYXRhYmFzZVByb3ZpZGVyIiwiZGF0YWJhc2UiLCJhdXRoUHJvdmlkZXIiLCJhdXRoIiwicG9zdG1hblByb3ZpZGVyIiwicG9zdG1hbiIsImluc3RhbGxEZXBlbmRlbmNpZXMiLCJ5ZXMiLCJub3JtYWxpemVkIiwicGFyc2VBcGlOYW1lcyIsImNsb3NlUHJvbXB0Iiwic2NhZmZvbGRBcGkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O1FBV2dCQTtlQUFBQTs7UUFMQUM7ZUFBQUE7O1FBeUNNQztlQUFBQTs7UUEzQk5DO2VBQUFBOzs7a0NBbkJpQjt5QkFDSDsyQkFFRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXJCLFNBQVNGLFlBQVlHLEtBQWEsRUFBRUMsUUFBa0I7SUFDNURBLFNBQVNDLElBQUksQ0FBQ0Y7SUFDZCxPQUFPQztBQUNSO0FBRU8sU0FBU0wsd0JBQXdCTyxHQUFZO0lBQ25ELE9BQU9BLElBQ0xDLE1BQU0sQ0FBQyx5QkFBeUIsOENBQ2hDQSxNQUFNLENBQUMscUJBQXFCLCtCQUM1QkEsTUFBTSxDQUFDLHdCQUF3Qix3Q0FDL0JBLE1BQU0sQ0FBQyxhQUFhLDBDQUNwQkEsTUFBTSxDQUFDLG9CQUFvQiwyQ0FBMkM7QUFDekU7QUFFTyxTQUFTTCxhQUNmTSxTQUE2QixFQUM3QkMsSUFBNkIsRUFDN0JDLFFBQTZCLENBQUMsQ0FBQztJQUUvQixNQUFNQyxjQUFjQyxPQUFPSCxLQUFLSSxPQUFPLElBQUksT0FBT0MsV0FBVztJQUM3RCxNQUFNQyxRQUFRQyxNQUFNQyxPQUFPLENBQUNSLEtBQUtTLElBQUksSUFDakNULEtBQUtTLElBQUksR0FDVixPQUFPVCxLQUFLUyxJQUFJLEtBQUssV0FDcEI7UUFBQ1QsS0FBS1MsSUFBSTtLQUFDLEdBQ1hSLE1BQU1LLEtBQUs7SUFDZixPQUFPO1FBQ05JLEdBQUdDLElBQUFBLGtDQUFnQixFQUFDWixXQUFXLE9BQU9DLEtBQUtVLENBQUMsS0FBSyxXQUFXVixLQUFLVSxDQUFDLEdBQUdFO1FBQ3JFQyxrQkFBa0JiLEtBQUtjLFFBQVE7UUFDL0JDLGNBQWNmLEtBQUtnQixJQUFJO1FBQ3ZCQyxpQkFBaUJqQixLQUFLa0IsT0FBTztRQUM3QkMscUJBQ0NuQixLQUFLb0IsR0FBRyxLQUFLLE9BQ1YsUUFDQWxCLGdCQUFnQixTQUFTQSxnQkFBZ0IsT0FDeENBLGNBQ0FVO1FBQ0xOO1FBQ0EsR0FBR0wsS0FBSztJQUNUO0FBQ0Q7QUFFTyxlQUFlVCxlQUFlNkIsVUFBc0I7SUFDMURDLElBQUFBLHNCQUFhLEVBQUNELFdBQVdmLEtBQUs7SUFDOUIsTUFBTSxFQUFFaUIsV0FBVyxFQUFFLEdBQUcsTUFBTSxtRUFBQSxRQUFPO0lBQ3JDLElBQUk7UUFDSCxNQUFNQyxJQUFBQSxzQkFBVyxFQUFDSDtJQUNuQixTQUFVO1FBQ1RFO0lBQ0Q7QUFDRCJ9
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** Default API project slug when `--name` is omitted. */ "use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get DEFAULT_WEBAPI_NAME () {
|
|
13
|
+
return DEFAULT_WEBAPI_NAME;
|
|
14
|
+
},
|
|
15
|
+
get WEBAPI_PROJECT_DIR () {
|
|
16
|
+
return WEBAPI_PROJECT_DIR;
|
|
17
|
+
},
|
|
18
|
+
get WEBAPI_RELEASE_ENTRY () {
|
|
19
|
+
return WEBAPI_RELEASE_ENTRY;
|
|
20
|
+
},
|
|
21
|
+
get webapiPackageName () {
|
|
22
|
+
return webapiPackageName;
|
|
23
|
+
},
|
|
24
|
+
get webapiPort () {
|
|
25
|
+
return webapiPort;
|
|
26
|
+
},
|
|
27
|
+
get webapiProjectDir () {
|
|
28
|
+
return webapiProjectDir;
|
|
29
|
+
},
|
|
30
|
+
get webapiReleaseEntry () {
|
|
31
|
+
return webapiReleaseEntry;
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
const DEFAULT_WEBAPI_NAME = "api";
|
|
35
|
+
function webapiProjectDir(name) {
|
|
36
|
+
return `projects/${name}`;
|
|
37
|
+
}
|
|
38
|
+
function webapiReleaseEntry(name) {
|
|
39
|
+
return `dist/release/${webapiProjectDir(name)}/es6/src/main.js`;
|
|
40
|
+
}
|
|
41
|
+
function webapiPackageName(workspaceName, apiName) {
|
|
42
|
+
return `@${workspaceName}/${apiName}`;
|
|
43
|
+
}
|
|
44
|
+
function webapiPort(index) {
|
|
45
|
+
return 3000 + index;
|
|
46
|
+
}
|
|
47
|
+
const WEBAPI_PROJECT_DIR = webapiProjectDir(DEFAULT_WEBAPI_NAME);
|
|
48
|
+
const WEBAPI_RELEASE_ENTRY = webapiReleaseEntry(DEFAULT_WEBAPI_NAME);
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy93ZWJhcGkvY29uc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIERlZmF1bHQgQVBJIHByb2plY3Qgc2x1ZyB3aGVuIGAtLW5hbWVgIGlzIG9taXR0ZWQuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9XRUJBUElfTkFNRSA9IFwiYXBpXCI7XG5cbi8qKiBSZWxhdGl2ZSBwYXRoIG9mIGFuIEFQSSBwcm9qZWN0IGluc2lkZSB0aGUgbW9ub3JlcG8uICovXG5leHBvcnQgZnVuY3Rpb24gd2ViYXBpUHJvamVjdERpcihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gYHByb2plY3RzLyR7bmFtZX1gO1xufVxuXG4vKipcbiAqIEZvcmdlIHJlbGVhc2UgZW50cnkgZm9yIGEgc2NhZmZvbGRlZCBBUEkgKGBwYWNrOiB0cnVlYCDihpIgcGVyLXRhcmdldCBvdXREaXIpLlxuICogS2VlcCBpbiBzeW5jIHdpdGggcm9vdCBgcGFja2FnZS5qc29uYCBgXCJzdGFydFwiYCAvIGBcInN0YXJ0OjxuYW1lPlwiYCBhbmQgRG9ja2VyZmlsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3ZWJhcGlSZWxlYXNlRW50cnkobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIGBkaXN0L3JlbGVhc2UvJHt3ZWJhcGlQcm9qZWN0RGlyKG5hbWUpfS9lczYvc3JjL21haW4uanNgO1xufVxuXG4vKiogbnBtIHBhY2thZ2UgbmFtZSBmb3IgYSBzY2FmZm9sZGVkIEFQSSAoYGZsdXggc2VydmUgLS1wcm9qZWN0YCkuICovXG5leHBvcnQgZnVuY3Rpb24gd2ViYXBpUGFja2FnZU5hbWUod29ya3NwYWNlTmFtZTogc3RyaW5nLCBhcGlOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gYEAke3dvcmtzcGFjZU5hbWV9LyR7YXBpTmFtZX1gO1xufVxuXG4vKiogTG9jYWwgbGlzdGVuIHBvcnQgZm9yIHRoZSBudGggQVBJICgwLWJhc2VkKS4gUHJvZHVjdGlvbiB1c2VzIGBQT1JUYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3ZWJhcGlQb3J0KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuXHRyZXR1cm4gMzAwMCArIGluZGV4O1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgVXNlIGB3ZWJhcGlQcm9qZWN0RGlyKG5hbWUpYC4gRGVmYXVsdCBwYXRoIGZvciB0aGUgZmlyc3QgQVBJLiAqL1xuZXhwb3J0IGNvbnN0IFdFQkFQSV9QUk9KRUNUX0RJUiA9IHdlYmFwaVByb2plY3REaXIoREVGQVVMVF9XRUJBUElfTkFNRSk7XG5cbi8qKiBAZGVwcmVjYXRlZCBVc2UgYHdlYmFwaVJlbGVhc2VFbnRyeShuYW1lKWAuIERlZmF1bHQgc3RhcnQgZW50cnkgZm9yIHRoZSBmaXJzdCBBUEkuICovXG5leHBvcnQgY29uc3QgV0VCQVBJX1JFTEVBU0VfRU5UUlkgPSB3ZWJhcGlSZWxlYXNlRW50cnkoREVGQVVMVF9XRUJBUElfTkFNRSk7XG4iXSwibmFtZXMiOlsiREVGQVVMVF9XRUJBUElfTkFNRSIsIldFQkFQSV9QUk9KRUNUX0RJUiIsIldFQkFQSV9SRUxFQVNFX0VOVFJZIiwid2ViYXBpUGFja2FnZU5hbWUiLCJ3ZWJhcGlQb3J0Iiwid2ViYXBpUHJvamVjdERpciIsIndlYmFwaVJlbGVhc2VFbnRyeSIsIm5hbWUiLCJ3b3Jrc3BhY2VOYW1lIiwiYXBpTmFtZSIsImluZGV4Il0sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7Ozs7Ozs7Ozs7O1FBQzFDQTtlQUFBQTs7UUEwQkFDO2VBQUFBOztRQUdBQztlQUFBQTs7UUFiR0M7ZUFBQUE7O1FBS0FDO2VBQUFBOztRQWxCQUM7ZUFBQUE7O1FBUUFDO2VBQUFBOzs7QUFYVCxNQUFNTixzQkFBc0I7QUFHNUIsU0FBU0ssaUJBQWlCRSxJQUFZO0lBQzVDLE9BQU8sQ0FBQyxTQUFTLEVBQUVBLE1BQU07QUFDMUI7QUFNTyxTQUFTRCxtQkFBbUJDLElBQVk7SUFDOUMsT0FBTyxDQUFDLGFBQWEsRUFBRUYsaUJBQWlCRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hFO0FBR08sU0FBU0osa0JBQWtCSyxhQUFxQixFQUFFQyxPQUFlO0lBQ3ZFLE9BQU8sQ0FBQyxDQUFDLEVBQUVELGNBQWMsQ0FBQyxFQUFFQyxTQUFTO0FBQ3RDO0FBR08sU0FBU0wsV0FBV00sS0FBYTtJQUN2QyxPQUFPLE9BQU9BO0FBQ2Y7QUFHTyxNQUFNVCxxQkFBcUJJLGlCQUFpQkw7QUFHNUMsTUFBTUUsdUJBQXVCSSxtQkFBbUJOIn0=
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get WEBAPI_PROJECT_DIR () {
|
|
13
|
+
return _const1.WEBAPI_PROJECT_DIR;
|
|
14
|
+
},
|
|
15
|
+
get WEBAPI_RELEASE_ENTRY () {
|
|
16
|
+
return _const1.WEBAPI_RELEASE_ENTRY;
|
|
17
|
+
},
|
|
18
|
+
get scaffoldApi () {
|
|
19
|
+
return scaffoldApi;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
const _nodefs = require("node:fs");
|
|
23
|
+
const _nodepath = require("node:path");
|
|
24
|
+
const _composemodel = require("../models/compose.model.js");
|
|
25
|
+
const _configyamlmodel = require("../models/config-yaml.model.js");
|
|
26
|
+
const _const = require("../models/const.js");
|
|
27
|
+
const _devcontainermodel = require("../models/dev-container.model.js");
|
|
28
|
+
const _dockerimagemodel = require("../models/docker-image.model.js");
|
|
29
|
+
const _envfilemodel = require("../models/env-file.model.js");
|
|
30
|
+
const _gitignoremodel = require("../models/gitignore.model.js");
|
|
31
|
+
const _launchjsonmodel = require("../models/launch-json.model.js");
|
|
32
|
+
const _packagejsonmodel = require("../models/package-json.model.js");
|
|
33
|
+
const _projectmodel = require("../models/project.model.js");
|
|
34
|
+
const _tsconfigmodel = require("../models/tsconfig.model.js");
|
|
35
|
+
const _vitestconfigmodel = require("../models/vitest-config.model.js");
|
|
36
|
+
const _vscodesettingsmodel = require("../models/vscode-settings.model.js");
|
|
37
|
+
const _scaffoldservice = require("../services/scaffold.service.js");
|
|
38
|
+
const _apiname = require("./api-name.js");
|
|
39
|
+
const _const1 = require("./const.js");
|
|
40
|
+
const _hostscripts = require("./devcontainer/host-scripts.js");
|
|
41
|
+
const _authfeature = require("./features/auth.feature.js");
|
|
42
|
+
const _databasefeature = require("./features/database.feature.js");
|
|
43
|
+
const _finalizefeature = require("./features/finalize.feature.js");
|
|
44
|
+
const _postmanfeature = require("./features/postman.feature.js");
|
|
45
|
+
const _apipackagejsonmodel = require("./models/api-package-json.model.js");
|
|
46
|
+
const _controllersourcefilemodel = require("./models/controller-source-file.model.js");
|
|
47
|
+
const _githubcimodel = require("./models/github-ci.model.js");
|
|
48
|
+
const _mainsourcefilemodel = require("./models/main-source-file.model.js");
|
|
49
|
+
const _productiondockerfilemodel = require("./models/production-dockerfile.model.js");
|
|
50
|
+
const _samplefilesmodel = require("./models/sample-files.model.js");
|
|
51
|
+
const _webapiimagemodel = require("./models/webapi-image.model.js");
|
|
52
|
+
const features = [
|
|
53
|
+
_databasefeature.DatabaseFeature,
|
|
54
|
+
_authfeature.AuthFeature,
|
|
55
|
+
_postmanfeature.PostmanFeature,
|
|
56
|
+
_finalizefeature.FinalizeFeature
|
|
57
|
+
];
|
|
58
|
+
async function scaffoldApi(cliOptions) {
|
|
59
|
+
const targetDir = (0, _nodepath.resolve)(cliOptions.d ?? ".");
|
|
60
|
+
const projectName = cliOptions.projectName?.trim() || process.env.DECOHERE_PROJECT_NAME?.trim() || (0, _nodepath.basename)(targetDir);
|
|
61
|
+
const names = (0, _apiname.parseApiNames)(cliOptions.names);
|
|
62
|
+
const workspace = cliOptions.add ? createAddWorkspace(targetDir, projectName, names) : createWorkspace(targetDir, projectName, names);
|
|
63
|
+
await _scaffoldservice.ScaffoldService.scaffold(workspace, {
|
|
64
|
+
...cliOptions,
|
|
65
|
+
names
|
|
66
|
+
}, features);
|
|
67
|
+
}
|
|
68
|
+
function createWorkspace(targetDir, projectName, apiNames) {
|
|
69
|
+
const monoRepo = new _projectmodel.MonoRepoScaffold();
|
|
70
|
+
monoRepo.targetDir = targetDir;
|
|
71
|
+
monoRepo.setName(projectName);
|
|
72
|
+
const name = monoRepo.name;
|
|
73
|
+
const compose = new _composemodel.DockerCompose().setProjectName(name).addHeaderComment("Merge .cursor/mcp.json in the service command. postStartCommand runs after Cursor's first MCP snapshot.").addNetwork(name, {
|
|
74
|
+
name: `samples-${name}`
|
|
75
|
+
}).addService("devcontainer", {
|
|
76
|
+
build: ".",
|
|
77
|
+
volumes: [
|
|
78
|
+
// Workspace-local (created by initialize.sh as the host user).
|
|
79
|
+
// Do NOT bind ${HOME}/.npm/... — Docker creates missing host paths as root.
|
|
80
|
+
"./npm-auth:/home/node/.npm-config",
|
|
81
|
+
"./gh-auth:/home/node/.config/gh",
|
|
82
|
+
"webapi-node-modules:/workspace/node_modules",
|
|
83
|
+
// Named volume (not a Cursor-only mount) so CLI recreates keep Up-arrow history.
|
|
84
|
+
`${_dockerimagemodel.commandHistory.volumeName}:${_dockerimagemodel.commandHistory.dir}`
|
|
85
|
+
],
|
|
86
|
+
env_file: [
|
|
87
|
+
"./gh.env"
|
|
88
|
+
],
|
|
89
|
+
environment: {
|
|
90
|
+
NPM_CONFIG_USERCONFIG: "/home/node/.npm-config/.npmrc"
|
|
91
|
+
},
|
|
92
|
+
command: "'bash -c \"CODEBASE_RAG_WORKSPACE=/workspace node --experimental-strip-types /workspace/.devcontainer/codebase-rag-mcp.ts merge || true && exec sleep infinity\"'",
|
|
93
|
+
networks: [
|
|
94
|
+
name
|
|
95
|
+
]
|
|
96
|
+
}).addVolume("webapi-node-modules").addVolume(_dockerimagemodel.commandHistory.volumeName);
|
|
97
|
+
const installCmd = "bash .devcontainer/post-create.sh";
|
|
98
|
+
const devContainer = new _devcontainermodel.DevContainer().addExtension("biomejs.biome", "vitest.explorer").setInitializeCommand("bash .devcontainer/initialize.sh").setPostCreateCommand(installCmd).setUpdateContentCommand(installCmd).setPostStartCommand("bash .devcontainer/post-start.sh").useCompose();
|
|
99
|
+
for (const [index, apiName] of apiNames.entries()){
|
|
100
|
+
const port = (0, _const1.webapiPort)(index);
|
|
101
|
+
devContainer.forwardPort(port);
|
|
102
|
+
devContainer.setPortAttributes(port, {
|
|
103
|
+
label: apiName === _const1.DEFAULT_WEBAPI_NAME ? "API" : apiName,
|
|
104
|
+
requireLocalPort: true
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
// Workspace-level models (repo root)
|
|
108
|
+
monoRepo.addModel(compose);
|
|
109
|
+
monoRepo.addModel(devContainer);
|
|
110
|
+
monoRepo.addModel(new _webapiimagemodel.WebapiDevContainer());
|
|
111
|
+
monoRepo.addModel(new _productiondockerfilemodel.WebapiProductionDockerfile(apiNames));
|
|
112
|
+
monoRepo.addModel(new _githubcimodel.GithubCiWorkflows());
|
|
113
|
+
monoRepo.addModel(new _vscodesettingsmodel.VSCodeSettings(name));
|
|
114
|
+
monoRepo.addModel(new _launchjsonmodel.LaunchJson(apiNames));
|
|
115
|
+
monoRepo.addModel(new _tsconfigmodel.TsConfig());
|
|
116
|
+
monoRepo.addModel(new _vitestconfigmodel.VitestConfig());
|
|
117
|
+
monoRepo.addModel(new _packagejsonmodel.PackageJson(`${name}.api`, {
|
|
118
|
+
apiNames,
|
|
119
|
+
workspaceName: name
|
|
120
|
+
}));
|
|
121
|
+
monoRepo.addModel(new _configyamlmodel.ConfigYaml(_const.WELL_KNOWN_FILES.CONFIG_YAML, "config/config.yaml", ""));
|
|
122
|
+
monoRepo.addModel(new _configyamlmodel.ConfigYaml(_const.WELL_KNOWN_FILES.CONFIG_DEV_YAML, "config/config.dev.yaml", ""));
|
|
123
|
+
monoRepo.addModel(new _gitignoremodel.Gitignore());
|
|
124
|
+
monoRepo.addModel(new _envfilemodel.EnvFile());
|
|
125
|
+
monoRepo.addFile(new _hostscripts.DevContainerHostScripts());
|
|
126
|
+
// Biome formatter/linter config
|
|
127
|
+
monoRepo.addFile({
|
|
128
|
+
files: ()=>[
|
|
129
|
+
{
|
|
130
|
+
filePath: "biome.json",
|
|
131
|
+
content: JSON.stringify({
|
|
132
|
+
$schema: "https://biomejs.dev/schemas/2.0.0/schema.json",
|
|
133
|
+
files: {
|
|
134
|
+
includes: [
|
|
135
|
+
"**/*.ts",
|
|
136
|
+
"**/*.js",
|
|
137
|
+
"**/*.json",
|
|
138
|
+
"**/*.yml",
|
|
139
|
+
"**/*.yaml"
|
|
140
|
+
]
|
|
141
|
+
},
|
|
142
|
+
assist: {
|
|
143
|
+
actions: {
|
|
144
|
+
source: {
|
|
145
|
+
organizeImports: "on"
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
vcs: {
|
|
150
|
+
enabled: true,
|
|
151
|
+
clientKind: "git",
|
|
152
|
+
useIgnoreFile: true
|
|
153
|
+
},
|
|
154
|
+
formatter: {
|
|
155
|
+
enabled: true,
|
|
156
|
+
formatWithErrors: true,
|
|
157
|
+
indentStyle: "tab",
|
|
158
|
+
lineWidth: 95
|
|
159
|
+
},
|
|
160
|
+
javascript: {
|
|
161
|
+
parser: {
|
|
162
|
+
unsafeParameterDecoratorsEnabled: true
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
linter: {
|
|
166
|
+
rules: {
|
|
167
|
+
style: {
|
|
168
|
+
useConsistentMemberAccessibility: {
|
|
169
|
+
level: "error",
|
|
170
|
+
options: {
|
|
171
|
+
accessibility: "explicit"
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
overrides: [
|
|
178
|
+
{
|
|
179
|
+
includes: [
|
|
180
|
+
"**/*.json"
|
|
181
|
+
],
|
|
182
|
+
formatter: {
|
|
183
|
+
indentStyle: "space",
|
|
184
|
+
indentWidth: 2
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
]
|
|
188
|
+
}, null, 2)
|
|
189
|
+
}
|
|
190
|
+
]
|
|
191
|
+
});
|
|
192
|
+
for (const apiName of apiNames){
|
|
193
|
+
addApiProject(monoRepo, name, apiName);
|
|
194
|
+
}
|
|
195
|
+
return monoRepo;
|
|
196
|
+
}
|
|
197
|
+
function createAddWorkspace(targetDir, projectName, apiNames) {
|
|
198
|
+
if (!(0, _apiname.isDecohereWorkspace)(targetDir)) {
|
|
199
|
+
throw new _apiname.CreateCliError(`Not a Decohere workspace: ${targetDir}. Scaffold one first with \`npx @decohere/create webapi\`.`);
|
|
200
|
+
}
|
|
201
|
+
const existing = (0, _apiname.listExistingApiNames)(targetDir);
|
|
202
|
+
for (const apiName of apiNames){
|
|
203
|
+
if (existing.includes(apiName)) {
|
|
204
|
+
throw new _apiname.CreateCliError(`API "${apiName}" already exists at ${(0, _const1.webapiProjectDir)(apiName)}.`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
const monoRepo = new _projectmodel.MonoRepoScaffold();
|
|
208
|
+
monoRepo.targetDir = targetDir;
|
|
209
|
+
monoRepo.setName(projectName);
|
|
210
|
+
const name = monoRepo.name;
|
|
211
|
+
const pkg = _packagejsonmodel.PackageJson.fromFile((0, _nodepath.join)(targetDir, "package.json"));
|
|
212
|
+
monoRepo.addModel(pkg);
|
|
213
|
+
monoRepo.addModel((0, _nodefs.existsSync)((0, _nodepath.join)(targetDir, ".env")) ? _envfilemodel.EnvFile.fromFile((0, _nodepath.join)(targetDir, ".env")) : new _envfilemodel.EnvFile());
|
|
214
|
+
monoRepo.addModel((0, _nodefs.existsSync)((0, _nodepath.join)(targetDir, "config/config.yaml")) ? _configyamlmodel.ConfigYaml.fromFile(_const.WELL_KNOWN_FILES.CONFIG_YAML, "config/config.yaml", (0, _nodepath.join)(targetDir, "config/config.yaml")) : new _configyamlmodel.ConfigYaml(_const.WELL_KNOWN_FILES.CONFIG_YAML, "config/config.yaml", ""));
|
|
215
|
+
monoRepo.addModel((0, _nodefs.existsSync)((0, _nodepath.join)(targetDir, "config/config.dev.yaml")) ? _configyamlmodel.ConfigYaml.fromFile(_const.WELL_KNOWN_FILES.CONFIG_DEV_YAML, "config/config.dev.yaml", (0, _nodepath.join)(targetDir, "config/config.dev.yaml")) : new _configyamlmodel.ConfigYaml(_const.WELL_KNOWN_FILES.CONFIG_DEV_YAML, "config/config.dev.yaml", ""));
|
|
216
|
+
for (const [offset, apiName] of apiNames.entries()){
|
|
217
|
+
const port = (0, _const1.webapiPort)(existing.length + offset);
|
|
218
|
+
pkg.addScript(`start:${apiName}`, `node ${(0, _const1.webapiReleaseEntry)(apiName)}`);
|
|
219
|
+
pkg.addScript(`dev:${apiName}`, `PORT=${port} flux serve --project ${(0, _const1.webapiPackageName)(name, apiName)}`);
|
|
220
|
+
addApiProject(monoRepo, name, apiName);
|
|
221
|
+
}
|
|
222
|
+
monoRepo.addModel(new _productiondockerfilemodel.WebapiProductionDockerfile(apiNames, {
|
|
223
|
+
namedOnly: true
|
|
224
|
+
}));
|
|
225
|
+
return monoRepo;
|
|
226
|
+
}
|
|
227
|
+
function addApiProject(monoRepo, workspaceName, apiName) {
|
|
228
|
+
const apiProject = new _projectmodel.ProjectScaffold((0, _const1.webapiProjectDir)(apiName));
|
|
229
|
+
apiProject.addModel(new _apipackagejsonmodel.ApiPackageJson(workspaceName, apiName));
|
|
230
|
+
apiProject.addModel(new _mainsourcefilemodel.MainSourceFile(`${workspaceName}.${apiName}`));
|
|
231
|
+
apiProject.addModel(new _controllersourcefilemodel.ControllerSourceFile());
|
|
232
|
+
apiProject.addFile(new _samplefilesmodel.SampleConfigModel());
|
|
233
|
+
apiProject.addFile(new _samplefilesmodel.SampleServiceModel());
|
|
234
|
+
monoRepo.addProject(apiProject);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy93ZWJhcGkvY3JlYXRlLWFwaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGJhc2VuYW1lLCBqb2luLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgRG9ja2VyQ29tcG9zZSB9IGZyb20gXCIuLi9tb2RlbHMvY29tcG9zZS5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgQ29uZmlnWWFtbCB9IGZyb20gXCIuLi9tb2RlbHMvY29uZmlnLXlhbWwubW9kZWwuanNcIjtcbmltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgeyBEZXZDb250YWluZXIgfSBmcm9tIFwiLi4vbW9kZWxzL2Rldi1jb250YWluZXIubW9kZWwuanNcIjtcbmltcG9ydCB7IGNvbW1hbmRIaXN0b3J5IH0gZnJvbSBcIi4uL21vZGVscy9kb2NrZXItaW1hZ2UubW9kZWwuanNcIjtcbmltcG9ydCB7IEVudkZpbGUgfSBmcm9tIFwiLi4vbW9kZWxzL2Vudi1maWxlLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBHaXRpZ25vcmUgfSBmcm9tIFwiLi4vbW9kZWxzL2dpdGlnbm9yZS5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgTGF1bmNoSnNvbiB9IGZyb20gXCIuLi9tb2RlbHMvbGF1bmNoLWpzb24ubW9kZWwuanNcIjtcbmltcG9ydCB7IFBhY2thZ2VKc29uIH0gZnJvbSBcIi4uL21vZGVscy9wYWNrYWdlLWpzb24ubW9kZWwuanNcIjtcbmltcG9ydCB7IE1vbm9SZXBvU2NhZmZvbGQsIFByb2plY3RTY2FmZm9sZCB9IGZyb20gXCIuLi9tb2RlbHMvcHJvamVjdC5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgVHNDb25maWcgfSBmcm9tIFwiLi4vbW9kZWxzL3RzY29uZmlnLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBWaXRlc3RDb25maWcgfSBmcm9tIFwiLi4vbW9kZWxzL3ZpdGVzdC1jb25maWcubW9kZWwuanNcIjtcbmltcG9ydCB7IFZTQ29kZVNldHRpbmdzIH0gZnJvbSBcIi4uL21vZGVscy92c2NvZGUtc2V0dGluZ3MubW9kZWwuanNcIjtcbmltcG9ydCB7IFNjYWZmb2xkU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9zY2FmZm9sZC5zZXJ2aWNlLmpzXCI7XG5pbXBvcnQge1xuXHRDcmVhdGVDbGlFcnJvcixcblx0aXNEZWNvaGVyZVdvcmtzcGFjZSxcblx0bGlzdEV4aXN0aW5nQXBpTmFtZXMsXG5cdHBhcnNlQXBpTmFtZXMsXG59IGZyb20gXCIuL2FwaS1uYW1lLmpzXCI7XG5pbXBvcnQge1xuXHRERUZBVUxUX1dFQkFQSV9OQU1FLFxuXHR3ZWJhcGlQYWNrYWdlTmFtZSxcblx0d2ViYXBpUG9ydCxcblx0d2ViYXBpUHJvamVjdERpcixcblx0d2ViYXBpUmVsZWFzZUVudHJ5LFxufSBmcm9tIFwiLi9jb25zdC5qc1wiO1xuaW1wb3J0IHsgRGV2Q29udGFpbmVySG9zdFNjcmlwdHMgfSBmcm9tIFwiLi9kZXZjb250YWluZXIvaG9zdC1zY3JpcHRzLmpzXCI7XG5pbXBvcnQgeyBBdXRoRmVhdHVyZSB9IGZyb20gXCIuL2ZlYXR1cmVzL2F1dGguZmVhdHVyZS5qc1wiO1xuaW1wb3J0IHsgRGF0YWJhc2VGZWF0dXJlIH0gZnJvbSBcIi4vZmVhdHVyZXMvZGF0YWJhc2UuZmVhdHVyZS5qc1wiO1xuaW1wb3J0IHsgRmluYWxpemVGZWF0dXJlIH0gZnJvbSBcIi4vZmVhdHVyZXMvZmluYWxpemUuZmVhdHVyZS5qc1wiO1xuaW1wb3J0IHsgUG9zdG1hbkZlYXR1cmUgfSBmcm9tIFwiLi9mZWF0dXJlcy9wb3N0bWFuLmZlYXR1cmUuanNcIjtcbmltcG9ydCB7IEFwaVBhY2thZ2VKc29uIH0gZnJvbSBcIi4vbW9kZWxzL2FwaS1wYWNrYWdlLWpzb24ubW9kZWwuanNcIjtcbmltcG9ydCB7IENvbnRyb2xsZXJTb3VyY2VGaWxlIH0gZnJvbSBcIi4vbW9kZWxzL2NvbnRyb2xsZXItc291cmNlLWZpbGUubW9kZWwuanNcIjtcbmltcG9ydCB7IEdpdGh1YkNpV29ya2Zsb3dzIH0gZnJvbSBcIi4vbW9kZWxzL2dpdGh1Yi1jaS5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgTWFpblNvdXJjZUZpbGUgfSBmcm9tIFwiLi9tb2RlbHMvbWFpbi1zb3VyY2UtZmlsZS5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgV2ViYXBpUHJvZHVjdGlvbkRvY2tlcmZpbGUgfSBmcm9tIFwiLi9tb2RlbHMvcHJvZHVjdGlvbi1kb2NrZXJmaWxlLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBTYW1wbGVDb25maWdNb2RlbCwgU2FtcGxlU2VydmljZU1vZGVsIH0gZnJvbSBcIi4vbW9kZWxzL3NhbXBsZS1maWxlcy5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgV2ViYXBpRGV2Q29udGFpbmVyIH0gZnJvbSBcIi4vbW9kZWxzL3dlYmFwaS1pbWFnZS5tb2RlbC5qc1wiO1xuXG5leHBvcnQgeyBXRUJBUElfUFJPSkVDVF9ESVIsIFdFQkFQSV9SRUxFQVNFX0VOVFJZIH0gZnJvbSBcIi4vY29uc3QuanNcIjtcblxuZXhwb3J0IHR5cGUgQXBpT3B0aW9ucyA9IHtcblx0ZD86IHN0cmluZztcblx0LyoqIEhvc3QgcHJvamVjdCBuYW1lIChkaXJlY3RvcnkgYmFzZW5hbWUpLiBSZXF1aXJlZCB3aGVuIHNjYWZmb2xkaW5nIGludG8gYC93b3Jrc3BhY2VgLiAqL1xuXHRwcm9qZWN0TmFtZT86IHN0cmluZztcblx0LyoqIEFQSSBzbHVncyB1bmRlciBgcHJvamVjdHMvYC4gRGVmYXVsdCBgW1wiYXBpXCJdYC4gUmVwZWF0YWJsZSBgLS1uYW1lYC4gKi9cblx0bmFtZXM/OiBzdHJpbmdbXTtcblx0LyoqIEFkZCBBUElzIHRvIGFuIGV4aXN0aW5nIERlY29oZXJlIHdvcmtzcGFjZSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS4gKi9cblx0YWRkPzogYm9vbGVhbjtcblx0YXV0aFByb3ZpZGVyPzogXCJhdXRoMFwiIHwgXCJub25lXCI7XG5cdGRhdGFiYXNlUHJvdmlkZXI/OiBcIm5vbmVcIiB8IFwicG9zdGdyZXMvdHlwZW9ybVwiO1xuXHRwb3N0bWFuUHJvdmlkZXI/OiBcImFwaVwiIHwgXCJsb2NhbFwiIHwgXCJub25lXCI7XG5cdGluc3RhbGxEZXBlbmRlbmNpZXM/OiBcInllc1wiIHwgXCJub1wiO1xufTtcblxuY29uc3QgZmVhdHVyZXMgPSBbRGF0YWJhc2VGZWF0dXJlLCBBdXRoRmVhdHVyZSwgUG9zdG1hbkZlYXR1cmUsIEZpbmFsaXplRmVhdHVyZV07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzY2FmZm9sZEFwaShjbGlPcHRpb25zOiBBcGlPcHRpb25zKSB7XG5cdGNvbnN0IHRhcmdldERpciA9IHJlc29sdmUoY2xpT3B0aW9ucy5kID8/IFwiLlwiKTtcblx0Y29uc3QgcHJvamVjdE5hbWUgPVxuXHRcdGNsaU9wdGlvbnMucHJvamVjdE5hbWU/LnRyaW0oKSB8fFxuXHRcdHByb2Nlc3MuZW52LkRFQ09IRVJFX1BST0pFQ1RfTkFNRT8udHJpbSgpIHx8XG5cdFx0YmFzZW5hbWUodGFyZ2V0RGlyKTtcblx0Y29uc3QgbmFtZXMgPSBwYXJzZUFwaU5hbWVzKGNsaU9wdGlvbnMubmFtZXMpO1xuXHRjb25zdCB3b3Jrc3BhY2UgPSBjbGlPcHRpb25zLmFkZFxuXHRcdD8gY3JlYXRlQWRkV29ya3NwYWNlKHRhcmdldERpciwgcHJvamVjdE5hbWUsIG5hbWVzKVxuXHRcdDogY3JlYXRlV29ya3NwYWNlKHRhcmdldERpciwgcHJvamVjdE5hbWUsIG5hbWVzKTtcblx0YXdhaXQgU2NhZmZvbGRTZXJ2aWNlLnNjYWZmb2xkKHdvcmtzcGFjZSwgeyAuLi5jbGlPcHRpb25zLCBuYW1lcyB9LCBmZWF0dXJlcyk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVdvcmtzcGFjZShcblx0dGFyZ2V0RGlyOiBzdHJpbmcsXG5cdHByb2plY3ROYW1lOiBzdHJpbmcsXG5cdGFwaU5hbWVzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IE1vbm9SZXBvU2NhZmZvbGQge1xuXHRjb25zdCBtb25vUmVwbyA9IG5ldyBNb25vUmVwb1NjYWZmb2xkKCk7XG5cdG1vbm9SZXBvLnRhcmdldERpciA9IHRhcmdldERpcjtcblx0bW9ub1JlcG8uc2V0TmFtZShwcm9qZWN0TmFtZSk7XG5cdGNvbnN0IG5hbWUgPSBtb25vUmVwby5uYW1lO1xuXG5cdGNvbnN0IGNvbXBvc2UgPSBuZXcgRG9ja2VyQ29tcG9zZSgpXG5cdFx0LnNldFByb2plY3ROYW1lKG5hbWUpXG5cdFx0LmFkZEhlYWRlckNvbW1lbnQoXG5cdFx0XHRcIk1lcmdlIC5jdXJzb3IvbWNwLmpzb24gaW4gdGhlIHNlcnZpY2UgY29tbWFuZC4gcG9zdFN0YXJ0Q29tbWFuZCBydW5zIGFmdGVyIEN1cnNvcidzIGZpcnN0IE1DUCBzbmFwc2hvdC5cIixcblx0XHQpXG5cdFx0LmFkZE5ldHdvcmsobmFtZSwgeyBuYW1lOiBgc2FtcGxlcy0ke25hbWV9YCB9KVxuXHRcdC5hZGRTZXJ2aWNlKFwiZGV2Y29udGFpbmVyXCIsIHtcblx0XHRcdGJ1aWxkOiBcIi5cIixcblx0XHRcdHZvbHVtZXM6IFtcblx0XHRcdFx0Ly8gV29ya3NwYWNlLWxvY2FsIChjcmVhdGVkIGJ5IGluaXRpYWxpemUuc2ggYXMgdGhlIGhvc3QgdXNlcikuXG5cdFx0XHRcdC8vIERvIE5PVCBiaW5kICR7SE9NRX0vLm5wbS8uLi4g4oCUIERvY2tlciBjcmVhdGVzIG1pc3NpbmcgaG9zdCBwYXRocyBhcyByb290LlxuXHRcdFx0XHRcIi4vbnBtLWF1dGg6L2hvbWUvbm9kZS8ubnBtLWNvbmZpZ1wiLFxuXHRcdFx0XHRcIi4vZ2gtYXV0aDovaG9tZS9ub2RlLy5jb25maWcvZ2hcIixcblx0XHRcdFx0XCJ3ZWJhcGktbm9kZS1tb2R1bGVzOi93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzXCIsXG5cdFx0XHRcdC8vIE5hbWVkIHZvbHVtZSAobm90IGEgQ3Vyc29yLW9ubHkgbW91bnQpIHNvIENMSSByZWNyZWF0ZXMga2VlcCBVcC1hcnJvdyBoaXN0b3J5LlxuXHRcdFx0XHRgJHtjb21tYW5kSGlzdG9yeS52b2x1bWVOYW1lfToke2NvbW1hbmRIaXN0b3J5LmRpcn1gLFxuXHRcdFx0XSxcblx0XHRcdGVudl9maWxlOiBbXCIuL2doLmVudlwiXSxcblx0XHRcdGVudmlyb25tZW50OiB7IE5QTV9DT05GSUdfVVNFUkNPTkZJRzogXCIvaG9tZS9ub2RlLy5ucG0tY29uZmlnLy5ucG1yY1wiIH0sXG5cdFx0XHRjb21tYW5kOlxuXHRcdFx0XHRcIidiYXNoIC1jIFxcXCJDT0RFQkFTRV9SQUdfV09SS1NQQUNFPS93b3Jrc3BhY2Ugbm9kZSAtLWV4cGVyaW1lbnRhbC1zdHJpcC10eXBlcyAvd29ya3NwYWNlLy5kZXZjb250YWluZXIvY29kZWJhc2UtcmFnLW1jcC50cyBtZXJnZSB8fCB0cnVlICYmIGV4ZWMgc2xlZXAgaW5maW5pdHlcXFwiJ1wiLFxuXHRcdFx0bmV0d29ya3M6IFtuYW1lXSxcblx0XHR9KVxuXHRcdC5hZGRWb2x1bWUoXCJ3ZWJhcGktbm9kZS1tb2R1bGVzXCIpXG5cdFx0LmFkZFZvbHVtZShjb21tYW5kSGlzdG9yeS52b2x1bWVOYW1lKTtcblxuXHRjb25zdCBpbnN0YWxsQ21kID0gXCJiYXNoIC5kZXZjb250YWluZXIvcG9zdC1jcmVhdGUuc2hcIjtcblx0Y29uc3QgZGV2Q29udGFpbmVyID0gbmV3IERldkNvbnRhaW5lcigpXG5cdFx0LmFkZEV4dGVuc2lvbihcImJpb21lanMuYmlvbWVcIiwgXCJ2aXRlc3QuZXhwbG9yZXJcIilcblx0XHQuc2V0SW5pdGlhbGl6ZUNvbW1hbmQoXCJiYXNoIC5kZXZjb250YWluZXIvaW5pdGlhbGl6ZS5zaFwiKVxuXHRcdC5zZXRQb3N0Q3JlYXRlQ29tbWFuZChpbnN0YWxsQ21kKVxuXHRcdC5zZXRVcGRhdGVDb250ZW50Q29tbWFuZChpbnN0YWxsQ21kKVxuXHRcdC5zZXRQb3N0U3RhcnRDb21tYW5kKFwiYmFzaCAuZGV2Y29udGFpbmVyL3Bvc3Qtc3RhcnQuc2hcIilcblx0XHQudXNlQ29tcG9zZSgpO1xuXG5cdGZvciAoY29uc3QgW2luZGV4LCBhcGlOYW1lXSBvZiBhcGlOYW1lcy5lbnRyaWVzKCkpIHtcblx0XHRjb25zdCBwb3J0ID0gd2ViYXBpUG9ydChpbmRleCk7XG5cdFx0ZGV2Q29udGFpbmVyLmZvcndhcmRQb3J0KHBvcnQpO1xuXHRcdGRldkNvbnRhaW5lci5zZXRQb3J0QXR0cmlidXRlcyhwb3J0LCB7XG5cdFx0XHRsYWJlbDogYXBpTmFtZSA9PT0gREVGQVVMVF9XRUJBUElfTkFNRSA/IFwiQVBJXCIgOiBhcGlOYW1lLFxuXHRcdFx0cmVxdWlyZUxvY2FsUG9ydDogdHJ1ZSxcblx0XHR9KTtcblx0fVxuXG5cdC8vIFdvcmtzcGFjZS1sZXZlbCBtb2RlbHMgKHJlcG8gcm9vdClcblx0bW9ub1JlcG8uYWRkTW9kZWwoY29tcG9zZSk7XG5cdG1vbm9SZXBvLmFkZE1vZGVsKGRldkNvbnRhaW5lcik7XG5cdG1vbm9SZXBvLmFkZE1vZGVsKG5ldyBXZWJhcGlEZXZDb250YWluZXIoKSk7XG5cdG1vbm9SZXBvLmFkZE1vZGVsKG5ldyBXZWJhcGlQcm9kdWN0aW9uRG9ja2VyZmlsZShhcGlOYW1lcykpO1xuXHRtb25vUmVwby5hZGRNb2RlbChuZXcgR2l0aHViQ2lXb3JrZmxvd3MoKSk7XG5cdG1vbm9SZXBvLmFkZE1vZGVsKG5ldyBWU0NvZGVTZXR0aW5ncyhuYW1lKSk7XG5cdG1vbm9SZXBvLmFkZE1vZGVsKG5ldyBMYXVuY2hKc29uKGFwaU5hbWVzKSk7XG5cdG1vbm9SZXBvLmFkZE1vZGVsKG5ldyBUc0NvbmZpZygpKTtcblx0bW9ub1JlcG8uYWRkTW9kZWwobmV3IFZpdGVzdENvbmZpZygpKTtcblx0bW9ub1JlcG8uYWRkTW9kZWwobmV3IFBhY2thZ2VKc29uKGAke25hbWV9LmFwaWAsIHsgYXBpTmFtZXMsIHdvcmtzcGFjZU5hbWU6IG5hbWUgfSkpO1xuXHRtb25vUmVwby5hZGRNb2RlbChuZXcgQ29uZmlnWWFtbChXRUxMX0tOT1dOX0ZJTEVTLkNPTkZJR19ZQU1MLCBcImNvbmZpZy9jb25maWcueWFtbFwiLCBcIlwiKSk7XG5cdG1vbm9SZXBvLmFkZE1vZGVsKFxuXHRcdG5ldyBDb25maWdZYW1sKFdFTExfS05PV05fRklMRVMuQ09ORklHX0RFVl9ZQU1MLCBcImNvbmZpZy9jb25maWcuZGV2LnlhbWxcIiwgXCJcIiksXG5cdCk7XG5cdG1vbm9SZXBvLmFkZE1vZGVsKG5ldyBHaXRpZ25vcmUoKSk7XG5cdG1vbm9SZXBvLmFkZE1vZGVsKG5ldyBFbnZGaWxlKCkpO1xuXHRtb25vUmVwby5hZGRGaWxlKG5ldyBEZXZDb250YWluZXJIb3N0U2NyaXB0cygpKTtcblxuXHQvLyBCaW9tZSBmb3JtYXR0ZXIvbGludGVyIGNvbmZpZ1xuXHRtb25vUmVwby5hZGRGaWxlKHtcblx0XHRmaWxlczogKCkgPT4gW1xuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCJiaW9tZS5qc29uXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdCRzY2hlbWE6IFwiaHR0cHM6Ly9iaW9tZWpzLmRldi9zY2hlbWFzLzIuMC4wL3NjaGVtYS5qc29uXCIsXG5cdFx0XHRcdFx0XHRmaWxlczoge1xuXHRcdFx0XHRcdFx0XHRpbmNsdWRlczogW1wiKiovKi50c1wiLCBcIioqLyouanNcIiwgXCIqKi8qLmpzb25cIiwgXCIqKi8qLnltbFwiLCBcIioqLyoueWFtbFwiXSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRhc3Npc3Q6IHsgYWN0aW9uczogeyBzb3VyY2U6IHsgb3JnYW5pemVJbXBvcnRzOiBcIm9uXCIgfSB9IH0sXG5cdFx0XHRcdFx0XHR2Y3M6IHsgZW5hYmxlZDogdHJ1ZSwgY2xpZW50S2luZDogXCJnaXRcIiwgdXNlSWdub3JlRmlsZTogdHJ1ZSB9LFxuXHRcdFx0XHRcdFx0Zm9ybWF0dGVyOiB7XG5cdFx0XHRcdFx0XHRcdGVuYWJsZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGZvcm1hdFdpdGhFcnJvcnM6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGluZGVudFN0eWxlOiBcInRhYlwiLFxuXHRcdFx0XHRcdFx0XHRsaW5lV2lkdGg6IDk1LFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGphdmFzY3JpcHQ6IHsgcGFyc2VyOiB7IHVuc2FmZVBhcmFtZXRlckRlY29yYXRvcnNFbmFibGVkOiB0cnVlIH0gfSxcblx0XHRcdFx0XHRcdGxpbnRlcjoge1xuXHRcdFx0XHRcdFx0XHRydWxlczoge1xuXHRcdFx0XHRcdFx0XHRcdHN0eWxlOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHR1c2VDb25zaXN0ZW50TWVtYmVyQWNjZXNzaWJpbGl0eToge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXZlbDogXCJlcnJvclwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvcHRpb25zOiB7IGFjY2Vzc2liaWxpdHk6IFwiZXhwbGljaXRcIiB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG92ZXJyaWRlczogW1xuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aW5jbHVkZXM6IFtcIioqLyouanNvblwiXSxcblx0XHRcdFx0XHRcdFx0XHRmb3JtYXR0ZXI6IHsgaW5kZW50U3R5bGU6IFwic3BhY2VcIiwgaW5kZW50V2lkdGg6IDIgfSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdDIsXG5cdFx0XHRcdCksXG5cdFx0XHR9LFxuXHRcdF0sXG5cdH0pO1xuXG5cdGZvciAoY29uc3QgYXBpTmFtZSBvZiBhcGlOYW1lcykge1xuXHRcdGFkZEFwaVByb2plY3QobW9ub1JlcG8sIG5hbWUsIGFwaU5hbWUpO1xuXHR9XG5cblx0cmV0dXJuIG1vbm9SZXBvO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBZGRXb3Jrc3BhY2UoXG5cdHRhcmdldERpcjogc3RyaW5nLFxuXHRwcm9qZWN0TmFtZTogc3RyaW5nLFxuXHRhcGlOYW1lczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBNb25vUmVwb1NjYWZmb2xkIHtcblx0aWYgKCFpc0RlY29oZXJlV29ya3NwYWNlKHRhcmdldERpcikpIHtcblx0XHR0aHJvdyBuZXcgQ3JlYXRlQ2xpRXJyb3IoXG5cdFx0XHRgTm90IGEgRGVjb2hlcmUgd29ya3NwYWNlOiAke3RhcmdldERpcn0uIFNjYWZmb2xkIG9uZSBmaXJzdCB3aXRoIFxcYG5weCBAZGVjb2hlcmUvY3JlYXRlIHdlYmFwaVxcYC5gLFxuXHRcdCk7XG5cdH1cblxuXHRjb25zdCBleGlzdGluZyA9IGxpc3RFeGlzdGluZ0FwaU5hbWVzKHRhcmdldERpcik7XG5cdGZvciAoY29uc3QgYXBpTmFtZSBvZiBhcGlOYW1lcykge1xuXHRcdGlmIChleGlzdGluZy5pbmNsdWRlcyhhcGlOYW1lKSkge1xuXHRcdFx0dGhyb3cgbmV3IENyZWF0ZUNsaUVycm9yKFxuXHRcdFx0XHRgQVBJIFwiJHthcGlOYW1lfVwiIGFscmVhZHkgZXhpc3RzIGF0ICR7d2ViYXBpUHJvamVjdERpcihhcGlOYW1lKX0uYCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3QgbW9ub1JlcG8gPSBuZXcgTW9ub1JlcG9TY2FmZm9sZCgpO1xuXHRtb25vUmVwby50YXJnZXREaXIgPSB0YXJnZXREaXI7XG5cdG1vbm9SZXBvLnNldE5hbWUocHJvamVjdE5hbWUpO1xuXHRjb25zdCBuYW1lID0gbW9ub1JlcG8ubmFtZTtcblxuXHRjb25zdCBwa2cgPSBQYWNrYWdlSnNvbi5mcm9tRmlsZShqb2luKHRhcmdldERpciwgXCJwYWNrYWdlLmpzb25cIikpO1xuXHRtb25vUmVwby5hZGRNb2RlbChwa2cpO1xuXHRtb25vUmVwby5hZGRNb2RlbChcblx0XHRleGlzdHNTeW5jKGpvaW4odGFyZ2V0RGlyLCBcIi5lbnZcIikpXG5cdFx0XHQ/IEVudkZpbGUuZnJvbUZpbGUoam9pbih0YXJnZXREaXIsIFwiLmVudlwiKSlcblx0XHRcdDogbmV3IEVudkZpbGUoKSxcblx0KTtcblx0bW9ub1JlcG8uYWRkTW9kZWwoXG5cdFx0ZXhpc3RzU3luYyhqb2luKHRhcmdldERpciwgXCJjb25maWcvY29uZmlnLnlhbWxcIikpXG5cdFx0XHQ/IENvbmZpZ1lhbWwuZnJvbUZpbGUoXG5cdFx0XHRcdFx0V0VMTF9LTk9XTl9GSUxFUy5DT05GSUdfWUFNTCxcblx0XHRcdFx0XHRcImNvbmZpZy9jb25maWcueWFtbFwiLFxuXHRcdFx0XHRcdGpvaW4odGFyZ2V0RGlyLCBcImNvbmZpZy9jb25maWcueWFtbFwiKSxcblx0XHRcdFx0KVxuXHRcdFx0OiBuZXcgQ29uZmlnWWFtbChXRUxMX0tOT1dOX0ZJTEVTLkNPTkZJR19ZQU1MLCBcImNvbmZpZy9jb25maWcueWFtbFwiLCBcIlwiKSxcblx0KTtcblx0bW9ub1JlcG8uYWRkTW9kZWwoXG5cdFx0ZXhpc3RzU3luYyhqb2luKHRhcmdldERpciwgXCJjb25maWcvY29uZmlnLmRldi55YW1sXCIpKVxuXHRcdFx0PyBDb25maWdZYW1sLmZyb21GaWxlKFxuXHRcdFx0XHRcdFdFTExfS05PV05fRklMRVMuQ09ORklHX0RFVl9ZQU1MLFxuXHRcdFx0XHRcdFwiY29uZmlnL2NvbmZpZy5kZXYueWFtbFwiLFxuXHRcdFx0XHRcdGpvaW4odGFyZ2V0RGlyLCBcImNvbmZpZy9jb25maWcuZGV2LnlhbWxcIiksXG5cdFx0XHRcdClcblx0XHRcdDogbmV3IENvbmZpZ1lhbWwoV0VMTF9LTk9XTl9GSUxFUy5DT05GSUdfREVWX1lBTUwsIFwiY29uZmlnL2NvbmZpZy5kZXYueWFtbFwiLCBcIlwiKSxcblx0KTtcblxuXHRmb3IgKGNvbnN0IFtvZmZzZXQsIGFwaU5hbWVdIG9mIGFwaU5hbWVzLmVudHJpZXMoKSkge1xuXHRcdGNvbnN0IHBvcnQgPSB3ZWJhcGlQb3J0KGV4aXN0aW5nLmxlbmd0aCArIG9mZnNldCk7XG5cdFx0cGtnLmFkZFNjcmlwdChgc3RhcnQ6JHthcGlOYW1lfWAsIGBub2RlICR7d2ViYXBpUmVsZWFzZUVudHJ5KGFwaU5hbWUpfWApO1xuXHRcdHBrZy5hZGRTY3JpcHQoXG5cdFx0XHRgZGV2OiR7YXBpTmFtZX1gLFxuXHRcdFx0YFBPUlQ9JHtwb3J0fSBmbHV4IHNlcnZlIC0tcHJvamVjdCAke3dlYmFwaVBhY2thZ2VOYW1lKG5hbWUsIGFwaU5hbWUpfWAsXG5cdFx0KTtcblx0XHRhZGRBcGlQcm9qZWN0KG1vbm9SZXBvLCBuYW1lLCBhcGlOYW1lKTtcblx0fVxuXHRtb25vUmVwby5hZGRNb2RlbChuZXcgV2ViYXBpUHJvZHVjdGlvbkRvY2tlcmZpbGUoYXBpTmFtZXMsIHsgbmFtZWRPbmx5OiB0cnVlIH0pKTtcblxuXHRyZXR1cm4gbW9ub1JlcG87XG59XG5cbmZ1bmN0aW9uIGFkZEFwaVByb2plY3QoXG5cdG1vbm9SZXBvOiBNb25vUmVwb1NjYWZmb2xkLFxuXHR3b3Jrc3BhY2VOYW1lOiBzdHJpbmcsXG5cdGFwaU5hbWU6IHN0cmluZyxcbik6IHZvaWQge1xuXHRjb25zdCBhcGlQcm9qZWN0ID0gbmV3IFByb2plY3RTY2FmZm9sZCh3ZWJhcGlQcm9qZWN0RGlyKGFwaU5hbWUpKTtcblx0YXBpUHJvamVjdC5hZGRNb2RlbChuZXcgQXBpUGFja2FnZUpzb24od29ya3NwYWNlTmFtZSwgYXBpTmFtZSkpO1xuXHRhcGlQcm9qZWN0LmFkZE1vZGVsKG5ldyBNYWluU291cmNlRmlsZShgJHt3b3Jrc3BhY2VOYW1lfS4ke2FwaU5hbWV9YCkpO1xuXHRhcGlQcm9qZWN0LmFkZE1vZGVsKG5ldyBDb250cm9sbGVyU291cmNlRmlsZSgpKTtcblx0YXBpUHJvamVjdC5hZGRGaWxlKG5ldyBTYW1wbGVDb25maWdNb2RlbCgpKTtcblx0YXBpUHJvamVjdC5hZGRGaWxlKG5ldyBTYW1wbGVTZXJ2aWNlTW9kZWwoKSk7XG5cdG1vbm9SZXBvLmFkZFByb2plY3QoYXBpUHJvamVjdCk7XG59XG4iXSwibmFtZXMiOlsiV0VCQVBJX1BST0pFQ1RfRElSIiwiV0VCQVBJX1JFTEVBU0VfRU5UUlkiLCJzY2FmZm9sZEFwaSIsImZlYXR1cmVzIiwiRGF0YWJhc2VGZWF0dXJlIiwiQXV0aEZlYXR1cmUiLCJQb3N0bWFuRmVhdHVyZSIsIkZpbmFsaXplRmVhdHVyZSIsImNsaU9wdGlvbnMiLCJ0YXJnZXREaXIiLCJyZXNvbHZlIiwiZCIsInByb2plY3ROYW1lIiwidHJpbSIsInByb2Nlc3MiLCJlbnYiLCJERUNPSEVSRV9QUk9KRUNUX05BTUUiLCJiYXNlbmFtZSIsIm5hbWVzIiwicGFyc2VBcGlOYW1lcyIsIndvcmtzcGFjZSIsImFkZCIsImNyZWF0ZUFkZFdvcmtzcGFjZSIsImNyZWF0ZVdvcmtzcGFjZSIsIlNjYWZmb2xkU2VydmljZSIsInNjYWZmb2xkIiwiYXBpTmFtZXMiLCJtb25vUmVwbyIsIk1vbm9SZXBvU2NhZmZvbGQiLCJzZXROYW1lIiwibmFtZSIsImNvbXBvc2UiLCJEb2NrZXJDb21wb3NlIiwic2V0UHJvamVjdE5hbWUiLCJhZGRIZWFkZXJDb21tZW50IiwiYWRkTmV0d29yayIsImFkZFNlcnZpY2UiLCJidWlsZCIsInZvbHVtZXMiLCJjb21tYW5kSGlzdG9yeSIsInZvbHVtZU5hbWUiLCJkaXIiLCJlbnZfZmlsZSIsImVudmlyb25tZW50IiwiTlBNX0NPTkZJR19VU0VSQ09ORklHIiwiY29tbWFuZCIsIm5ldHdvcmtzIiwiYWRkVm9sdW1lIiwiaW5zdGFsbENtZCIsImRldkNvbnRhaW5lciIsIkRldkNvbnRhaW5lciIsImFkZEV4dGVuc2lvbiIsInNldEluaXRpYWxpemVDb21tYW5kIiwic2V0UG9zdENyZWF0ZUNvbW1hbmQiLCJzZXRVcGRhdGVDb250ZW50Q29tbWFuZCIsInNldFBvc3RTdGFydENvbW1hbmQiLCJ1c2VDb21wb3NlIiwiaW5kZXgiLCJhcGlOYW1lIiwiZW50cmllcyIsInBvcnQiLCJ3ZWJhcGlQb3J0IiwiZm9yd2FyZFBvcnQiLCJzZXRQb3J0QXR0cmlidXRlcyIsImxhYmVsIiwiREVGQVVMVF9XRUJBUElfTkFNRSIsInJlcXVpcmVMb2NhbFBvcnQiLCJhZGRNb2RlbCIsIldlYmFwaURldkNvbnRhaW5lciIsIldlYmFwaVByb2R1Y3Rpb25Eb2NrZXJmaWxlIiwiR2l0aHViQ2lXb3JrZmxvd3MiLCJWU0NvZGVTZXR0aW5ncyIsIkxhdW5jaEpzb24iLCJUc0NvbmZpZyIsIlZpdGVzdENvbmZpZyIsIlBhY2thZ2VKc29uIiwid29ya3NwYWNlTmFtZSIsIkNvbmZpZ1lhbWwiLCJXRUxMX0tOT1dOX0ZJTEVTIiwiQ09ORklHX1lBTUwiLCJDT05GSUdfREVWX1lBTUwiLCJHaXRpZ25vcmUiLCJFbnZGaWxlIiwiYWRkRmlsZSIsIkRldkNvbnRhaW5lckhvc3RTY3JpcHRzIiwiZmlsZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJKU09OIiwic3RyaW5naWZ5IiwiJHNjaGVtYSIsImluY2x1ZGVzIiwiYXNzaXN0IiwiYWN0aW9ucyIsInNvdXJjZSIsIm9yZ2FuaXplSW1wb3J0cyIsInZjcyIsImVuYWJsZWQiLCJjbGllbnRLaW5kIiwidXNlSWdub3JlRmlsZSIsImZvcm1hdHRlciIsImZvcm1hdFdpdGhFcnJvcnMiLCJpbmRlbnRTdHlsZSIsImxpbmVXaWR0aCIsImphdmFzY3JpcHQiLCJwYXJzZXIiLCJ1bnNhZmVQYXJhbWV0ZXJEZWNvcmF0b3JzRW5hYmxlZCIsImxpbnRlciIsInJ1bGVzIiwic3R5bGUiLCJ1c2VDb25zaXN0ZW50TWVtYmVyQWNjZXNzaWJpbGl0eSIsImxldmVsIiwib3B0aW9ucyIsImFjY2Vzc2liaWxpdHkiLCJvdmVycmlkZXMiLCJpbmRlbnRXaWR0aCIsImFkZEFwaVByb2plY3QiLCJpc0RlY29oZXJlV29ya3NwYWNlIiwiQ3JlYXRlQ2xpRXJyb3IiLCJleGlzdGluZyIsImxpc3RFeGlzdGluZ0FwaU5hbWVzIiwid2ViYXBpUHJvamVjdERpciIsInBrZyIsImZyb21GaWxlIiwiam9pbiIsImV4aXN0c1N5bmMiLCJvZmZzZXQiLCJsZW5ndGgiLCJhZGRTY3JpcHQiLCJ3ZWJhcGlSZWxlYXNlRW50cnkiLCJ3ZWJhcGlQYWNrYWdlTmFtZSIsIm5hbWVkT25seSIsImFwaVByb2plY3QiLCJQcm9qZWN0U2NhZmZvbGQiLCJBcGlQYWNrYWdlSnNvbiIsIk1haW5Tb3VyY2VGaWxlIiwiQ29udHJvbGxlclNvdXJjZUZpbGUiLCJTYW1wbGVDb25maWdNb2RlbCIsIlNhbXBsZVNlcnZpY2VNb2RlbCIsImFkZFByb2plY3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O1FBMENTQTtlQUFBQSwwQkFBa0I7O1FBQUVDO2VBQUFBLDRCQUFvQjs7UUFrQjNCQztlQUFBQTs7O3dCQTVESzswQkFDYTs4QkFDVjtpQ0FDSDt1QkFDTTttQ0FDSjtrQ0FDRTs4QkFDUDtnQ0FDRTtpQ0FDQztrQ0FDQzs4QkFDc0I7K0JBQ3pCO21DQUNJO3FDQUNFO2lDQUNDO3lCQU16Qjt3QkFPQTs2QkFDaUM7NkJBQ1o7aUNBQ0k7aUNBQ0E7Z0NBQ0Q7cUNBQ0E7MkNBQ007K0JBQ0g7cUNBQ0g7MkNBQ1k7a0NBQ1c7a0NBQ25CO0FBa0JuQyxNQUFNQyxXQUFXO0lBQUNDLGdDQUFlO0lBQUVDLHdCQUFXO0lBQUVDLDhCQUFjO0lBQUVDLGdDQUFlO0NBQUM7QUFFekUsZUFBZUwsWUFBWU0sVUFBc0I7SUFDdkQsTUFBTUMsWUFBWUMsSUFBQUEsaUJBQU8sRUFBQ0YsV0FBV0csQ0FBQyxJQUFJO0lBQzFDLE1BQU1DLGNBQ0xKLFdBQVdJLFdBQVcsRUFBRUMsVUFDeEJDLFFBQVFDLEdBQUcsQ0FBQ0MscUJBQXFCLEVBQUVILFVBQ25DSSxJQUFBQSxrQkFBUSxFQUFDUjtJQUNWLE1BQU1TLFFBQVFDLElBQUFBLHNCQUFhLEVBQUNYLFdBQVdVLEtBQUs7SUFDNUMsTUFBTUUsWUFBWVosV0FBV2EsR0FBRyxHQUM3QkMsbUJBQW1CYixXQUFXRyxhQUFhTSxTQUMzQ0ssZ0JBQWdCZCxXQUFXRyxhQUFhTTtJQUMzQyxNQUFNTSxnQ0FBZSxDQUFDQyxRQUFRLENBQUNMLFdB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
|