@devbie/newbie-cli 0.1.0-stage.0

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 (139) hide show
  1. package/dist/assemble/assets.d.ts +9 -0
  2. package/dist/assemble/assets.js +49 -0
  3. package/dist/assemble/assets.js.map +1 -0
  4. package/dist/assemble/dependencies.d.ts +10 -0
  5. package/dist/assemble/dependencies.js +36 -0
  6. package/dist/assemble/dependencies.js.map +1 -0
  7. package/dist/assemble/env.d.ts +15 -0
  8. package/dist/assemble/env.js +79 -0
  9. package/dist/assemble/env.js.map +1 -0
  10. package/dist/assemble/modules-copy.d.ts +13 -0
  11. package/dist/assemble/modules-copy.js +36 -0
  12. package/dist/assemble/modules-copy.js.map +1 -0
  13. package/dist/assemble/modules.d.ts +8 -0
  14. package/dist/assemble/modules.js +86 -0
  15. package/dist/assemble/modules.js.map +1 -0
  16. package/dist/assemble/pipeline.d.ts +17 -0
  17. package/dist/assemble/pipeline.js +143 -0
  18. package/dist/assemble/pipeline.js.map +1 -0
  19. package/dist/assemble/schema.d.ts +10 -0
  20. package/dist/assemble/schema.js +64 -0
  21. package/dist/assemble/schema.js.map +1 -0
  22. package/dist/assemble/types.d.ts +18 -0
  23. package/dist/assemble/types.js +3 -0
  24. package/dist/assemble/types.js.map +1 -0
  25. package/dist/commands/agent.d.ts +1 -0
  26. package/dist/commands/agent.js +16 -0
  27. package/dist/commands/agent.js.map +1 -0
  28. package/dist/commands/apply.d.ts +6 -0
  29. package/dist/commands/apply.js +52 -0
  30. package/dist/commands/apply.js.map +1 -0
  31. package/dist/commands/check.d.ts +2 -0
  32. package/dist/commands/check.js +37 -0
  33. package/dist/commands/check.js.map +1 -0
  34. package/dist/commands/config.d.ts +7 -0
  35. package/dist/commands/config.js +82 -0
  36. package/dist/commands/config.js.map +1 -0
  37. package/dist/commands/create.d.ts +16 -0
  38. package/dist/commands/create.js +89 -0
  39. package/dist/commands/create.js.map +1 -0
  40. package/dist/commands/default.d.ts +2 -0
  41. package/dist/commands/default.js +69 -0
  42. package/dist/commands/default.js.map +1 -0
  43. package/dist/commands/doctor.d.ts +2 -0
  44. package/dist/commands/doctor.js +145 -0
  45. package/dist/commands/doctor.js.map +1 -0
  46. package/dist/commands/env.d.ts +7 -0
  47. package/dist/commands/env.js +324 -0
  48. package/dist/commands/env.js.map +1 -0
  49. package/dist/commands/install.d.ts +4 -0
  50. package/dist/commands/install.js +45 -0
  51. package/dist/commands/install.js.map +1 -0
  52. package/dist/commands/shared.d.ts +19 -0
  53. package/dist/commands/shared.js +54 -0
  54. package/dist/commands/shared.js.map +1 -0
  55. package/dist/commands/status.d.ts +4 -0
  56. package/dist/commands/status.js +62 -0
  57. package/dist/commands/status.js.map +1 -0
  58. package/dist/commands/update-template.d.ts +6 -0
  59. package/dist/commands/update-template.js +83 -0
  60. package/dist/commands/update-template.js.map +1 -0
  61. package/dist/commands/update.d.ts +6 -0
  62. package/dist/commands/update.js +129 -0
  63. package/dist/commands/update.js.map +1 -0
  64. package/dist/constants/paths.d.ts +12 -0
  65. package/dist/constants/paths.js +19 -0
  66. package/dist/constants/paths.js.map +1 -0
  67. package/dist/core/assets.d.ts +8 -0
  68. package/dist/core/assets.js +30 -0
  69. package/dist/core/assets.js.map +1 -0
  70. package/dist/core/dependency-plan.d.ts +12 -0
  71. package/dist/core/dependency-plan.js +42 -0
  72. package/dist/core/dependency-plan.js.map +1 -0
  73. package/dist/core/drift.d.ts +9 -0
  74. package/dist/core/drift.js +34 -0
  75. package/dist/core/drift.js.map +1 -0
  76. package/dist/core/env-file.d.ts +19 -0
  77. package/dist/core/env-file.js +184 -0
  78. package/dist/core/env-file.js.map +1 -0
  79. package/dist/core/module-manifest.d.ts +19 -0
  80. package/dist/core/module-manifest.js +48 -0
  81. package/dist/core/module-manifest.js.map +1 -0
  82. package/dist/core/modules-state.d.ts +24 -0
  83. package/dist/core/modules-state.js +81 -0
  84. package/dist/core/modules-state.js.map +1 -0
  85. package/dist/core/prisma-schema.d.ts +3 -0
  86. package/dist/core/prisma-schema.js +38 -0
  87. package/dist/core/prisma-schema.js.map +1 -0
  88. package/dist/core/semver.d.ts +9 -0
  89. package/dist/core/semver.js +32 -0
  90. package/dist/core/semver.js.map +1 -0
  91. package/dist/core/template-sync.d.ts +19 -0
  92. package/dist/core/template-sync.js +97 -0
  93. package/dist/core/template-sync.js.map +1 -0
  94. package/dist/core/unified-diff.d.ts +1 -0
  95. package/dist/core/unified-diff.js +103 -0
  96. package/dist/core/unified-diff.js.map +1 -0
  97. package/dist/index.d.ts +2 -0
  98. package/dist/index.js +202 -0
  99. package/dist/index.js.map +1 -0
  100. package/dist/lib/check.d.ts +1 -0
  101. package/dist/lib/check.js +31 -0
  102. package/dist/lib/check.js.map +1 -0
  103. package/dist/lib/drift.d.ts +5 -0
  104. package/dist/lib/drift.js +142 -0
  105. package/dist/lib/drift.js.map +1 -0
  106. package/dist/lib/env-tool-config.d.ts +17 -0
  107. package/dist/lib/env-tool-config.js +32 -0
  108. package/dist/lib/env-tool-config.js.map +1 -0
  109. package/dist/lib/errors.d.ts +5 -0
  110. package/dist/lib/errors.js +20 -0
  111. package/dist/lib/errors.js.map +1 -0
  112. package/dist/lib/exec.d.ts +13 -0
  113. package/dist/lib/exec.js +40 -0
  114. package/dist/lib/exec.js.map +1 -0
  115. package/dist/lib/fs-util.d.ts +1 -0
  116. package/dist/lib/fs-util.js +18 -0
  117. package/dist/lib/fs-util.js.map +1 -0
  118. package/dist/lib/issues.d.ts +8 -0
  119. package/dist/lib/issues.js +31 -0
  120. package/dist/lib/issues.js.map +1 -0
  121. package/dist/lib/loading.d.ts +1 -0
  122. package/dist/lib/loading.js +31 -0
  123. package/dist/lib/loading.js.map +1 -0
  124. package/dist/lib/module-install.d.ts +5 -0
  125. package/dist/lib/module-install.js +54 -0
  126. package/dist/lib/module-install.js.map +1 -0
  127. package/dist/lib/modules-state.d.ts +6 -0
  128. package/dist/lib/modules-state.js +51 -0
  129. package/dist/lib/modules-state.js.map +1 -0
  130. package/dist/lib/registry.d.ts +23 -0
  131. package/dist/lib/registry.js +182 -0
  132. package/dist/lib/registry.js.map +1 -0
  133. package/dist/lib/sink.d.ts +10 -0
  134. package/dist/lib/sink.js +56 -0
  135. package/dist/lib/sink.js.map +1 -0
  136. package/dist/lib/version.d.ts +1 -0
  137. package/dist/lib/version.js +19 -0
  138. package/dist/lib/version.js.map +1 -0
  139. package/package.json +39 -0
