@decohere/create 0.0.1-dev.126 → 0.0.1-dev.16

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.
@@ -3,5 +3,13 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- const _runner = require("./runner.js");
7
- (0, _runner.runInBuilder)(process.argv.slice(2));
6
+ const _nodepath = require("node:path");
7
+ const _commander = require("commander");
8
+ const _scaffold = require("./scaffold.js");
9
+ const program = new _commander.Command();
10
+ program.name("decohere").description("Scaffold a new Decohere project").argument("[directory]", "Target directory (default: current directory)", ".").option("-y, --yes", "Skip confirmation prompts").option("-t, --template <template>", "Project template: basic (default) or webapi", "basic").option("-d, --database <provider>", "Database provider to include (webapi only): typeorm").action(async (directory, opts)=>{
11
+ await (0, _scaffold.scaffold)((0, _nodepath.resolve)(directory), opts);
12
+ });
13
+ program.parse();
14
+
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHsgc2NhZmZvbGQgfSBmcm9tIFwiLi9zY2FmZm9sZC5qc1wiO1xuXG5jb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKTtcblxucHJvZ3JhbVxuXHQubmFtZShcImRlY29oZXJlXCIpXG5cdC5kZXNjcmlwdGlvbihcIlNjYWZmb2xkIGEgbmV3IERlY29oZXJlIHByb2plY3RcIilcblx0LmFyZ3VtZW50KFwiW2RpcmVjdG9yeV1cIiwgXCJUYXJnZXQgZGlyZWN0b3J5IChkZWZhdWx0OiBjdXJyZW50IGRpcmVjdG9yeSlcIiwgXCIuXCIpXG5cdC5vcHRpb24oXCIteSwgLS15ZXNcIiwgXCJTa2lwIGNvbmZpcm1hdGlvbiBwcm9tcHRzXCIpXG5cdC5vcHRpb24oXCItdCwgLS10ZW1wbGF0ZSA8dGVtcGxhdGU+XCIsIFwiUHJvamVjdCB0ZW1wbGF0ZTogYmFzaWMgKGRlZmF1bHQpIG9yIHdlYmFwaVwiLCBcImJhc2ljXCIpXG5cdC5vcHRpb24oXCItZCwgLS1kYXRhYmFzZSA8cHJvdmlkZXI+XCIsIFwiRGF0YWJhc2UgcHJvdmlkZXIgdG8gaW5jbHVkZSAod2ViYXBpIG9ubHkpOiB0eXBlb3JtXCIpXG5cdC5hY3Rpb24oXG5cdFx0YXN5bmMgKFxuXHRcdFx0ZGlyZWN0b3J5OiBzdHJpbmcsXG5cdFx0XHRvcHRzOiB7IHllcz86IGJvb2xlYW47IHRlbXBsYXRlPzogXCJiYXNpY1wiIHwgXCJ3ZWJhcGlcIjsgZGF0YWJhc2U/OiBcInR5cGVvcm1cIiB9LFxuXHRcdCkgPT4ge1xuXHRcdFx0YXdhaXQgc2NhZmZvbGQocmVzb2x2ZShkaXJlY3RvcnkpLCBvcHRzKTtcblx0XHR9LFxuXHQpO1xuXG5wcm9ncmFtLnBhcnNlKCk7XG4iXSwibmFtZXMiOlsicHJvZ3JhbSIsIkNvbW1hbmQiLCJuYW1lIiwiZGVzY3JpcHRpb24iLCJhcmd1bWVudCIsIm9wdGlvbiIsImFjdGlvbiIsImRpcmVjdG9yeSIsIm9wdHMiLCJzY2FmZm9sZCIsInJlc29sdmUiLCJwYXJzZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7MEJBQ3dCOzJCQUNBOzBCQUNDO0FBRXpCLE1BQU1BLFVBQVUsSUFBSUMsa0JBQU87QUFFM0JELFFBQ0VFLElBQUksQ0FBQyxZQUNMQyxXQUFXLENBQUMsbUNBQ1pDLFFBQVEsQ0FBQyxlQUFlLGlEQUFpRCxLQUN6RUMsTUFBTSxDQUFDLGFBQWEsNkJBQ3BCQSxNQUFNLENBQUMsNkJBQTZCLCtDQUErQyxTQUNuRkEsTUFBTSxDQUFDLDZCQUE2Qix1REFDcENDLE1BQU0sQ0FDTixPQUNDQyxXQUNBQztJQUVBLE1BQU1DLElBQUFBLGtCQUFRLEVBQUNDLElBQUFBLGlCQUFPLEVBQUNILFlBQVlDO0FBQ3BDO0FBR0ZSLFFBQVFXLEtBQUsifQ==
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "scaffold", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return scaffold;
9
+ }
10
+ });
11
+ const _nodefs = require("node:fs");
12
+ const _promises = require("node:fs/promises");
13
+ const _nodepath = require("node:path");
14
+ const _promises1 = require("node:readline/promises");
15
+ const _interop = require("@decohere/nexus/interop");
16
+ const _templates = require("./templates.js");
17
+ async function scaffold(targetDir, opts) {
18
+ const name = (0, _nodepath.basename)(targetDir);
19
+ if ((0, _nodefs.existsSync)(targetDir) && (0, _nodefs.readdirSync)(targetDir).length > 0 && !opts.yes) {
20
+ const rl = (0, _promises1.createInterface)({
21
+ input: process.stdin,
22
+ output: process.stdout
23
+ });
24
+ const answer = await rl.question(`Directory "${name}" is not empty. Continue? [y/N] `);
25
+ rl.close();
26
+ if (!answer.trim().toLowerCase().startsWith("y")) {
27
+ console.log("Aborted.");
28
+ process.exit(0);
29
+ }
30
+ }
31
+ if (opts.template === "webapi") {
32
+ const dbOpts = opts.database ? {
33
+ database: opts.database
34
+ } : undefined;
35
+ await (0, _promises.mkdir)((0, _nodepath.join)(targetDir, "projects", "api", "src", "controllers"), {
36
+ recursive: true
37
+ });
38
+ await (0, _promises.mkdir)((0, _nodepath.join)(targetDir, "config"), {
39
+ recursive: true
40
+ });
41
+ const writes = [
42
+ (0, _promises.writeFile)((0, _nodepath.join)(targetDir, "package.json"), (0, _templates.WEB_API_ROOT_PACKAGE_JSON)(name, dbOpts)),
43
+ (0, _promises.writeFile)((0, _nodepath.join)(targetDir, "tsconfig.json"), _templates.WEB_API_TSCONFIG),
44
+ (0, _promises.writeFile)((0, _nodepath.join)(targetDir, "projects", "api", "package.json"), (0, _templates.WEB_API_APP_PACKAGE_JSON)(name)),
45
+ (0, _promises.writeFile)((0, _nodepath.join)(targetDir, "projects", "api", "src", "main.ts"), (0, _templates.WEB_API_MAIN_TS)(name, dbOpts)),
46
+ (0, _promises.writeFile)((0, _nodepath.join)(targetDir, "projects", "api", "src", "controllers", "hello.controller.ts"), _templates.HELLO_CONTROLLER_TS),
47
+ (0, _promises.writeFile)((0, _nodepath.join)(targetDir, "projects", "api", "src", "sample.config.ts"), _templates.SAMPLE_CONFIG_TS),
48
+ (0, _promises.writeFile)((0, _nodepath.join)(targetDir, "projects", "api", "src", "sample.service.ts"), _templates.SAMPLE_SERVICE_TS),
49
+ (0, _promises.writeFile)((0, _nodepath.join)(targetDir, "config", "config.yaml"), (0, _templates.CONFIG_YAML)(name, dbOpts)),
50
+ (0, _promises.writeFile)((0, _nodepath.join)(targetDir, "config", "config.dev.yaml"), _templates.CONFIG_DEV_YAML)
51
+ ];
52
+ if (opts.database === "typeorm") {
53
+ await (0, _promises.mkdir)((0, _nodepath.join)(targetDir, "projects", "api", "src", "entities"), {
54
+ recursive: true
55
+ });
56
+ await (0, _promises.mkdir)((0, _nodepath.join)(targetDir, "projects", "api", "src", "repositories"), {
57
+ recursive: true
58
+ });
59
+ writes.push((0, _promises.writeFile)((0, _nodepath.join)(targetDir, "projects", "api", "src", "entities", "sample.entity.ts"), _templates.SAMPLE_ENTITY_TS), (0, _promises.writeFile)((0, _nodepath.join)(targetDir, "projects", "api", "src", "repositories", "sample.repository.ts"), _templates.SAMPLE_REPOSITORY_TS), (0, _promises.writeFile)((0, _nodepath.join)(targetDir, "config", "config.prod.yaml"), _templates.CONFIG_PROD_YAML));
60
+ }
61
+ await Promise.all(writes);
62
+ } else {
63
+ await (0, _promises.mkdir)((0, _nodepath.join)(targetDir, "projects", "app", "src"), {
64
+ recursive: true
65
+ });
66
+ await Promise.all([
67
+ (0, _promises.writeFile)((0, _nodepath.join)(targetDir, "package.json"), (0, _templates.ROOT_PACKAGE_JSON)(name)),
68
+ (0, _promises.writeFile)((0, _nodepath.join)(targetDir, "tsconfig.json"), _templates.TSCONFIG),
69
+ (0, _promises.writeFile)((0, _nodepath.join)(targetDir, "projects", "app", "package.json"), (0, _templates.APP_PACKAGE_JSON)(name)),
70
+ (0, _promises.writeFile)((0, _nodepath.join)(targetDir, "projects", "app", "src", "main.ts"), _templates.MAIN_TS)
71
+ ]);
72
+ }
73
+ console.log(`\nScaffolded ${name}. Installing dependencies...\n`);
74
+ let pm = (0, _interop.detectPackageManager)(targetDir);
75
+ if (pm == null) {
76
+ pm = await (0, _interop.promptForPackageManager)();
77
+ }
78
+ await pm.install({
79
+ cwd: targetDir
80
+ });
81
+ console.log(`\nDone! Next steps:\n`);
82
+ if ((0, _nodepath.basename)(targetDir) !== targetDir) {
83
+ console.log(` cd ${name}`);
84
+ }
85
+ console.log(" pnpm build # forge build");
86
+ console.log(" pnpm dev # flux serve\n");
87
+ }
88
+
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvc2NhZmZvbGQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZGRpclN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgbWtkaXIsIHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBiYXNlbmFtZSwgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGNyZWF0ZUludGVyZmFjZSB9IGZyb20gXCJub2RlOnJlYWRsaW5lL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBkZXRlY3RQYWNrYWdlTWFuYWdlciwgcHJvbXB0Rm9yUGFja2FnZU1hbmFnZXIgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2ludGVyb3BcIjtcbmltcG9ydCB7XG5cdEFQUF9QQUNLQUdFX0pTT04sXG5cdENPTkZJR19ERVZfWUFNTCxcblx0Q09ORklHX1BST0RfWUFNTCxcblx0Q09ORklHX1lBTUwsXG5cdEhFTExPX0NPTlRST0xMRVJfVFMsXG5cdE1BSU5fVFMsXG5cdFJPT1RfUEFDS0FHRV9KU09OLFxuXHRTQU1QTEVfQ09ORklHX1RTLFxuXHRTQU1QTEVfRU5USVRZX1RTLFxuXHRTQU1QTEVfUkVQT1NJVE9SWV9UUyxcblx0U0FNUExFX1NFUlZJQ0VfVFMsXG5cdFRTQ09ORklHLFxuXHRXRUJfQVBJX0FQUF9QQUNLQUdFX0pTT04sXG5cdFdFQl9BUElfTUFJTl9UUyxcblx0V0VCX0FQSV9ST09UX1BBQ0tBR0VfSlNPTixcblx0V0VCX0FQSV9UU0NPTkZJRyxcbn0gZnJvbSBcIi4vdGVtcGxhdGVzLmpzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NhZmZvbGRPcHRpb25zIHtcblx0eWVzPzogYm9vbGVhbjtcblx0dGVtcGxhdGU/OiBcImJhc2ljXCIgfCBcIndlYmFwaVwiO1xuXHRkYXRhYmFzZT86IFwidHlwZW9ybVwiO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2NhZmZvbGQodGFyZ2V0RGlyOiBzdHJpbmcsIG9wdHM6IFNjYWZmb2xkT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuXHRjb25zdCBuYW1lID0gYmFzZW5hbWUodGFyZ2V0RGlyKTtcblxuXHRpZiAoZXhpc3RzU3luYyh0YXJnZXREaXIpICYmIHJlYWRkaXJTeW5jKHRhcmdldERpcikubGVuZ3RoID4gMCAmJiAhb3B0cy55ZXMpIHtcblx0XHRjb25zdCBybCA9IGNyZWF0ZUludGVyZmFjZSh7XG5cdFx0XHRpbnB1dDogcHJvY2Vzcy5zdGRpbixcblx0XHRcdG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG5cdFx0fSk7XG5cdFx0Y29uc3QgYW5zd2VyID0gYXdhaXQgcmwucXVlc3Rpb24oYERpcmVjdG9yeSBcIiR7bmFtZX1cIiBpcyBub3QgZW1wdHkuIENvbnRpbnVlPyBbeS9OXSBgKTtcblx0XHRybC5jbG9zZSgpO1xuXHRcdGlmICghYW5zd2VyLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJ5XCIpKSB7XG5cdFx0XHRjb25zb2xlLmxvZyhcIkFib3J0ZWQuXCIpO1xuXHRcdFx0cHJvY2Vzcy5leGl0KDApO1xuXHRcdH1cblx0fVxuXG5cdGlmIChvcHRzLnRlbXBsYXRlID09PSBcIndlYmFwaVwiKSB7XG5cdFx0Y29uc3QgZGJPcHRzID0gb3B0cy5kYXRhYmFzZSA/IHsgZGF0YWJhc2U6IG9wdHMuZGF0YWJhc2UgfSA6IHVuZGVmaW5lZDtcblx0XHRhd2FpdCBta2Rpcihqb2luKHRhcmdldERpciwgXCJwcm9qZWN0c1wiLCBcImFwaVwiLCBcInNyY1wiLCBcImNvbnRyb2xsZXJzXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRhd2FpdCBta2Rpcihqb2luKHRhcmdldERpciwgXCJjb25maWdcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdGNvbnN0IHdyaXRlcyA9IFtcblx0XHRcdHdyaXRlRmlsZShqb2luKHRhcmdldERpciwgXCJwYWNrYWdlLmpzb25cIiksIFdFQl9BUElfUk9PVF9QQUNLQUdFX0pTT04obmFtZSwgZGJPcHRzKSksXG5cdFx0XHR3cml0ZUZpbGUoam9pbih0YXJnZXREaXIsIFwidHNjb25maWcuanNvblwiKSwgV0VCX0FQSV9UU0NPTkZJRyksXG5cdFx0XHR3cml0ZUZpbGUoXG5cdFx0XHRcdGpvaW4odGFyZ2V0RGlyLCBcInByb2plY3RzXCIsIFwiYXBpXCIsIFwicGFja2FnZS5qc29uXCIpLFxuXHRcdFx0XHRXRUJfQVBJX0FQUF9QQUNLQUdFX0pTT04obmFtZSksXG5cdFx0XHQpLFxuXHRcdFx0d3JpdGVGaWxlKFxuXHRcdFx0XHRqb2luKHRhcmdldERpciwgXCJwcm9qZWN0c1wiLCBcImFwaVwiLCBcInNyY1wiLCBcIm1haW4udHNcIiksXG5cdFx0XHRcdFdFQl9BUElfTUFJTl9UUyhuYW1lLCBkYk9wdHMpLFxuXHRcdFx0KSxcblx0XHRcdHdyaXRlRmlsZShcblx0XHRcdFx0am9pbih0YXJnZXREaXIsIFwicHJvamVjdHNcIiwgXCJhcGlcIiwgXCJzcmNcIiwgXCJjb250cm9sbGVyc1wiLCBcImhlbGxvLmNvbnRyb2xsZXIudHNcIiksXG5cdFx0XHRcdEhFTExPX0NPTlRST0xMRVJfVFMsXG5cdFx0XHQpLFxuXHRcdFx0d3JpdGVGaWxlKFxuXHRcdFx0XHRqb2luKHRhcmdldERpciwgXCJwcm9qZWN0c1wiLCBcImFwaVwiLCBcInNyY1wiLCBcInNhbXBsZS5jb25maWcudHNcIiksXG5cdFx0XHRcdFNBTVBMRV9DT05GSUdfVFMsXG5cdFx0XHQpLFxuXHRcdFx0d3JpdGVGaWxlKFxuXHRcdFx0XHRqb2luKHRhcmdldERpciwgXCJwcm9qZWN0c1wiLCBcImFwaVwiLCBcInNyY1wiLCBcInNhbXBsZS5zZXJ2aWNlLnRzXCIpLFxuXHRcdFx0XHRTQU1QTEVfU0VSVklDRV9UUyxcblx0XHRcdCksXG5cdFx0XHR3cml0ZUZpbGUoam9pbih0YXJnZXREaXIsIFwiY29uZmlnXCIsIFwiY29uZmlnLnlhbWxcIiksIENPTkZJR19ZQU1MKG5hbWUsIGRiT3B0cykpLFxuXHRcdFx0d3JpdGVGaWxlKGpvaW4odGFyZ2V0RGlyLCBcImNvbmZpZ1wiLCBcImNvbmZpZy5kZXYueWFtbFwiKSwgQ09ORklHX0RFVl9ZQU1MKSxcblx0XHRdO1xuXHRcdGlmIChvcHRzLmRhdGFiYXNlID09PSBcInR5cGVvcm1cIikge1xuXHRcdFx0YXdhaXQgbWtkaXIoam9pbih0YXJnZXREaXIsIFwicHJvamVjdHNcIiwgXCJhcGlcIiwgXCJzcmNcIiwgXCJlbnRpdGllc1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRhd2FpdCBta2Rpcihqb2luKHRhcmdldERpciwgXCJwcm9qZWN0c1wiLCBcImFwaVwiLCBcInNyY1wiLCBcInJlcG9zaXRvcmllc1wiKSwge1xuXHRcdFx0XHRyZWN1cnNpdmU6IHRydWUsXG5cdFx0XHR9KTtcblx0XHRcdHdyaXRlcy5wdXNoKFxuXHRcdFx0XHR3cml0ZUZpbGUoXG5cdFx0XHRcdFx0am9pbih0YXJnZXREaXIsIFwicHJvamVjdHNcIiwgXCJhcGlcIiwgXCJzcmNcIiwgXCJlbnRpdGllc1wiLCBcInNhbXBsZS5lbnRpdHkudHNcIiksXG5cdFx0XHRcdFx0U0FNUExFX0VOVElUWV9UUyxcblx0XHRcdFx0KSxcblx0XHRcdFx0d3JpdGVGaWxlKFxuXHRcdFx0XHRcdGpvaW4odGFyZ2V0RGlyLCBcInByb2plY3RzXCIsIFwiYXBpXCIsIFwic3JjXCIsIFwicmVwb3NpdG9yaWVzXCIsIFwic2FtcGxlLnJlcG9zaXRvcnkudHNcIiksXG5cdFx0XHRcdFx0U0FNUExFX1JFUE9TSVRPUllfVFMsXG5cdFx0XHRcdCksXG5cdFx0XHRcdHdyaXRlRmlsZShqb2luKHRhcmdldERpciwgXCJjb25maWdcIiwgXCJjb25maWcucHJvZC55YW1sXCIpLCBDT05GSUdfUFJPRF9ZQU1MKSxcblx0XHRcdCk7XG5cdFx0fVxuXHRcdGF3YWl0IFByb21pc2UuYWxsKHdyaXRlcyk7XG5cdH0gZWxzZSB7XG5cdFx0YXdhaXQgbWtkaXIoam9pbih0YXJnZXREaXIsIFwicHJvamVjdHNcIiwgXCJhcHBcIiwgXCJzcmNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdGF3YWl0IFByb21pc2UuYWxsKFtcblx0XHRcdHdyaXRlRmlsZShqb2luKHRhcmdldERpciwgXCJwYWNrYWdlLmpzb25cIiksIFJPT1RfUEFDS0FHRV9KU09OKG5hbWUpKSxcblx0XHRcdHdyaXRlRmlsZShqb2luKHRhcmdldERpciwgXCJ0c2NvbmZpZy5qc29uXCIpLCBUU0NPTkZJRyksXG5cdFx0XHR3cml0ZUZpbGUoam9pbih0YXJnZXREaXIsIFwicHJvamVjdHNcIiwgXCJhcHBcIiwgXCJwYWNrYWdlLmpzb25cIiksIEFQUF9QQUNLQUdFX0pTT04obmFtZSkpLFxuXHRcdFx0d3JpdGVGaWxlKGpvaW4odGFyZ2V0RGlyLCBcInByb2plY3RzXCIsIFwiYXBwXCIsIFwic3JjXCIsIFwibWFpbi50c1wiKSwgTUFJTl9UUyksXG5cdFx0XSk7XG5cdH1cblxuXHRjb25zb2xlLmxvZyhgXFxuU2NhZmZvbGRlZCAke25hbWV9LiBJbnN0YWxsaW5nIGRlcGVuZGVuY2llcy4uLlxcbmApO1xuXHRsZXQgcG0gPSBkZXRlY3RQYWNrYWdlTWFuYWdlcih0YXJnZXREaXIpO1xuXHRpZiAocG0gPT0gbnVsbCkge1xuXHRcdHBtID0gYXdhaXQgcHJvbXB0Rm9yUGFja2FnZU1hbmFnZXIoKTtcblx0fVxuXHRhd2FpdCBwbS5pbnN0YWxsKHsgY3dkOiB0YXJnZXREaXIgfSk7XG5cblx0Y29uc29sZS5sb2coYFxcbkRvbmUhIE5leHQgc3RlcHM6XFxuYCk7XG5cdGlmIChiYXNlbmFtZSh0YXJnZXREaXIpICE9PSB0YXJnZXREaXIpIHtcblx0XHRjb25zb2xlLmxvZyhgICBjZCAke25hbWV9YCk7XG5cdH1cblx0Y29uc29sZS5sb2coXCIgIHBucG0gYnVpbGQgICAgICMgZm9yZ2UgYnVpbGRcIik7XG5cdGNvbnNvbGUubG9nKFwiICBwbnBtIGRldiAgICAgICAjIGZsdXggc2VydmVcXG5cIik7XG59XG4iXSwibmFtZXMiOlsic2NhZmZvbGQiLCJ0YXJnZXREaXIiLCJvcHRzIiwibmFtZSIsImJhc2VuYW1lIiwiZXhpc3RzU3luYyIsInJlYWRkaXJTeW5jIiwibGVuZ3RoIiwieWVzIiwicmwiLCJjcmVhdGVJbnRlcmZhY2UiLCJpbnB1dCIsInByb2Nlc3MiLCJzdGRpbiIsIm91dHB1dCIsInN0ZG91dCIsImFuc3dlciIsInF1ZXN0aW9uIiwiY2xvc2UiLCJ0cmltIiwidG9Mb3dlckNhc2UiLCJzdGFydHNXaXRoIiwiY29uc29sZSIsImxvZyIsImV4aXQiLCJ0ZW1wbGF0ZSIsImRiT3B0cyIsImRhdGFiYXNlIiwidW5kZWZpbmVkIiwibWtkaXIiLCJqb2luIiwicmVjdXJzaXZlIiwid3JpdGVzIiwid3JpdGVGaWxlIiwiV0VCX0FQSV9ST09UX1BBQ0tBR0VfSlNPTiIsIldFQl9BUElfVFNDT05GSUciLCJXRUJfQVBJX0FQUF9QQUNLQUdFX0pTT04iLCJXRUJfQVBJX01BSU5fVFMiLCJIRUxMT19DT05UUk9MTEVSX1RTIiwiU0FNUExFX0NPTkZJR19UUyIsIlNBTVBMRV9TRVJWSUNFX1RTIiwiQ09ORklHX1lBTUwiLCJDT05GSUdfREVWX1lBTUwiLCJwdXNoIiwiU0FNUExFX0VOVElUWV9UUyIsIlNBTVBMRV9SRVBPU0lUT1JZX1RTIiwiQ09ORklHX1BST0RfWUFNTCIsIlByb21pc2UiLCJhbGwiLCJST09UX1BBQ0tBR0VfSlNPTiIsIlRTQ09ORklHIiwiQVBQX1BBQ0tBR0VfSlNPTiIsIk1BSU5fVFMiLCJwbSIsImRldGVjdFBhY2thZ2VNYW5hZ2VyIiwicHJvbXB0Rm9yUGFja2FnZU1hbmFnZXIiLCJpbnN0YWxsIiwiY3dkIl0sIm1hcHBpbmdzIjoiOzs7OytCQThCc0JBOzs7ZUFBQUE7Ozt3QkE5QmtCOzBCQUNQOzBCQUNGOzJCQUNDO3lCQUM4QjsyQkFrQnZEO0FBUUEsZUFBZUEsU0FBU0MsU0FBaUIsRUFBRUMsSUFBcUI7SUFD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
@@ -0,0 +1,305 @@
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 APP_PACKAGE_JSON () {
13
+ return APP_PACKAGE_JSON;
14
+ },
15
+ get CONFIG_DEV_YAML () {
16
+ return CONFIG_DEV_YAML;
17
+ },
18
+ get CONFIG_PROD_YAML () {
19
+ return CONFIG_PROD_YAML;
20
+ },
21
+ get CONFIG_YAML () {
22
+ return CONFIG_YAML;
23
+ },
24
+ get HELLO_CONTROLLER_TS () {
25
+ return HELLO_CONTROLLER_TS;
26
+ },
27
+ get MAIN_TS () {
28
+ return MAIN_TS;
29
+ },
30
+ get ROOT_PACKAGE_JSON () {
31
+ return ROOT_PACKAGE_JSON;
32
+ },
33
+ get SAMPLE_CONFIG_TS () {
34
+ return SAMPLE_CONFIG_TS;
35
+ },
36
+ get SAMPLE_ENTITY_TS () {
37
+ return SAMPLE_ENTITY_TS;
38
+ },
39
+ get SAMPLE_REPOSITORY_TS () {
40
+ return SAMPLE_REPOSITORY_TS;
41
+ },
42
+ get SAMPLE_SERVICE_TS () {
43
+ return SAMPLE_SERVICE_TS;
44
+ },
45
+ get TSCONFIG () {
46
+ return TSCONFIG;
47
+ },
48
+ get WEB_API_APP_PACKAGE_JSON () {
49
+ return WEB_API_APP_PACKAGE_JSON;
50
+ },
51
+ get WEB_API_MAIN_TS () {
52
+ return WEB_API_MAIN_TS;
53
+ },
54
+ get WEB_API_ROOT_PACKAGE_JSON () {
55
+ return WEB_API_ROOT_PACKAGE_JSON;
56
+ },
57
+ get WEB_API_TSCONFIG () {
58
+ return WEB_API_TSCONFIG;
59
+ }
60
+ });
61
+ function ROOT_PACKAGE_JSON(name) {
62
+ return JSON.stringify({
63
+ name,
64
+ version: "0.0.1",
65
+ type: "module",
66
+ scripts: {
67
+ build: "forge build",
68
+ "build:watch": "forge build --watch",
69
+ dev: "flux serve"
70
+ },
71
+ devDependencies: {
72
+ "@decohere/terminal": "0.0.1-dev.14",
73
+ typescript: "^6.0.3"
74
+ }
75
+ }, null, 2);
76
+ }
77
+ function WEB_API_ROOT_PACKAGE_JSON(name, opts) {
78
+ const deps = {
79
+ "@decohere/cortex": "0.0.1-dev.15",
80
+ "@decohere/protocol": "0.0.1-dev.15",
81
+ "@decohere/scribe": "0.0.1-dev.15",
82
+ "@decohere/scribe-pino": "0.0.1-dev.15",
83
+ "pino-pretty": "^13.0.0"
84
+ };
85
+ if (opts?.database === "typeorm") {
86
+ deps["@decohere/codex"] = "0.0.1-dev.15";
87
+ deps["@decohere/codex-typeorm"] = "0.0.1-dev.15";
88
+ }
89
+ return JSON.stringify({
90
+ name: `${name}.api`,
91
+ version: "0.0.1",
92
+ type: "module",
93
+ scripts: {
94
+ build: "forge build",
95
+ "build:watch": "forge build --watch",
96
+ dev: "flux serve"
97
+ },
98
+ dependencies: deps,
99
+ devDependencies: {
100
+ "@decohere/terminal": "0.0.1-dev.15",
101
+ typescript: "^6.0.3"
102
+ }
103
+ }, null, 2);
104
+ }
105
+ function APP_PACKAGE_JSON(name) {
106
+ return JSON.stringify({
107
+ name: `@${name}/app`,
108
+ version: "0.0.1",
109
+ type: "module",
110
+ main: "src/main.ts"
111
+ }, null, 2);
112
+ }
113
+ const TSCONFIG = JSON.stringify({
114
+ compilerOptions: {
115
+ target: "ES2022",
116
+ module: "NodeNext",
117
+ moduleResolution: "NodeNext",
118
+ strict: true,
119
+ skipLibCheck: true
120
+ },
121
+ include: [
122
+ "projects"
123
+ ]
124
+ }, null, 2);
125
+ const MAIN_TS = `console.log("Hello from Decohere!");
126
+ `;
127
+ const WEB_API_TSCONFIG = JSON.stringify({
128
+ compilerOptions: {
129
+ target: "ES2022",
130
+ module: "NodeNext",
131
+ moduleResolution: "NodeNext",
132
+ strict: true,
133
+ skipLibCheck: true,
134
+ experimentalDecorators: true,
135
+ emitDecoratorMetadata: true
136
+ },
137
+ include: [
138
+ "projects"
139
+ ]
140
+ }, null, 2);
141
+ function WEB_API_APP_PACKAGE_JSON(name) {
142
+ return JSON.stringify({
143
+ name: `@${name}/api`,
144
+ version: "0.0.1",
145
+ type: "module",
146
+ main: "src/main.ts",
147
+ dependencies: {
148
+ "@decohere/cortex": "0.0.1-dev.15"
149
+ }
150
+ }, null, 2);
151
+ }
152
+ function WEB_API_MAIN_TS(name, opts) {
153
+ const dbImport = opts?.database === "typeorm" ? `import "@decohere/codex-typeorm";
154
+ import { SampleEntity } from "./entities/sample.entity.js";
155
+ import { SampleEntityRepository } from "./repositories/sample.repository.js";
156
+ ` : "";
157
+ const dbChain = opts?.database === "typeorm" ? `\n\t.withTypeOrm({ entities: [SampleEntity], repositories: [SampleEntityRepository] })` : "";
158
+ return `import "@decohere/scribe-pino";
159
+ import "@decohere/cortex/http";
160
+ import "@decohere/protocol";
161
+ ${dbImport}import { Builder } from "@decohere/cortex";
162
+ import { FastifyProvider } from "@decohere/cortex/providers";
163
+ import { scribe } from "@decohere/scribe";
164
+ import { YamlDataSource } from "@decohere/protocol";
165
+ import { HelloController } from "./controllers/hello.controller.js";
166
+ import { SampleService } from "./sample.service.js";
167
+
168
+ scribe.extend.withPinoPretty();
169
+
170
+ const app = await Builder.create({ applicationName: "${name}.api" })
171
+ \t.withHttpProvider(FastifyProvider)
172
+ \t.withConfiguration(YamlDataSource)
173
+ \t.withServices((cb) => {
174
+ \t\tcb.registerSingleton(SampleService);
175
+ \t})${dbChain}
176
+ \t.withControllers(HelloController)
177
+ \t.build();
178
+
179
+ await app.start({ port: 3000 });
180
+
181
+ export default app;
182
+ `;
183
+ }
184
+ const HELLO_CONTROLLER_TS = `import { Controller, Delete, Field, Get, Param, Post, Put, Query } from "@decohere/cortex";
185
+ import { SampleService } from "../sample.service.js";
186
+
187
+ class HelloBody {
188
+ @Field("body", "message")
189
+ public message!: string;
190
+ }
191
+
192
+ @Controller({ prefix: "/hello" })
193
+ export class HelloController {
194
+ public constructor(private readonly sample: SampleService) {}
195
+
196
+ @Get()
197
+ public async getAll(@Query("filter") filter: string) {
198
+ const greeting = await this.sample.getGreeting();
199
+ return { filter, message: greeting };
200
+ }
201
+
202
+ @Get("/:id")
203
+ public getOne(@Param("id") id: string) {
204
+ return { id, message: \`Hello \${id}!\` };
205
+ }
206
+
207
+ @Post("/")
208
+ public create(body: HelloBody) {
209
+ return { message: body.message };
210
+ }
211
+
212
+ @Put("/:id")
213
+ public update(@Param("id") id: string, body: HelloBody) {
214
+ return { id, message: body.message };
215
+ }
216
+
217
+ @Delete("/:id")
218
+ public remove(@Param("id") id: string) {
219
+ return { id, deleted: true };
220
+ }
221
+ }
222
+ `;
223
+ const SAMPLE_CONFIG_TS = `export class SampleConfig {
224
+ public greeting: string = "";
225
+ }
226
+ `;
227
+ const SAMPLE_SERVICE_TS = `import { inject, injectable } from "@decohere/crucible/decorators";
228
+ import { ConfigurationServiceToken } from "@decohere/nexus/configuration";
229
+ import type { IConfigurationService } from "@decohere/nexus/configuration";
230
+ import { SampleConfig } from "./sample.config.js";
231
+
232
+ @injectable()
233
+ export class SampleService {
234
+ public constructor(
235
+ @inject(ConfigurationServiceToken) private readonly config: IConfigurationService,
236
+ ) {}
237
+
238
+ public async getGreeting(): Promise<string> {
239
+ const config = await this.config.get(SampleConfig);
240
+ return config.greeting;
241
+ }
242
+ }
243
+ `;
244
+ function CONFIG_YAML(name, opts) {
245
+ const dbSection = opts?.database === "typeorm" ? `database:
246
+ dataSources:
247
+ - name: default
248
+ provider: postgres
249
+ host: localhost
250
+ port: 5432
251
+ database: ${name}_dev
252
+ username: postgres
253
+ password: postgres
254
+ synchronize: true
255
+ seed: false
256
+ adminUser: postgres
257
+ adminPassword: postgres
258
+ ` : "";
259
+ return `sample:
260
+ greeting: Hello from configuration!
261
+ ${dbSection}`;
262
+ }
263
+ const CONFIG_DEV_YAML = `sample:
264
+ greeting: Hello from dev configuration!
265
+ `;
266
+ const CONFIG_PROD_YAML = `database:
267
+ dataSources:
268
+ - name: default
269
+ provider: postgres
270
+ host: \${DB_HOST}
271
+ port: \${DB_PORT}
272
+ database: \${DB_NAME}
273
+ username: \${DB_USER}
274
+ password: \${DB_PASSWORD}
275
+ synchronize: false
276
+ seed: false
277
+ adminUser: \${DB_ADMIN_USER}
278
+ adminPassword: \${DB_ADMIN_PASSWORD}
279
+ `;
280
+ const SAMPLE_ENTITY_TS = `import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";
281
+ import type { Entity as IEntity } from "@decohere/codex";
282
+
283
+ @Entity()
284
+ export class SampleEntity implements IEntity {
285
+ \t@PrimaryGeneratedColumn()
286
+ \tpublic id!: number;
287
+
288
+ \t@Column()
289
+ \tpublic name!: string;
290
+ }
291
+ `;
292
+ const SAMPLE_REPOSITORY_TS = `import { injectable } from "@decohere/crucible/decorators";
293
+ import { injectUnitOfWork } from "@decohere/codex";
294
+ import { TypeOrmRepository, TypeOrmUnitOfWork } from "@decohere/codex-typeorm";
295
+ import { SampleEntity } from "../entities/sample.entity.js";
296
+
297
+ @injectable()
298
+ export class SampleEntityRepository extends TypeOrmRepository<SampleEntity> {
299
+ \tpublic constructor(@injectUnitOfWork() unitOfWork: TypeOrmUnitOfWork) {
300
+ \t\tsuper(unitOfWork, SampleEntity);
301
+ \t}
302
+ }
303
+ `;
304
+
305
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvdGVtcGxhdGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBST09UX1BBQ0tBR0VfSlNPTihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoXG5cdFx0e1xuXHRcdFx0bmFtZSxcblx0XHRcdHZlcnNpb246IFwiMC4wLjFcIixcblx0XHRcdHR5cGU6IFwibW9kdWxlXCIsXG5cdFx0XHRzY3JpcHRzOiB7XG5cdFx0XHRcdGJ1aWxkOiBcImZvcmdlIGJ1aWxkXCIsXG5cdFx0XHRcdFwiYnVpbGQ6d2F0Y2hcIjogXCJmb3JnZSBidWlsZCAtLXdhdGNoXCIsXG5cdFx0XHRcdGRldjogXCJmbHV4IHNlcnZlXCIsXG5cdFx0XHR9LFxuXHRcdFx0ZGV2RGVwZW5kZW5jaWVzOiB7XG5cdFx0XHRcdFwiQGRlY29oZXJlL3Rlcm1pbmFsXCI6IFwiMC4wLjEtZGV2LjE0XCIsXG5cdFx0XHRcdHR5cGVzY3JpcHQ6IFwiXjYuMC4zXCIsXG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0bnVsbCxcblx0XHQyLFxuXHQpO1xufVxuXG5leHBvcnQgdHlwZSBEYXRhYmFzZVByb3ZpZGVyID0gXCJ0eXBlb3JtXCI7XG5cbmV4cG9ydCB0eXBlIFdlYkFwaU9wdGlvbnMgPSB7XG5cdGRhdGFiYXNlPzogRGF0YWJhc2VQcm92aWRlcjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBXRUJfQVBJX1JPT1RfUEFDS0FHRV9KU09OKG5hbWU6IHN0cmluZywgb3B0cz86IFdlYkFwaU9wdGlvbnMpOiBzdHJpbmcge1xuXHRjb25zdCBkZXBzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuXHRcdFwiQGRlY29oZXJlL2NvcnRleFwiOiBcIjAuMC4xLWRldi4xNVwiLFxuXHRcdFwiQGRlY29oZXJlL3Byb3RvY29sXCI6IFwiMC4wLjEtZGV2LjE1XCIsXG5cdFx0XCJAZGVjb2hlcmUvc2NyaWJlXCI6IFwiMC4wLjEtZGV2LjE1XCIsXG5cdFx0XCJAZGVjb2hlcmUvc2NyaWJlLXBpbm9cIjogXCIwLjAuMS1kZXYuMTVcIixcblx0XHRcInBpbm8tcHJldHR5XCI6IFwiXjEzLjAuMFwiLFxuXHR9O1xuXHRpZiAob3B0cz8uZGF0YWJhc2UgPT09IFwidHlwZW9ybVwiKSB7XG5cdFx0ZGVwc1tcIkBkZWNvaGVyZS9jb2RleFwiXSA9IFwiMC4wLjEtZGV2LjE1XCI7XG5cdFx0ZGVwc1tcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCJdID0gXCIwLjAuMS1kZXYuMTVcIjtcblx0fVxuXHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoXG5cdFx0e1xuXHRcdFx0bmFtZTogYCR7bmFtZX0uYXBpYCxcblx0XHRcdHZlcnNpb246IFwiMC4wLjFcIixcblx0XHRcdHR5cGU6IFwibW9kdWxlXCIsXG5cdFx0XHRzY3JpcHRzOiB7XG5cdFx0XHRcdGJ1aWxkOiBcImZvcmdlIGJ1aWxkXCIsXG5cdFx0XHRcdFwiYnVpbGQ6d2F0Y2hcIjogXCJmb3JnZSBidWlsZCAtLXdhdGNoXCIsXG5cdFx0XHRcdGRldjogXCJmbHV4IHNlcnZlXCIsXG5cdFx0XHR9LFxuXHRcdFx0ZGVwZW5kZW5jaWVzOiBkZXBzLFxuXHRcdFx0ZGV2RGVwZW5kZW5jaWVzOiB7XG5cdFx0XHRcdFwiQGRlY29oZXJlL3Rlcm1pbmFsXCI6IFwiMC4wLjEtZGV2LjE1XCIsXG5cdFx0XHRcdHR5cGVzY3JpcHQ6IFwiXjYuMC4zXCIsXG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0bnVsbCxcblx0XHQyLFxuXHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQVBQX1BBQ0tBR0VfSlNPTihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoXG5cdFx0e1xuXHRcdFx0bmFtZTogYEAke25hbWV9L2FwcGAsXG5cdFx0XHR2ZXJzaW9uOiBcIjAuMC4xXCIsXG5cdFx0XHR0eXBlOiBcIm1vZHVsZVwiLFxuXHRcdFx0bWFpbjogXCJzcmMvbWFpbi50c1wiLFxuXHRcdH0sXG5cdFx0bnVsbCxcblx0XHQyLFxuXHQpO1xufVxuXG5leHBvcnQgY29uc3QgVFNDT05GSUcgPSBKU09OLnN0cmluZ2lmeShcblx0e1xuXHRcdGNvbXBpbGVyT3B0aW9uczoge1xuXHRcdFx0dGFyZ2V0OiBcIkVTMjAyMlwiLFxuXHRcdFx0bW9kdWxlOiBcIk5vZGVOZXh0XCIsXG5cdFx0XHRtb2R1bGVSZXNvbHV0aW9uOiBcIk5vZGVOZXh0XCIsXG5cdFx0XHRzdHJpY3Q6IHRydWUsXG5cdFx0XHRza2lwTGliQ2hlY2s6IHRydWUsXG5cdFx0fSxcblx0XHRpbmNsdWRlOiBbXCJwcm9qZWN0c1wiXSxcblx0fSxcblx0bnVsbCxcblx0Mixcbik7XG5cbmV4cG9ydCBjb25zdCBNQUlOX1RTID0gYGNvbnNvbGUubG9nKFwiSGVsbG8gZnJvbSBEZWNvaGVyZSFcIik7XG5gO1xuXG5leHBvcnQgY29uc3QgV0VCX0FQSV9UU0NPTkZJRyA9IEpTT04uc3RyaW5naWZ5KFxuXHR7XG5cdFx0Y29tcGlsZXJPcHRpb25zOiB7XG5cdFx0XHR0YXJnZXQ6IFwiRVMyMDIyXCIsXG5cdFx0XHRtb2R1bGU6IFwiTm9kZU5leHRcIixcblx0XHRcdG1vZHVsZVJlc29sdXRpb246IFwiTm9kZU5leHRcIixcblx0XHRcdHN0cmljdDogdHJ1ZSxcblx0XHRcdHNraXBMaWJDaGVjazogdHJ1ZSxcblx0XHRcdGV4cGVyaW1lbnRhbERlY29yYXRvcnM6IHRydWUsXG5cdFx0XHRlbWl0RGVjb3JhdG9yTWV0YWRhdGE6IHRydWUsXG5cdFx0fSxcblx0XHRpbmNsdWRlOiBbXCJwcm9qZWN0c1wiXSxcblx0fSxcblx0bnVsbCxcblx0Mixcbik7XG5cbmV4cG9ydCBmdW5jdGlvbiBXRUJfQVBJX0FQUF9QQUNLQUdFX0pTT04obmFtZTogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KFxuXHRcdHtcblx0XHRcdG5hbWU6IGBAJHtuYW1lfS9hcGlgLFxuXHRcdFx0dmVyc2lvbjogXCIwLjAuMVwiLFxuXHRcdFx0dHlwZTogXCJtb2R1bGVcIixcblx0XHRcdG1haW46IFwic3JjL21haW4udHNcIixcblx0XHRcdGRlcGVuZGVuY2llczoge1xuXHRcdFx0XHRcIkBkZWNvaGVyZS9jb3J0ZXhcIjogXCIwLjAuMS1kZXYuMTVcIixcblx0XHRcdH0sXG5cdFx0fSxcblx0XHRudWxsLFxuXHRcdDIsXG5cdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBXRUJfQVBJX01BSU5fVFMobmFtZTogc3RyaW5nLCBvcHRzPzogV2ViQXBpT3B0aW9ucyk6IHN0cmluZyB7XG5cdGNvbnN0IGRiSW1wb3J0ID1cblx0XHRvcHRzPy5kYXRhYmFzZSA9PT0gXCJ0eXBlb3JtXCJcblx0XHRcdD8gYGltcG9ydCBcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCI7XG5pbXBvcnQgeyBTYW1wbGVFbnRpdHkgfSBmcm9tIFwiLi9lbnRpdGllcy9zYW1wbGUuZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBTYW1wbGVFbnRpdHlSZXBvc2l0b3J5IH0gZnJvbSBcIi4vcmVwb3NpdG9yaWVzL3NhbXBsZS5yZXBvc2l0b3J5LmpzXCI7XG5gXG5cdFx0XHQ6IFwiXCI7XG5cdGNvbnN0IGRiQ2hhaW4gPVxuXHRcdG9wdHM/LmRhdGFiYXNlID09PSBcInR5cGVvcm1cIlxuXHRcdFx0PyBgXFxuXFx0LndpdGhUeXBlT3JtKHsgZW50aXRpZXM6IFtTYW1wbGVFbnRpdHldLCByZXBvc2l0b3JpZXM6IFtTYW1wbGVFbnRpdHlSZXBvc2l0b3J5XSB9KWBcblx0XHRcdDogXCJcIjtcblx0cmV0dXJuIGBpbXBvcnQgXCJAZGVjb2hlcmUvc2NyaWJlLXBpbm9cIjtcbmltcG9ydCBcIkBkZWNvaGVyZS9jb3J0ZXgvaHR0cFwiO1xuaW1wb3J0IFwiQGRlY29oZXJlL3Byb3RvY29sXCI7XG4ke2RiSW1wb3J0fWltcG9ydCB7IEJ1aWxkZXIgfSBmcm9tIFwiQGRlY29oZXJlL2NvcnRleFwiO1xuaW1wb3J0IHsgRmFzdGlmeVByb3ZpZGVyIH0gZnJvbSBcIkBkZWNvaGVyZS9jb3J0ZXgvcHJvdmlkZXJzXCI7XG5pbXBvcnQgeyBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHsgWWFtbERhdGFTb3VyY2UgfSBmcm9tIFwiQGRlY29oZXJlL3Byb3RvY29sXCI7XG5pbXBvcnQgeyBIZWxsb0NvbnRyb2xsZXIgfSBmcm9tIFwiLi9jb250cm9sbGVycy9oZWxsby5jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQgeyBTYW1wbGVTZXJ2aWNlIH0gZnJvbSBcIi4vc2FtcGxlLnNlcnZpY2UuanNcIjtcblxuc2NyaWJlLmV4dGVuZC53aXRoUGlub1ByZXR0eSgpO1xuXG5jb25zdCBhcHAgPSBhd2FpdCBCdWlsZGVyLmNyZWF0ZSh7IGFwcGxpY2F0aW9uTmFtZTogXCIke25hbWV9LmFwaVwiIH0pXG5cXHQud2l0aEh0dHBQcm92aWRlcihGYXN0aWZ5UHJvdmlkZXIpXG5cXHQud2l0aENvbmZpZ3VyYXRpb24oWWFtbERhdGFTb3VyY2UpXG5cXHQud2l0aFNlcnZpY2VzKChjYikgPT4ge1xuXFx0XFx0Y2IucmVnaXN0ZXJTaW5nbGV0b24oU2FtcGxlU2VydmljZSk7XG5cXHR9KSR7ZGJDaGFpbn1cblxcdC53aXRoQ29udHJvbGxlcnMoSGVsbG9Db250cm9sbGVyKVxuXFx0LmJ1aWxkKCk7XG5cbmF3YWl0IGFwcC5zdGFydCh7IHBvcnQ6IDMwMDAgfSk7XG5cbmV4cG9ydCBkZWZhdWx0IGFwcDtcbmA7XG59XG5cbmV4cG9ydCBjb25zdCBIRUxMT19DT05UUk9MTEVSX1RTID0gYGltcG9ydCB7IENvbnRyb2xsZXIsIERlbGV0ZSwgRmllbGQsIEdldCwgUGFyYW0sIFBvc3QsIFB1dCwgUXVlcnkgfSBmcm9tIFwiQGRlY29oZXJlL2NvcnRleFwiO1xuaW1wb3J0IHsgU2FtcGxlU2VydmljZSB9IGZyb20gXCIuLi9zYW1wbGUuc2VydmljZS5qc1wiO1xuXG5jbGFzcyBIZWxsb0JvZHkge1xuXHRARmllbGQoXCJib2R5XCIsIFwibWVzc2FnZVwiKVxuXHRwdWJsaWMgbWVzc2FnZSE6IHN0cmluZztcbn1cblxuQENvbnRyb2xsZXIoeyBwcmVmaXg6IFwiL2hlbGxvXCIgfSlcbmV4cG9ydCBjbGFzcyBIZWxsb0NvbnRyb2xsZXIge1xuXHRwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBzYW1wbGU6IFNhbXBsZVNlcnZpY2UpIHt9XG5cblx0QEdldCgpXG5cdHB1YmxpYyBhc3luYyBnZXRBbGwoQFF1ZXJ5KFwiZmlsdGVyXCIpIGZpbHRlcjogc3RyaW5nKSB7XG5cdFx0Y29uc3QgZ3JlZXRpbmcgPSBhd2FpdCB0aGlzLnNhbXBsZS5nZXRHcmVldGluZygpO1xuXHRcdHJldHVybiB7IGZpbHRlciwgbWVzc2FnZTogZ3JlZXRpbmcgfTtcblx0fVxuXG5cdEBHZXQoXCIvOmlkXCIpXG5cdHB1YmxpYyBnZXRPbmUoQFBhcmFtKFwiaWRcIikgaWQ6IHN0cmluZykge1xuXHRcdHJldHVybiB7IGlkLCBtZXNzYWdlOiBcXGBIZWxsbyBcXCR7aWR9IVxcYCB9O1xuXHR9XG5cblx0QFBvc3QoXCIvXCIpXG5cdHB1YmxpYyBjcmVhdGUoYm9keTogSGVsbG9Cb2R5KSB7XG5cdFx0cmV0dXJuIHsgbWVzc2FnZTogYm9keS5tZXNzYWdlIH07XG5cdH1cblxuXHRAUHV0KFwiLzppZFwiKVxuXHRwdWJsaWMgdXBkYXRlKEBQYXJhbShcImlkXCIpIGlkOiBzdHJpbmcsIGJvZHk6IEhlbGxvQm9keSkge1xuXHRcdHJldHVybiB7IGlkLCBtZXNzYWdlOiBib2R5Lm1lc3NhZ2UgfTtcblx0fVxuXG5cdEBEZWxldGUoXCIvOmlkXCIpXG5cdHB1YmxpYyByZW1vdmUoQFBhcmFtKFwiaWRcIikgaWQ6IHN0cmluZykge1xuXHRcdHJldHVybiB7IGlkLCBkZWxldGVkOiB0cnVlIH07XG5cdH1cbn1cbmA7XG5cbmV4cG9ydCBjb25zdCBTQU1QTEVfQ09ORklHX1RTID0gYGV4cG9ydCBjbGFzcyBTYW1wbGVDb25maWcge1xuXHRwdWJsaWMgZ3JlZXRpbmc6IHN0cmluZyA9IFwiXCI7XG59XG5gO1xuXG5leHBvcnQgY29uc3QgU0FNUExFX1NFUlZJQ0VfVFMgPSBgaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uU2VydmljZVRva2VuIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IElDb25maWd1cmF0aW9uU2VydmljZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY29uZmlndXJhdGlvblwiO1xuaW1wb3J0IHsgU2FtcGxlQ29uZmlnIH0gZnJvbSBcIi4vc2FtcGxlLmNvbmZpZy5qc1wiO1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2FtcGxlU2VydmljZSB7XG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihcblx0XHRAaW5qZWN0KENvbmZpZ3VyYXRpb25TZXJ2aWNlVG9rZW4pIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBJQ29uZmlndXJhdGlvblNlcnZpY2UsXG5cdCkge31cblxuXHRwdWJsaWMgYXN5bmMgZ2V0R3JlZXRpbmcoKTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRjb25zdCBjb25maWcgPSBhd2FpdCB0aGlzLmNvbmZpZy5nZXQoU2FtcGxlQ29uZmlnKTtcblx0XHRyZXR1cm4gY29uZmlnLmdyZWV0aW5nO1xuXHR9XG59XG5gO1xuXG5leHBvcnQgZnVuY3Rpb24gQ09ORklHX1lBTUwobmFtZTogc3RyaW5nLCBvcHRzPzogV2ViQXBpT3B0aW9ucyk6IHN0cmluZyB7XG5cdGNvbnN0IGRiU2VjdGlvbiA9XG5cdFx0b3B0cz8uZGF0YWJhc2UgPT09IFwidHlwZW9ybVwiXG5cdFx0XHQ/IGBkYXRhYmFzZTpcbiAgZGF0YVNvdXJjZXM6XG4gICAgLSBuYW1lOiBkZWZhdWx0XG4gICAgICBwcm92aWRlcjogcG9zdGdyZXNcbiAgICAgIGhvc3Q6IGxvY2FsaG9zdFxuICAgICAgcG9ydDogNTQzMlxuICAgICAgZGF0YWJhc2U6ICR7bmFtZX1fZGV2XG4gICAgICB1c2VybmFtZTogcG9zdGdyZXNcbiAgICAgIHBhc3N3b3JkOiBwb3N0Z3Jlc1xuICAgICAgc3luY2hyb25pemU6IHRydWVcbiAgICAgIHNlZWQ6IGZhbHNlXG4gICAgICBhZG1pblVzZXI6IHBvc3RncmVzXG4gICAgICBhZG1pblBhc3N3b3JkOiBwb3N0Z3Jlc1xuYFxuXHRcdFx0OiBcIlwiO1xuXHRyZXR1cm4gYHNhbXBsZTpcbiAgZ3JlZXRpbmc6IEhlbGxvIGZyb20gY29uZmlndXJhdGlvbiFcbiR7ZGJTZWN0aW9ufWA7XG59XG5cbmV4cG9ydCBjb25zdCBDT05GSUdfREVWX1lBTUwgPSBgc2FtcGxlOlxuICBncmVldGluZzogSGVsbG8gZnJvbSBkZXYgY29uZmlndXJhdGlvbiFcbmA7XG5cbmV4cG9ydCBjb25zdCBDT05GSUdfUFJPRF9ZQU1MID0gYGRhdGFiYXNlOlxuICBkYXRhU291cmNlczpcbiAgICAtIG5hbWU6IGRlZmF1bHRcbiAgICAgIHByb3ZpZGVyOiBwb3N0Z3Jlc1xuICAgICAgaG9zdDogXFwke0RCX0hPU1R9XG4gICAgICBwb3J0OiBcXCR7REJfUE9SVH1cbiAgICAgIGRhdGFiYXNlOiBcXCR7REJfTkFNRX1cbiAgICAgIHVzZXJuYW1lOiBcXCR7REJfVVNFUn1cbiAgICAgIHBhc3N3b3JkOiBcXCR7REJfUEFTU1dPUkR9XG4gICAgICBzeW5jaHJvbml6ZTogZmFsc2VcbiAgICAgIHNlZWQ6IGZhbHNlXG4gICAgICBhZG1pblVzZXI6IFxcJHtEQl9BRE1JTl9VU0VSfVxuICAgICAgYWRtaW5QYXNzd29yZDogXFwke0RCX0FETUlOX1BBU1NXT1JEfVxuYDtcblxuZXhwb3J0IGNvbnN0IFNBTVBMRV9FTlRJVFlfVFMgPSBgaW1wb3J0IHsgQ29sdW1uLCBFbnRpdHksIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4gfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgYXMgSUVudGl0eSB9IGZyb20gXCJAZGVjb2hlcmUvY29kZXhcIjtcblxuQEVudGl0eSgpXG5leHBvcnQgY2xhc3MgU2FtcGxlRW50aXR5IGltcGxlbWVudHMgSUVudGl0eSB7XG5cXHRAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG5cXHRwdWJsaWMgaWQhOiBudW1iZXI7XG5cblxcdEBDb2x1bW4oKVxuXFx0cHVibGljIG5hbWUhOiBzdHJpbmc7XG59XG5gO1xuXG5leHBvcnQgY29uc3QgU0FNUExFX1JFUE9TSVRPUllfVFMgPSBgaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgaW5qZWN0VW5pdE9mV29yayB9IGZyb20gXCJAZGVjb2hlcmUvY29kZXhcIjtcbmltcG9ydCB7IFR5cGVPcm1SZXBvc2l0b3J5LCBUeXBlT3JtVW5pdE9mV29yayB9IGZyb20gXCJAZGVjb2hlcmUvY29kZXgtdHlwZW9ybVwiO1xuaW1wb3J0IHsgU2FtcGxlRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0aWVzL3NhbXBsZS5lbnRpdHkuanNcIjtcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNhbXBsZUVudGl0eVJlcG9zaXRvcnkgZXh0ZW5kcyBUeXBlT3JtUmVwb3NpdG9yeTxTYW1wbGVFbnRpdHk+IHtcblxcdHB1YmxpYyBjb25zdHJ1Y3RvcihAaW5qZWN0VW5pdE9mV29yaygpIHVuaXRPZldvcms6IFR5cGVPcm1Vbml0T2ZXb3JrKSB7XG5cXHRcXHRzdXBlcih1bml0T2ZXb3JrLCBTYW1wbGVFbnRpdHkpO1xuXFx0fVxufVxuYDtcbiJdLCJuYW1lcyI6WyJBUFBfUEFDS0FHRV9KU09OIiwiQ09ORklHX0RFVl9ZQU1MIiwiQ09ORklHX1BST0RfWUFNTCIsIkNPTkZJR19ZQU1MIiwiSEVMTE9fQ09OVFJPTExFUl9UUyIsIk1BSU5fVFMiLCJST09UX1BBQ0tBR0VfSlNPTiIsIlNBTVBMRV9DT05GSUdfVFMiLCJTQU1QTEVfRU5USVRZX1RTIiwiU0FNUExFX1JFUE9TSVRPUllfVFMiLCJTQU1QTEVfU0VSVklDRV9UUyIsIlRTQ09ORklHIiwiV0VCX0FQSV9BUFBfUEFDS0FHRV9KU09OIiwiV0VCX0FQSV9NQUlOX1RTIiwiV0VCX0FQSV9ST09UX1BBQ0tBR0VfSlNPTiIsIldFQl9BUElfVFNDT05GSUciLCJuYW1lIiwiSlNPTiIsInN0cmluZ2lmeSIsInZlcnNpb24iLCJ0eXBlIiwic2NyaXB0cyIsImJ1aWxkIiwiZGV2IiwiZGV2RGVwZW5kZW5jaWVzIiwidHlwZXNjcmlwdCIsIm9wdHMiLCJkZXBzIiwiZGF0YWJhc2UiLCJkZXBlbmRlbmNpZXMiLCJtYWluIiwiY29tcGlsZXJPcHRpb25zIiwidGFyZ2V0IiwibW9kdWxlIiwibW9kdWxlUmVzb2x1dGlvbiIsInN0cmljdCIsInNraXBMaWJDaGVjayIsImluY2x1ZGUiLCJleHBlcmltZW50YWxEZWNvcmF0b3JzIiwiZW1pdERlY29yYXRvck1ldGFkYXRhIiwiZGJJbXBvcnQiLCJkYkNoYWluIiwiZGJTZWN0aW9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztRQTREZ0JBO2VBQUFBOztRQTZMSEM7ZUFBQUE7O1FBSUFDO2VBQUFBOztRQTNCR0M7ZUFBQUE7O1FBL0RIQztlQUFBQTs7UUEzRUFDO2VBQUFBOztRQXhGR0M7ZUFBQUE7O1FBMk1IQztlQUFBQTs7UUFpRUFDO2VBQUFBOztRQWFBQztlQUFBQTs7UUF6RUFDO2VBQUFBOztRQXZJQUM7ZUFBQUE7O1FBbUNHQztlQUFBQTs7UUFnQkFDO2VBQUFBOztRQWpHQUM7ZUFBQUE7O1FBZ0VIQztlQUFBQTs7O0FBM0ZOLFNBQVNULGtCQUFrQlUsSUFBWTtJQUM3QyxPQUFPQyxLQUFLQyxTQUFTLENBQ3BCO1FBQ0NGO1FBQ0FHLFNBQVM7UUFDVEMsTUFBTTtRQUNOQyxTQUFTO1lBQ1JDLE9BQU87WUFDUCxlQUFlO1lBQ2ZDLEtBQUs7UUFDTjtRQUNBQyxpQkFBaUI7WUFDaEIsc0JBQXNCO1lBQ3RCQyxZ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
package/es6/src/cli.js CHANGED
@@ -1,3 +1,11 @@
1
1
  #!/usr/bin/env node
