@decohere/scaffold 0.0.1-dev.18 → 0.0.1-dev.81

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.
Files changed (240) hide show
  1. package/commonjs/src/add-api.action.js +39 -0
  2. package/commonjs/src/add-api.command.js +41 -0
  3. package/commonjs/src/add.command.js +24 -0
  4. package/commonjs/src/add.module.js +26 -0
  5. package/commonjs/src/cli.js +9 -0
  6. package/commonjs/src/create.command.js +24 -0
  7. package/commonjs/src/create.module.js +26 -0
  8. package/commonjs/src/domain/prompt.js +64 -0
  9. package/commonjs/src/index.js +38 -0
  10. package/commonjs/src/models/compose.model.js +150 -0
  11. package/commonjs/src/models/config-yaml.model.js +88 -0
  12. package/commonjs/src/models/const.js +32 -0
  13. package/commonjs/src/models/dev-container.model.js +116 -0
  14. package/commonjs/src/models/docker-image.model.js +259 -0
  15. package/commonjs/src/models/env-file.model.js +50 -0
  16. package/commonjs/src/models/gitignore.model.js +43 -0
  17. package/commonjs/src/models/launch-json.model.js +74 -0
  18. package/commonjs/src/models/package-json.model.js +149 -0
  19. package/commonjs/src/models/project.model.js +134 -0
  20. package/commonjs/src/models/source-file.js +6 -0
  21. package/commonjs/src/models/tsconfig.model.js +34 -0
  22. package/commonjs/src/models/vitest-config.model.js +35 -0
  23. package/commonjs/src/models/vscode-settings.model.js +31 -0
  24. package/commonjs/src/program.js +57 -0
  25. package/commonjs/src/resolve-target-dir.js +19 -0
  26. package/commonjs/src/services/scaffold.service.js +62 -0
  27. package/commonjs/src/version.js +57 -0
  28. package/commonjs/src/webapi/api-name.js +95 -0
  29. package/commonjs/src/webapi/cli-options.js +101 -0
  30. package/commonjs/src/webapi/const.js +50 -0
  31. package/commonjs/src/webapi/create-api.js +237 -0
  32. package/commonjs/src/webapi/devcontainer/codebase-rag-mcp.js +166 -0
  33. package/commonjs/src/webapi/devcontainer/codebase-rag-mcp.ts +182 -0
  34. package/commonjs/src/webapi/devcontainer/host-scripts.js +52 -0
  35. package/commonjs/src/webapi/devcontainer/templates/codebase-rag.env.example +3 -0
  36. package/commonjs/src/webapi/devcontainer/templates/initialize.sh +169 -0
  37. package/commonjs/src/webapi/devcontainer/templates/post-create.sh +35 -0
  38. package/commonjs/src/webapi/devcontainer/templates/post-start.sh +65 -0
  39. package/commonjs/src/webapi/devcontainer/templates/tty-prompt.sh +38 -0
  40. package/commonjs/src/webapi/features/auth.feature.js +441 -0
  41. package/commonjs/src/webapi/features/auth0-cli.js +435 -0
  42. package/commonjs/src/webapi/features/biome-format.js +49 -0
  43. package/commonjs/src/webapi/features/database.feature.js +433 -0
  44. package/commonjs/src/webapi/features/finalize.feature.js +95 -0
  45. package/commonjs/src/webapi/features/postman.feature.js +324 -0
  46. package/commonjs/src/webapi/models/api-package-json.model.js +60 -0
  47. package/commonjs/src/webapi/models/auth-config.model.js +26 -0
  48. package/commonjs/src/webapi/models/controller-source-file.model.js +193 -0
  49. package/commonjs/src/webapi/models/github-ci.model.js +193 -0
  50. package/commonjs/src/webapi/models/main-source-file.model.js +167 -0
  51. package/commonjs/src/webapi/models/production-dockerfile.model.js +157 -0
  52. package/commonjs/src/webapi/models/sample-files.model.js +60 -0
  53. package/commonjs/src/webapi/models/webapi-image.model.js +27 -0
  54. package/commonjs/src/webapi/postman/hello-openapi.js +175 -0
  55. package/commonjs/src/webapi/postman/local-view.js +184 -0
  56. package/commonjs/src/webapi/postman/openapi-to-postman.js +202 -0
  57. package/commonjs/src/webapi/workspace-readme.js +110 -0
  58. package/commonjs/src/webapi.action.js +30 -0
  59. package/commonjs/src/webapi.command.js +45 -0
  60. package/es6/src/add-api.action.js +29 -0
  61. package/es6/src/add-api.command.js +31 -0
  62. package/es6/src/add.command.js +14 -0
  63. package/es6/src/add.module.js +16 -0
  64. package/es6/src/cli.js +5 -0
  65. package/es6/src/create.command.js +14 -0
  66. package/es6/src/create.module.js +16 -0
  67. package/es6/src/domain/prompt.js +43 -0
  68. package/es6/src/index.js +8 -0
  69. package/es6/src/models/compose.model.js +144 -0
  70. package/es6/src/models/config-yaml.model.js +76 -0
  71. package/es6/src/models/const.js +22 -0
  72. package/es6/src/models/dev-container.model.js +106 -0
  73. package/es6/src/models/docker-image.model.js +217 -0
  74. package/es6/src/models/env-file.model.js +46 -0
  75. package/es6/src/models/gitignore.model.js +33 -0
  76. package/es6/src/models/launch-json.model.js +64 -0
  77. package/es6/src/models/package-json.model.js +137 -0
  78. package/es6/src/models/project.model.js +119 -0
  79. package/es6/src/models/source-file.js +3 -0
  80. package/es6/src/models/tsconfig.model.js +24 -0
  81. package/es6/src/models/vitest-config.model.js +25 -0
  82. package/es6/src/models/vscode-settings.model.js +21 -0
  83. package/es6/src/program.js +39 -0
  84. package/es6/src/resolve-target-dir.js +9 -0
  85. package/es6/src/services/scaffold.service.js +52 -0
  86. package/es6/src/version.js +36 -0
  87. package/es6/src/webapi/api-name.js +59 -0
  88. package/es6/src/webapi/cli-options.js +36 -0
  89. package/es6/src/webapi/const.js +20 -0
  90. package/es6/src/webapi/create-api.js +217 -0
  91. package/es6/src/webapi/devcontainer/codebase-rag-mcp.js +156 -0
  92. package/es6/src/webapi/devcontainer/codebase-rag-mcp.ts +182 -0
  93. package/es6/src/webapi/devcontainer/host-scripts.js +31 -0
  94. package/es6/src/webapi/devcontainer/templates/codebase-rag.env.example +3 -0
  95. package/es6/src/webapi/devcontainer/templates/initialize.sh +169 -0
  96. package/es6/src/webapi/devcontainer/templates/post-create.sh +35 -0
  97. package/es6/src/webapi/devcontainer/templates/post-start.sh +65 -0
  98. package/es6/src/webapi/devcontainer/templates/tty-prompt.sh +38 -0
  99. package/es6/src/webapi/features/auth.feature.js +390 -0
  100. package/es6/src/webapi/features/auth0-cli.js +375 -0
  101. package/es6/src/webapi/features/biome-format.js +42 -0
  102. package/es6/src/webapi/features/database.feature.js +423 -0
  103. package/es6/src/webapi/features/finalize.feature.js +85 -0
  104. package/es6/src/webapi/features/postman.feature.js +258 -0
  105. package/es6/src/webapi/models/api-package-json.model.js +55 -0
  106. package/es6/src/webapi/models/auth-config.model.js +22 -0
  107. package/es6/src/webapi/models/controller-source-file.model.js +184 -0
  108. package/es6/src/webapi/models/github-ci.model.js +186 -0
  109. package/es6/src/webapi/models/main-source-file.model.js +163 -0
  110. package/es6/src/webapi/models/production-dockerfile.model.js +148 -0
  111. package/es6/src/webapi/models/sample-files.model.js +42 -0
  112. package/es6/src/webapi/models/webapi-image.model.js +20 -0
  113. package/es6/src/webapi/postman/hello-openapi.js +168 -0
  114. package/es6/src/webapi/postman/local-view.js +169 -0
  115. package/es6/src/webapi/postman/openapi-to-postman.js +179 -0
  116. package/es6/src/webapi/workspace-readme.js +89 -0
  117. package/es6/src/webapi.action.js +20 -0
  118. package/es6/src/webapi.command.js +35 -0
  119. package/package.json +8 -8
  120. package/types/src/add-api.action.d.ts +13 -0
  121. package/types/src/add-api.command.d.ts +7 -0
  122. package/types/src/add.command.d.ts +6 -0
  123. package/types/src/add.module.d.ts +14 -0
  124. package/types/src/cli.d.ts +2 -0
  125. package/types/src/create.command.d.ts +6 -0
  126. package/types/src/create.module.d.ts +14 -0
  127. package/types/src/domain/prompt.d.ts +4 -0
  128. package/types/src/models/compose.model.d.ts +64 -0
  129. package/types/src/models/config-yaml.model.d.ts +27 -0
  130. package/types/src/models/const.d.ts +20 -0
  131. package/types/src/models/dev-container.model.d.ts +37 -0
  132. package/types/src/models/docker-image.model.d.ts +84 -0
  133. package/types/src/models/env-file.model.d.ts +16 -0
  134. package/types/src/models/gitignore.model.d.ts +7 -0
  135. package/types/src/models/launch-json.model.d.ts +7 -0
  136. package/types/src/models/package-json.model.d.ts +35 -0
  137. package/types/src/models/project.model.d.ts +60 -0
  138. package/{src/models/source-file.ts → types/src/models/source-file.d.ts} +4 -6
  139. package/types/src/models/tsconfig.model.d.ts +5 -0
  140. package/types/src/models/vitest-config.model.d.ts +5 -0
  141. package/types/src/models/vscode-settings.model.d.ts +7 -0
  142. package/types/src/program.d.ts +3 -0
  143. package/{src/resolve-target-dir.ts → types/src/resolve-target-dir.d.ts} +1 -4
  144. package/types/src/services/scaffold.service.d.ts +22 -0
  145. package/types/src/version.d.ts +6 -0
  146. package/types/src/webapi/api-name.d.ts +14 -0
  147. package/types/src/webapi/cli-options.d.ts +6 -0
  148. package/{src/webapi/const.ts → types/src/webapi/const.d.ts} +7 -21
  149. package/types/src/webapi/create-api.d.ts +15 -0
  150. package/types/src/webapi/devcontainer/codebase-rag-mcp.d.ts +32 -0
  151. package/types/src/webapi/devcontainer/codebase-rag-mcp.ts +182 -0
  152. package/types/src/webapi/devcontainer/host-scripts.d.ts +7 -0
  153. package/types/src/webapi/devcontainer/templates/codebase-rag.env.example +3 -0
  154. package/types/src/webapi/devcontainer/templates/initialize.sh +169 -0
  155. package/types/src/webapi/devcontainer/templates/post-create.sh +35 -0
  156. package/types/src/webapi/devcontainer/templates/post-start.sh +65 -0
  157. package/types/src/webapi/devcontainer/templates/tty-prompt.sh +38 -0
  158. package/types/src/webapi/features/auth.feature.d.ts +10 -0
  159. package/types/src/webapi/features/auth0-cli.d.ts +80 -0
  160. package/types/src/webapi/features/biome-format.d.ts +5 -0
  161. package/types/src/webapi/features/database.feature.d.ts +7 -0
  162. package/types/src/webapi/features/finalize.feature.d.ts +2 -0
  163. package/types/src/webapi/features/postman.feature.d.ts +16 -0
  164. package/types/src/webapi/models/api-package-json.model.d.ts +18 -0
  165. package/types/src/webapi/models/auth-config.model.d.ts +26 -0
  166. package/types/src/webapi/models/controller-source-file.model.d.ts +46 -0
  167. package/types/src/webapi/models/github-ci.model.d.ts +9 -0
  168. package/types/src/webapi/models/main-source-file.model.d.ts +54 -0
  169. package/types/src/webapi/models/production-dockerfile.model.d.ts +23 -0
  170. package/types/src/webapi/models/sample-files.model.d.ts +7 -0
  171. package/types/src/webapi/models/webapi-image.model.d.ts +12 -0
  172. package/types/src/webapi/postman/hello-openapi.d.ts +19 -0
  173. package/types/src/webapi/postman/local-view.d.ts +17 -0
  174. package/types/src/webapi/postman/openapi-to-postman.d.ts +62 -0
  175. package/types/src/webapi/workspace-readme.d.ts +18 -0
  176. package/types/src/webapi.action.d.ts +14 -0
  177. package/types/src/webapi.command.d.ts +11 -0
  178. package/src/add-api.action.ts +0 -25
  179. package/src/add-api.command.ts +0 -31
  180. package/src/add.command.ts +0 -20
  181. package/src/add.module.ts +0 -11
  182. package/src/cli.ts +0 -4
  183. package/src/create.command.ts +0 -20
  184. package/src/create.module.ts +0 -11
  185. package/src/domain/prompt.ts +0 -50
  186. package/src/models/compose.model.ts +0 -205
  187. package/src/models/config-yaml.model.ts +0 -83
  188. package/src/models/const.ts +0 -20
  189. package/src/models/dev-container.model.ts +0 -136
  190. package/src/models/docker-image.model.ts +0 -343
  191. package/src/models/env-file.model.ts +0 -45
  192. package/src/models/gitignore.model.ts +0 -35
  193. package/src/models/launch-json.model.ts +0 -60
  194. package/src/models/package-json.model.ts +0 -169
  195. package/src/models/project.model.ts +0 -141
  196. package/src/models/tsconfig.model.ts +0 -29
  197. package/src/models/vitest-config.model.ts +0 -26
  198. package/src/models/vscode-settings.model.ts +0 -24
  199. package/src/program.ts +0 -63
  200. package/src/services/scaffold.service.ts +0 -89
  201. package/src/version.ts +0 -56
  202. package/src/webapi/api-name.ts +0 -73
  203. package/src/webapi/cli-options.ts +0 -56
  204. package/src/webapi/create-api.ts +0 -275
  205. package/src/webapi/devcontainer/host-scripts.ts +0 -35
  206. package/src/webapi/features/auth.feature.ts +0 -454
  207. package/src/webapi/features/auth0-cli.ts +0 -421
  208. package/src/webapi/features/biome-format.ts +0 -34
  209. package/src/webapi/features/database.feature.ts +0 -522
  210. package/src/webapi/features/finalize.feature.ts +0 -112
  211. package/src/webapi/features/postman.feature.ts +0 -287
  212. package/src/webapi/models/api-package-json.model.ts +0 -60
  213. package/src/webapi/models/auth-config.model.ts +0 -36
  214. package/src/webapi/models/controller-source-file.model.ts +0 -232
  215. package/src/webapi/models/github-ci.model.ts +0 -188
  216. package/src/webapi/models/main-source-file.model.ts +0 -208
  217. package/src/webapi/models/production-dockerfile.model.ts +0 -162
  218. package/src/webapi/models/sample-files.model.ts +0 -45
  219. package/src/webapi/models/webapi-image.model.ts +0 -21
  220. package/src/webapi/postman/hello-openapi.ts +0 -92
  221. package/src/webapi/postman/local-view.ts +0 -195
  222. package/src/webapi/postman/openapi-to-postman.ts +0 -208
  223. package/src/webapi/workspace-readme.ts +0 -192
  224. package/src/webapi.action.ts +0 -22
  225. package/src/webapi.command.ts +0 -41
  226. package/tests/auth-postman.wiring.spec.ts +0 -263
  227. package/tests/auth0-cli.spec.ts +0 -232
  228. package/tests/biome-format.spec.ts +0 -49
  229. package/tests/cli.integration.spec.ts +0 -658
  230. package/tests/compose.model.spec.ts +0 -51
  231. package/tests/container-image.model.spec.ts +0 -162
  232. package/tests/dev-container.model.spec.ts +0 -29
  233. package/tests/devcontainer-base-image.spec.ts +0 -32
  234. package/tests/hello-di-inject.scaffold.spec.ts +0 -18
  235. package/tests/hello-route.contract.spec.ts +0 -94
  236. package/tests/package-json.order.spec.ts +0 -59
  237. package/tests/postman-from-openapi.spec.ts +0 -197
  238. package/tests/seed-devcontainer-templates.ts +0 -40
  239. package/tests/webapi/devcontainer/codebase-rag-mcp.spec.ts +0 -96
  240. /package/{src/index.ts → types/src/index.d.ts} +0 -0