@@ -0,0 +1,9 @@
1
+ import { IssueBag } from "../lib/issues";
2
+ import { Sink } from "../lib/sink";
3
+ export declare function assembleNestJsAssets(params: {
4
+ cwd: string;
5
+ sink: Sink;
6
+ issues: IssueBag;
7
+ added: string[];
8
+ removed: string[];
9
+ }): Promise<void>;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.assembleNestJsAssets = assembleNestJsAssets;
7
+ const promises_1 = __importDefault(require("node:fs/promises"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const assets_1 = require("../core/assets");
10
+ const paths_1 = require("../constants/paths");
11
+ const issues_1 = require("../lib/issues");
12
+ const module_install_1 = require("../lib/module-install");
13
+ async function readNestCli(cwd) {
14
+ try {
15
+ return JSON.parse(await promises_1.default.readFile(node_path_1.default.resolve(cwd, paths_1.NEST_CLI_JSON), "utf8"));
16
+ }
17
+ catch (error) {
18
+ if (error.code === "ENOENT")
19
+ return null;
20
+ throw error;
21
+ }
22
+ }
23
+ async function assembleNestJsAssets(params) {
24
+ const { cwd, sink, issues, added, removed } = params;
25
+ const nestCli = await readNestCli(cwd);
26
+ if (!nestCli) {
27
+ (0, issues_1.reportIssue)(issues, sink, `Missing ${paths_1.NEST_CLI_JSON}; skipping nestjs assets update.`);
28
+ return;
29
+ }
30
+ nestCli.compilerOptions = nestCli.compilerOptions ?? {};
31
+ let assets = nestCli.compilerOptions.assets ?? [];
32
+ for (const key of added) {
33
+ const manifest = await (0, module_install_1.readInstalledManifest)(cwd, key);
34
+ if (manifest === null) {
35
+ (0, issues_1.reportIssue)(issues, sink, `Missing newbie.module.json for '${key}'; its assets were not added.`);
36
+ continue;
37
+ }
38
+ assets = (0, assets_1.addAssets)(assets, manifest.assets ?? []);
39
+ }
40
+ for (const key of removed) {
41
+ const manifest = await (0, module_install_1.readInstalledManifest)(cwd, key);
42
+ if (manifest === null)
43
+ continue;
44
+ assets = (0, assets_1.removeAssets)(assets, manifest.assets ?? []);
45
+ }
46
+ nestCli.compilerOptions.assets = (0, assets_1.dedupeAssets)(assets);
47
+ await sink.writeText(paths_1.NEST_CLI_JSON, JSON.stringify(nestCli, null, 2));
48
+ }
49
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/assemble/assets.ts"],"names":[],"mappings":";;;;;AAiCA,oDA2CC;AA5ED,gEAAkC;AAClC,0DAA6B;AAE7B,2CAKwB;AACxB,8CAAmD;AACnD,0CAAsD;AACtD,0DAA8D;AAW9D,KAAK,UAAU,WAAW,CAAC,GAAW;IACpC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CACf,MAAM,kBAAE,CAAC,QAAQ,CAAC,mBAAI,CAAC,OAAO,CAAC,GAAG,EAAE,qBAAa,CAAC,EAAE,MAAM,CAAC,CAC3C,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACpE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,oBAAoB,CAAC,MAM1C;IACC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAErD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAA,oBAAW,EACT,MAAM,EACN,IAAI,EACJ,WAAW,qBAAa,kCAAkC,CAC3D,CAAC;QACF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC;IACxD,IAAI,MAAM,GAAgB,OAAO,CAAC,eAAe,CAAC,MAAM,IAAI,EAAE,CAAC;IAE/D,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,MAAM,IAAA,sCAAqB,EAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACvD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,IAAA,oBAAW,EACT,MAAM,EACN,IAAI,EACJ,mCAAmC,GAAG,+BAA+B,CACtE,CAAC;YACF,SAAS;QACX,CAAC;QACD,MAAM,GAAG,IAAA,kBAAS,EAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,MAAM,IAAA,sCAAqB,EAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACvD,IAAI,QAAQ,KAAK,IAAI;YAAE,SAAS;QAChC,MAAM,GAAG,IAAA,qBAAY,EAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,CAAC,eAAe,CAAC,MAAM,GAAG,IAAA,qBAAY,EAAC,MAAM,CAAC,CAAC;IACtD,MAAM,IAAI,CAAC,SAAS,CAAC,qBAAa,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { IssueBag } from "../lib/issues";
2
+ import { Sink } from "../lib/sink";
3
+ export declare function assembleDependencies(params: {
4
+ cwd: string;
5
+ sink: Sink;
6
+ issues: IssueBag;
7
+ added: string[];
8
+ removed: string[];
9
+ enabled: string[];
10
+ }): Promise<void>;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assembleDependencies = assembleDependencies;
4
+ const dependency_plan_1 = require("../core/dependency-plan");
5
+ const issues_1 = require("../lib/issues");
6
+ const module_install_1 = require("../lib/module-install");
7
+ async function loadManifests(cwd, issues, sink, keys, label) {
8
+ const manifests = [];
9
+ for (const key of keys) {
10
+ const manifest = await (0, module_install_1.readInstalledManifest)(cwd, key);
11
+ if (manifest === null) {
12
+ (0, issues_1.reportIssue)(issues, sink, `Missing newbie.module.json for '${key}'; dependencies of ${label} modules may be incomplete.`);
13
+ continue;
14
+ }
15
+ manifests.push(manifest);
16
+ }
17
+ return manifests;
18
+ }
19
+ async function assembleDependencies(params) {
20
+ const { cwd, sink, issues, added, removed, enabled } = params;
21
+ const addedDecls = await loadManifests(cwd, issues, sink, added, "added");
22
+ const { dependencies: addSpecs, devDependencies: addDevSpecs } = (0, dependency_plan_1.buildInstallSpecs)(addedDecls);
23
+ if (addSpecs.length > 0) {
24
+ await sink.run("npm", ["install", ...addSpecs], "npm install");
25
+ }
26
+ if (addDevSpecs.length > 0) {
27
+ await sink.run("npm", ["install", "--save-dev", ...addDevSpecs], "npm install --save-dev");
28
+ }
29
+ const enabledDecls = await loadManifests(cwd, issues, sink, enabled, "enabled");
30
+ const removedDecls = await loadManifests(cwd, issues, sink, removed, "removed");
31
+ const { dependencies: removeDeps, devDependencies: removeDevDeps } = (0, dependency_plan_1.planDependencyRemovals)(removedDecls, enabledDecls);
32
+ if (removeDeps.length > 0 || removeDevDeps.length > 0) {
33
+ await sink.run("npm", ["uninstall", ...removeDeps, ...removeDevDeps], "npm uninstall");
34
+ }
35
+ }
36
+ //# sourceMappingURL=dependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/assemble/dependencies.ts"],"names":[],"mappings":";;AAgCA,oDAmDC;AAnFD,6DAGiC;AAEjC,0CAAsD;AACtD,0DAA8D;AAG9D,KAAK,UAAU,aAAa,CAC1B,GAAW,EACX,MAAgB,EAChB,IAAU,EACV,IAAc,EACd,KAAa;IAEb,MAAM,SAAS,GAAqB,EAAE,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,MAAM,IAAA,sCAAqB,EAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACvD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,IAAA,oBAAW,EACT,MAAM,EACN,IAAI,EACJ,mCAAmC,GAAG,sBAAsB,KAAK,6BAA6B,CAC/F,CAAC;YACF,SAAS;QACX,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAEM,KAAK,UAAU,oBAAoB,CAAC,MAO1C;IACC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAG9D,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1E,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,GAC5D,IAAA,mCAAiB,EAAC,UAAU,CAAC,CAAC;IAEhC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,GAAG,QAAQ,CAAC,EAAE,aAAa,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,CAAC,GAAG,CACZ,KAAK,EACL,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,EACzC,wBAAwB,CACzB,CAAC;IACJ,CAAC;IAGD,MAAM,YAAY,GAAG,MAAM,aAAa,CACtC,GAAG,EACH,MAAM,EACN,IAAI,EACJ,OAAO,EACP,SAAS,CACV,CAAC;IACF,MAAM,YAAY,GAAG,MAAM,aAAa,CACtC,GAAG,EACH,MAAM,EACN,IAAI,EACJ,OAAO,EACP,SAAS,CACV,CAAC;IACF,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,GAChE,IAAA,wCAAsB,EAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAErD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,CAAC,GAAG,CACZ,KAAK,EACL,CAAC,WAAW,EAAE,GAAG,UAAU,EAAE,GAAG,aAAa,CAAC,EAC9C,eAAe,CAChB,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { IssueBag } from "../lib/issues";
2
+ import { Sink } from "../lib/sink";
3
+ export declare function assembleEnv(params: {
4
+ cwd: string;
5
+ sink: Sink;
6
+ issues: IssueBag;
7
+ added: string[];
8
+ removed: string[];
9
+ }): Promise<void>;
10
+ export declare function assembleEnvExample(params: {
11
+ cwd: string;
12
+ sink: Sink;
13
+ issues: IssueBag;
14
+ enabled: string[];
15
+ }): Promise<void>;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.assembleEnv = assembleEnv;
7
+ exports.assembleEnvExample = assembleEnvExample;
8
+ const promises_1 = __importDefault(require("node:fs/promises"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const env_file_1 = require("../core/env-file");
11
+ const paths_1 = require("../constants/paths");
12
+ const issues_1 = require("../lib/issues");
13
+ const module_install_1 = require("../lib/module-install");
14
+ function sectionTitle(key) {
15
+ return key.length === 0 ? key : key.charAt(0).toUpperCase() + key.slice(1);
16
+ }
17
+ async function assembleEnv(params) {
18
+ const { cwd, sink, issues, added, removed } = params;
19
+ let raw = "";
20
+ try {
21
+ raw = await promises_1.default.readFile(node_path_1.default.resolve(cwd, paths_1.ENV_PATH), "utf8");
22
+ }
23
+ catch {
24
+ }
25
+ let lines = (0, env_file_1.parseEnv)(raw);
26
+ for (const key of added) {
27
+ const manifest = await (0, module_install_1.readInstalledManifest)(cwd, key);
28
+ if (manifest === null) {
29
+ (0, issues_1.reportIssue)(issues, sink, `Missing newbie.module.json for '${key}'; its env variables were not added.`);
30
+ continue;
31
+ }
32
+ lines = (0, env_file_1.upsertEnvSection)(lines, sectionTitle(key), manifest.env ?? {});
33
+ }
34
+ const removedKeys = new Set();
35
+ for (const key of removed) {
36
+ const manifest = await (0, module_install_1.readInstalledManifest)(cwd, key);
37
+ if (manifest === null)
38
+ continue;
39
+ for (const envKey of Object.keys(manifest.env ?? {}))
40
+ removedKeys.add(envKey);
41
+ }
42
+ if (removedKeys.size > 0) {
43
+ lines = (0, env_file_1.pruneEmptySections)((0, env_file_1.removeEnvKeys)(lines, removedKeys));
44
+ }
45
+ const serialized = (0, env_file_1.serializeEnv)(lines);
46
+ if (serialized !== raw) {
47
+ await sink.writeText(paths_1.ENV_PATH, serialized);
48
+ }
49
+ }
50
+ async function assembleEnvExample(params) {
51
+ const { cwd, sink, issues, enabled } = params;
52
+ const decoration = "# ----------------------------------------------------------------------------------";
53
+ const sectionLines = [];
54
+ for (const key of enabled) {
55
+ const manifest = await (0, module_install_1.readInstalledManifest)(cwd, key);
56
+ if (manifest === null) {
57
+ (0, issues_1.reportIssue)(issues, sink, `Missing newbie.module.json for '${key}'; excluded from ${paths_1.ENV_EXAMPLE_PATH}.`);
58
+ continue;
59
+ }
60
+ sectionLines.push(decoration, `# ! ${sectionTitle(key)} variables`, decoration);
61
+ for (const [envKey, value] of Object.entries(manifest.env ?? {})) {
62
+ sectionLines.push(`${envKey}=${value}`);
63
+ }
64
+ }
65
+ const body = sectionLines.length > 0
66
+ ? `# Variables below are managed by @devbie/newbie-cli. Do not edit between the markers.\n${sectionLines.join("\n")}\n`
67
+ : "";
68
+ let raw = "";
69
+ try {
70
+ raw = await promises_1.default.readFile(node_path_1.default.resolve(cwd, paths_1.ENV_EXAMPLE_PATH), "utf8");
71
+ }
72
+ catch {
73
+ }
74
+ const next = (0, env_file_1.replaceMarkedBlock)(raw, body);
75
+ if (next !== raw) {
76
+ await sink.writeText(paths_1.ENV_EXAMPLE_PATH, next);
77
+ }
78
+ }
79
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/assemble/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { RegistryLocation } from "../lib/registry";
2
+ import { Sink } from "../lib/sink";
3
+ export declare function assertModuleKeySafe(key: string): void;
4
+ export declare function addModules(params: {
5
+ cwd: string;
6
+ sink: Sink;
7
+ registry: RegistryLocation;
8
+ keys: string[];
9
+ }): Promise<void>;
10
+ export declare function removeModules(params: {
11
+ sink: Sink;
12
+ keys: string[];
13
+ }): Promise<void>;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.assertModuleKeySafe = assertModuleKeySafe;
7
+ exports.addModules = addModules;
8
+ exports.removeModules = removeModules;
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const paths_1 = require("../constants/paths");
11
+ const registry_1 = require("../lib/registry");
12
+ const errors_1 = require("../lib/errors");
13
+ function assertModuleKeySafe(key) {
14
+ const resolved = node_path_1.default.resolve(paths_1.MODULES_DIR, key);
15
+ const relative = node_path_1.default.relative(paths_1.MODULES_DIR, resolved);
16
+ if (relative.startsWith("..") ||
17
+ node_path_1.default.isAbsolute(relative) ||
18
+ relative.split(node_path_1.default.sep).length !== 1) {
19
+ throw new errors_1.CliError(`[Error] Refusing to operate outside ${paths_1.MODULES_DIR}: ${key}`);
20
+ }
21
+ }
22
+ async function addModules(params) {
23
+ const { cwd, sink, registry, keys } = params;
24
+ for (const key of keys) {
25
+ assertModuleKeySafe(key);
26
+ await sink.copy((0, registry_1.moduleRootInRegistry)(registry.root, key), node_path_1.default.posix.join(paths_1.MODULES_DIR, key));
27
+ }
28
+ }
29
+ async function removeModules(params) {
30
+ const { sink, keys } = params;
31
+ for (const key of keys) {
32
+ assertModuleKeySafe(key);
33
+ await sink.remove(node_path_1.default.posix.join(paths_1.MODULES_DIR, key));
34
+ }
35
+ }
36
+ //# sourceMappingURL=modules-copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modules-copy.js","sourceRoot":"","sources":["../../src/assemble/modules-copy.ts"],"names":[],"mappings":";;;;;AAcA,kDAYC;AAOD,gCAcC;AAGD,sCASC;AA3DD,0DAA6B;AAE7B,8CAAiD;AACjD,8CAGyB;AACzB,0CAAyC;AAOzC,SAAgB,mBAAmB,CAAC,GAAW;IAC7C,MAAM,QAAQ,GAAG,mBAAI,CAAC,OAAO,CAAC,mBAAW,EAAE,GAAG,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,mBAAI,CAAC,QAAQ,CAAC,mBAAW,EAAE,QAAQ,CAAC,CAAC;IACtD,IACE,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;QACzB,mBAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QACzB,QAAQ,CAAC,KAAK,CAAC,mBAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,EACrC,CAAC;QACD,MAAM,IAAI,iBAAQ,CAChB,uCAAuC,mBAAW,KAAK,GAAG,EAAE,CAC7D,CAAC;IACJ,CAAC;AACH,CAAC;AAOM,KAAK,UAAU,UAAU,CAAC,MAKhC;IACC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IAC7C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,IAAI,CAAC,IAAI,CACb,IAAA,+BAAoB,EAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EACxC,mBAAI,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAW,EAAE,GAAG,CAAC,CAClC,CAAC;IACJ,CAAC;AACH,CAAC;AAGM,KAAK,UAAU,aAAa,CAAC,MAGnC;IACC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,IAAI,CAAC,MAAM,CAAC,mBAAI,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAW,EAAE,GAAG,CAAC,CAAC,CAAC;IACvD,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { IssueBag } from "../lib/issues";
2
+ import { Sink } from "../lib/sink";
3
+ export declare function assembleNestJsModules(params: {
4
+ cwd: string;
5
+ sink: Sink;
6
+ issues: IssueBag;
7
+ enabledKeys: string[];
8
+ }): Promise<void>;
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assembleNestJsModules = assembleNestJsModules;
4
+ const paths_1 = require("../constants/paths");
5
+ const module_manifest_1 = require("../core/module-manifest");
6
+ const issues_1 = require("../lib/issues");
7
+ const module_install_1 = require("../lib/module-install");
8
+ const DO_NOT_EDIT_HEADER = `// THIS FILE IS GENERATED BY @devbie/newbie-cli. DO NOT EDIT.
9
+ // Run 'newbie install' to regenerate this file.
10
+
11
+ `;
12
+ const EMPTY_MODULE_TEMPLATE = `${DO_NOT_EDIT_HEADER}import {Global, Module} from '@nestjs/common';
13
+
14
+ @Global()
15
+ @Module({
16
+ imports: [],
17
+ })
18
+ export class ModulesModule {}
19
+ `;
20
+ const EMPTY_CONFIG_TEMPLATE = `${DO_NOT_EDIT_HEADER}import {registerAs} from '@nestjs/config';
21
+
22
+ export default registerAs('modules', () => ({}));
23
+ `;
24
+ function moduleTemplate(entries) {
25
+ const hasConfigService = entries.length > 0;
26
+ const importCode = [
27
+ `import {Global, Module} from '@nestjs/common';`,
28
+ hasConfigService
29
+ ? `import ModulesConfiguration from './modules.config';\nimport {ConfigModule} from '@nestjs/config';`
30
+ : "",
31
+ ...entries.map(({ key, manifest }) => (0, module_manifest_1.moduleImportLine)(key, manifest)),
32
+ ]
33
+ .filter(Boolean)
34
+ .join("\n");
35
+ const importModuleNames = [
36
+ hasConfigService
37
+ ? `ConfigModule.forRoot({load: [ModulesConfiguration], isGlobal: true})`
38
+ : "",
39
+ ...entries.map(({ manifest }) => manifest.module.className),
40
+ ]
41
+ .filter(Boolean)
42
+ .join(",\n ");
43
+ return `${DO_NOT_EDIT_HEADER}${importCode}
44
+
45
+ @Global()
46
+ @Module({
47
+ imports: [
48
+ ${importModuleNames}
49
+ ],
50
+ })
51
+ export class ModulesModule {}
52
+ `;
53
+ }
54
+ function configTemplate(configs) {
55
+ const body = JSON.stringify(configs, null, 2)
56
+ .replace(/("|')(process.*?)\1/g, "$2")
57
+ .replace(/("|')(bool\(process.*?)\1/g, "$2")
58
+ .replace(/("|')(int\(process.*?)\1/g, "$2");
59
+ return `${DO_NOT_EDIT_HEADER}import {registerAs} from '@nestjs/config';
60
+ import {bool, int} from '@devbie/newbie';
61
+
62
+ export default registerAs('modules', () => (${body}));
63
+ `;
64
+ }
65
+ async function assembleNestJsModules(params) {
66
+ const { cwd, sink, issues, enabledKeys } = params;
67
+ const entries = [];
68
+ for (const key of enabledKeys) {
69
+ const manifest = await (0, module_install_1.readInstalledManifest)(cwd, key);
70
+ if (manifest === null) {
71
+ (0, issues_1.reportIssue)(issues, sink, `Missing newbie.module.json for '${key}'; it was skipped in the NestJS module wiring.`);
72
+ continue;
73
+ }
74
+ entries.push({ key, manifest });
75
+ }
76
+ await sink.writeText(paths_1.MODULES_MODULE_TS, entries.length > 0 ? moduleTemplate(entries) : EMPTY_MODULE_TEMPLATE);
77
+ let configs = {};
78
+ for (const { manifest } of entries) {
79
+ configs = { ...configs, ...(manifest["config-service"] ?? {}) };
80
+ }
81
+ await sink.writeText(paths_1.MODULES_CONFIG_TS, Object.keys(configs).length > 0
82
+ ? configTemplate(configs)
83
+ : EMPTY_CONFIG_TEMPLATE);
84
+ await sink.run("npx", ["prettier", "--write", paths_1.MODULES_MODULE_TS, paths_1.MODULES_CONFIG_TS], "prettier generated module files");
85
+ }
86
+ //# sourceMappingURL=modules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modules.js","sourceRoot":"","sources":["../../src/assemble/modules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { PipelineContext } from "./types";
2
+ export interface PlannedChange {
3
+ added: string[];
4
+ removed: string[];
5
+ enabledKeys: string[];
6
+ }
7
+ export declare function readProjectModuleDirs(cwd: string): Promise<string[]>;
8
+ export declare function runSteps(ctx: PipelineContext, changes: PlannedChange): Promise<void>;
9
+ export declare function applyPlanned(ctx: PipelineContext, changes: PlannedChange): Promise<void>;
10
+ export declare function applyModuleKeys(ctx: PipelineContext, nextKeys: string[]): Promise<{
11
+ added: string[];
12
+ removed: string[];
13
+ }>;
14
+ export declare function planReconcile(ctx: PipelineContext): Promise<PlannedChange & {
15
+ installed: string[];
16
+ uninstalled: string[];
17
+ }>;
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.readProjectModuleDirs = readProjectModuleDirs;
7
+ exports.runSteps = runSteps;
8
+ exports.applyPlanned = applyPlanned;
9
+ exports.applyModuleKeys = applyModuleKeys;
10
+ exports.planReconcile = planReconcile;
11
+ const promises_1 = __importDefault(require("node:fs/promises"));
12
+ const node_path_1 = __importDefault(require("node:path"));
13
+ const colorette_1 = require("colorette");
14
+ const modules_state_1 = require("../core/modules-state");
15
+ const paths_1 = require("../constants/paths");
16
+ const modules_state_2 = require("../lib/modules-state");
17
+ const dependencies_1 = require("./dependencies");
18
+ const env_1 = require("./env");
19
+ const assets_1 = require("./assets");
20
+ const modules_1 = require("./modules");
21
+ const modules_copy_1 = require("./modules-copy");
22
+ const schema_1 = require("./schema");
23
+ function step(title) {
24
+ console.info(`\n${(0, colorette_1.cyan)("→")} ${title}`);
25
+ }
26
+ async function readProjectModuleDirs(cwd) {
27
+ try {
28
+ const dirents = await promises_1.default.readdir(node_path_1.default.resolve(cwd, paths_1.MODULES_DIR), {
29
+ withFileTypes: true,
30
+ });
31
+ const keys = [];
32
+ for (const dirent of dirents) {
33
+ if (!dirent.isDirectory())
34
+ continue;
35
+ try {
36
+ await promises_1.default.stat(node_path_1.default.resolve(cwd, paths_1.MODULES_DIR, dirent.name, paths_1.MODULE_MANIFEST_FILE));
37
+ keys.push(dirent.name);
38
+ }
39
+ catch {
40
+ }
41
+ }
42
+ return keys;
43
+ }
44
+ catch {
45
+ return [];
46
+ }
47
+ }
48
+ function stampCopiedModules(state, addedKeys, registry) {
49
+ const added = new Set(addedKeys);
50
+ return {
51
+ ...state,
52
+ registry: {
53
+ ...(state.registry ?? {}),
54
+ url: registry.url,
55
+ sourceCommit: registry.sourceCommit,
56
+ },
57
+ modules: state.modules.map((record) => added.has(record.key)
58
+ ? {
59
+ ...record,
60
+ version: null,
61
+ sourceCommit: registry.sourceCommit,
62
+ localPatches: [],
63
+ }
64
+ : record),
65
+ };
66
+ }
67
+ async function runSteps(ctx, changes) {
68
+ const { cwd, sink, issues, registry, skipPrismaGenerate } = ctx;
69
+ const { added, removed, enabledKeys } = changes;
70
+ if (added.length > 0) {
71
+ step("Copy modules from the registry");
72
+ await (0, modules_copy_1.addModules)({ cwd, sink, registry, keys: added });
73
+ if (!sink.dryRun) {
74
+ ctx.state = stampCopiedModules(ctx.state, added, registry);
75
+ await (0, modules_state_2.writeModulesState)(cwd, sink, ctx.state);
76
+ }
77
+ }
78
+ step("Update environment variables");
79
+ await (0, env_1.assembleEnv)({ cwd, sink, issues, added, removed });
80
+ step("Update database schema");
81
+ await (0, schema_1.assembleSchemaFiles)({
82
+ cwd,
83
+ sink,
84
+ issues,
85
+ added,
86
+ removed,
87
+ skipPrismaGenerate,
88
+ });
89
+ step("Update nestjs assets");
90
+ await (0, assets_1.assembleNestJsAssets)({ cwd, sink, issues, added, removed });
91
+ step("Update nestjs modules");
92
+ await (0, modules_1.assembleNestJsModules)({ cwd, sink, issues, enabledKeys });
93
+ step("Update package dependencies");
94
+ await (0, dependencies_1.assembleDependencies)({
95
+ cwd,
96
+ sink,
97
+ issues,
98
+ added,
99
+ removed,
100
+ enabled: enabledKeys,
101
+ });
102
+ if (removed.length > 0) {
103
+ step("Delete module directories");
104
+ await (0, modules_copy_1.removeModules)({ sink, keys: removed });
105
+ }
106
+ step("Update .env.example");
107
+ await (0, env_1.assembleEnvExample)({ cwd, sink, issues, enabled: enabledKeys });
108
+ }
109
+ async function applyPlanned(ctx, changes) {
110
+ await runSteps(ctx, changes);
111
+ }
112
+ async function applyModuleKeys(ctx, nextKeys) {
113
+ const { cwd, sink } = ctx;
114
+ const diff = (0, modules_state_1.diffModuleKeys)((0, modules_state_1.moduleKeys)(ctx.state), nextKeys);
115
+ ctx.state = (0, modules_state_1.withModuleKeys)(ctx.state, nextKeys);
116
+ await (0, modules_state_2.writeModulesState)(cwd, sink, ctx.state);
117
+ await runSteps(ctx, {
118
+ added: diff.added,
119
+ removed: diff.removed,
120
+ enabledKeys: nextKeys,
121
+ });
122
+ return diff;
123
+ }
124
+ async function planReconcile(ctx) {
125
+ const inProject = new Set(await readProjectModuleDirs(ctx.cwd));
126
+ const enabled = (0, modules_state_1.moduleKeys)(ctx.state);
127
+ const enabledSet = new Set(enabled);
128
+ const installed = enabled.filter((key) => {
129
+ if (!inProject.has(key))
130
+ return true;
131
+ const record = ctx.state.modules.find((entry) => entry.key === key);
132
+ return !record?.sourceCommit;
133
+ });
134
+ const uninstalled = [...inProject].filter((key) => !enabledSet.has(key));
135
+ return {
136
+ added: installed,
137
+ removed: uninstalled,
138
+ enabledKeys: enabled,
139
+ installed,
140
+ uninstalled,
141
+ };
142
+ }
143
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/assemble/pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { IssueBag } from "../lib/issues";
2
+ import { Sink } from "../lib/sink";
3
+ export declare function assembleSchemaFiles(params: {
4
+ cwd: string;
5
+ sink: Sink;
6
+ issues: IssueBag;
7
+ added: string[];
8
+ removed: string[];
9
+ skipPrismaGenerate?: boolean;
10
+ }): Promise<void>;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.assembleSchemaFiles = assembleSchemaFiles;
7
+ const promises_1 = __importDefault(require("node:fs/promises"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const prisma_schema_1 = require("../core/prisma-schema");
10
+ const paths_1 = require("../constants/paths");
11
+ const issues_1 = require("../lib/issues");
12
+ const module_install_1 = require("../lib/module-install");
13
+ const fs_util_1 = require("../lib/fs-util");
14
+ const DO_NOT_EDIT_HEADER = `// THIS FILE IS MANAGED BY @devbie/newbie-cli. DO NOT EDIT.
15
+ // Run 'newbie install' to regenerate this file.
16
+
17
+ `;
18
+ async function keysWithSchema(cwd, keys) {
19
+ const result = [];
20
+ for (const key of keys) {
21
+ const manifest = await (0, module_install_1.readInstalledManifest)(cwd, key);
22
+ if (!manifest)
23
+ continue;
24
+ if (!manifest.schema)
25
+ continue;
26
+ const fragment = await (0, module_install_1.readInstalledSchema)(cwd, key, manifest);
27
+ result.push({ key, fragment });
28
+ }
29
+ return result;
30
+ }
31
+ async function assembleSchemaFiles(params) {
32
+ const { cwd, sink, issues, added, removed, skipPrismaGenerate } = params;
33
+ for (const { key, fragment } of await keysWithSchema(cwd, added)) {
34
+ if (fragment === null) {
35
+ (0, issues_1.reportIssue)(issues, sink, `Declared Prisma fragment is missing inside ${node_path_1.default.posix.join(paths_1.MODULES_DIR, key)}`);
36
+ continue;
37
+ }
38
+ await sink.writeText(node_path_1.default.posix.join(paths_1.PRISMA_SCHEMA_MODELS_DIR, `${key}.prisma`), `${DO_NOT_EDIT_HEADER}${fragment}`);
39
+ }
40
+ for (const { key } of await keysWithSchema(cwd, removed)) {
41
+ await sink.remove(node_path_1.default.posix.join(paths_1.PRISMA_SCHEMA_MODELS_DIR, `${key}.prisma`));
42
+ }
43
+ const addedWithSchema = (await keysWithSchema(cwd, added)).filter((entry) => entry.fragment !== null);
44
+ const removedWithSchema = await keysWithSchema(cwd, removed);
45
+ if (addedWithSchema.length > 0 || removedWithSchema.length > 0) {
46
+ const mainSchemaPath = node_path_1.default.resolve(cwd, paths_1.PRISMA_SCHEMA_MAIN);
47
+ let content;
48
+ try {
49
+ content = await promises_1.default.readFile(mainSchemaPath, "utf8");
50
+ }
51
+ catch {
52
+ (0, issues_1.reportIssue)(issues, sink, `Missing ${paths_1.PRISMA_SCHEMA_MAIN}; skipping datasource schemas update.`);
53
+ return;
54
+ }
55
+ const next = (0, prisma_schema_1.updateDatasourceSchemas)(content, addedWithSchema.map((entry) => (0, prisma_schema_1.moduleSchemaNamespace)(entry.key)), removedWithSchema.map((entry) => (0, prisma_schema_1.moduleSchemaNamespace)(entry.key)));
56
+ if (next !== content) {
57
+ await sink.writeText(paths_1.PRISMA_SCHEMA_MAIN, next);
58
+ }
59
+ }
60
+ if (!skipPrismaGenerate && (await (0, fs_util_1.fileExists)(cwd, paths_1.PRISMA_SCHEMA_MAIN))) {
61
+ await sink.run("npx", ["prisma", "generate"], "prisma generate");
62
+ }
63
+ }
64
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/assemble/schema.ts"],"names":[],"mappings":"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"}