2
- import { runInBuilder } from "./runner.js";
3
- runInBuilder(process.argv.slice(2));
2
+ import { resolve } from "node:path";
3
+ import { Command } from "commander";
4
+ import { scaffold } from "./scaffold.js";
5
+ const program = new Command();
6
+ program.name("decohere").description("Scaffold a new Decohere project").argument("[directory]", "Target directory (default: current directory)", ".").option("-y, --yes", "Skip confirmation prompts").option("-t, --template <template>", "Project template: basic (default) or webapi", "basic").option("-d, --database <provider>", "Database provider to include (webapi only): typeorm").action(async (directory, opts)=>{
7
+ await scaffold(resolve(directory), opts);
8
+ });
9
+ program.parse();
10
+
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHsgc2NhZmZvbGQgfSBmcm9tIFwiLi9zY2FmZm9sZC5qc1wiO1xuXG5jb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKTtcblxucHJvZ3JhbVxuXHQubmFtZShcImRlY29oZXJlXCIpXG5cdC5kZXNjcmlwdGlvbihcIlNjYWZmb2xkIGEgbmV3IERlY29oZXJlIHByb2plY3RcIilcblx0LmFyZ3VtZW50KFwiW2RpcmVjdG9yeV1cIiwgXCJUYXJnZXQgZGlyZWN0b3J5IChkZWZhdWx0OiBjdXJyZW50IGRpcmVjdG9yeSlcIiwgXCIuXCIpXG5cdC5vcHRpb24oXCIteSwgLS15ZXNcIiwgXCJTa2lwIGNvbmZpcm1hdGlvbiBwcm9tcHRzXCIpXG5cdC5vcHRpb24oXCItdCwgLS10ZW1wbGF0ZSA8dGVtcGxhdGU+XCIsIFwiUHJvamVjdCB0ZW1wbGF0ZTogYmFzaWMgKGRlZmF1bHQpIG9yIHdlYmFwaVwiLCBcImJhc2ljXCIpXG5cdC5vcHRpb24oXCItZCwgLS1kYXRhYmFzZSA8cHJvdmlkZXI+XCIsIFwiRGF0YWJhc2UgcHJvdmlkZXIgdG8gaW5jbHVkZSAod2ViYXBpIG9ubHkpOiB0eXBlb3JtXCIpXG5cdC5hY3Rpb24oXG5cdFx0YXN5bmMgKFxuXHRcdFx0ZGlyZWN0b3J5OiBzdHJpbmcsXG5cdFx0XHRvcHRzOiB7IHllcz86IGJvb2xlYW47IHRlbXBsYXRlPzogXCJiYXNpY1wiIHwgXCJ3ZWJhcGlcIjsgZGF0YWJhc2U/OiBcInR5cGVvcm1cIiB9LFxuXHRcdCkgPT4ge1xuXHRcdFx0YXdhaXQgc2NhZmZvbGQocmVzb2x2ZShkaXJlY3RvcnkpLCBvcHRzKTtcblx0XHR9LFxuXHQpO1xuXG5wcm9ncmFtLnBhcnNlKCk7XG4iXSwibmFtZXMiOlsicmVzb2x2ZSIsIkNvbW1hbmQiLCJzY2FmZm9sZCIsInByb2dyYW0iLCJuYW1lIiwiZGVzY3JpcHRpb24iLCJhcmd1bWVudCIsIm9wdGlvbiIsImFjdGlvbiIsImRpcmVjdG9yeSIsIm9wdHMiLCJwYXJzZSJdLCJtYXBwaW5ncyI6IjtBQUNBLFNBQVNBLE9BQU8sUUFBUSxZQUFZO0FBQ3BDLFNBQVNDLE9BQU8sUUFBUSxZQUFZO0FBQ3BDLFNBQVNDLFFBQVEsUUFBUSxnQkFBZ0I7QUFFekMsTUFBTUMsVUFBVSxJQUFJRjtBQUVwQkUsUUFDRUMsSUFBSSxDQUFDLFlBQ0xDLFdBQVcsQ0FBQyxtQ0FDWkMsUUFBUSxDQUFDLGVBQWUsaURBQWlELEtBQ3pFQyxNQUFNLENBQUMsYUFBYSw2QkFDcEJBLE1BQU0sQ0FBQyw2QkFBNkIsK0NBQStDLFNBQ25GQSxNQUFNLENBQUMsNkJBQTZCLHVEQUNwQ0MsTUFBTSxDQUNOLE9BQ0NDLFdBQ0FDO0lBRUEsTUFBTVIsU0FBU0YsUUFBUVMsWUFBWUM7QUFDcEM7QUFHRlAsUUFBUVEsS0FBSyJ9
@@ -0,0 +1,79 @@
1
+ import { existsSync, readdirSync } from "node:fs";
2
+ import { mkdir, writeFile } from "node:fs/promises";
3
+ import { basename, join } from "node:path";
4
+ import { createInterface } from "node:readline/promises";
5
+ import { detectPackageManager, promptForPackageManager } from "@decohere/nexus/interop";
6
+ import { APP_PACKAGE_JSON, CONFIG_DEV_YAML, CONFIG_PROD_YAML, CONFIG_YAML, HELLO_CONTROLLER_TS, MAIN_TS, ROOT_PACKAGE_JSON, SAMPLE_CONFIG_TS, SAMPLE_ENTITY_TS, SAMPLE_REPOSITORY_TS, SAMPLE_SERVICE_TS, TSCONFIG, WEB_API_APP_PACKAGE_JSON, WEB_API_MAIN_TS, WEB_API_ROOT_PACKAGE_JSON, WEB_API_TSCONFIG } from "./templates.js";
7
+ export async function scaffold(targetDir, opts) {
8
+ const name = basename(targetDir);
9
+ if (existsSync(targetDir) && readdirSync(targetDir).length > 0 && !opts.yes) {
10
+ const rl = createInterface({
11
+ input: process.stdin,
12
+ output: process.stdout
13
+ });
14
+ const answer = await rl.question(`Directory "${name}" is not empty. Continue? [y/N] `);
15
+ rl.close();
16
+ if (!answer.trim().toLowerCase().startsWith("y")) {
17
+ console.log("Aborted.");
18
+ process.exit(0);
19
+ }
20
+ }
21
+ if (opts.template === "webapi") {
22
+ const dbOpts = opts.database ? {
23
+ database: opts.database
24
+ } : undefined;
25
+ await mkdir(join(targetDir, "projects", "api", "src", "controllers"), {
26
+ recursive: true
27
+ });
28
+ await mkdir(join(targetDir, "config"), {
29
+ recursive: true
30
+ });
31
+ const writes = [
32
+ writeFile(join(targetDir, "package.json"), WEB_API_ROOT_PACKAGE_JSON(name, dbOpts)),
33
+ writeFile(join(targetDir, "tsconfig.json"), WEB_API_TSCONFIG),
34
+ writeFile(join(targetDir, "projects", "api", "package.json"), WEB_API_APP_PACKAGE_JSON(name)),
35
+ writeFile(join(targetDir, "projects", "api", "src", "main.ts"), WEB_API_MAIN_TS(name, dbOpts)),
36
+ writeFile(join(targetDir, "projects", "api", "src", "controllers", "hello.controller.ts"), HELLO_CONTROLLER_TS),
37
+ writeFile(join(targetDir, "projects", "api", "src", "sample.config.ts"), SAMPLE_CONFIG_TS),
38
+ writeFile(join(targetDir, "projects", "api", "src", "sample.service.ts"), SAMPLE_SERVICE_TS),
39
+ writeFile(join(targetDir, "config", "config.yaml"), CONFIG_YAML(name, dbOpts)),
40
+ writeFile(join(targetDir, "config", "config.dev.yaml"), CONFIG_DEV_YAML)
41
+ ];
42
+ if (opts.database === "typeorm") {
43
+ await mkdir(join(targetDir, "projects", "api", "src", "entities"), {
44
+ recursive: true
45
+ });
46
+ await mkdir(join(targetDir, "projects", "api", "src", "repositories"), {
47
+ recursive: true
48
+ });
49
+ writes.push(writeFile(join(targetDir, "projects", "api", "src", "entities", "sample.entity.ts"), SAMPLE_ENTITY_TS), writeFile(join(targetDir, "projects", "api", "src", "repositories", "sample.repository.ts"), SAMPLE_REPOSITORY_TS), writeFile(join(targetDir, "config", "config.prod.yaml"), CONFIG_PROD_YAML));
50
+ }
51
+ await Promise.all(writes);
52
+ } else {
53
+ await mkdir(join(targetDir, "projects", "app", "src"), {
54
+ recursive: true
55
+ });
56
+ await Promise.all([
57
+ writeFile(join(targetDir, "package.json"), ROOT_PACKAGE_JSON(name)),
58
+ writeFile(join(targetDir, "tsconfig.json"), TSCONFIG),
59
+ writeFile(join(targetDir, "projects", "app", "package.json"), APP_PACKAGE_JSON(name)),
60
+ writeFile(join(targetDir, "projects", "app", "src", "main.ts"), MAIN_TS)
61
+ ]);
62
+ }
63
+ console.log(`\nScaffolded ${name}. Installing dependencies...\n`);
64
+ let pm = detectPackageManager(targetDir);
65
+ if (pm == null) {
66
+ pm = await promptForPackageManager();
67
+ }
68
+ await pm.install({
69
+ cwd: targetDir
70
+ });
71
+ console.log(`\nDone! Next steps:\n`);
72
+ if (basename(targetDir) !== targetDir) {
73
+ console.log(` cd ${name}`);
74
+ }
75
+ console.log(" pnpm build # forge build");
76
+ console.log(" pnpm dev # flux serve\n");
77
+ }
78
+
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvc2NhZmZvbGQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZGRpclN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgbWtkaXIsIHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBiYXNlbmFtZSwgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGNyZWF0ZUludGVyZmFjZSB9IGZyb20gXCJub2RlOnJlYWRsaW5lL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBkZXRlY3RQYWNrYWdlTWFuYWdlciwgcHJvbXB0Rm9yUGFja2FnZU1hbmFnZXIgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2ludGVyb3BcIjtcbmltcG9ydCB7XG5cdEFQUF9QQUNLQUdFX0pTT04sXG5cdENPTkZJR19ERVZfWUFNTCxcblx0Q09ORklHX1BST0RfWUFNTCxcblx0Q09ORklHX1lBTUwsXG5cdEhFTExPX0NPTlRST0xMRVJfVFMsXG5cdE1BSU5fVFMsXG5cdFJPT1RfUEFDS0FHRV9KU09OLFxuXHRTQU1QTEVfQ09ORklHX1RTLFxuXHRTQU1QTEVfRU5USVRZX1RTLFxuXHRTQU1QTEVfUkVQT1NJVE9SWV9UUyxcblx0U0FNUExFX1NFUlZJQ0VfVFMsXG5cdFRTQ09ORklHLFxuXHRXRUJfQVBJX0FQUF9QQUNLQUdFX0pTT04sXG5cdFdFQl9BUElfTUFJTl9UUyxcblx0V0VCX0FQSV9ST09UX1BBQ0tBR0VfSlNPTixcblx0V0VCX0FQSV9UU0NPTkZJRyxcbn0gZnJvbSBcIi4vdGVtcGxhdGVzLmpzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NhZmZvbGRPcHRpb25zIHtcblx0eWVzPzogYm9vbGVhbjtcblx0dGVtcGxhdGU/OiBcImJhc2ljXCIgfCBcIndlYmFwaVwiO1xuXHRkYXRhYmFzZT86IFwidHlwZW9ybVwiO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2NhZmZvbGQodGFyZ2V0RGlyOiBzdHJpbmcsIG9wdHM6IFNjYWZmb2xkT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuXHRjb25zdCBuYW1lID0gYmFzZW5hbWUodGFyZ2V0RGlyKTtcblxuXHRpZiAoZXhpc3RzU3luYyh0YXJnZXREaXIpICYmIHJlYWRkaXJTeW5jKHRhcmdldERpcikubGVuZ3RoID4gMCAmJiAhb3B0cy55ZXMpIHtcblx0XHRjb25zdCBybCA9IGNyZWF0ZUludGVyZmFjZSh7XG5cdFx0XHRpbnB1dDogcHJvY2Vzcy5zdGRpbixcblx0XHRcdG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG5cdFx0fSk7XG5cdFx0Y29uc3QgYW5zd2VyID0gYXdhaXQgcmwucXVlc3Rpb24oYERpcmVjdG9yeSBcIiR7bmFtZX1cIiBpcyBub3QgZW1wdHkuIENvbnRpbnVlPyBbeS9OXSBgKTtcblx0XHRybC5jbG9zZSgpO1xuXHRcdGlmICghYW5zd2VyLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJ5XCIpKSB7XG5cdFx0XHRjb25zb2xlLmxvZyhcIkFib3J0ZWQuXCIpO1xuXHRcdFx0cHJvY2Vzcy5leGl0KDApO1xuXHRcdH1cblx0fVxuXG5cdGlmIChvcHRzLnRlbXBsYXRlID09PSBcIndlYmFwaVwiKSB7XG5cdFx0Y29uc3QgZGJPcHRzID0gb3B0cy5kYXRhYmFzZSA/IHsgZGF0YWJhc2U6IG9wdHMuZGF0YWJhc2UgfSA6IHVuZGVmaW5lZDtcblx0XHRhd2FpdCBta2Rpcihqb2luKHRhcmdldERpciwgXCJwcm9qZWN0c1wiLCBcImFwaVwiLCBcInNyY1wiLCBcImNvbnRyb2xsZXJzXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRhd2FpdCBta2Rpcihqb2luKHRhcmdldERpciwgXCJjb25maWdcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdGNvbnN0IHdyaXRlcyA9IFtcblx0XHRcdHdyaXRlRmlsZShqb2luKHRhcmdldERpciwgXCJwYWNrYWdlLmpzb25cIiksIFdFQl9BUElfUk9PVF9QQUNLQUdFX0pTT04obmFtZSwgZGJPcHRzKSksXG5cdFx0XHR3cml0ZUZpbGUoam9pbih0YXJnZXREaXIsIFwidHNjb25maWcuanNvblwiKSwgV0VCX0FQSV9UU0NPTkZJRyksXG5cdFx0XHR3cml0ZUZpbGUoXG5cdFx0XHRcdGpvaW4odGFyZ2V0RGlyLCBcInByb2plY3RzXCIsIFwiYXBpXCIsIFwicGFja2FnZS5qc29uXCIpLFxuXHRcdFx0XHRXRUJfQVBJX0FQUF9QQUNLQUdFX0pTT04obmFtZSksXG5cdFx0XHQpLFxuXHRcdFx0d3JpdGVGaWxlKFxuXHRcdFx0XHRqb2luKHRhcmdldERpciwgXCJwcm9qZWN0c1wiLCBcImFwaVwiLCBcInNyY1wiLCBcIm1haW4udHNcIiksXG5cdFx0XHRcdFdFQl9BUElfTUFJTl9UUyhuYW1lLCBkYk9wdHMpLFxuXHRcdFx0KSxcblx0XHRcdHdyaXRlRmlsZShcblx0XHRcdFx0am9pbih0YXJnZXREaXIsIFwicHJvamVjdHNcIiwgXCJhcGlcIiwgXCJzcmNcIiwgXCJjb250cm9sbGVyc1wiLCBcImhlbGxvLmNvbnRyb2xsZXIudHNcIiksXG5cdFx0XHRcdEhFTExPX0NPTlRST0xMRVJfVFMsXG5cdFx0XHQpLFxuXHRcdFx0d3JpdGVGaWxlKFxuXHRcdFx0XHRqb2luKHRhcmdldERpciwgXCJwcm9qZWN0c1wiLCBcImFwaVwiLCBcInNyY1wiLCBcInNhbXBsZS5jb25maWcudHNcIiksXG5cdFx0XHRcdFNBTVBMRV9DT05GSUdfVFMsXG5cdFx0XHQpLFxuXHRcdFx0d3JpdGVGaWxlKFxuXHRcdFx0XHRqb2luKHRhcmdldERpciwgXCJwcm9qZWN0c1wiLCBcImFwaVwiLCBcInNyY1wiLCBcInNhbXBsZS5zZXJ2aWNlLnRzXCIpLFxuXHRcdFx0XHRTQU1QTEVfU0VSVklDRV9UUyxcblx0XHRcdCksXG5cdFx0XHR3cml0ZUZpbGUoam9pbih0YXJnZXREaXIsIFwiY29uZmlnXCIsIFwiY29uZmlnLnlhbWxcIiksIENPTkZJR19ZQU1MKG5hbWUsIGRiT3B0cykpLFxuXHRcdFx0d3JpdGVGaWxlKGpvaW4odGFyZ2V0RGlyLCBcImNvbmZpZ1wiLCBcImNvbmZpZy5kZXYueWFtbFwiKSwgQ09ORklHX0RFVl9ZQU1MKSxcblx0XHRdO1xuXHRcdGlmIChvcHRzLmRhdGFiYXNlID09PSBcInR5cGVvcm1cIikge1xuXHRcdFx0YXdhaXQgbWtkaXIoam9pbih0YXJnZXREaXIsIFwicHJvamVjdHNcIiwgXCJhcGlcIiwgXCJzcmNcIiwgXCJlbnRpdGllc1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRhd2FpdCBta2Rpcihqb2luKHRhcmdldERpciwgXCJwcm9qZWN0c1wiLCBcImFwaVwiLCBcInNyY1wiLCBcInJlcG9zaXRvcmllc1wiKSwge1xuXHRcdFx0XHRyZWN1cnNpdmU6IHRydWUsXG5cdFx0XHR9KTtcblx0XHRcdHdyaXRlcy5wdXNoKFxuXHRcdFx0XHR3cml0ZUZpbGUoXG5cdFx0XHRcdFx0am9pbih0YXJnZXREaXIsIFwicHJvamVjdHNcIiwgXCJhcGlcIiwgXCJzcmNcIiwgXCJlbnRpdGllc1wiLCBcInNhbXBsZS5lbnRpdHkudHNcIiksXG5cdFx0XHRcdFx0U0FNUExFX0VOVElUWV9UUyxcblx0XHRcdFx0KSxcblx0XHRcdFx0d3JpdGVGaWxlKFxuXHRcdFx0XHRcdGpvaW4odGFyZ2V0RGlyLCBcInByb2plY3RzXCIsIFwiYXBpXCIsIFwic3JjXCIsIFwicmVwb3NpdG9yaWVzXCIsIFwic2FtcGxlLnJlcG9zaXRvcnkudHNcIiksXG5cdFx0XHRcdFx0U0FNUExFX1JFUE9TSVRPUllfVFMsXG5cdFx0XHRcdCksXG5cdFx0XHRcdHdyaXRlRmlsZShqb2luKHRhcmdldERpciwgXCJjb25maWdcIiwgXCJjb25maWcucHJvZC55YW1sXCIpLCBDT05GSUdfUFJPRF9ZQU1MKSxcblx0XHRcdCk7XG5cdFx0fVxuXHRcdGF3YWl0IFByb21pc2UuYWxsKHdyaXRlcyk7XG5cdH0gZWxzZSB7XG5cdFx0YXdhaXQgbWtkaXIoam9pbih0YXJnZXREaXIsIFwicHJvamVjdHNcIiwgXCJhcHBcIiwgXCJzcmNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdGF3YWl0IFByb21pc2UuYWxsKFtcblx0XHRcdHdyaXRlRmlsZShqb2luKHRhcmdldERpciwgXCJwYWNrYWdlLmpzb25cIiksIFJPT1RfUEFDS0FHRV9KU09OKG5hbWUpKSxcblx0XHRcdHdyaXRlRmlsZShqb2luKHRhcmdldERpciwgXCJ0c2NvbmZpZy5qc29uXCIpLCBUU0NPTkZJRyksXG5cdFx0XHR3cml0ZUZpbGUoam9pbih0YXJnZXREaXIsIFwicHJvamVjdHNcIiwgXCJhcHBcIiwgXCJwYWNrYWdlLmpzb25cIiksIEFQUF9QQUNLQUdFX0pTT04obmFtZSkpLFxuXHRcdFx0d3JpdGVGaWxlKGpvaW4odGFyZ2V0RGlyLCBcInByb2plY3RzXCIsIFwiYXBwXCIsIFwic3JjXCIsIFwibWFpbi50c1wiKSwgTUFJTl9UUyksXG5cdFx0XSk7XG5cdH1cblxuXHRjb25zb2xlLmxvZyhgXFxuU2NhZmZvbGRlZCAke25hbWV9LiBJbnN0YWxsaW5nIGRlcGVuZGVuY2llcy4uLlxcbmApO1xuXHRsZXQgcG0gPSBkZXRlY3RQYWNrYWdlTWFuYWdlcih0YXJnZXREaXIpO1xuXHRpZiAocG0gPT0gbnVsbCkge1xuXHRcdHBtID0gYXdhaXQgcHJvbXB0Rm9yUGFja2FnZU1hbmFnZXIoKTtcblx0fVxuXHRhd2FpdCBwbS5pbnN0YWxsKHsgY3dkOiB0YXJnZXREaXIgfSk7XG5cblx0Y29uc29sZS5sb2coYFxcbkRvbmUhIE5leHQgc3RlcHM6XFxuYCk7XG5cdGlmIChiYXNlbmFtZSh0YXJnZXREaXIpICE9PSB0YXJnZXREaXIpIHtcblx0XHRjb25zb2xlLmxvZyhgICBjZCAke25hbWV9YCk7XG5cdH1cblx0Y29uc29sZS5sb2coXCIgIHBucG0gYnVpbGQgICAgICMgZm9yZ2UgYnVpbGRcIik7XG5cdGNvbnNvbGUubG9nKFwiICBwbnBtIGRldiAgICAgICAjIGZsdXggc2VydmVcXG5cIik7XG59XG4iXSwibmFtZXMiOlsiZXhpc3RzU3luYyIsInJlYWRkaXJTeW5jIiwibWtkaXIiLCJ3cml0ZUZpbGUiLCJiYXNlbmFtZSIsImpvaW4iLCJjcmVhdGVJbnRlcmZhY2UiLCJkZXRlY3RQYWNrYWdlTWFuYWdlciIsInByb21wdEZvclBhY2thZ2VNYW5hZ2VyIiwiQVBQX1BBQ0tBR0VfSlNPTiIsIkNPTkZJR19ERVZfWUFNTCIsIkNPTkZJR19QUk9EX1lBTUwiLCJDT05GSUdfWUFNTCIsIkhFTExPX0NPTlRST0xMRVJfVFMiLCJNQUlOX1RTIiwiUk9PVF9QQUNLQUdFX0pTT04iLCJTQU1QTEVfQ09ORklHX1RTIiwiU0FNUExFX0VOVElUWV9UUyIsIlNBTVBMRV9SRVBPU0lUT1JZX1RTIiwiU0FNUExFX1NFUlZJQ0VfVFMiLCJUU0NPTkZJRyIsIldFQl9BUElfQVBQX1BBQ0tBR0VfSlNPTiIsIldFQl9BUElfTUFJTl9UUyIsIldFQl9BUElfUk9PVF9QQUNLQUdFX0pTT04iLCJXRUJfQVBJX1RTQ09ORklHIiwic2NhZmZvbGQiLCJ0YXJnZXREaXIiLCJvcHRzIiwibmFtZSIsImxlbmd0aCIsInllcyIsInJsIiwiaW5wdXQiLCJwcm9jZXNzIiwic3RkaW4iLCJvdXRwdXQiLCJzdGRvdXQiLCJhbnN3ZXIiLCJxdWVzdGlvbiIsImNsb3NlIiwidHJpbSIsInRvTG93ZXJDYXNlIiwic3RhcnRzV2l0aCIsImNvbnNvbGUiLCJsb2ciLCJleGl0IiwidGVtcGxhdGUiLCJkYk9wdHMiLCJkYXRhYmFzZSIsInVuZGVmaW5lZCIsInJlY3Vyc2l2ZSIsIndyaXRlcyIsInB1c2giLCJQcm9taXNlIiwiYWxsIiwicG0iLCJpbnN0YWxsIiwiY3dkIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxVQUFVLEVBQUVDLFdBQVcsUUFBUSxVQUFVO0FBQ2xELFNBQVNDLEtBQUssRUFBRUMsU0FBUyxRQUFRLG1CQUFtQjtBQUNwRCxTQUFTQyxRQUFRLEVBQUVDLElB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