@@ -0,0 +1,149 @@
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 PackageJson () {
13
+ return PackageJson;
14
+ },
15
+ get sortStringMap () {
16
+ return sortStringMap;
17
+ }
18
+ });
19
+ const _nodefs = require("node:fs");
20
+ const _version = require("../version.js");
21
+ const _const = require("../webapi/const.js");
22
+ const _const1 = require("./const.js");
23
+ class PackageJson {
24
+ name;
25
+ key = _const1.WELL_KNOWN_FILES.PACKAGE_JSON;
26
+ _dependencies;
27
+ _devDependencies;
28
+ _scripts;
29
+ _version = "0.0.1";
30
+ _type = "module";
31
+ _rest = {};
32
+ constructor(name, options){
33
+ this.name = name;
34
+ const apiNames = options?.apiNames ?? [
35
+ _const.DEFAULT_WEBAPI_NAME
36
+ ];
37
+ const first = apiNames[0] ?? _const.DEFAULT_WEBAPI_NAME;
38
+ const startEntry = options?.startEntry ?? (0, _const.webapiReleaseEntry)(first);
39
+ const workspaceName = options?.workspaceName ?? stripApiSuffix(name);
40
+ const namedOrMany = apiNames.length > 1 || first !== _const.DEFAULT_WEBAPI_NAME;
41
+ this._scripts = {
42
+ build: "forge build --configuration release",
43
+ "build:watch": "forge build --watch",
44
+ start: `node ${startEntry}`,
45
+ dev: namedOrMany ? fluxDevScript(workspaceName, first, (0, _const.webapiPort)(0)) : "flux serve",
46
+ "lint:check": "biome check .",
47
+ typecheck: "forge typecheck",
48
+ test: "vitest run --passWithNoTests"
49
+ };
50
+ for (const [index, apiName] of apiNames.entries()){
51
+ this._scripts[`start:${apiName}`] = `node ${(0, _const.webapiReleaseEntry)(apiName)}`;
52
+ this._scripts[`dev:${apiName}`] = fluxDevScript(workspaceName, apiName, (0, _const.webapiPort)(index));
53
+ }
54
+ this._dependencies = {
55
+ "@decohere/cortex": _version.CREATE_VERSION,
56
+ "@decohere/crucible": _version.CREATE_VERSION,
57
+ "@decohere/nexus": _version.CREATE_VERSION,
58
+ "@decohere/protocol": _version.CREATE_VERSION,
59
+ "@decohere/scribe": _version.CREATE_VERSION,
60
+ "@decohere/scribe-pino": _version.CREATE_VERSION,
61
+ "pino-pretty": "^13.0.0",
62
+ "pino-roll": "^4.0.0"
63
+ };
64
+ this._devDependencies = {
65
+ "@decohere/forge": _version.CREATE_VERSION,
66
+ "@decohere/cli": _version.CREATE_VERSION,
67
+ typescript: "^6.0.3",
68
+ "@biomejs/biome": "^2.0.0",
69
+ vitest: "^3.2.4"
70
+ };
71
+ }
72
+ /** Load an existing root package.json so `webapi add` can merge scripts/deps. */ static fromFile(filePath) {
73
+ const raw = JSON.parse((0, _nodefs.readFileSync)(filePath, "utf8"));
74
+ const pkg = new PackageJson(typeof raw.name === "string" ? raw.name : "app", {
75
+ apiNames: []
76
+ });
77
+ pkg._version = typeof raw.version === "string" ? raw.version : "0.0.1";
78
+ pkg._type = typeof raw.type === "string" ? raw.type : "module";
79
+ pkg._scripts = {
80
+ ...asStringMap(raw.scripts)
81
+ };
82
+ pkg._dependencies = {
83
+ ...asStringMap(raw.dependencies)
84
+ };
85
+ pkg._devDependencies = {
86
+ ...asStringMap(raw.devDependencies)
87
+ };
88
+ const reserved = new Set([
89
+ "name",
90
+ "version",
91
+ "type",
92
+ "scripts",
93
+ "dependencies",
94
+ "devDependencies"
95
+ ]);
96
+ pkg._rest = Object.fromEntries(Object.entries(raw).filter(([key])=>!reserved.has(key)));
97
+ return pkg;
98
+ }
99
+ addDependency(name, version) {
100
+ this._dependencies[name] = version;
101
+ return this;
102
+ }
103
+ addDevDependency(name, version) {
104
+ this._devDependencies[name] = version;
105
+ return this;
106
+ }
107
+ addScript(name, command) {
108
+ this._scripts[name] = command;
109
+ return this;
110
+ }
111
+ hasScript(name) {
112
+ return typeof this._scripts[name] === "string";
113
+ }
114
+ files() {
115
+ return [
116
+ {
117
+ filePath: "package.json",
118
+ content: JSON.stringify({
119
+ name: this.name,
120
+ version: this._version,
121
+ type: this._type,
122
+ ...this._rest,
123
+ scripts: this._scripts,
124
+ dependencies: sortStringMap(this._dependencies),
125
+ devDependencies: sortStringMap(this._devDependencies)
126
+ }, null, 2)
127
+ }
128
+ ];
129
+ }
130
+ }
131
+ function stripApiSuffix(name) {
132
+ return name.endsWith(".api") ? name.slice(0, -".api".length) : name;
133
+ }
134
+ function asStringMap(value) {
135
+ if (value == null || typeof value !== "object") return {};
136
+ const result = {};
137
+ for (const [key, entry] of Object.entries(value)){
138
+ if (typeof entry === "string") result[key] = entry;
139
+ }
140
+ return result;
141
+ }
142
+ function sortStringMap(map) {
143
+ return Object.fromEntries(Object.entries(map).sort(([left], [right])=>left.localeCompare(right, "en")));
144
+ }
145
+ function fluxDevScript(workspaceName, apiName, port) {
146
+ return `PORT=${port} flux serve --project ${(0, _const.webapiPackageName)(workspaceName, apiName)}`;
147
+ }
148
+
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy9tb2RlbHMvcGFja2FnZS1qc29uLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBDUkVBVEVfVkVSU0lPTiB9IGZyb20gXCIuLi92ZXJzaW9uLmpzXCI7XG5pbXBvcnQge1xuXHRERUZBVUxUX1dFQkFQSV9OQU1FLFxuXHR3ZWJhcGlQYWNrYWdlTmFtZSxcblx0d2ViYXBpUG9ydCxcblx0d2ViYXBpUmVsZWFzZUVudHJ5LFxufSBmcm9tIFwiLi4vd2ViYXBpL2NvbnN0LmpzXCI7XG5pbXBvcnQgeyBXRUxMX0tOT1dOX0ZJTEVTIH0gZnJvbSBcIi4vY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgS2V5ZWRNb2RlbCwgU291cmNlRmlsZSB9IGZyb20gXCIuL3NvdXJjZS1maWxlLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFBhY2thZ2VKc29uT3B0aW9ucyA9IHtcblx0c3RhcnRFbnRyeT86IHN0cmluZztcblx0LyoqIEFQSSBzbHVncyBpbiB0aGlzIHdvcmtzcGFjZS4gRHJpdmVzIGBzdGFydDo8bmFtZT5gIC8gYGRldjo8bmFtZT5gLiAqL1xuXHRhcGlOYW1lcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHQvKiogSG9zdCB3b3Jrc3BhY2UgbmFtZSB1c2VkIGluIGBAPHdvcmtzcGFjZT4vPGFwaT5gIGZvciBmbHV4IGAtLXByb2plY3RgLiAqL1xuXHR3b3Jrc3BhY2VOYW1lPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBCdWlsZGVyIGZvciB0aGUgcm9vdCBgcGFja2FnZS5qc29uYC5cbiAqXG4gKiBTdGFydHMgd2l0aCB0aGUgY29yZSBBUEkgZGVwZW5kZW5jaWVzLiBGZWF0dXJlcyBjYWxsIGBhZGREZXBlbmRlbmN5YCAvXG4gKiBgYWRkRGV2RGVwZW5kZW5jeWAgZHVyaW5nIHRoZWlyIHNjYWZmb2xkIHBoYXNlIHRvIGluamVjdCB0aGVpciBvd24gZGVwc1xuICogYmVmb3JlIGBmaWxlcygpYCBpcyBjYWxsZWQgYXQgcmVuZGVyIHRpbWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWNrYWdlSnNvbiBpbXBsZW1lbnRzIEtleWVkTW9kZWwge1xuXHRwdWJsaWMgcmVhZG9ubHkga2V5ID0gV0VMTF9LTk9XTl9GSUxFUy5QQUNLQUdFX0pTT047XG5cblx0cHJpdmF0ZSBfZGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXHRwcml2YXRlIF9kZXZEZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdHByaXZhdGUgX3NjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdHByaXZhdGUgX3ZlcnNpb24gPSBcIjAuMC4xXCI7XG5cdHByaXZhdGUgX3R5cGUgPSBcIm1vZHVsZVwiO1xuXHRwcml2YXRlIF9yZXN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihcblx0XHRwcml2YXRlIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcblx0XHRvcHRpb25zPzogUGFja2FnZUpzb25PcHRpb25zLFxuXHQpIHtcblx0XHRjb25zdCBhcGlOYW1lcyA9IG9wdGlvbnM/LmFwaU5hbWVzID8/IFtERUZBVUxUX1dFQkFQSV9OQU1FXTtcblx0XHRjb25zdCBmaXJzdCA9IGFwaU5hbWVzWzBdID8/IERFRkFVTFRfV0VCQVBJX05BTUU7XG5cdFx0Y29uc3Qgc3RhcnRFbnRyeSA9IG9wdGlvbnM/LnN0YXJ0RW50cnkgPz8gd2ViYXBpUmVsZWFzZUVudHJ5KGZpcnN0KTtcblx0XHRjb25zdCB3b3Jrc3BhY2VOYW1lID0gb3B0aW9ucz8ud29ya3NwYWNlTmFtZSA/PyBzdHJpcEFwaVN1ZmZpeChuYW1lKTtcblx0XHRjb25zdCBuYW1lZE9yTWFueSA9IGFwaU5hbWVzLmxlbmd0aCA+IDEgfHwgZmlyc3QgIT09IERFRkFVTFRfV0VCQVBJX05BTUU7XG5cblx0XHR0aGlzLl9zY3JpcHRzID0ge1xuXHRcdFx0YnVpbGQ6IFwiZm9yZ2UgYnVpbGQgLS1jb25maWd1cmF0aW9uIHJlbGVhc2VcIixcblx0XHRcdFwiYnVpbGQ6d2F0Y2hcIjogXCJmb3JnZSBidWlsZCAtLXdhdGNoXCIsXG5cdFx0XHRzdGFydDogYG5vZGUgJHtzdGFydEVudHJ5fWAsXG5cdFx0XHRkZXY6IG5hbWVkT3JNYW55ID8gZmx1eERldlNjcmlwdCh3b3Jrc3BhY2VOYW1lLCBmaXJzdCwgd2ViYXBpUG9ydCgwKSkgOiBcImZsdXggc2VydmVcIixcblx0XHRcdFwibGludDpjaGVja1wiOiBcImJpb21lIGNoZWNrIC5cIixcblx0XHRcdHR5cGVjaGVjazogXCJmb3JnZSB0eXBlY2hlY2tcIixcblx0XHRcdHRlc3Q6IFwidml0ZXN0IHJ1biAtLXBhc3NXaXRoTm9UZXN0c1wiLFxuXHRcdH07XG5cdFx0Zm9yIChjb25zdCBbaW5kZXgsIGFwaU5hbWVdIG9mIGFwaU5hbWVzLmVudHJpZXMoKSkge1xuXHRcdFx0dGhpcy5fc2NyaXB0c1tgc3RhcnQ6JHthcGlOYW1lfWBdID0gYG5vZGUgJHt3ZWJhcGlSZWxlYXNlRW50cnkoYXBpTmFtZSl9YDtcblx0XHRcdHRoaXMuX3NjcmlwdHNbYGRldjoke2FwaU5hbWV9YF0gPSBmbHV4RGV2U2NyaXB0KFxuXHRcdFx0XHR3b3Jrc3BhY2VOYW1lLFxuXHRcdFx0XHRhcGlOYW1lLFxuXHRcdFx0XHR3ZWJhcGlQb3J0KGluZGV4KSxcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHRoaXMuX2RlcGVuZGVuY2llcyA9IHtcblx0XHRcdFwiQGRlY29oZXJlL2NvcnRleFwiOiBDUkVBVEVfVkVSU0lPTixcblx0XHRcdFwiQGRlY29oZXJlL2NydWNpYmxlXCI6IENSRUFURV9WRVJTSU9OLFxuXHRcdFx0XCJAZGVjb2hlcmUvbmV4dXNcIjogQ1JFQVRFX1ZFUlNJT04sXG5cdFx0XHRcIkBkZWNvaGVyZS9wcm90b2NvbFwiOiBDUkVBVEVfVkVSU0lPTixcblx0XHRcdFwiQGRlY29oZXJlL3NjcmliZVwiOiBDUkVBVEVfVkVSU0lPTixcblx0XHRcdFwiQGRlY29oZXJlL3NjcmliZS1waW5vXCI6IENSRUFURV9WRVJTSU9OLFxuXHRcdFx0XCJwaW5vLXByZXR0eVwiOiBcIl4xMy4wLjBcIixcblx0XHRcdFwicGluby1yb2xsXCI6IFwiXjQuMC4wXCIsXG5cdFx0fTtcblx0XHR0aGlzLl9kZXZEZXBlbmRlbmNpZXMgPSB7XG5cdFx0XHRcIkBkZWNvaGVyZS9mb3JnZVwiOiBDUkVBVEVfVkVSU0lPTixcblx0XHRcdFwiQGRlY29oZXJlL2NsaVwiOiBDUkVBVEVfVkVSU0lPTixcblx0XHRcdHR5cGVzY3JpcHQ6IFwiXjYuMC4zXCIsXG5cdFx0XHRcIkBiaW9tZWpzL2Jpb21lXCI6IFwiXjIuMC4wXCIsXG5cdFx0XHR2aXRlc3Q6IFwiXjMuMi40XCIsXG5cdFx0fTtcblx0fVxuXG5cdC8qKiBMb2FkIGFuIGV4aXN0aW5nIHJvb3QgcGFja2FnZS5qc29uIHNvIGB3ZWJhcGkgYWRkYCBjYW4gbWVyZ2Ugc2NyaXB0cy9kZXBzLiAqL1xuXHRwdWJsaWMgc3RhdGljIGZyb21GaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQYWNrYWdlSnNvbiB7XG5cdFx0Y29uc3QgcmF3ID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmOFwiKSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0Y29uc3QgcGtnID0gbmV3IFBhY2thZ2VKc29uKHR5cGVvZiByYXcubmFtZSA9PT0gXCJzdHJpbmdcIiA/IHJhdy5uYW1lIDogXCJhcHBcIiwge1xuXHRcdFx0YXBpTmFtZXM6IFtdLFxuXHRcdH0pO1xuXHRcdHBrZy5fdmVyc2lvbiA9IHR5cGVvZiByYXcudmVyc2lvbiA9PT0gXCJzdHJpbmdcIiA/IHJhdy52ZXJzaW9uIDogXCIwLjAuMVwiO1xuXHRcdHBrZy5fdHlwZSA9IHR5cGVvZiByYXcudHlwZSA9PT0gXCJzdHJpbmdcIiA/IHJhdy50eXBlIDogXCJtb2R1bGVcIjtcblx0XHRwa2cuX3NjcmlwdHMgPSB7IC4uLmFzU3RyaW5nTWFwKHJhdy5zY3JpcHRzKSB9O1xuXHRcdHBrZy5fZGVwZW5kZW5jaWVzID0geyAuLi5hc1N0cmluZ01hcChyYXcuZGVwZW5kZW5jaWVzKSB9O1xuXHRcdHBrZy5fZGV2RGVwZW5kZW5jaWVzID0geyAuLi5hc1N0cmluZ01hcChyYXcuZGV2RGVwZW5kZW5jaWVzKSB9O1xuXHRcdGNvbnN0IHJlc2VydmVkID0gbmV3IFNldChbXG5cdFx0XHRcIm5hbWVcIixcblx0XHRcdFwidmVyc2lvblwiLFxuXHRcdFx0XCJ0eXBlXCIsXG5cdFx0XHRcInNjcmlwdHNcIixcblx0XHRcdFwiZGVwZW5kZW5jaWVzXCIsXG5cdFx0XHRcImRldkRlcGVuZGVuY2llc1wiLFxuXHRcdF0pO1xuXHRcdHBrZy5fcmVzdCA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhyYXcpLmZpbHRlcigoW2tleV0pID0+ICFyZXNlcnZlZC5oYXMoa2V5KSkpO1xuXHRcdHJldHVybiBwa2c7XG5cdH1cblxuXHRwdWJsaWMgYWRkRGVwZW5kZW5jeShuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2RlcGVuZGVuY2llc1tuYW1lXSA9IHZlcnNpb247XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgYWRkRGV2RGVwZW5kZW5jeShuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2RldkRlcGVuZGVuY2llc1tuYW1lXSA9IHZlcnNpb247XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgYWRkU2NyaXB0KG5hbWU6IHN0cmluZywgY29tbWFuZDogc3RyaW5nKTogdGhpcyB7XG5cdFx0dGhpcy5fc2NyaXB0c1tuYW1lXSA9IGNvbW1hbmQ7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgaGFzU2NyaXB0KG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0eXBlb2YgdGhpcy5fc2NyaXB0c1tuYW1lXSA9PT0gXCJzdHJpbmdcIjtcblx0fVxuXG5cdHB1YmxpYyBmaWxlcygpOiBTb3VyY2VGaWxlW10ge1xuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcInBhY2thZ2UuanNvblwiLFxuXHRcdFx0XHRjb250ZW50OiBKU09OLnN0cmluZ2lmeShcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiB0aGlzLm5hbWUsXG5cdFx0XHRcdFx0XHR2ZXJzaW9uOiB0aGlzLl92ZXJzaW9uLFxuXHRcdFx0XHRcdFx0dHlwZTogdGhpcy5fdHlwZSxcblx0XHRcdFx0XHRcdC4uLnRoaXMuX3Jlc3QsXG5cdFx0XHRcdFx0XHRzY3JpcHRzOiB0aGlzLl9zY3JpcHRzLFxuXHRcdFx0XHRcdFx0ZGVwZW5kZW5jaWVzOiBzb3J0U3RyaW5nTWFwKHRoaXMuX2RlcGVuZGVuY2llcyksXG5cdFx0XHRcdFx0XHRkZXZEZXBlbmRlbmNpZXM6IHNvcnRTdHJpbmdNYXAodGhpcy5fZGV2RGVwZW5kZW5jaWVzKSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0Mixcblx0XHRcdFx0KSxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuXG5mdW5jdGlvbiBzdHJpcEFwaVN1ZmZpeChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gbmFtZS5lbmRzV2l0aChcIi5hcGlcIikgPyBuYW1lLnNsaWNlKDAsIC1cIi5hcGlcIi5sZW5ndGgpIDogbmFtZTtcbn1cblxuZnVuY3Rpb24gYXNTdHJpbmdNYXAodmFsdWU6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcblx0aWYgKHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4ge307XG5cdGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXHRmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcblx0XHRpZiAodHlwZW9mIGVudHJ5ID09PSBcInN0cmluZ1wiKSByZXN1bHRba2V5XSA9IGVudHJ5O1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBTdGFibGUgQeKGkloga2V5IG9yZGVyIGZvciBwYWNrYWdlLmpzb24gZGVwZW5kZW5jeSBtYXBzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRTdHJpbmdNYXAobWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG5cdHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG5cdFx0T2JqZWN0LmVudHJpZXMobWFwKS5zb3J0KChbbGVmdF0sIFtyaWdodF0pID0+IGxlZnQubG9jYWxlQ29tcGFyZShyaWdodCwgXCJlblwiKSksXG5cdCk7XG59XG5cbmZ1bmN0aW9uIGZsdXhEZXZTY3JpcHQod29ya3NwYWNlTmFtZTogc3RyaW5nLCBhcGlOYW1lOiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG5cdHJldHVybiBgUE9SVD0ke3BvcnR9IGZsdXggc2VydmUgLS1wcm9qZWN0ICR7d2ViYXBpUGFja2FnZU5hbWUod29ya3NwYWNlTmFtZSwgYXBpTmFtZSl9YDtcbn1cbiJdLCJuYW1lcyI6WyJQYWNrYWdlSnNvbiIsInNvcnRTdHJpbmdNYXAiLCJrZXkiLCJXRUxMX0tOT1dOX0ZJTEVTIiwiUEFDS0FHRV9KU09OIiwiX2RlcGVuZGVuY2llcyIsIl9kZXZEZXBlbmRlbmNpZXMiLCJfc2NyaXB0cyIsIl92ZXJzaW9uIiwiX3R5cGUiLCJfcmVzdCIsIm5hbWUiLCJvcHRpb25zIiwiYXBpTmFtZXMiLCJERUZBVUxUX1dFQkFQSV9OQU1FIiwiZmlyc3QiLCJzdGFydEVudHJ5Iiwid2ViYXBpUmVsZWFzZUVudHJ5Iiwid29ya3NwYWNlTmFtZSIsInN0cmlwQXBpU3VmZml4IiwibmFtZWRPck1hbnkiLCJsZW5ndGgiLCJidWlsZCIsInN0YXJ0IiwiZGV2IiwiZmx1eERldlNjcmlwdCIsIndlYmFwaVBvcnQiLCJ0eXBlY2hlY2siLCJ0ZXN0IiwiaW5kZXgiLCJhcGlOYW1lIiwiZW50cmllcyIsIkNSRUFURV9WRVJTSU9OIiwidHlwZXNjcmlwdCIsInZpdGVzdCIsImZyb21GaWxlIiwiZmlsZVBhdGgiLCJyYXciLCJKU09OIiwicGFyc2UiLCJyZWFkRmlsZVN5bmMiLCJwa2ciLCJ2ZXJzaW9uIiwidHlwZSIsImFzU3RyaW5nTWFwIiwic2NyaXB0cyIsImRlcGVuZGVuY2llcyIsImRldkRlcGVuZGVuY2llcyIsInJlc2VydmVkIiwiU2V0IiwiT2JqZWN0IiwiZnJvbUVudHJpZXMiLCJmaWx0ZXIiLCJoYXMiLCJhZGREZXBlbmRlbmN5IiwiYWRkRGV2RGVwZW5kZW5jeSIsImFkZFNjcmlwdCIsImNvbW1hbmQiLCJoYXNTY3JpcHQiLCJmaWxlcyIsImNvbnRlbnQiLCJzdHJpbmdpZnkiLCJlbmRzV2l0aCIsInNsaWNlIiwidmFsdWUiLCJyZXN1bHQiLCJlbnRyeSIsIm1hcCIsInNvcnQiLCJsZWZ0IiwicmlnaHQiLCJsb2NhbGVDb21wYXJlIiwicG9ydCIsIndlYmFwaVBhY2thZ2VOYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztRQTBCYUE7ZUFBQUE7O1FBc0lHQztlQUFBQTs7O3dCQWhLYTt5QkFDRTt1QkFNeEI7d0JBQzBCO0FBa0IxQixNQUFNRDs7SUFDSUUsTUFBTUMsd0JBQWdCLENBQUNDLFlBQVksQ0FBQztJQUU1Q0MsY0FBc0M7SUFDdENDLGlCQUF5QztJQUN6Q0MsU0FBaUM7SUFDakNDLFdBQVcsUUFBUTtJQUNuQkMsUUFBUSxTQUFTO0lBQ2pCQyxRQUFpQyxDQUFDLEVBQUU7SUFFNUMsWUFDQyxBQUFpQkMsSUFBWSxFQUM3QkMsT0FBNEIsQ0FDM0I7YUFGZ0JELE9BQUFBO1FBR2pCLE1BQU1FLFdBQVdELFNBQVNDLFlBQVk7WUFBQ0MsMEJBQW1CO1NBQUM7UUFDM0Qs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
@@ -0,0 +1,134 @@
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 MonoRepoScaffold () {
13
+ return MonoRepoScaffold;
14
+ },
15
+ get ProjectScaffold () {
16
+ return ProjectScaffold;
17
+ },
18
+ get WorkspaceScaffold () {
19
+ return WorkspaceScaffold;
20
+ }
21
+ });
22
+ const _promises = require("node:fs/promises");
23
+ const _nodepath = require("node:path");
24
+ class ProjectScaffold {
25
+ dir;
26
+ _models = new Map();
27
+ _files = [];
28
+ constructor(dir){
29
+ this.dir = dir;
30
+ }
31
+ addModel(model) {
32
+ this._models.set(model.key, model);
33
+ return model;
34
+ }
35
+ addFile(provider) {
36
+ this._files.push(...provider.files());
37
+ return this;
38
+ }
39
+ getModel(key) {
40
+ return this._models.get(key);
41
+ }
42
+ getModels(ctor) {
43
+ return [
44
+ ...this._models.values()
45
+ ].filter((m)=>m instanceof ctor);
46
+ }
47
+ /** Returns all files with `dir/` prepended to each path. */ files() {
48
+ const all = [
49
+ ...this._files,
50
+ ...[
51
+ ...this._models.values()
52
+ ].flatMap((m)=>m.files())
53
+ ];
54
+ return all.map((f)=>({
55
+ filePath: `${this.dir}/${f.filePath}`,
56
+ content: f.content
57
+ }));
58
+ }
59
+ }
60
+ class WorkspaceScaffold {
61
+ files = [];
62
+ targetDir = process.cwd();
63
+ _name;
64
+ /** Project name — host directory basename, not the in-container mount path. */ get name() {
65
+ return this._name ?? (0, _nodepath.basename)(this.targetDir);
66
+ }
67
+ setName(name) {
68
+ this._name = name;
69
+ return this;
70
+ }
71
+ /** Add an ad-hoc file provider whose output is included at render time. */ addFile(provider) {
72
+ this.files.push(...provider.files());
73
+ return this;
74
+ }
75
+ }
76
+ class MonoRepoScaffold extends WorkspaceScaffold {
77
+ _models = new Map();
78
+ _projects = [];
79
+ /** Register a named project. */ addProject(project) {
80
+ this._projects.push(project);
81
+ return project;
82
+ }
83
+ /** Retrieve a previously-registered project by its directory path. */ getProject(dir) {
84
+ return this._projects.find((p)=>p.dir === dir);
85
+ }
86
+ /** All registered projects, in registration order. */ getProjects() {
87
+ return this._projects;
88
+ }
89
+ /** Register a named model at workspace level. */ addModel(model) {
90
+ this._models.set(model.key, model);
91
+ return model;
92
+ }
93
+ /**
94
+ * Retrieve a model by key. Searches workspace models first, then all
95
+ * registered projects in order.
96
+ */ getModel(key) {
97
+ const m = this._models.get(key);
98
+ if (m !== undefined) return m;
99
+ for (const project of this._projects){
100
+ const pm = project.getModel(key);
101
+ if (pm !== undefined) return pm;
102
+ }
103
+ return undefined;
104
+ }
105
+ /**
106
+ * Retrieve all models of a given type. Searches workspace models and all
107
+ * projects, so features can discover controllers across multiple projects.
108
+ */ getModels(ctor) {
109
+ return [
110
+ ...[
111
+ ...this._models.values()
112
+ ].filter((m)=>m instanceof ctor),
113
+ ...this._projects.flatMap((p)=>p.getModels(ctor))
114
+ ];
115
+ }
116
+ /** Render all models and projects into files, then write everything to disk. */ async scaffold() {
117
+ const allFiles = [
118
+ ...this.files,
119
+ ...[
120
+ ...this._models.values()
121
+ ].flatMap((m)=>m.files()),
122
+ ...this._projects.flatMap((p)=>p.files())
123
+ ];
124
+ await Promise.all(allFiles.map(async (file)=>{
125
+ const fullPath = (0, _nodepath.join)(this.targetDir, file.filePath);
126
+ await (0, _promises.mkdir)((0, _nodepath.dirname)(fullPath), {
127
+ recursive: true
128
+ });
129
+ await (0, _promises.writeFile)(fullPath, file.content);
130
+ }));
131
+ }
132
+ }
133
+
134
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy9tb2RlbHMvcHJvamVjdC5tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBta2Rpciwgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBLZXllZE1vZGVsLCBTb3VyY2VGaWxlLCBTb3VyY2VGaWxlUHJvdmlkZXIgfSBmcm9tIFwiLi9zb3VyY2UtZmlsZS5qc1wiO1xuXG4vKipcbiAqIEEgc3ViLXVuaXQgb2YgdGhlIG1vbm9yZXBvIChlLmcuIGBwcm9qZWN0cy9hcGlgKS5cbiAqXG4gKiBNb2RlbHMgYW5kIGZpbGVzIHJlZ2lzdGVyZWQgaGVyZSBwcm9kdWNlIHBhdGhzIHJlbGF0aXZlIHRvIGBkaXJgLiBUaGUgcGFyZW50XG4gKiBgTW9ub1JlcG9TY2FmZm9sZGAgY2FsbHMgYGZpbGVzKClgIGFuZCBwcmVwZW5kcyBgZGlyL2AgdG8gZXZlcnkgcGF0aCwgc29cbiAqIG1vZGVscyByZW1haW4gdW5hd2FyZSBvZiB3aGVyZSB0aGV5IGxpdmUgaW4gdGhlIHJlcG8uXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm9qZWN0U2NhZmZvbGQge1xuXHRwcml2YXRlIHJlYWRvbmx5IF9tb2RlbHMgPSBuZXcgTWFwPHN0cmluZywgU291cmNlRmlsZVByb3ZpZGVyPigpO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9maWxlczogU291cmNlRmlsZVtdID0gW107XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBkaXI6IHN0cmluZykge31cblxuXHRwdWJsaWMgYWRkTW9kZWw8VCBleHRlbmRzIEtleWVkTW9kZWw+KG1vZGVsOiBUKTogVCB7XG5cdFx0dGhpcy5fbW9kZWxzLnNldChtb2RlbC5rZXksIG1vZGVsKTtcblx0XHRyZXR1cm4gbW9kZWw7XG5cdH1cblxuXHRwdWJsaWMgYWRkRmlsZShwcm92aWRlcjogU291cmNlRmlsZVByb3ZpZGVyKTogdGhpcyB7XG5cdFx0dGhpcy5fZmlsZXMucHVzaCguLi5wcm92aWRlci5maWxlcygpKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyBnZXRNb2RlbDxUIGV4dGVuZHMgU291cmNlRmlsZVByb3ZpZGVyPihrZXk6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLl9tb2RlbHMuZ2V0KGtleSkgYXMgVCB8IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRNb2RlbHM8VCBleHRlbmRzIFNvdXJjZUZpbGVQcm92aWRlcj4oY3RvcjogbmV3ICguLi5hcmdzOiBuZXZlcltdKSA9PiBUKTogVFtdIHtcblx0XHRyZXR1cm4gWy4uLnRoaXMuX21vZGVscy52YWx1ZXMoKV0uZmlsdGVyKChtKTogbSBpcyBUID0+IG0gaW5zdGFuY2VvZiBjdG9yKTtcblx0fVxuXG5cdC8qKiBSZXR1cm5zIGFsbCBmaWxlcyB3aXRoIGBkaXIvYCBwcmVwZW5kZWQgdG8gZWFjaCBwYXRoLiAqL1xuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRjb25zdCBhbGwgPSBbLi4udGhpcy5fZmlsZXMsIC4uLlsuLi50aGlzLl9tb2RlbHMudmFsdWVzKCldLmZsYXRNYXAoKG0pID0+IG0uZmlsZXMoKSldO1xuXHRcdHJldHVybiBhbGwubWFwKChmKSA9PiAoeyBmaWxlUGF0aDogYCR7dGhpcy5kaXJ9LyR7Zi5maWxlUGF0aH1gLCBjb250ZW50OiBmLmNvbnRlbnQgfSkpO1xuXHR9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBXb3Jrc3BhY2VTY2FmZm9sZCB7XG5cdHB1YmxpYyByZWFkb25seSBmaWxlczogU291cmNlRmlsZVtdID0gW107XG5cdHB1YmxpYyB0YXJnZXREaXI6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCk7XG5cdHByaXZhdGUgX25hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuXHQvKiogUHJvamVjdCBuYW1lIOKAlCBob3N0IGRpcmVjdG9yeSBiYXNlbmFtZSwgbm90IHRoZSBpbi1jb250YWluZXIgbW91bnQgcGF0aC4gKi9cblx0cHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuX25hbWUgPz8gYmFzZW5hbWUodGhpcy50YXJnZXREaXIpO1xuXHR9XG5cblx0cHVibGljIHNldE5hbWUobmFtZTogc3RyaW5nKTogdGhpcyB7XG5cdFx0dGhpcy5fbmFtZSA9IG5hbWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKiogQWRkIGFuIGFkLWhvYyBmaWxlIHByb3ZpZGVyIHdob3NlIG91dHB1dCBpcyBpbmNsdWRlZCBhdCByZW5kZXIgdGltZS4gKi9cblx0cHVibGljIGFkZEZpbGUocHJvdmlkZXI6IFNvdXJjZUZpbGVQcm92aWRlcik6IHRoaXMge1xuXHRcdHRoaXMuZmlsZXMucHVzaCguLi5wcm92aWRlci5maWxlcygpKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyBhYnN0cmFjdCBhZGRNb2RlbDxUIGV4dGVuZHMgS2V5ZWRNb2RlbD4obW9kZWw6IFQpOiBUO1xuXHRwdWJsaWMgYWJzdHJhY3QgZ2V0TW9kZWw8VCBleHRlbmRzIFNvdXJjZUZpbGVQcm92aWRlcj4oa2V5OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkO1xuXHRwdWJsaWMgYWJzdHJhY3QgZ2V0TW9kZWxzPFQgZXh0ZW5kcyBTb3VyY2VGaWxlUHJvdmlkZXI+KFxuXHRcdGN0b3I6IG5ldyAoLi4uYXJnczogbmV2ZXJbXSkgPT4gVCxcblx0KTogVFtdO1xuXHRwdWJsaWMgYWJzdHJhY3QgZ2V0UHJvamVjdChkaXI6IHN0cmluZyk6IFByb2plY3RTY2FmZm9sZCB8IHVuZGVmaW5lZDtcblx0cHVibGljIGFic3RyYWN0IGdldFByb2plY3RzKCk6IHJlYWRvbmx5IFByb2plY3RTY2FmZm9sZFtdO1xuXHRwdWJsaWMgYWJzdHJhY3Qgc2NhZmZvbGQoKTogUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBNb25vUmVwb1NjYWZmb2xkIGV4dGVuZHMgV29ya3NwYWNlU2NhZmZvbGQge1xuXHRwcml2YXRlIHJlYWRvbmx5IF9tb2RlbHMgPSBuZXcgTWFwPHN0cmluZywgU291cmNlRmlsZVByb3ZpZGVyPigpO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9wcm9qZWN0czogUHJvamVjdFNjYWZmb2xkW10gPSBbXTtcblxuXHQvKiogUmVnaXN0ZXIgYSBuYW1lZCBwcm9qZWN0LiAqL1xuXHRwdWJsaWMgYWRkUHJvamVjdChwcm9qZWN0OiBQcm9qZWN0U2NhZmZvbGQpOiBQcm9qZWN0U2NhZmZvbGQge1xuXHRcdHRoaXMuX3Byb2plY3RzLnB1c2gocHJvamVjdCk7XG5cdFx0cmV0dXJuIHByb2plY3Q7XG5cdH1cblxuXHQvKiogUmV0cmlldmUgYSBwcmV2aW91c2x5LXJlZ2lzdGVyZWQgcHJvamVjdCBieSBpdHMgZGlyZWN0b3J5IHBhdGguICovXG5cdHB1YmxpYyBnZXRQcm9qZWN0KGRpcjogc3RyaW5nKTogUHJvamVjdFNjYWZmb2xkIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5fcHJvamVjdHMuZmluZCgocCkgPT4gcC5kaXIgPT09IGRpcik7XG5cdH1cblxuXHQvKiogQWxsIHJlZ2lzdGVyZWQgcHJvamVjdHMsIGluIHJlZ2lzdHJhdGlvbiBvcmRlci4gKi9cblx0cHVibGljIGdldFByb2plY3RzKCk6IHJlYWRvbmx5IFByb2plY3RTY2FmZm9sZFtdIHtcblx0XHRyZXR1cm4gdGhpcy5fcHJvamVjdHM7XG5cdH1cblxuXHQvKiogUmVnaXN0ZXIgYSBuYW1lZCBtb2RlbCBhdCB3b3Jrc3BhY2UgbGV2ZWwuICovXG5cdHB1YmxpYyBhZGRNb2RlbDxUIGV4dGVuZHMgS2V5ZWRNb2RlbD4obW9kZWw6IFQpOiBUIHtcblx0XHR0aGlzLl9tb2RlbHMuc2V0KG1vZGVsLmtleSwgbW9kZWwpO1xuXHRcdHJldHVybiBtb2RlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSBhIG1vZGVsIGJ5IGtleS4gU2VhcmNoZXMgd29ya3NwYWNlIG1vZGVscyBmaXJzdCwgdGhlbiBhbGxcblx0ICogcmVnaXN0ZXJlZCBwcm9qZWN0cyBpbiBvcmRlci5cblx0ICovXG5cdHB1YmxpYyBnZXRNb2RlbDxUIGV4dGVuZHMgU291cmNlRmlsZVByb3ZpZGVyPihrZXk6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG0gPSB0aGlzLl9tb2RlbHMuZ2V0KGtleSkgYXMgVCB8IHVuZGVmaW5lZDtcblx0XHRpZiAobSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gbTtcblx0XHRmb3IgKGNvbnN0IHByb2plY3Qgb2YgdGhpcy5fcHJvamVjdHMpIHtcblx0XHRcdGNvbnN0IHBtID0gcHJvamVjdC5nZXRNb2RlbDxUPihrZXkpO1xuXHRcdFx0aWYgKHBtICE9PSB1bmRlZmluZWQpIHJldHVybiBwbTtcblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSBhbGwgbW9kZWxzIG9mIGEgZ2l2ZW4gdHlwZS4gU2VhcmNoZXMgd29ya3NwYWNlIG1vZGVscyBhbmQgYWxsXG5cdCAqIHByb2plY3RzLCBzbyBmZWF0dXJlcyBjYW4gZGlzY292ZXIgY29udHJvbGxlcnMgYWNyb3NzIG11bHRpcGxlIHByb2plY3RzLlxuXHQgKi9cblx0cHVibGljIGdldE1vZGVsczxUIGV4dGVuZHMgU291cmNlRmlsZVByb3ZpZGVyPihjdG9yOiBuZXcgKC4uLmFyZ3M6IG5ldmVyW10pID0+IFQpOiBUW10ge1xuXHRcdHJldHVybiBbXG5cdFx0XHQuLi5bLi4udGhpcy5fbW9kZWxzLnZhbHVlcygpXS5maWx0ZXIoKG0pOiBtIGlzIFQgPT4gbSBpbnN0YW5jZW9mIGN0b3IpLFxuXHRcdFx0Li4udGhpcy5fcHJvamVjdHMuZmxhdE1hcCgocCkgPT4gcC5nZXRNb2RlbHMoY3RvcikpLFxuXHRcdF07XG5cdH1cblxuXHQvKiogUmVuZGVyIGFsbCBtb2RlbHMgYW5kIHByb2plY3RzIGludG8gZmlsZXMsIHRoZW4gd3JpdGUgZXZlcnl0aGluZyB0byBkaXNrLiAqL1xuXHRwdWJsaWMgYXN5bmMgc2NhZmZvbGQoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYWxsRmlsZXMgPSBbXG5cdFx0XHQuLi50aGlzLmZpbGVzLFxuXHRcdFx0Li4uWy4uLnRoaXMuX21vZGVscy52YWx1ZXMoKV0uZmxhdE1hcCgobSkgPT4gbS5maWxlcygpKSxcblx0XHRcdC4uLnRoaXMuX3Byb2plY3RzLmZsYXRNYXAoKHApID0+IHAuZmlsZXMoKSksXG5cdFx0XTtcblxuXHRcdGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0YWxsRmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGZ1bGxQYXRoID0gam9pbih0aGlzLnRhcmdldERpciwgZmlsZS5maWxlUGF0aCk7XG5cdFx0XHRcdGF3YWl0IG1rZGlyKGRpcm5hbWUoZnVsbFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRcdFx0YXdhaXQgd3JpdGVGaWxlKGZ1bGxQYXRoLCBmaWxlLmNvbnRlbnQpO1xuXHRcdFx0fSksXG5cdFx0KTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIk1vbm9SZXBvU2NhZmZvbGQiLCJQcm9qZWN0U2NhZmZvbGQiLCJXb3Jrc3BhY2VTY2FmZm9sZCIsIl9tb2RlbHMiLCJNYXAiLCJfZmlsZXMiLCJkaXIiLCJhZGRNb2RlbCIsIm1vZGVsIiwic2V0Iiwia2V5IiwiYWRkRmlsZSIsInByb3ZpZGVyIiwicHVzaCIsImZpbGVzIiwiZ2V0TW9kZWwiLCJnZXQiLCJnZXRNb2RlbHMiLCJjdG9yIiwidmFsdWVzIiwiZmlsdGVyIiwibSIsImFsbCIsImZsYXRNYXAiLCJtYXAiLCJmIiwiZmlsZVBhdGgiLCJjb250ZW50IiwidGFyZ2V0RGlyIiwicHJvY2VzcyIsImN3ZCIsIl9uYW1lIiwibmFtZSIsImJhc2VuYW1lIiwic2V0TmFtZSIsIl9wcm9qZWN0cyIsImFkZFByb2plY3QiLCJwcm9qZWN0IiwiZ2V0UHJvamVjdCIsImZpbmQiLCJwIiwiZ2V0UHJvamVjdHMiLCJ1bmRlZmluZWQiLCJwbSIsInNjYWZmb2xkIiwiYWxsRmlsZXMiLCJQcm9taXNlIiwiZmlsZSIsImZ1bGxQYXRoIiwiam9pbiIsIm1rZGlyIiwiZGlybmFtZSIsInJlY3Vyc2l2ZSIsIndyaXRlRmlsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7UUF5RWFBO2VBQUFBOztRQTlEQUM7ZUFBQUE7O1FBK0JTQztlQUFBQTs7OzBCQTFDVzswQkFDTztBQVVqQyxNQUFNRDs7SUFDS0UsVUFBVSxJQUFJQyxNQUFrQztJQUNoREMsU0FBdUIsRUFBRSxDQUFDO0lBRTNDLFlBQW1CLEFBQWdCQyxHQUFXLENBQUU7YUFBYkEsTUFBQUE7SUFBYztJQUUxQ0MsU0FBK0JDLEtBQVEsRUFBSztRQUNsRCxJQUFJLENBQUNMLE9BQU8sQ0FBQ00sR0FBRyxDQUFDRCxNQUFNRSxHQUFHLEVBQUVGO1FBQzVCLE9BQU9BO0lBQ1I7SUFFT0csUUFBUUMsUUFBNEIsRUFBUTtRQUNsRCxJQUFJLENBQUNQLE1BQU0sQ0FBQ1EsSUFBSSxJQUFJRCxTQUFTRSxLQUFLO1FBQ2xDLE9BQU8sSUFBSTtJQUNaO0lBRU9DLFNBQXVDTCxHQUFXLEVBQWlCO1FBQ3pFLE9BQU8sSUFBSSxDQUFDUCxPQUFPLENBQUNhLEdBQUcsQ0FBQ047SUFDekI7SUFFT08sVUFBd0NDLElBQWlDLEVBQU87UUFDdEYsT0FBTztlQUFJLElBQUksQ0FBQ2YsT0FBTyxDQUFDZ0IsTUFBTTtTQUFHLENBQUNDLE1BQU0sQ0FBQyxDQUFDQyxJQUFjQSxhQUFhSDtJQUN0RTtJQUVBLDBEQUEwRCxHQUMxRCxBQUFPSixRQUFzQjtRQUM1QixNQUFNUSxNQUFNO2VBQUksSUFBSSxDQUFDakIsTUFBTTtlQUFLO21CQUFJLElBQUksQ0FBQ0YsT0FBTyxDQUFDZ0IsTUFBTTthQUFH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
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "TsConfig", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return TsConfig;
9
+ }
10
+ });
11
+ const _const = require("./const.js");
12
+ class TsConfig {
13
+ key = _const.WELL_KNOWN_FILES.TSCONFIG;
14
+ files() {
15
+ return [
16
+ {
17
+ filePath: "tsconfig.json",
18
+ content: JSON.stringify({
19
+ compilerOptions: {
20
+ target: "ES2022",
21
+ module: "NodeNext",
22
+ moduleResolution: "NodeNext",
23
+ strict: true,
24
+ skipLibCheck: true,
25
+ experimentalDecorators: true,
26
+ emitDecoratorMetadata: true
27
+ }
28
+ }, null, 2)
29
+ }
30
+ ];
31
+ }
32
+ }
33
+
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy9tb2RlbHMvdHNjb25maWcubW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi9zb3VyY2UtZmlsZS5qc1wiO1xuXG5leHBvcnQgY2xhc3MgVHNDb25maWcgaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHVibGljIHJlYWRvbmx5IGtleSA9IFdFTExfS05PV05fRklMRVMuVFNDT05GSUc7XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwidHNjb25maWcuanNvblwiLFxuXHRcdFx0XHRjb250ZW50OiBKU09OLnN0cmluZ2lmeShcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjb21waWxlck9wdGlvbnM6IHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0OiBcIkVTMjAyMlwiLFxuXHRcdFx0XHRcdFx0XHRtb2R1bGU6IFwiTm9kZU5leHRcIixcblx0XHRcdFx0XHRcdFx0bW9kdWxlUmVzb2x1dGlvbjogXCJOb2RlTmV4dFwiLFxuXHRcdFx0XHRcdFx0XHRzdHJpY3Q6IHRydWUsXG5cdFx0XHRcdFx0XHRcdHNraXBMaWJDaGVjazogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0ZXhwZXJpbWVudGFsRGVjb3JhdG9yczogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0ZW1pdERlY29yYXRvck1ldGFkYXRhOiB0cnVlLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0Mixcblx0XHRcdFx0KSxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIlRzQ29uZmlnIiwia2V5IiwiV0VMTF9LTk9XTl9GSUxFUyIsIlRTQ09ORklHIiwiZmlsZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJKU09OIiwic3RyaW5naWZ5IiwiY29tcGlsZXJPcHRpb25zIiwidGFyZ2V0IiwibW9kdWxlIiwibW9kdWxlUmVzb2x1dGlvbiIsInN0cmljdCIsInNraXBMaWJDaGVjayIsImV4cGVyaW1lbnRhbERlY29yYXRvcnMiLCJlbWl0RGVjb3JhdG9yTWV0YWRhdGEiXSwibWFwcGluZ3MiOiI7Ozs7K0JBR2FBOzs7ZUFBQUE7Ozt1QkFIb0I7QUFHMUIsTUFBTUE7SUFDSUMsTUFBTUMsdUJBQWdCLENBQUNDLFFBQVEsQ0FBQztJQUV6Q0MsUUFBc0I7UUFDNUIsT0FBTztZQUNOO2dCQUNDQyxVQUFVO2dCQUNWQyxTQUFTQyxLQUFLQyxTQUFTLENBQ3RCO29CQUNDQyxpQkFBaUI7d0JBQ2hCQyxRQUFRO3dCQUNSQyxRQUFRO3dCQUNSQyxrQkFBa0I7d0JBQ2xCQyxRQUFRO3dCQUNSQyxjQUFjO3dCQUNkQyx3QkFBd0I7d0JBQ3hCQyx1QkFBdUI7b0JBQ3hCO2dCQUNELEdBQ0EsTUFDQTtZQUVGO1NBQ0E7SUFDRjtBQUNEIn0=
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "VitestConfig", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return VitestConfig;
9
+ }
10
+ });
11
+ const _const = require("./const.js");
12
+ class VitestConfig {
13
+ key = _const.WELL_KNOWN_FILES.VITEST_CONFIG;
14
+ files() {
15
+ return [
16
+ {
17
+ filePath: "vitest.config.ts",
18
+ content: [
19
+ 'import { forgeBuild } from "@decohere/forge/vitest";',
20
+ 'import { defineConfig } from "vitest/config";',
21
+ "",
22
+ "export default defineConfig({",
23
+ '\tplugins: [forgeBuild({ logLevel: "silent" })],',
24
+ "\ttest: {",
25
+ '\t\tinclude: ["projects/**/*.{test,spec}.?(c|m)[jt]s?(x)"],',
26
+ "\t},",
27
+ "});",
28
+ ""
29
+ ].join("\n")
30
+ }
31
+ ];
32
+ }
33
+ }
34
+
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy9tb2RlbHMvdml0ZXN0LWNvbmZpZy5tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXRUxMX0tOT1dOX0ZJTEVTIH0gZnJvbSBcIi4vY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgS2V5ZWRNb2RlbCwgU291cmNlRmlsZSB9IGZyb20gXCIuL3NvdXJjZS1maWxlLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBWaXRlc3RDb25maWcgaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHVibGljIHJlYWRvbmx5IGtleSA9IFdFTExfS05PV05fRklMRVMuVklURVNUX0NPTkZJRztcblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCJ2aXRlc3QuY29uZmlnLnRzXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IFtcblx0XHRcdFx0XHQnaW1wb3J0IHsgZm9yZ2VCdWlsZCB9IGZyb20gXCJAZGVjb2hlcmUvZm9yZ2Uvdml0ZXN0XCI7Jyxcblx0XHRcdFx0XHQnaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSBcInZpdGVzdC9jb25maWdcIjsnLFxuXHRcdFx0XHRcdFwiXCIsXG5cdFx0XHRcdFx0XCJleHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1wiLFxuXHRcdFx0XHRcdCdcXHRwbHVnaW5zOiBbZm9yZ2VCdWlsZCh7IGxvZ0xldmVsOiBcInNpbGVudFwiIH0pXSwnLFxuXHRcdFx0XHRcdFwiXFx0dGVzdDoge1wiLFxuXHRcdFx0XHRcdCdcXHRcXHRpbmNsdWRlOiBbXCJwcm9qZWN0cy8qKi8qLnt0ZXN0LHNwZWN9Lj8oY3xtKVtqdF1zPyh4KVwiXSwnLFxuXHRcdFx0XHRcdFwiXFx0fSxcIixcblx0XHRcdFx0XHRcIn0pO1wiLFxuXHRcdFx0XHRcdFwiXCIsXG5cdFx0XHRcdF0uam9pbihcIlxcblwiKSxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIlZpdGVzdENvbmZpZyIsImtleSIsIldFTExfS05PV05fRklMRVMiLCJWSVRFU1RfQ09ORklHIiwiZmlsZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJqb2luIl0sIm1hcHBpbmdzIjoiOzs7OytCQUdhQTs7O2VBQUFBOzs7dUJBSG9CO0FBRzFCLE1BQU1BO0lBQ0lDLE1BQU1DLHVCQUFnQixDQUFDQyxhQUFhLENBQUM7SUFFOUNDLFFBQXNCO1FBQzVCLE9BQU87WUFDTjtnQkFDQ0MsVUFBVTtnQkFDVkMsU0FBUztvQkFDUjtvQkFDQTtvQkFDQTtvQkFDQTtvQkFDQTtvQkFDQTtvQkFDQTtvQkFDQTtvQkFDQTtvQkFDQTtpQkFDQSxDQUFDQyxJQUFJLENBQUM7WUFDUjtTQUNBO0lBQ0Y7QUFDRCJ9
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "VSCodeSettings", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return VSCodeSettings;
9
+ }
10
+ });
11
+ const _const = require("./const.js");
12
+ class VSCodeSettings {
13
+ title;
14
+ key = _const.WELL_KNOWN_FILES.VSCODE_SETTINGS;
15
+ constructor(title){
16
+ this.title = title;
17
+ }
18
+ files() {
19
+ return [
20
+ {
21
+ filePath: ".vscode/settings.json",
22
+ content: JSON.stringify({
23
+ "window.title": `${this.title}\${separator}\${activeEditorShort}`,
24
+ "window.titleSeparator": " | "
25
+ }, null, 2)
26
+ }
27
+ ];
28
+ }
29
+ }
30
+
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy9tb2RlbHMvdnNjb2RlLXNldHRpbmdzLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLZXllZE1vZGVsLCBTb3VyY2VGaWxlIH0gZnJvbSBcIi4vc291cmNlLWZpbGUuanNcIjtcblxuZXhwb3J0IGNsYXNzIFZTQ29kZVNldHRpbmdzIGltcGxlbWVudHMgS2V5ZWRNb2RlbCB7XG5cdHB1YmxpYyByZWFkb25seSBrZXkgPSBXRUxMX0tOT1dOX0ZJTEVTLlZTQ09ERV9TRVRUSU5HUztcblxuXHRwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB0aXRsZTogc3RyaW5nKSB7fVxuXG5cdHB1YmxpYyBmaWxlcygpOiBTb3VyY2VGaWxlW10ge1xuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcIi52c2NvZGUvc2V0dGluZ3MuanNvblwiLFxuXHRcdFx0XHRjb250ZW50OiBKU09OLnN0cmluZ2lmeShcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcIndpbmRvdy50aXRsZVwiOiBgJHt0aGlzLnRpdGxlfVxcJHtzZXBhcmF0b3J9XFwke2FjdGl2ZUVkaXRvclNob3J0fWAsXG5cdFx0XHRcdFx0XHRcIndpbmRvdy50aXRsZVNlcGFyYXRvclwiOiBcIiB8IFwiLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHQyLFxuXHRcdFx0XHQpLFxuXHRcdFx0fSxcblx0XHRdO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiVlNDb2RlU2V0dGluZ3MiLCJrZXkiLCJXRUxMX0tOT1dOX0ZJTEVTIiwiVlNDT0RFX1NFVFRJTkdTIiwidGl0bGUiLCJmaWxlcyIsImZpbGVQYXRoIiwiY29udGVudCIsIkpTT04iLCJzdHJpbmdpZnkiXSwibWFwcGluZ3MiOiI7Ozs7K0JBR2FBOzs7ZUFBQUE7Ozt1QkFIb0I7QUFHMUIsTUFBTUE7O0lBQ0lDLE1BQU1DLHVCQUFnQixDQUFDQyxlQUFlLENBQUM7SUFFdkQsWUFBbUIsQUFBaUJDLEtBQWEsQ0FBRTthQUFmQSxRQUFBQTtJQUFnQjtJQUU3Q0MsUUFBc0I7UUFDNUIsT0FBTztZQUNOO2dCQUNDQyxVQUFVO2dCQUNWQyxTQUFTQyxLQUFLQyxTQUFTLENBQ3RCO29CQUNDLGdCQUFnQixHQUFHLElBQUksQ0FBQ0wsS0FBSyxDQUFDLGtDQUFrQyxDQUFDO29CQUNqRSx5QkFBeUI7Z0JBQzFCLEdBQ0EsTUFDQTtZQUVGO1NBQ0E7SUFDRjtBQUNEIn0=
@@ -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 createProgram () {
13
+ return createProgram;
14
+ },
15
+ get runCli () {
16
+ return runCli;
17
+ }
18
+ });
19
+ const _commander = require("commander");
20
+ const _apiname = require("./webapi/api-name.js");
21
+ const _clioptions = require("./webapi/cli-options.js");
22
+ function createProgram() {
23
+ const program = new _commander.Command();
24
+ program.exitOverride();
25
+ program.name("decohere").description("Decohere CLI").option("-d <directory>", "Target directory (default: current directory)", ".");
26
+ const create = program.command("create").description("Create a new Decohere workspace");
27
+ (0, _clioptions.addWebapiFeatureOptions)(create.command("webapi").argument("[directory]", "Target directory (default: -d or current directory)").option("--name <slug>", "API name under projects/ (repeatable; default: api)", _clioptions.collectName, [])).action(async (directory, _opts, cmd)=>{
28
+ await (0, _clioptions.runScaffoldApi)((0, _clioptions.toApiOptions)(directory, cmd.optsWithGlobals()));
29
+ });
30
+ (0, _clioptions.addWebapiFeatureOptions)(program.command("add").description("Add to an existing Decohere workspace").command("api").argument("<name>", "API name under projects/")).action(async (name, _opts, cmd)=>{
31
+ await (0, _clioptions.runScaffoldApi)((0, _clioptions.toApiOptions)(undefined, cmd.optsWithGlobals(), {
32
+ names: [
33
+ name
34
+ ],
35
+ add: true
36
+ }));
37
+ });
38
+ return program;
39
+ }
40
+ async function runCli(argv = process.argv) {
41
+ try {
42
+ await createProgram().parseAsync(argv);
43
+ } catch (err) {
44
+ if (err instanceof _commander.CommanderError) {
45
+ process.exit(err.exitCode);
46
+ }
47
+ if (err instanceof _apiname.CreateCliError) {
48
+ console.error(`\n ${err.message}\n`);
49
+ process.exit(1);
50
+ }
51
+ console.error(err);
52
+ process.exit(1);
53
+ }
54
+ process.exit(process.exitCode ?? 0);
55
+ }
56
+
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy9wcm9ncmFtLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1hbmQsIENvbW1hbmRlckVycm9yIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHsgQ3JlYXRlQ2xpRXJyb3IgfSBmcm9tIFwiLi93ZWJhcGkvYXBpLW5hbWUuanNcIjtcbmltcG9ydCB7XG5cdGFkZFdlYmFwaUZlYXR1cmVPcHRpb25zLFxuXHRjb2xsZWN0TmFtZSxcblx0cnVuU2NhZmZvbGRBcGksXG5cdHRvQXBpT3B0aW9ucyxcbn0gZnJvbSBcIi4vd2ViYXBpL2NsaS1vcHRpb25zLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9ncmFtKCk6IENvbW1hbmQge1xuXHRjb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKTtcblx0cHJvZ3JhbS5leGl0T3ZlcnJpZGUoKTtcblx0cHJvZ3JhbVxuXHRcdC5uYW1lKFwiZGVjb2hlcmVcIilcblx0XHQuZGVzY3JpcHRpb24oXCJEZWNvaGVyZSBDTElcIilcblx0XHQub3B0aW9uKFwiLWQgPGRpcmVjdG9yeT5cIiwgXCJUYXJnZXQgZGlyZWN0b3J5IChkZWZhdWx0OiBjdXJyZW50IGRpcmVjdG9yeSlcIiwgXCIuXCIpO1xuXG5cdGNvbnN0IGNyZWF0ZSA9IHByb2dyYW0uY29tbWFuZChcImNyZWF0ZVwiKS5kZXNjcmlwdGlvbihcIkNyZWF0ZSBhIG5ldyBEZWNvaGVyZSB3b3Jrc3BhY2VcIik7XG5cdGFkZFdlYmFwaUZlYXR1cmVPcHRpb25zKFxuXHRcdGNyZWF0ZVxuXHRcdFx0LmNvbW1hbmQoXCJ3ZWJhcGlcIilcblx0XHRcdC5hcmd1bWVudChcIltkaXJlY3RvcnldXCIsIFwiVGFyZ2V0IGRpcmVjdG9yeSAoZGVmYXVsdDogLWQgb3IgY3VycmVudCBkaXJlY3RvcnkpXCIpXG5cdFx0XHQub3B0aW9uKFxuXHRcdFx0XHRcIi0tbmFtZSA8c2x1Zz5cIixcblx0XHRcdFx0XCJBUEkgbmFtZSB1bmRlciBwcm9qZWN0cy8gKHJlcGVhdGFibGU7IGRlZmF1bHQ6IGFwaSlcIixcblx0XHRcdFx0Y29sbGVjdE5hbWUsXG5cdFx0XHRcdFtdIGFzIHN0cmluZ1tdLFxuXHRcdFx0KSxcblx0KS5hY3Rpb24oYXN5bmMgKGRpcmVjdG9yeTogc3RyaW5nIHwgdW5kZWZpbmVkLCBfb3B0czogdW5rbm93biwgY21kOiBDb21tYW5kKSA9PiB7XG5cdFx0YXdhaXQgcnVuU2NhZmZvbGRBcGkodG9BcGlPcHRpb25zKGRpcmVjdG9yeSwgY21kLm9wdHNXaXRoR2xvYmFscygpKSk7XG5cdH0pO1xuXG5cdGFkZFdlYmFwaUZlYXR1cmVPcHRpb25zKFxuXHRcdHByb2dyYW1cblx0XHRcdC5jb21tYW5kKFwiYWRkXCIpXG5cdFx0XHQuZGVzY3JpcHRpb24oXCJBZGQgdG8gYW4gZXhpc3RpbmcgRGVjb2hlcmUgd29ya3NwYWNlXCIpXG5cdFx0XHQuY29tbWFuZChcImFwaVwiKVxuXHRcdFx0LmFyZ3VtZW50KFwiPG5hbWU+XCIsIFwiQVBJIG5hbWUgdW5kZXIgcHJvamVjdHMvXCIpLFxuXHQpLmFjdGlvbihhc3luYyAobmFtZTogc3RyaW5nLCBfb3B0czogdW5rbm93biwgY21kOiBDb21tYW5kKSA9PiB7XG5cdFx0YXdhaXQgcnVuU2NhZmZvbGRBcGkoXG5cdFx0XHR0b0FwaU9wdGlvbnModW5kZWZpbmVkLCBjbWQub3B0c1dpdGhHbG9iYWxzKCksIHsgbmFtZXM6IFtuYW1lXSwgYWRkOiB0cnVlIH0pLFxuXHRcdCk7XG5cdH0pO1xuXG5cdHJldHVybiBwcm9ncmFtO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQ2xpKGFyZ3Y6IHN0cmluZ1tdID0gcHJvY2Vzcy5hcmd2KTogUHJvbWlzZTx2b2lkPiB7XG5cdHRyeSB7XG5cdFx0YXdhaXQgY3JlYXRlUHJvZ3JhbSgpLnBhcnNlQXN5bmMoYXJndik7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGlmIChlcnIgaW5zdGFuY2VvZiBDb21tYW5kZXJFcnJvcikge1xuXHRcdFx0cHJvY2Vzcy5leGl0KGVyci5leGl0Q29kZSk7XG5cdFx0fVxuXHRcdGlmIChlcnIgaW5zdGFuY2VvZiBDcmVhdGVDbGlFcnJvcikge1xuXHRcdFx0Y29uc29sZS5lcnJvcihgXFxuICAke2Vyci5tZXNzYWdlfVxcbmApO1xuXHRcdFx0cHJvY2Vzcy5leGl0KDEpO1xuXHRcdH1cblx0XHRjb25zb2xlLmVycm9yKGVycik7XG5cdFx0cHJvY2Vzcy5leGl0KDEpO1xuXHR9XG5cdHByb2Nlc3MuZXhpdChwcm9jZXNzLmV4aXRDb2RlID8/IDApO1xufVxuIl0sIm5hbWVzIjpbImNyZWF0ZVByb2dyYW0iLCJydW5DbGkiLCJwcm9ncmFtIiwiQ29tbWFuZCIsImV4aXRPdmVycmlkZSIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIm9wdGlvbiIsImNyZWF0ZSIsImNvbW1hbmQiLCJhZGRXZWJhcGlGZWF0dXJlT3B0aW9ucyIsImFyZ3VtZW50IiwiY29sbGVjdE5hbWUiLCJhY3Rpb24iLCJkaXJlY3RvcnkiLCJfb3B0cyIsImNtZCIsInJ1blNjYWZmb2xkQXBpIiwidG9BcGlPcHRpb25zIiwib3B0c1dpdGhHbG9iYWxzIiwidW5kZWZpbmVkIiwibmFtZXMiLCJhZGQiLCJhcmd2IiwicHJvY2VzcyIsInBhcnNlQXN5bmMiLCJlcnIiLCJDb21tYW5kZXJFcnJvciIsImV4aXQiLCJleGl0Q29kZSIsIkNyZWF0ZUNsaUVycm9yIiwiY29uc29sZSIsImVycm9yIiwibWVzc2FnZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7UUFTZ0JBO2VBQUFBOztRQXNDTUM7ZUFBQUE7OzsyQkEvQ2tCO3lCQUNUOzRCQU14QjtBQUVBLFNBQVNEO0lBQ2YsTUFBTUUsVUFBVSxJQUFJQyxrQkFBTztJQUMzQkQsUUFBUUUsWUFBWTtJQUNwQkYsUUFDRUcsSUFBSSxDQUFDLFlBQ0xDLFdBQVcsQ0FBQyxnQkFDWkMsTUFBTSxDQUFDLGtCQUFrQixpREFBaUQ7SUFFNUUsTUFBTUMsU0FBU04sUUFBUU8sT0FBTyxDQUFDLFVBQVVILFdBQVcsQ0FBQztJQUNyREksSUFBQUEsbUNBQXVCLEVBQ3RCRixPQUNFQyxPQUFPLENBQUMsVUFDUkUsUUFBUSxDQUFDLGVBQWUsdURBQ3hCSixNQUFNLENBQ04saUJBQ0EsdURBQ0FLLHVCQUFXLEVBQ1gsRUFBRSxHQUVIQyxNQUFNLENBQUMsT0FBT0MsV0FBK0JDLE9BQWdCQztRQUM5RCxNQUFNQyxJQUFBQSwwQkFBYyxFQUFDQyxJQUFBQSx3QkFBWSxFQUFDSixXQUFXRSxJQUFJRyxlQUFlO0lBQ2pFO0lBRUFULElBQUFBLG1DQUF1QixFQUN0QlIsUUFDRU8sT0FBTyxDQUFDLE9BQ1JILFdBQVcsQ0FBQyx5Q0FDWkcsT0FBTyxDQUFDLE9BQ1JFLFFBQVEsQ0FBQyxVQUFVLDZCQUNwQkUsTUFBTSxDQUFDLE9BQU9SLE1BQWNVLE9BQWdCQztRQUM3QyxNQUFNQyxJQUFBQSwwQkFBYyxFQUNuQkMsSUFBQUEsd0JBQVksRUFBQ0UsV0FBV0osSUFBSUcsZUFBZSxJQUFJO1lBQUVFLE9BQU87Z0JBQUNoQjthQUFLO1lBQUVpQixLQUFLO1FBQUs7SUFFNUU7SUFFQSxPQUFPcEI7QUFDUjtBQUVPLGVBQWVELE9BQU9zQixPQUFpQkMsUUFBUUQsSUFBSTtJQUN6RCxJQUFJO1FBQ0gsTUFBTXZCLGdCQUFnQnlCLFVBQVUsQ0FBQ0Y7SUFDbEMsRUFBRSxPQUFPRyxLQUFLO1FBQ2IsSUFBSUEsZUFBZUMseUJBQWMsRUFBRTtZQUNsQ0gsUUFBUUksSUFBSSxDQUFDRixJQUFJRyxRQUFRO1FBQzFCO1FBQ0EsSUFBSUgsZUFBZUksdUJBQWMsRUFBRTtZQUNsQ0MsUUFBUUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFTixJQUFJTyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3BDVCxRQUFRSSxJQUFJLENBQUM7UUFDZDtRQUNBRyxRQUFRQyxLQUFLLENBQUNOO1FBQ2RGLFFBQVFJLElBQUksQ0FBQztJQUNkO0lBQ0FKLFFBQVFJLElBQUksQ0FBQ0osUUFBUUssUUFBUSxJQUFJO0FBQ2xDIn0=
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Resolve scaffold destination: positional `webapi my-app` wins over `-d`.
3
+ * `npm create … webapi -d my-app` drops `-d` (npm loglevel) and forwards `my-app`.
4
+ */ "use strict";
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ Object.defineProperty(exports, "resolveTargetDir", {
9
+ enumerable: true,
10
+ get: function() {
11
+ return resolveTargetDir;
12
+ }
13
+ });
14
+ function resolveTargetDir(positional, flag) {
15
+ const dir = positional?.trim() || flag?.trim() || ".";
16
+ return dir;
17
+ }
18
+
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy9yZXNvbHZlLXRhcmdldC1kaXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNvbHZlIHNjYWZmb2xkIGRlc3RpbmF0aW9uOiBwb3NpdGlvbmFsIGB3ZWJhcGkgbXktYXBwYCB3aW5zIG92ZXIgYC1kYC5cbiAqIGBucG0gY3JlYXRlIOKApiB3ZWJhcGkgLWQgbXktYXBwYCBkcm9wcyBgLWRgIChucG0gbG9nbGV2ZWwpIGFuZCBmb3J3YXJkcyBgbXktYXBwYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUYXJnZXREaXIocG9zaXRpb25hbD86IHN0cmluZywgZmxhZz86IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IGRpciA9IHBvc2l0aW9uYWw/LnRyaW0oKSB8fCBmbGFnPy50cmltKCkgfHwgXCIuXCI7XG5cdHJldHVybiBkaXI7XG59XG4iXSwibmFtZXMiOlsicmVzb2x2ZVRhcmdldERpciIsInBvc2l0aW9uYWwiLCJmbGFnIiwiZGlyIiwidHJpbSJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDOzs7OytCQUNlQTs7O2VBQUFBOzs7QUFBVCxTQUFTQSxpQkFBaUJDLFVBQW1CLEVBQUVDLElBQWE7SUFDbEUsTUFBTUMsTUFBTUYsWUFBWUcsVUFBVUYsTUFBTUUsVUFBVTtJQUNsRCxPQUFPRDtBQUNSIn0=
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "ScaffoldService", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return ScaffoldService;
9
+ }
10
+ });
11
+ async function scaffold(workspace, cliOptions, features) {
12
+ const options = await getAllOptions(workspace, cliOptions, features);
13
+ // Features mutate workspace models first, then workspace renders to disk.
14
+ await scaffoldFeatures(workspace, options, features);
15
+ await scaffoldWorkspace(workspace, options);
16
+ // Post-write phase: install deps, print final messages, etc.
17
+ await finalizeFeatures(workspace, options, features);
18
+ }
19
+ async function scaffoldWorkspace(workspace, _options) {
20
+ await workspace.scaffold();
21
+ }
22
+ /**
23
+ * Iterate features in order, calling `getOptions` on each.
24
+ * Each feature receives the running merged options so later features can
25
+ * branch on decisions made by earlier ones (e.g. database choice affects auth).
26
+ * Results are shallow-merged, so features only need to return what they own.
27
+ */ async function getAllOptions(workspace, cliOptions, features) {
28
+ let options = {
29
+ ...cliOptions
30
+ };
31
+ for (const feature of features){
32
+ const featureOptions = await feature.getOptions(workspace, options);
33
+ options = {
34
+ ...options,
35
+ ...featureOptions
36
+ };
37
+ }
38
+ return options;
39
+ }
40
+ /**
41
+ * Iterate features in order, calling `scaffold` with the fully-resolved options.
42
+ * All option-gathering is complete before any scaffolding begins.
43
+ */ async function scaffoldFeatures(workspace, options, features) {
44
+ for (const feature of features){
45
+ await feature.scaffold(workspace, options);
46
+ }
47
+ }
48
+ /**
49
+ * Iterate features in order, calling `finalize` on each (if defined).
50
+ * All files are on disk by this point.
51
+ */ async function finalizeFeatures(workspace, options, features) {
52
+ for (const feature of features){
53
+ if (feature.finalize) {
54
+ await feature.finalize(workspace, options);
55
+ }
56
+ }
57
+ }
58
+ const ScaffoldService = {
59
+ scaffold
60
+ };
61
+
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjYWZmb2xkL3NyYy9zZXJ2aWNlcy9zY2FmZm9sZC5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgV29ya3NwYWNlU2NhZmZvbGQgfSBmcm9tIFwiLi4vbW9kZWxzL3Byb2plY3QubW9kZWwuanNcIjtcblxuLyoqXG4gKiBBIGZlYXR1cmUgaGFzIHRocmVlIHJlc3BvbnNpYmlsaXRpZXM6XG4gKiAgMS4gYGdldE9wdGlvbnNgIOKAlCByZXNvbHZlIHByb3ZpZGVyIHNlbGVjdGlvbiBhbmQgYW55IGZvbGxvdy11cCBxdWVzdGlvbnMuXG4gKiAgICAgUmVjZWl2ZXMgdGhlIG9wdGlvbnMgY29sbGVjdGVkIHNvIGZhcjsgcmV0dXJucyBvbmx5IHRoZSBrZXlzIGl0IG93bnMuXG4gKiAgICAgU2hvcnQtY2lyY3VpdHMgaWYgdGhlIGNhbGxlciBhbHJlYWR5IHN1cHBsaWVkIHRob3NlIGtleXMgdmlhIENMSSBmbGFncy5cbiAqICAyLiBgc2NhZmZvbGRgIOKAlCBtdXRhdGUgdGhlIHdvcmtzcGFjZSBtb2RlbHMgYW5kL29yIHdyaXRlIGZpbGVzIHVzaW5nIHRoZVxuICogICAgIGZ1bGx5LXJlc29sdmVkIG9wdGlvbnMuIENhbGxlZCBhZnRlciBBTEwgZmVhdHVyZXMgaGF2ZSBnYXRoZXJlZCBvcHRpb25zXG4gKiAgICAgYnV0IEJFRk9SRSBmaWxlcyBhcmUgd3JpdHRlbiB0byBkaXNrLlxuICogIDMuIGBmaW5hbGl6ZWAgKG9wdGlvbmFsKSDigJQgcnVuIHBvc3Qtd3JpdGUgYWN0aW9ucyAoZS5nLiBpbnN0YWxsIGRlcGVuZGVuY2llcykuXG4gKiAgICAgQ2FsbGVkIGFmdGVyIHdvcmtzcGFjZS5zY2FmZm9sZCgpIGhhcyBmbHVzaGVkIGFsbCBmaWxlcyB0byBkaXNrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmU8VE9wdGlvbnMgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+IHtcblx0Z2V0T3B0aW9ucyhcblx0XHR3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLFxuXHRcdGNsaU9wdGlvbnM6IFBhcnRpYWw8VE9wdGlvbnM+LFxuXHQpOiBQcm9taXNlPFBhcnRpYWw8VE9wdGlvbnM+Pjtcblx0c2NhZmZvbGQod29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCwgb3B0aW9uczogVE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcblx0ZmluYWxpemU/KHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsIG9wdGlvbnM6IFRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkKFxuXHR3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLFxuXHRjbGlPcHRpb25zOiBvYmplY3QsXG5cdGZlYXR1cmVzOiBGZWF0dXJlW10sXG4pIHtcblx0Y29uc3Qgb3B0aW9ucyA9IGF3YWl0IGdldEFsbE9wdGlvbnMod29ya3NwYWNlLCBjbGlPcHRpb25zLCBmZWF0dXJlcyk7XG5cdC8vIEZlYXR1cmVzIG11dGF0ZSB3b3Jrc3BhY2UgbW9kZWxzIGZpcnN0LCB0aGVuIHdvcmtzcGFjZSByZW5kZXJzIHRvIGRpc2suXG5cdGF3YWl0IHNjYWZmb2xkRmVhdHVyZXMod29ya3NwYWNlLCBvcHRpb25zLCBmZWF0dXJlcyk7XG5cdGF3YWl0IHNjYWZmb2xkV29ya3NwYWNlKHdvcmtzcGFjZSwgb3B0aW9ucyk7XG5cdC8vIFBvc3Qtd3JpdGUgcGhhc2U6IGluc3RhbGwgZGVwcywgcHJpbnQgZmluYWwgbWVzc2FnZXMsIGV0Yy5cblx0YXdhaXQgZmluYWxpemVGZWF0dXJlcyh3b3Jrc3BhY2UsIG9wdGlvbnMsIGZlYXR1cmVzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2NhZmZvbGRXb3Jrc3BhY2Uod29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCwgX29wdGlvbnM6IG9iamVjdCkge1xuXHRhd2FpdCB3b3Jrc3BhY2Uuc2NhZmZvbGQoKTtcbn1cblxuLyoqXG4gKiBJdGVyYXRlIGZlYXR1cmVzIGluIG9yZGVyLCBjYWxsaW5nIGBnZXRPcHRpb25zYCBvbiBlYWNoLlxuICogRWFjaCBmZWF0dXJlIHJlY2VpdmVzIHRoZSBydW5uaW5nIG1lcmdlZCBvcHRpb25zIHNvIGxhdGVyIGZlYXR1cmVzIGNhblxuICogYnJhbmNoIG9uIGRlY2lzaW9ucyBtYWRlIGJ5IGVhcmxpZXIgb25lcyAoZS5nLiBkYXRhYmFzZSBjaG9pY2UgYWZmZWN0cyBhdXRoKS5cbiAqIFJlc3VsdHMgYXJlIHNoYWxsb3ctbWVyZ2VkLCBzbyBmZWF0dXJlcyBvbmx5IG5lZWQgdG8gcmV0dXJuIHdoYXQgdGhleSBvd24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbE9wdGlvbnMoXG5cdHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsXG5cdGNsaU9wdGlvbnM6IG9iamVjdCxcblx0ZmVhdHVyZXM6IEZlYXR1cmVbXSxcbik6IFByb21pc2U8b2JqZWN0PiB7XG5cdGxldCBvcHRpb25zID0geyAuLi5jbGlPcHRpb25zIH07XG5cdGZvciAoY29uc3QgZmVhdHVyZSBvZiBmZWF0dXJlcykge1xuXHRcdGNvbnN0IGZlYXR1cmVPcHRpb25zID0gYXdhaXQgZmVhdHVyZS5nZXRPcHRpb25zKHdvcmtzcGFjZSwgb3B0aW9ucyk7XG5cdFx0b3B0aW9ucyA9IHsgLi4ub3B0aW9ucywgLi4uZmVhdHVyZU9wdGlvbnMgfTtcblx0fVxuXHRyZXR1cm4gb3B0aW9ucztcbn1cblxuLyoqXG4gKiBJdGVyYXRlIGZlYXR1cmVzIGluIG9yZGVyLCBjYWxsaW5nIGBzY2FmZm9sZGAgd2l0aCB0aGUgZnVsbHktcmVzb2x2ZWQgb3B0aW9ucy5cbiAqIEFsbCBvcHRpb24tZ2F0aGVyaW5nIGlzIGNvbXBsZXRlIGJlZm9yZSBhbnkgc2NhZmZvbGRpbmcgYmVnaW5zLlxuICovXG5hc3luYyBmdW5jdGlvbiBzY2FmZm9sZEZlYXR1cmVzKFxuXHR3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLFxuXHRvcHRpb25zOiBvYmplY3QsXG5cdGZlYXR1cmVzOiBGZWF0dXJlW10sXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0Zm9yIChjb25zdCBmZWF0dXJlIG9mIGZlYXR1cmVzKSB7XG5cdFx0YXdhaXQgZmVhdHVyZS5zY2FmZm9sZCh3b3Jrc3BhY2UsIG9wdGlvbnMgYXMgbmV2ZXIpO1xuXHR9XG59XG5cbi8qKlxuICogSXRlcmF0ZSBmZWF0dXJlcyBpbiBvcmRlciwgY2FsbGluZyBgZmluYWxpemVgIG9uIGVhY2ggKGlmIGRlZmluZWQpLlxuICogQWxsIGZpbGVzIGFyZSBvbiBkaXNrIGJ5IHRoaXMgcG9pbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpbmFsaXplRmVhdHVyZXMoXG5cdHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsXG5cdG9wdGlvbnM6IG9iamVjdCxcblx0ZmVhdHVyZXM6IEZlYXR1cmVbXSxcbik6IFByb21pc2U8dm9pZD4ge1xuXHRmb3IgKGNvbnN0IGZlYXR1cmUgb2YgZmVhdHVyZXMpIHtcblx0XHRpZiAoZmVhdHVyZS5maW5hbGl6ZSkge1xuXHRcdFx0YXdhaXQgZmVhdHVyZS5maW5hbGl6ZSh3b3Jrc3BhY2UsIG9wdGlvbnMgYXMgbmV2ZXIpO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgY29uc3QgU2NhZmZvbGRTZXJ2aWNlID0geyBzY2FmZm9sZCB9O1xuIl0sIm5hbWVzIjpbIlNjYWZmb2xkU2VydmljZSIsInNjYWZmb2xkIiwid29ya3NwYWNlIiwiY2xpT3B0aW9ucyIsImZlYXR1cmVzIiwib3B0aW9ucyIsImdldEFsbE9wdGlvbnMiLCJzY2FmZm9sZEZlYXR1cmVzIiwic2NhZmZvbGRXb3Jrc3BhY2UiLCJmaW5hbGl6ZUZlYXR1cmVzIiwiX29wdGlvbnMiLCJmZWF0dXJlIiwiZmVhdHVyZU9wdGlvbnMiLCJnZXRPcHRpb25zIiwiZmluYWxpemUiXSwibWFwcGluZ3MiOiI7Ozs7K0JBd0ZhQTs7O2VBQUFBOzs7QUFsRWIsZUFBZUMsU0FDZEMsU0FBNEIsRUFDNUJDLFVBQWtCLEVBQ2xCQyxRQUFtQjtJQUVuQixNQUFNQyxVQUFVLE1BQU1DLGNBQWNKLFdBQVdDLFlBQVlDO0lBQzNELDBFQUEwRTtJQUMxRSxNQUFNRyxpQkFBaUJMLFdBQVdHLFNBQVNEO0lBQzNDLE1BQU1JLGtCQUFrQk4sV0FBV0c7SUFDbkMsNkRBQTZEO0lBQzdELE1BQU1JLGlCQUFpQlAsV0FBV0csU0FBU0Q7QUFDNUM7QUFFQSxlQUFlSSxrQkFBa0JOLFNBQTRCLEVBQUVRLFFBQWdCO0lBQzlFLE1BQU1SLFVBQVVELFFBQVE7QUFDekI7QUFFQTs7Ozs7Q0FLQyxHQUNELGVBQWVLLGNBQ2RKLFNBQTRCLEVBQzVCQyxVQUFrQixFQUNsQkMsUUFBbUI7SUFFbkIsSUFBSUMsVUFBVTtRQUFFLEdBQUdGLFVBQVU7SUFBQztJQUM5QixLQUFLLE1BQU1RLFdBQVdQLFNBQVU7UUFDL0IsTUFBTVEsaUJBQWlCLE1BQU1ELFFBQVFFLFVBQVUsQ0FBQ1gsV0FBV0c7UUFDM0RBLFVBQVU7WUFBRSxHQUFHQSxPQUFPO1lBQUUsR0FBR08sY0FBYztRQUFDO0lBQzNDO0lBQ0EsT0FBT1A7QUFDUjtBQUVBOzs7Q0FHQyxHQUNELGVBQWVFLGlCQUNkTCxTQUE0QixFQUM1QkcsT0FBZSxFQUNmRCxRQUFtQjtJQUVuQixLQUFLLE1BQU1PLFdBQVdQLFNBQVU7UUFDL0IsTUFBTU8sUUFBUVYsUUFBUSxDQUFDQyxXQUFXRztJQUNuQztBQUNEO0FBRUE7OztDQUdDLEdBQ0QsZUFBZUksaUJBQ2RQLFNBQTRCLEVBQzVCRyxPQUFlLEVBQ2ZELFFBQW1CO0lBRW5CLEtBQUssTUFBTU8sV0FBV1AsU0FBVTtRQUMvQixJQUFJTyxRQUFRRyxRQUFRLEVBQUU7WUFDckIsTUFBTUgsUUFBUUcsUUFBUSxDQUFDWixXQUFXRztRQUNuQztJQUNEO0FBQ0Q7QUFFTyxNQUFNTCxrQkFBa0I7SUFBRUM7QUFBUyJ9