@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,6 @@
1
+ import { GlobalOptions } from "./shared";
2
+ export declare function runUpdate(options: GlobalOptions & {
3
+ all?: boolean;
4
+ yes?: boolean;
5
+ force?: boolean;
6
+ }): Promise<void>;
@@ -0,0 +1,129 @@
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.runUpdate = runUpdate;
7
+ const figlet_1 = __importDefault(require("figlet"));
8
+ const prompts_1 = require("@inquirer/prompts");
9
+ const colorette_1 = require("colorette");
10
+ const pipeline_1 = require("../assemble/pipeline");
11
+ const drift_1 = require("../core/drift");
12
+ const modules_state_1 = require("../core/modules-state");
13
+ const drift_2 = require("../lib/drift");
14
+ const fs_util_1 = require("../lib/fs-util");
15
+ const paths_1 = require("../constants/paths");
16
+ const modules_state_2 = require("../lib/modules-state");
17
+ const shared_1 = require("./shared");
18
+ const short = (commit) => commit ? commit.slice(0, 7) : "unknown";
19
+ async function runUpdate(options) {
20
+ console.info(figlet_1.default.textSync("Newbie", {
21
+ font: "Epic",
22
+ width: 80,
23
+ whitespaceBreak: true,
24
+ }));
25
+ const { ctx } = await (0, shared_1.createContext)(options, { fetch: true });
26
+ const { cwd, sink, registry, state } = ctx;
27
+ const keys = (0, modules_state_1.moduleKeys)(state);
28
+ if (keys.length === 0) {
29
+ console.info("\n[info] No modules are enabled.\n");
30
+ return;
31
+ }
32
+ const targetCommit = registry.sourceCommit;
33
+ const inspections = [];
34
+ for (const key of keys) {
35
+ process.stdout.write(`Checking ${key}...\r`);
36
+ const record = state.modules.find((entry) => entry.key === key);
37
+ const fromCommit = record?.sourceCommit ?? null;
38
+ const base = {
39
+ key,
40
+ status: "up-to-date",
41
+ fromCommit,
42
+ toCommit: targetCommit,
43
+ patchIds: [],
44
+ };
45
+ if (!(await (0, fs_util_1.fileExists)(cwd, `${paths_1.MODULES_DIR}/${key}`))) {
46
+ inspections.push({ ...base, status: "missing" });
47
+ continue;
48
+ }
49
+ if (fromCommit && targetCommit && fromCommit === targetCommit) {
50
+ inspections.push(base);
51
+ continue;
52
+ }
53
+ if (fromCommit && !options.force) {
54
+ const pristine = await (0, drift_2.snapshotPristineModule)(registry, key, fromCommit);
55
+ if (pristine) {
56
+ const drift = (0, drift_1.diffSnapshots)(await (0, drift_2.snapshotInstalledModule)(cwd, key), pristine);
57
+ if (!drift.clean) {
58
+ inspections.push({
59
+ ...base,
60
+ status: "drifted",
61
+ patchIds: (0, drift_1.driftPatchIds)(drift),
62
+ });
63
+ continue;
64
+ }
65
+ }
66
+ }
67
+ inspections.push({ ...base, status: "update-available" });
68
+ }
69
+ process.stdout.write("\x1b[2K\r");
70
+ for (const result of inspections) {
71
+ if (result.status === "missing") {
72
+ console.info((0, colorette_1.yellow)(`[skip] ${result.key}: directory missing; run 'newbie install'.`));
73
+ }
74
+ else if (result.status === "drifted") {
75
+ console.info((0, colorette_1.yellow)(`[skip] ${result.key}: local changes detected (${result.patchIds.length} file(s)); re-run with --force to overwrite.`));
76
+ }
77
+ }
78
+ const updatable = inspections.filter((result) => result.status === "update-available");
79
+ if (updatable.length === 0) {
80
+ console.info((0, colorette_1.green)("\n[info] All modules are up to date.\n"));
81
+ return;
82
+ }
83
+ let selected;
84
+ if (options.all || options.dryRun) {
85
+ selected = updatable;
86
+ }
87
+ else {
88
+ const selectedKeys = await (0, prompts_1.checkbox)({
89
+ message: "Which modules do you want to update:",
90
+ choices: updatable.map((result) => ({
91
+ value: result.key,
92
+ name: `${result.key} ${(0, colorette_1.inverse)(short(result.fromCommit))} -> ${(0, colorette_1.cyan)(short(result.toCommit))}`,
93
+ checked: true,
94
+ })),
95
+ pageSize: 100,
96
+ loop: true,
97
+ });
98
+ selected = updatable.filter((result) => selectedKeys.includes(result.key));
99
+ }
100
+ if (selected.length === 0) {
101
+ console.info("\n[info] No modules selected.\n");
102
+ return;
103
+ }
104
+ if (!options.yes && !options.dryRun) {
105
+ const confirmed = await (0, prompts_1.select)({
106
+ message: `Do you want to UPDATE ${(0, colorette_1.cyan)(selected.map((result) => result.key).join(", "))}?`,
107
+ choices: [
108
+ { name: "Yes", value: "yes" },
109
+ { name: "No", value: "no" },
110
+ ],
111
+ });
112
+ if (confirmed !== "yes") {
113
+ console.info("\n[info] Update cancelled.\n");
114
+ return;
115
+ }
116
+ }
117
+ const selectedKeys = selected.map((result) => result.key);
118
+ await (0, pipeline_1.runSteps)(ctx, {
119
+ added: selectedKeys,
120
+ removed: [],
121
+ enabledKeys: keys,
122
+ });
123
+ if (!sink.dryRun) {
124
+ await (0, modules_state_2.writeModulesState)(cwd, sink, ctx.state);
125
+ }
126
+ ctx.issues.assertEmpty();
127
+ console.info((0, colorette_1.bold)((0, colorette_1.green)("\nC O M P L E T E\n")));
128
+ }
129
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare const MODULES_JSON = "modules.json";
2
+ export declare const MODULES_DIR = "src/modules";
3
+ export declare const MODULES_MODULE_TS = "src/modules/modules.module.ts";
4
+ export declare const MODULES_CONFIG_TS = "src/modules/modules.config.ts";
5
+ export declare const MODULE_MANIFEST_FILE = "newbie.module.json";
6
+ export declare const PRISMA_SCHEMA_MAIN = "prisma/schema.prisma";
7
+ export declare const PRISMA_SCHEMA_MODELS_DIR = "prisma/models";
8
+ export declare const ENV_PATH = ".env";
9
+ export declare const ENV_EXAMPLE_PATH = ".env.example";
10
+ export declare const NEST_CLI_JSON = "nest-cli.json";
11
+ export declare const REGISTRY_MODULES_DIR = "packages/modules";
12
+ export declare const ENV_TOOL_CONFIG_CANDIDATES: string[];
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ENV_TOOL_CONFIG_CANDIDATES = exports.REGISTRY_MODULES_DIR = exports.NEST_CLI_JSON = exports.ENV_EXAMPLE_PATH = exports.ENV_PATH = exports.PRISMA_SCHEMA_MODELS_DIR = exports.PRISMA_SCHEMA_MAIN = exports.MODULE_MANIFEST_FILE = exports.MODULES_CONFIG_TS = exports.MODULES_MODULE_TS = exports.MODULES_DIR = exports.MODULES_JSON = void 0;
4
+ exports.MODULES_JSON = "modules.json";
5
+ exports.MODULES_DIR = "src/modules";
6
+ exports.MODULES_MODULE_TS = "src/modules/modules.module.ts";
7
+ exports.MODULES_CONFIG_TS = "src/modules/modules.config.ts";
8
+ exports.MODULE_MANIFEST_FILE = "newbie.module.json";
9
+ exports.PRISMA_SCHEMA_MAIN = "prisma/schema.prisma";
10
+ exports.PRISMA_SCHEMA_MODELS_DIR = "prisma/models";
11
+ exports.ENV_PATH = ".env";
12
+ exports.ENV_EXAMPLE_PATH = ".env.example";
13
+ exports.NEST_CLI_JSON = "nest-cli.json";
14
+ exports.REGISTRY_MODULES_DIR = "packages/modules";
15
+ exports.ENV_TOOL_CONFIG_CANDIDATES = [
16
+ ".newbie/env.config.json",
17
+ ".newbie-env-tool/.config/config.json",
18
+ ];
19
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/constants/paths.ts"],"names":[],"mappings":";;;AAOa,QAAA,YAAY,GAAG,cAAc,CAAC;AAE9B,QAAA,WAAW,GAAG,aAAa,CAAC;AAC5B,QAAA,iBAAiB,GAAG,+BAA+B,CAAC;AACpD,QAAA,iBAAiB,GAAG,+BAA+B,CAAC;AAGpD,QAAA,oBAAoB,GAAG,oBAAoB,CAAC;AAE5C,QAAA,kBAAkB,GAAG,sBAAsB,CAAC;AAC5C,QAAA,wBAAwB,GAAG,eAAe,CAAC;AAE3C,QAAA,QAAQ,GAAG,MAAM,CAAC;AAClB,QAAA,gBAAgB,GAAG,cAAc,CAAC;AAClC,QAAA,aAAa,GAAG,eAAe,CAAC;AAGhC,QAAA,oBAAoB,GAAG,kBAAkB,CAAC;AAG1C,QAAA,0BAA0B,GAAG;IACxC,yBAAyB;IACzB,sCAAsC;CACvC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export type NestAsset = string | {
2
+ include: string;
3
+ outDir?: string;
4
+ };
5
+ export declare function isSameAsset(a: NestAsset, b: NestAsset): boolean;
6
+ export declare function addAssets(existing: NestAsset[], additions: NestAsset[]): NestAsset[];
7
+ export declare function removeAssets(existing: NestAsset[], removals: NestAsset[]): NestAsset[];
8
+ export declare function dedupeAssets(assets: NestAsset[]): NestAsset[];
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isSameAsset = isSameAsset;
4
+ exports.addAssets = addAssets;
5
+ exports.removeAssets = removeAssets;
6
+ exports.dedupeAssets = dedupeAssets;
7
+ function isSameAsset(a, b) {
8
+ if (typeof a === "string" || typeof b === "string") {
9
+ return a === b;
10
+ }
11
+ return a.include === b.include && (a.outDir ?? null) === (b.outDir ?? null);
12
+ }
13
+ function addAssets(existing, additions) {
14
+ const next = [...existing];
15
+ for (const asset of additions) {
16
+ if (!next.some((candidate) => isSameAsset(candidate, asset))) {
17
+ next.push(asset);
18
+ }
19
+ }
20
+ return next;
21
+ }
22
+ function removeAssets(existing, removals) {
23
+ return existing.filter((asset) => !removals.some((removal) => isSameAsset(asset, removal)));
24
+ }
25
+ function dedupeAssets(assets) {
26
+ return assets
27
+ .filter(Boolean)
28
+ .filter((asset, index, all) => all.findIndex((item) => isSameAsset(item, asset)) === index);
29
+ }
30
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/core/assets.ts"],"names":[],"mappings":";;AAOA,kCAKC;AAGD,8BAWC;AAGD,oCAOC;AAGD,oCAOC;AAvCD,SAAgB,WAAW,CAAC,CAAY,EAAE,CAAY;IACpD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QACnD,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;AAC9E,CAAC;AAGD,SAAgB,SAAS,CACvB,QAAqB,EACrB,SAAsB;IAEtB,MAAM,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAGD,SAAgB,YAAY,CAC1B,QAAqB,EACrB,QAAqB;IAErB,OAAO,QAAQ,CAAC,MAAM,CACpB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CACpE,CAAC;AACJ,CAAC;AAGD,SAAgB,YAAY,CAAC,MAAmB;IAC9C,OAAO,MAAM;SACV,MAAM,CAAC,OAAO,CAAC;SACf,MAAM,CACL,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CACpB,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,KAAK,KAAK,CAC9D,CAAC;AACN,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface DependencyDecls {
2
+ dependencies?: Record<string, string>;
3
+ devDependencies?: Record<string, string>;
4
+ }
5
+ export declare function planDependencyRemovals(removedDecls: DependencyDecls[], enabledDecls: DependencyDecls[]): {
6
+ dependencies: string[];
7
+ devDependencies: string[];
8
+ };
9
+ export declare function buildInstallSpecs(decls: DependencyDecls[]): {
10
+ dependencies: string[];
11
+ devDependencies: string[];
12
+ };
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.planDependencyRemovals = planDependencyRemovals;
4
+ exports.buildInstallSpecs = buildInstallSpecs;
5
+ function planDependencyRemovals(removedDecls, enabledDecls) {
6
+ const keptDependencies = new Set();
7
+ const keptDevDependencies = new Set();
8
+ for (const decl of enabledDecls) {
9
+ Object.keys(decl.dependencies ?? {}).forEach((name) => keptDependencies.add(name));
10
+ Object.keys(decl.devDependencies ?? {}).forEach((name) => keptDevDependencies.add(name));
11
+ }
12
+ const removedDependencies = new Set();
13
+ const removedDevDependencies = new Set();
14
+ for (const decl of removedDecls) {
15
+ for (const name of Object.keys(decl.dependencies ?? {})) {
16
+ if (!keptDependencies.has(name))
17
+ removedDependencies.add(name);
18
+ }
19
+ for (const name of Object.keys(decl.devDependencies ?? {})) {
20
+ if (!keptDevDependencies.has(name))
21
+ removedDevDependencies.add(name);
22
+ }
23
+ }
24
+ return {
25
+ dependencies: [...removedDependencies],
26
+ devDependencies: [...removedDevDependencies],
27
+ };
28
+ }
29
+ function buildInstallSpecs(decls) {
30
+ const dependencies = [];
31
+ const devDependencies = [];
32
+ for (const decl of decls) {
33
+ for (const [name, range] of Object.entries(decl.dependencies ?? {})) {
34
+ dependencies.push(`${name}@${range}`);
35
+ }
36
+ for (const [name, range] of Object.entries(decl.devDependencies ?? {})) {
37
+ devDependencies.push(`${name}@${range}`);
38
+ }
39
+ }
40
+ return { dependencies, devDependencies };
41
+ }
42
+ //# sourceMappingURL=dependency-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-plan.js","sourceRoot":"","sources":["../../src/core/dependency-plan.ts"],"names":[],"mappings":";;AAWA,wDAgCC;AAGD,8CAiBC;AApDD,SAAgB,sBAAsB,CACpC,YAA+B,EAC/B,YAA+B;IAE/B,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC3C,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE9C,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACpD,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAC3B,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACvD,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAC9B,CAAC;IACJ,CAAC;IAED,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9C,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAU,CAAC;IAEjD,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjE,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,OAAO;QACL,YAAY,EAAE,CAAC,GAAG,mBAAmB,CAAC;QACtC,eAAe,EAAE,CAAC,GAAG,sBAAsB,CAAC;KAC7C,CAAC;AACJ,CAAC;AAGD,SAAgB,iBAAiB,CAAC,KAAwB;IAIxD,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,eAAe,GAAa,EAAE,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;YACpE,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE,CAAC;YACvE,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type FileSnapshot = ReadonlyMap<string, string>;
2
+ export interface DriftReport {
3
+ added: string[];
4
+ removed: string[];
5
+ changed: string[];
6
+ clean: boolean;
7
+ }
8
+ export declare function diffSnapshots(local: FileSnapshot, pristine: FileSnapshot): DriftReport;
9
+ export declare function driftPatchIds(report: DriftReport): string[];
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.diffSnapshots = diffSnapshots;
4
+ exports.driftPatchIds = driftPatchIds;
5
+ function diffSnapshots(local, pristine) {
6
+ const added = [];
7
+ const removed = [];
8
+ const changed = [];
9
+ for (const [file, hash] of local) {
10
+ if (!pristine.has(file)) {
11
+ added.push(file);
12
+ }
13
+ else if (pristine.get(file) !== hash) {
14
+ changed.push(file);
15
+ }
16
+ }
17
+ for (const file of pristine.keys()) {
18
+ if (!local.has(file))
19
+ removed.push(file);
20
+ }
21
+ added.sort();
22
+ removed.sort();
23
+ changed.sort();
24
+ return {
25
+ added,
26
+ removed,
27
+ changed,
28
+ clean: added.length === 0 && removed.length === 0 && changed.length === 0,
29
+ };
30
+ }
31
+ function driftPatchIds(report) {
32
+ return [...report.added, ...report.changed, ...report.removed].sort();
33
+ }
34
+ //# sourceMappingURL=drift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/core/drift.ts"],"names":[],"mappings":";;AAsBA,sCA4BC;AAGD,sCAEC;AAjCD,SAAgB,aAAa,CAC3B,KAAmB,EACnB,QAAsB;IAEtB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;aAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,IAAI,EAAE,CAAC;IACb,OAAO,CAAC,IAAI,EAAE,CAAC;IACf,OAAO,CAAC,IAAI,EAAE,CAAC;IACf,OAAO;QACL,KAAK;QACL,OAAO;QACP,OAAO;QACP,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;KAC1E,CAAC;AACJ,CAAC;AAGD,SAAgB,aAAa,CAAC,MAAmB;IAC/C,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AACxE,CAAC"}
@@ -0,0 +1,19 @@
1
+ export type EnvLine = {
2
+ kind: "blank";
3
+ } | {
4
+ kind: "comment";
5
+ text: string;
6
+ } | {
7
+ kind: "entry";
8
+ key: string;
9
+ value: string;
10
+ };
11
+ export declare function parseEnv(content: string): EnvLine[];
12
+ export declare function serializeEnv(lines: EnvLine[]): string;
13
+ export declare function envValues(lines: EnvLine[]): Record<string, string>;
14
+ export declare function removeEnvKeys(lines: EnvLine[], keys: ReadonlySet<string>): EnvLine[];
15
+ export declare function upsertEnvSection(lines: EnvLine[], title: string, entries: Record<string, string>): EnvLine[];
16
+ export declare function pruneEmptySections(lines: EnvLine[]): EnvLine[];
17
+ export declare const MODULES_MARKER_START = "# @@newbie-modules-start";
18
+ export declare const MODULES_MARKER_END = "# @@newbie-modules-end";
19
+ export declare function replaceMarkedBlock(content: string, body: string): string;
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MODULES_MARKER_END = exports.MODULES_MARKER_START = void 0;
4
+ exports.parseEnv = parseEnv;
5
+ exports.serializeEnv = serializeEnv;
6
+ exports.envValues = envValues;
7
+ exports.removeEnvKeys = removeEnvKeys;
8
+ exports.upsertEnvSection = upsertEnvSection;
9
+ exports.pruneEmptySections = pruneEmptySections;
10
+ exports.replaceMarkedBlock = replaceMarkedBlock;
11
+ const SINGLE_ENTRY_RE = /^\s*(?:export\s+)?([\w.-]+)\s*=\s*([\s\S]*?)\s*$/;
12
+ const SECTION_TITLE_RE = /^# ! (.+) variables\s*$/;
13
+ const DECORATION_RE = /^#\s*-{5,}\s*$/;
14
+ function parseEnv(content) {
15
+ const normalized = content.replace(/\r\n?/g, "\n");
16
+ const rawLines = normalized.split("\n");
17
+ if (rawLines.length > 0 && rawLines[rawLines.length - 1] === "") {
18
+ rawLines.pop();
19
+ }
20
+ const lines = [];
21
+ for (const raw of rawLines) {
22
+ if (raw.trim() === "") {
23
+ lines.push({ kind: "blank" });
24
+ continue;
25
+ }
26
+ if (raw.trimStart().startsWith("#")) {
27
+ lines.push({ kind: "comment", text: raw });
28
+ continue;
29
+ }
30
+ const match = raw.match(SINGLE_ENTRY_RE);
31
+ if (!match) {
32
+ lines.push({ kind: "comment", text: raw });
33
+ continue;
34
+ }
35
+ const [, key, rawValue] = match;
36
+ lines.push({ kind: "entry", key, value: unquote(rawValue.trim()) });
37
+ }
38
+ return lines;
39
+ }
40
+ function unquote(value) {
41
+ const quote = value[0];
42
+ if (quote === '"' || quote === "'" || quote === "`") {
43
+ if (value[value.length - 1] === quote) {
44
+ return value.slice(1, -1);
45
+ }
46
+ }
47
+ return value;
48
+ }
49
+ function serializeEnv(lines) {
50
+ const text = lines
51
+ .map((line) => {
52
+ if (line.kind === "blank")
53
+ return "";
54
+ if (line.kind === "comment")
55
+ return line.text;
56
+ return `${line.key}=${formatValue(line.value)}`;
57
+ })
58
+ .join("\n");
59
+ return text.length > 0 ? `${text}\n` : "";
60
+ }
61
+ function formatValue(value) {
62
+ if (value.includes("\n") ||
63
+ /^[\s]|[\s]$/.test(value) ||
64
+ value.includes("#")) {
65
+ return `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
66
+ }
67
+ return value;
68
+ }
69
+ function envValues(lines) {
70
+ const result = {};
71
+ for (const line of lines) {
72
+ if (line.kind === "entry") {
73
+ result[line.key] = line.value;
74
+ }
75
+ }
76
+ return result;
77
+ }
78
+ function removeEnvKeys(lines, keys) {
79
+ return lines.filter((line) => line.kind !== "entry" || !keys.has(line.key));
80
+ }
81
+ function findSectionRange(lines, title) {
82
+ const titleIndex = lines.findIndex((line) => line.kind === "comment" &&
83
+ line.text.match(SECTION_TITLE_RE)?.[1] === title);
84
+ if (titleIndex === -1)
85
+ return null;
86
+ let start = titleIndex;
87
+ if (titleIndex - 2 >= 0 &&
88
+ lines[titleIndex - 1].kind === "comment" &&
89
+ DECORATION_RE.test(lines[titleIndex - 1].text) &&
90
+ lines[titleIndex - 2].kind === "comment" &&
91
+ DECORATION_RE.test(lines[titleIndex - 2].text)) {
92
+ start = titleIndex - 2;
93
+ }
94
+ let end = lines.length;
95
+ for (let i = titleIndex + 1; i < lines.length; i++) {
96
+ const candidate = lines[i];
97
+ if (candidate.kind === "comment" &&
98
+ DECORATION_RE.test(candidate.text) &&
99
+ lines[i + 2]?.kind === "comment" &&
100
+ SECTION_TITLE_RE.test(lines[i + 2].text)) {
101
+ end = i;
102
+ break;
103
+ }
104
+ }
105
+ return { start, end };
106
+ }
107
+ function sectionHeader(title) {
108
+ return [
109
+ { kind: "blank" },
110
+ {
111
+ kind: "comment",
112
+ text: "# ----------------------------------------------------------------------------------",
113
+ },
114
+ { kind: "comment", text: `# ! ${title} variables` },
115
+ {
116
+ kind: "comment",
117
+ text: "# ----------------------------------------------------------------------------------",
118
+ },
119
+ ];
120
+ }
121
+ function upsertEnvSection(lines, title, entries) {
122
+ const newKeys = Object.keys(entries);
123
+ if (newKeys.length === 0)
124
+ return lines;
125
+ const existingKeys = new Set(Object.keys(envValues(lines)));
126
+ const range = findSectionRange(lines, title);
127
+ if (!range) {
128
+ const next = [...lines];
129
+ next.push(...sectionHeader(title));
130
+ for (const key of newKeys) {
131
+ next.push({ kind: "entry", key, value: entries[key] });
132
+ }
133
+ return next;
134
+ }
135
+ const next = [...lines];
136
+ const insertAt = [];
137
+ for (const key of newKeys) {
138
+ if (!existingKeys.has(key)) {
139
+ insertAt.push({ kind: "entry", key, value: entries[key] });
140
+ }
141
+ }
142
+ next.splice(range.end, 0, ...insertAt);
143
+ return next;
144
+ }
145
+ function pruneEmptySections(lines) {
146
+ const titles = [];
147
+ for (const line of lines) {
148
+ if (line.kind === "comment") {
149
+ const match = line.text.match(SECTION_TITLE_RE);
150
+ if (match)
151
+ titles.push(match[1]);
152
+ }
153
+ }
154
+ let next = lines;
155
+ for (const title of titles) {
156
+ const range = findSectionRange(next, title);
157
+ if (!range)
158
+ continue;
159
+ const body = next.slice(range.start, range.end);
160
+ if (!body.some((line) => line.kind === "entry")) {
161
+ next = [...next.slice(0, range.start), ...next.slice(range.end)];
162
+ if (next[range.start]?.kind === "blank") {
163
+ next = [...next.slice(0, range.start), ...next.slice(range.start + 1)];
164
+ }
165
+ }
166
+ }
167
+ return next;
168
+ }
169
+ exports.MODULES_MARKER_START = "# @@newbie-modules-start";
170
+ exports.MODULES_MARKER_END = "# @@newbie-modules-end";
171
+ function replaceMarkedBlock(content, body) {
172
+ const startIndex = content.indexOf(exports.MODULES_MARKER_START);
173
+ const endIndex = content.indexOf(exports.MODULES_MARKER_END);
174
+ const block = `${exports.MODULES_MARKER_START}\n${body}${exports.MODULES_MARKER_END}\n`;
175
+ if (startIndex !== -1 && endIndex !== -1 && startIndex < endIndex) {
176
+ const lineStart = content.lastIndexOf("\n", startIndex);
177
+ const blockStart = lineStart === -1 ? 0 : lineStart + 1;
178
+ const afterEnd = endIndex + exports.MODULES_MARKER_END.length;
179
+ return `${content.slice(0, blockStart)}${block}${content[afterEnd] === "\n" ? content.slice(afterEnd + 1) : content.slice(afterEnd)}`;
180
+ }
181
+ const separator = content.length === 0 || content.endsWith("\n") ? "" : "\n";
182
+ return `${content}${separator}\n${block}`;
183
+ }
184
+ //# sourceMappingURL=env-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-file.js","sourceRoot":"","sources":["../../src/core/env-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { NestAsset } from "./assets";
2
+ export interface ModuleWiring {
3
+ file: string;
4
+ className: string;
5
+ }
6
+ export interface ModuleManifest {
7
+ key: string;
8
+ module: ModuleWiring;
9
+ schema?: string;
10
+ "config-service"?: Record<string, unknown>;
11
+ env?: Record<string, string>;
12
+ dependencies?: Record<string, string>;
13
+ devDependencies?: Record<string, string>;
14
+ assets?: NestAsset[];
15
+ [key: string]: unknown;
16
+ }
17
+ export declare function normalizeModuleManifest(raw: unknown, expectedKey?: string): ModuleManifest;
18
+ export declare function moduleImportLine(key: string, manifest: ModuleManifest): string;
19
+ export declare function sanitizeModuleNames(names: string[], knownKeys: ReadonlySet<string>): string[];
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeModuleManifest = normalizeModuleManifest;
4
+ exports.moduleImportLine = moduleImportLine;
5
+ exports.sanitizeModuleNames = sanitizeModuleNames;
6
+ function normalizeModuleManifest(raw, expectedKey) {
7
+ if (!raw || typeof raw !== "object") {
8
+ throw new Error("Invalid newbie.module.json: expected an object.");
9
+ }
10
+ const data = raw;
11
+ if (typeof data.key !== "string" || data.key.length === 0) {
12
+ throw new Error("Invalid newbie.module.json: string 'key' is required.");
13
+ }
14
+ if (expectedKey && data.key !== expectedKey) {
15
+ throw new Error(`Invalid newbie.module.json: key '${data.key}' does not match directory '${expectedKey}'.`);
16
+ }
17
+ const wiring = data.module;
18
+ if (!wiring ||
19
+ typeof wiring.file !== "string" ||
20
+ typeof wiring.className !== "string" ||
21
+ wiring.file.length === 0 ||
22
+ wiring.className.length === 0) {
23
+ throw new Error(`Invalid newbie.module.json for '${data.key}': module.file and module.className strings are required.`);
24
+ }
25
+ const manifest = {
26
+ ...data,
27
+ key: data.key,
28
+ module: { file: wiring.file, className: wiring.className },
29
+ };
30
+ if (typeof data.schema !== "string")
31
+ delete manifest.schema;
32
+ return manifest;
33
+ }
34
+ function moduleImportLine(key, manifest) {
35
+ return `import {${manifest.module.className}} from './${key}/${manifest.module.file}';`;
36
+ }
37
+ function sanitizeModuleNames(names, knownKeys) {
38
+ const seen = new Set();
39
+ const result = [];
40
+ for (const name of names.map((name) => name.trim())) {
41
+ if (!knownKeys.has(name) || seen.has(name))
42
+ continue;
43
+ seen.add(name);
44
+ result.push(name);
45
+ }
46
+ return result;
47
+ }
48
+ //# sourceMappingURL=module-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-manifest.js","sourceRoot":"","sources":["../../src/core/module-manifest.ts"],"names":[],"mappings":";;AA8BA,0DAsCC;AAGD,4CAKC;AAGD,kDAYC;AA7DD,SAAgB,uBAAuB,CACrC,GAAY,EACZ,WAAoB;IAEpB,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,IAAI,GAAG,GAA8B,CAAC;IAE5C,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,WAAW,IAAI,IAAI,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,oCAAoC,IAAI,CAAC,GAAG,+BAA+B,WAAW,IAAI,CAC3F,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAA2C,CAAC;IAChE,IACE,CAAC,MAAM;QACP,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAC/B,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;QACpC,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QACxB,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAC7B,CAAC;QACD,MAAM,IAAI,KAAK,CACb,mCAAmC,IAAI,CAAC,GAAG,2DAA2D,CACvG,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAmB;QAC/B,GAAI,IAAe;QACnB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE;KAC3D,CAAC;IACF,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC,MAAM,CAAC;IAC5D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAGD,SAAgB,gBAAgB,CAC9B,GAAW,EACX,QAAwB;IAExB,OAAO,WAAW,QAAQ,CAAC,MAAM,CAAC,SAAS,aAAa,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;AAC1F,CAAC;AAGD,SAAgB,mBAAmB,CACjC,KAAe,EACf,SAA8B;IAE9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QACrD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}