@ldsg/cli 0.3.43 → 0.3.44

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 (133) hide show
  1. package/.rush/temp/package-deps_build.json +15 -18
  2. package/.rush/temp/shrinkwrap-deps.json +1 -1
  3. package/.tsbuildinfo +1 -1
  4. package/CHANGELOG.json +23 -0
  5. package/CHANGELOG.md +8 -1
  6. package/README.md +3 -3
  7. package/dist/__tests__/bootstrap-generator.test.js +120 -0
  8. package/dist/__tests__/bootstrap-generator.test.js.map +1 -0
  9. package/dist/__tests__/generate-bootstrap.test.d.ts +1 -0
  10. package/dist/__tests__/generate-bootstrap.test.js +97 -0
  11. package/dist/__tests__/generate-bootstrap.test.js.map +1 -0
  12. package/dist/__tests__/resolve-module-builder.test.d.ts +1 -0
  13. package/dist/__tests__/resolve-module-builder.test.js +83 -0
  14. package/dist/__tests__/resolve-module-builder.test.js.map +1 -0
  15. package/dist/__tests__/resolve-root.test.d.ts +1 -0
  16. package/dist/__tests__/resolve-root.test.js +32 -0
  17. package/dist/__tests__/resolve-root.test.js.map +1 -0
  18. package/dist/cli.js +4 -431
  19. package/dist/cli.js.map +1 -1
  20. package/dist/commands/generate/index.d.ts +2 -0
  21. package/dist/commands/generate/index.js +35 -0
  22. package/dist/commands/generate/index.js.map +1 -0
  23. package/dist/commands/generate/types/generate.d.ts +12 -0
  24. package/dist/commands/generate/types/generate.js +3 -0
  25. package/dist/commands/generate/types/generate.js.map +1 -0
  26. package/dist/commands/generate/types/generator.d.ts +4 -0
  27. package/dist/commands/generate/types/generator.js +3 -0
  28. package/dist/commands/generate/types/generator.js.map +1 -0
  29. package/dist/commands/generate/types/index.d.ts +2 -0
  30. package/dist/commands/generate/types/index.js +19 -0
  31. package/dist/commands/generate/types/index.js.map +1 -0
  32. package/dist/commands/generate/types.d.ts +8 -0
  33. package/dist/{types/get-extend-app-data-params.js → commands/generate/types.js} +1 -1
  34. package/dist/commands/generate/types.js.map +1 -0
  35. package/dist/commands/generate/utils/generate-application/index.d.ts +6 -0
  36. package/dist/commands/generate/utils/generate-application/index.js +28 -0
  37. package/dist/commands/generate/utils/generate-application/index.js.map +1 -0
  38. package/dist/commands/generate/utils/generate-application/types/generator.d.ts +9 -0
  39. package/dist/commands/generate/utils/generate-application/types/generator.js +3 -0
  40. package/dist/commands/generate/utils/generate-application/types/generator.js.map +1 -0
  41. package/dist/commands/generate/utils/generate-application/types/index.d.ts +1 -0
  42. package/dist/commands/generate/utils/generate-application/types/index.js +18 -0
  43. package/dist/commands/generate/utils/generate-application/types/index.js.map +1 -0
  44. package/dist/commands/generate/utils/generate-application/utils/build-app-generator/index.d.ts +9 -0
  45. package/dist/commands/generate/utils/generate-application/utils/build-app-generator/index.js +30 -0
  46. package/dist/commands/generate/utils/generate-application/utils/build-app-generator/index.js.map +1 -0
  47. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/index.d.ts +13 -0
  48. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/index.js +125 -0
  49. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/index.js.map +1 -0
  50. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/generate-bootstrap/constants.d.ts +3 -0
  51. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/generate-bootstrap/constants.js +7 -0
  52. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/generate-bootstrap/constants.js.map +1 -0
  53. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/generate-bootstrap/index.d.ts +4 -0
  54. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/generate-bootstrap/index.js +69 -0
  55. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/generate-bootstrap/index.js.map +1 -0
  56. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/generate-bootstrap/prepare-bootstrap-app-files.d.ts +3 -0
  57. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/generate-bootstrap/prepare-bootstrap-app-files.js +32 -0
  58. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/generate-bootstrap/prepare-bootstrap-app-files.js.map +1 -0
  59. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/generate-bootstrap/render-bootstrap-entry.d.ts +2 -0
  60. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/generate-bootstrap/render-bootstrap-entry.js +62 -0
  61. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/generate-bootstrap/render-bootstrap-entry.js.map +1 -0
  62. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/generate-bootstrap/resolve-dependencies.d.ts +11 -0
  63. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/generate-bootstrap/resolve-dependencies.js +84 -0
  64. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/generate-bootstrap/resolve-dependencies.js.map +1 -0
  65. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/resource-record/get-resource-record-by-id.d.ts +2 -0
  66. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/resource-record/get-resource-record-by-id.js +15 -0
  67. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/resource-record/get-resource-record-by-id.js.map +1 -0
  68. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/resource-record/resolve-resource-definition-resource-record.d.ts +2 -0
  69. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/resource-record/resolve-resource-definition-resource-record.js +21 -0
  70. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/resource-record/resolve-resource-definition-resource-record.js.map +1 -0
  71. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/resource-record/resolve-root-resource-record.d.ts +2 -0
  72. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/resource-record/resolve-root-resource-record.js +18 -0
  73. package/dist/commands/generate/utils/generate-application/utils/build-bootstrap/utils/resource-record/resolve-root-resource-record.js.map +1 -0
  74. package/dist/commands/generate/utils/generate-application/utils/build-meta-generator/index.d.ts +8 -0
  75. package/dist/commands/generate/utils/generate-application/utils/build-meta-generator/index.js +32 -0
  76. package/dist/commands/generate/utils/generate-application/utils/build-meta-generator/index.js.map +1 -0
  77. package/dist/commands/generate/utils/generate-application/utils/generate-app/index.d.ts +8 -0
  78. package/dist/commands/generate/utils/generate-application/utils/generate-app/index.js +10 -0
  79. package/dist/commands/generate/utils/generate-application/utils/generate-app/index.js.map +1 -0
  80. package/dist/commands/generate/utils/generate-application/utils/index.d.ts +3 -0
  81. package/dist/commands/generate/utils/generate-application/utils/index.js +20 -0
  82. package/dist/commands/generate/utils/generate-application/utils/index.js.map +1 -0
  83. package/dist/commands/generate/utils/parse-extra-options.d.ts +5 -0
  84. package/dist/commands/generate/utils/parse-extra-options.js +59 -0
  85. package/dist/commands/generate/utils/parse-extra-options.js.map +1 -0
  86. package/dist/commands/resource/index.d.ts +2 -0
  87. package/dist/commands/resource/index.js +392 -0
  88. package/dist/commands/resource/index.js.map +1 -0
  89. package/dist/generator/bootstrap-generator.d.ts +19 -0
  90. package/dist/generator/bootstrap-generator.js +59 -0
  91. package/dist/generator/bootstrap-generator.js.map +1 -0
  92. package/dist/generator/module-builder.d.ts +2 -0
  93. package/dist/generator/module-builder.js +284 -0
  94. package/dist/generator/module-builder.js.map +1 -0
  95. package/dist/generator/resolve-module-builder.d.ts +8 -0
  96. package/dist/generator/resolve-module-builder.js +41 -0
  97. package/dist/generator/resolve-module-builder.js.map +1 -0
  98. package/dist/generator/resolve-root.d.ts +5 -0
  99. package/dist/generator/resolve-root.js +48 -0
  100. package/dist/generator/resolve-root.js.map +1 -0
  101. package/jest.config.js +4 -1
  102. package/package.json +5 -5
  103. package/src/cli.ts +4 -510
  104. package/src/commands/generate/index.ts +54 -0
  105. package/src/commands/generate/utils/generate-application/index.ts +50 -0
  106. package/src/commands/generate/utils/generate-application/utils/build-app-generator/index.ts +39 -0
  107. package/src/commands/generate/utils/generate-application/utils/build-meta-generator/index.ts +45 -0
  108. package/src/commands/generate/utils/generate-application/utils/generate-app/index.ts +17 -0
  109. package/src/commands/generate/utils/generate-application/utils/index.ts +3 -0
  110. package/src/commands/generate/utils/parse-extra-options.ts +80 -0
  111. package/src/commands/resource/index.ts +455 -0
  112. package/dist/__tests__/get-extend-app-data-params-using-workspace-ldsg-module.test.js +0 -81
  113. package/dist/__tests__/get-extend-app-data-params-using-workspace-ldsg-module.test.js.map +0 -1
  114. package/dist/types/get-extend-app-data-params.d.ts +0 -10
  115. package/dist/types/get-extend-app-data-params.js.map +0 -1
  116. package/dist/utils/get-extend-app-data-params-using-npm-ldsg-module.d.ts +0 -2
  117. package/dist/utils/get-extend-app-data-params-using-npm-ldsg-module.js +0 -27
  118. package/dist/utils/get-extend-app-data-params-using-npm-ldsg-module.js.map +0 -1
  119. package/dist/utils/get-extend-app-data-params-using-workspace-ldsg-module/index.d.ts +0 -2
  120. package/dist/utils/get-extend-app-data-params-using-workspace-ldsg-module/index.js +0 -98
  121. package/dist/utils/get-extend-app-data-params-using-workspace-ldsg-module/index.js.map +0 -1
  122. package/src/__tests__/add-pnpm-overrides.test.ts +0 -91
  123. package/src/__tests__/commands.test.ts +0 -318
  124. package/src/__tests__/formatter.test.ts +0 -151
  125. package/src/__tests__/generate-app-index-ts.test.ts +0 -141
  126. package/src/__tests__/get-extend-app-data-params-using-workspace-ldsg-module.test.ts +0 -109
  127. package/src/__tests__/json-file-mutator.test.ts +0 -186
  128. package/src/__tests__/mutate.test.ts +0 -392
  129. package/src/__tests__/source-resolver.test.ts +0 -125
  130. package/src/types/get-extend-app-data-params.ts +0 -13
  131. package/src/utils/get-extend-app-data-params-using-npm-ldsg-module.ts +0 -34
  132. package/src/utils/get-extend-app-data-params-using-workspace-ldsg-module/index.ts +0 -159
  133. /package/dist/__tests__/{get-extend-app-data-params-using-workspace-ldsg-module.test.d.ts → bootstrap-generator.test.d.ts} +0 -0
@@ -1,10 +0,0 @@
1
- import { AppData } from "@ldsg/types";
2
- import { ExtendAppDataParams, ZipAppDataLayout } from "@ldsg/utils";
3
- interface GetExtendAppDataParamsParams {
4
- appData: AppData;
5
- layout?: ZipAppDataLayout;
6
- appPackageName?: string;
7
- outputPath?: string;
8
- }
9
- export type GetExtendAppDataParams = (params: GetExtendAppDataParamsParams) => Promise<ExtendAppDataParams>;
10
- export {};
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-extend-app-data-params.js","sourceRoot":"","sources":["../../src/types/get-extend-app-data-params.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- import { GetExtendAppDataParams } from "../types/get-extend-app-data-params";
2
- export declare const getExtendAppDataParamsUsingNpmLdsgModule: GetExtendAppDataParams;
@@ -1,27 +0,0 @@
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.getExtendAppDataParamsUsingNpmLdsgModule = void 0;
7
- const constants_1 = require("@ldsg/constants");
8
- const lodash_1 = __importDefault(require("lodash"));
9
- const add_pnpm_overrides_1 = require("./add-pnpm-overrides");
10
- const getExtendAppDataParamsUsingNpmLdsgModule = async (params) => {
11
- const { appData } = params;
12
- const packageJsonFile = constants_1.FILES_IN_APP_TEMPLATE_MODULE.find((file) => file.path === "package.json");
13
- lodash_1.default.set(packageJsonFile, 'data.dependencies["@ldsg/create-app"]', "latest");
14
- lodash_1.default.set(packageJsonFile, 'data.dependencies["@ldsg/opentelemetry-node"]', "latest");
15
- const graphqlDeps = ["graphql", "graphql-middleware", "graphql-shield"];
16
- const pnpmWorkspaceFile = (0, add_pnpm_overrides_1.addPnpmOverrides)(constants_1.FILES_IN_APP_TEMPLATE_MODULE, graphqlDeps);
17
- let res = {
18
- appData,
19
- extraAppData: {
20
- reuseMainAppDependencies: graphqlDeps,
21
- filesInAppModele: [...constants_1.FILES_IN_APP_TEMPLATE_MODULE, packageJsonFile, pnpmWorkspaceFile],
22
- },
23
- };
24
- return res;
25
- };
26
- exports.getExtendAppDataParamsUsingNpmLdsgModule = getExtendAppDataParamsUsingNpmLdsgModule;
27
- //# sourceMappingURL=get-extend-app-data-params-using-npm-ldsg-module.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-extend-app-data-params-using-npm-ldsg-module.js","sourceRoot":"","sources":["../../src/utils/get-extend-app-data-params-using-npm-ldsg-module.ts"],"names":[],"mappings":";;;;;;AAAA,+CAA+D;AAE/D,oDAAuB;AAEvB,6DAAwD;AAEjD,MAAM,wCAAwC,GAA2B,KAAK,EAAE,MAAM,EAAE,EAAE;IAC/F,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAE3B,MAAM,eAAe,GAAG,wCAA4B,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;IAKlG,gBAAC,CAAC,GAAG,CAAC,eAAe,EAAE,uCAAuC,EAAE,QAAQ,CAAC,CAAC;IAC1E,gBAAC,CAAC,GAAG,CAAC,eAAe,EAAE,+CAA+C,EAAE,QAAQ,CAAC,CAAC;IAMlF,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,oBAAoB,EAAE,gBAAgB,CAAC,CAAC;IACxE,MAAM,iBAAiB,GAAG,IAAA,qCAAgB,EAAC,wCAA4B,EAAE,WAAW,CAAC,CAAC;IAEtF,IAAI,GAAG,GAAwB;QAC7B,OAAO;QACP,YAAY,EAAE;YACZ,wBAAwB,EAAE,WAAW;YACrC,gBAAgB,EAAE,CAAC,GAAG,wCAA4B,EAAE,eAAe,EAAE,iBAAiB,CAAC;SACxF;KACF,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AA3BW,QAAA,wCAAwC,4CA2BnD"}
@@ -1,2 +0,0 @@
1
- import { GetExtendAppDataParams } from "../../types/get-extend-app-data-params";
2
- export declare const getExtendAppDataParamsUsingWorkspaceLdsgModule: GetExtendAppDataParams;
@@ -1,98 +0,0 @@
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.getExtendAppDataParamsUsingWorkspaceLdsgModule = void 0;
7
- const constants_1 = require("@ldsg/constants");
8
- const utils_1 = require("@ldsg/utils");
9
- const lodash_1 = __importDefault(require("lodash"));
10
- const path_1 = __importDefault(require("path"));
11
- const DEFAULT_APP_PACKAGE_NAME = "@ldsg/app";
12
- const DEFAULT_OUTPUT_PATH = "../../generated";
13
- const getExtendAppDataParamsUsingWorkspaceLdsgModule = async (params) => {
14
- const { appData: paramsAppData, layout = utils_1.ZipAppDataLayout.FLAT, appPackageName = DEFAULT_APP_PACKAGE_NAME, outputPath = DEFAULT_OUTPUT_PATH, } = params;
15
- let appData = paramsAppData;
16
- const handlerResourceIds = [];
17
- {
18
- const { resourceRecords: appDataResourceRecords } = appData;
19
- const repoRoot = path_1.default.resolve(process.cwd(), "../..");
20
- const outputAbs = path_1.default.resolve(process.cwd(), outputPath);
21
- const outputRel = path_1.default.relative(repoRoot, outputAbs);
22
- const appProjectFolder = layout === utils_1.ZipAppDataLayout.NESTED ? outputRel : path_1.default.join(outputRel, "app");
23
- const getHandlerProjectFolder = (id) => layout === utils_1.ZipAppDataLayout.NESTED
24
- ? path_1.default.join(outputRel, "handlers", id)
25
- : path_1.default.join(outputRel, id);
26
- const subspaceProjects = [
27
- {
28
- packageName: appPackageName,
29
- projectFolder: appProjectFolder,
30
- },
31
- ];
32
- const resourceRecords = appDataResourceRecords.map((resourceRecord) => {
33
- const { id, kind } = resourceRecord;
34
- if (kind === "handler") {
35
- handlerResourceIds.push(id);
36
- subspaceProjects.push({
37
- packageName: `${id}`,
38
- projectFolder: getHandlerProjectFolder(id),
39
- });
40
- let dependencies = resourceRecord.settings.dependencies.map((dependency) => {
41
- const res = dependency;
42
- if (lodash_1.default.startsWith(dependency.name, "@ldsg/")) {
43
- return {
44
- ...dependency,
45
- version: "workspace:*",
46
- };
47
- }
48
- return res;
49
- });
50
- dependencies = dependencies.concat([
51
- {
52
- name: "@types/node",
53
- version: "^24.1.0",
54
- },
55
- {
56
- name: "typescript",
57
- version: "^5.3.3",
58
- },
59
- ]);
60
- return {
61
- ...resourceRecord,
62
- settings: {
63
- ...resourceRecord.settings,
64
- dependencies,
65
- },
66
- };
67
- }
68
- return resourceRecord;
69
- });
70
- appData = {
71
- ...appData,
72
- resourceRecords,
73
- };
74
- const debugProjects = subspaceProjects.map((item) => {
75
- const res = {
76
- ...item,
77
- };
78
- return res;
79
- });
80
- (0, utils_1.syncRushProjects)(utils_1.RUSH_JSON_PATH, debugProjects);
81
- }
82
- const packageJsonFile = constants_1.FILES_IN_APP_TEMPLATE_MODULE.find((file) => file.path === "package.json");
83
- lodash_1.default.set(packageJsonFile, "data.name", appPackageName);
84
- const dependencies = {
85
- ...lodash_1.default.get(packageJsonFile, "data.dependencies"),
86
- ...lodash_1.default.mapValues(lodash_1.default.keyBy(handlerResourceIds), () => "workspace:*"),
87
- };
88
- lodash_1.default.set(packageJsonFile, "data.dependencies", dependencies);
89
- const res = {
90
- appData,
91
- extraAppData: {
92
- filesInAppModele: [...constants_1.FILES_IN_APP_TEMPLATE_MODULE, packageJsonFile],
93
- },
94
- };
95
- return res;
96
- };
97
- exports.getExtendAppDataParamsUsingWorkspaceLdsgModule = getExtendAppDataParamsUsingWorkspaceLdsgModule;
98
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/get-extend-app-data-params-using-workspace-ldsg-module/index.ts"],"names":[],"mappings":"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"}
@@ -1,91 +0,0 @@
1
- import yaml from "js-yaml";
2
- import { addPnpmOverrides } from "../utils/add-pnpm-overrides";
3
-
4
- describe("addPnpmOverrides", () => {
5
- const baseFiles = [
6
- {
7
- path: "package.json",
8
- data: {
9
- dependencies: {
10
- graphql: "^16.9.0",
11
- "graphql-middleware": "^6.1.35",
12
- "graphql-shield": "^7.6.5",
13
- "other-dep": "^1.0.0",
14
- },
15
- },
16
- },
17
- {
18
- path: "pnpm-workspace.yaml",
19
- data: 'packages:\n - "handlers/*"\n',
20
- },
21
- {
22
- path: "tsconfig.json",
23
- data: { compilerOptions: { target: "esnext" } },
24
- },
25
- ];
26
-
27
- it("should add overrides with versions from package.json dependencies", () => {
28
- const result = addPnpmOverrides(baseFiles, ["graphql", "graphql-middleware", "graphql-shield"]);
29
-
30
- expect(result.path).toBe("pnpm-workspace.yaml");
31
-
32
- const parsed = yaml.load(result.data as string) as Record<string, unknown>;
33
- expect(parsed.packages).toEqual(["handlers/*"]);
34
- expect(parsed.overrides).toEqual({
35
- graphql: "^16.9.0",
36
- "graphql-middleware": "^6.1.35",
37
- "graphql-shield": "^7.6.5",
38
- });
39
- });
40
-
41
- it("should skip deps not found in package.json", () => {
42
- const result = addPnpmOverrides(baseFiles, ["graphql", "nonexistent-dep"]);
43
-
44
- const parsed = yaml.load(result.data as string) as Record<string, unknown>;
45
- expect(parsed.overrides).toEqual({
46
- graphql: "^16.9.0",
47
- });
48
- });
49
-
50
- it("should add empty overrides when no matching deps", () => {
51
- const result = addPnpmOverrides(baseFiles, ["nonexistent-dep"]);
52
-
53
- const parsed = yaml.load(result.data as string) as Record<string, unknown>;
54
- expect(parsed.overrides).toEqual({});
55
- });
56
-
57
- it("should preserve existing packages config", () => {
58
- const filesWithCustomPackages = baseFiles.map((f) =>
59
- f.path === "pnpm-workspace.yaml"
60
- ? {
61
- path: "pnpm-workspace.yaml",
62
- data: 'packages:\n - "apps/*"\n - "libs/*"\n',
63
- }
64
- : f,
65
- );
66
-
67
- const result = addPnpmOverrides(filesWithCustomPackages, ["graphql"]);
68
-
69
- const parsed = yaml.load(result.data as string) as Record<string, unknown>;
70
- expect(parsed.packages).toEqual(["apps/*", "libs/*"]);
71
- expect(parsed.overrides).toEqual({ graphql: "^16.9.0" });
72
- });
73
-
74
- it("should throw when pnpm-workspace.yaml is missing", () => {
75
- const filesWithoutWorkspace = baseFiles.filter((f) => f.path !== "pnpm-workspace.yaml");
76
-
77
- expect(() => addPnpmOverrides(filesWithoutWorkspace, ["graphql"])).toThrow(
78
- "pnpm-workspace.yaml not found",
79
- );
80
- });
81
-
82
- it("should mutate the original pnpm-workspace.yaml file object", () => {
83
- const files = JSON.parse(JSON.stringify(baseFiles));
84
- const workspaceFile = files.find((f: any) => f.path === "pnpm-workspace.yaml");
85
-
86
- addPnpmOverrides(files, ["graphql"]);
87
-
88
- expect(workspaceFile.data).toContain("overrides");
89
- expect(workspaceFile.data).toContain("graphql");
90
- });
91
- });
@@ -1,318 +0,0 @@
1
- import { ResourceRecords } from "@ldsg/types";
2
- import { listResources, getResource, getTree } from "../commands/resource/list";
3
- import { createResource } from "../commands/resource/create";
4
- import { updateResource } from "../commands/resource/update";
5
- import { deleteResource } from "../commands/resource/delete";
6
- import { diffResource } from "../commands/resource/diff";
7
- import { SourceData } from "../types/resource-record";
8
- import fs from "fs-extra";
9
-
10
- jest.mock("fs-extra");
11
-
12
- const mockedFs = fs as jest.Mocked<typeof fs>;
13
-
14
- const sampleRecords: ResourceRecords = [
15
- {
16
- id: "app1",
17
- kind: "application",
18
- parentId: null,
19
- settings: { slug: "app1", title: "My App", description: "" },
20
- },
21
- {
22
- id: "form1",
23
- kind: "form",
24
- parentId: "app1",
25
- settings: { slug: "form1", title: "Login Form", description: "" },
26
- },
27
- {
28
- id: "form2",
29
- kind: "form",
30
- parentId: "app1",
31
- settings: { slug: "form2", title: "Register Form", description: "" },
32
- },
33
- {
34
- id: "table1",
35
- kind: "table",
36
- parentId: "app1",
37
- settings: { slug: "table1", title: "Users", description: "" },
38
- },
39
- {
40
- id: "field1",
41
- kind: "field",
42
- parentId: "table1",
43
- settings: { slug: "field1", title: "Name", description: "" },
44
- },
45
- {
46
- id: "field2",
47
- kind: "field",
48
- parentId: "table1",
49
- settings: { slug: "field2", title: "Email", description: "" },
50
- },
51
- ];
52
-
53
- const sourceData: SourceData = {
54
- resourceRecords: sampleRecords,
55
- format: "array",
56
- filePath: "/test/data.json",
57
- };
58
-
59
- describe("commands", () => {
60
- beforeEach(() => {
61
- jest.resetAllMocks();
62
- mockedFs.readJson.mockResolvedValue([...sampleRecords]);
63
- });
64
-
65
- describe("listResources", () => {
66
- it("should return all records without filter", async () => {
67
- const result = await listResources(sampleRecords, {});
68
- expect(result.total).toBe(6);
69
- expect(result.resources).toHaveLength(6);
70
- });
71
-
72
- it("should filter by kind", async () => {
73
- const result = await listResources(sampleRecords, { kind: "form" });
74
- expect(result.total).toBe(2);
75
- expect(result.resources.every((r) => r.kind === "form")).toBe(true);
76
- });
77
-
78
- it("should filter by parentId", async () => {
79
- const result = await listResources(sampleRecords, { parentId: "table1" });
80
- expect(result.total).toBe(2);
81
- expect(result.resources.every((r) => r.parentId === "table1")).toBe(true);
82
- });
83
-
84
- it("should filter by rootId", async () => {
85
- const result = await listResources(sampleRecords, { rootId: "table1" });
86
- expect(result.total).toBe(3);
87
- expect(result.resources.map((r) => r.id)).toEqual(["table1", "field1", "field2"]);
88
- });
89
-
90
- it("should combine filters", async () => {
91
- const result = await listResources(sampleRecords, { kind: "field", rootId: "table1" });
92
- expect(result.total).toBe(2);
93
- });
94
- });
95
-
96
- describe("getResource", () => {
97
- it("should get a single resource by id", async () => {
98
- const result = await getResource(sampleRecords, "app1", {});
99
- expect(result).not.toBeNull();
100
- expect(result!.id).toBe("app1");
101
- });
102
-
103
- it("should return null for non-existent id", async () => {
104
- const result = await getResource(sampleRecords, "nonexistent", {});
105
- expect(result).toBeNull();
106
- });
107
-
108
- it("should include children when requested", async () => {
109
- const result = (await getResource(sampleRecords, "app1", { children: true })) as any;
110
- expect(result.children).toHaveLength(3);
111
- expect(result.children.map((c: any) => c.id)).toEqual(["form1", "form2", "table1"]);
112
- });
113
-
114
- it("should return null for non-existent id with tree option", async () => {
115
- const result = await getResource(sampleRecords, "nonexistent", { tree: true });
116
- expect(result).toBeNull();
117
- });
118
- });
119
-
120
- describe("getTree", () => {
121
- it("should build tree for specified root", async () => {
122
- const result = await getTree(sampleRecords, "table1");
123
- expect(result.rootId).toBe("table1");
124
- expect(result.tree.resource.id).toBe("table1");
125
- expect(result.tree.children).toHaveLength(2);
126
- });
127
-
128
- it("should auto-detect root when only one", async () => {
129
- const singleRoot: ResourceRecords = [
130
- {
131
- id: "app1",
132
- kind: "application",
133
- parentId: null,
134
- settings: { slug: "app1", title: "App1", description: "" },
135
- },
136
- {
137
- id: "form1",
138
- kind: "form",
139
- parentId: "app1",
140
- settings: { slug: "form1", title: "Form1", description: "" },
141
- },
142
- ];
143
- const result = await getTree(singleRoot, undefined);
144
- expect(result.rootId).toBe("app1");
145
- });
146
-
147
- it("should throw for non-existent root", async () => {
148
- await expect(getTree(sampleRecords, "nonexistent")).rejects.toThrow("not found");
149
- });
150
- });
151
-
152
- describe("createResource", () => {
153
- it("should create with explicit fields", async () => {
154
- mockedFs.readJson.mockResolvedValue([...sampleRecords]);
155
-
156
- const result = await createResource({
157
- sourceData,
158
- kind: "form",
159
- parentId: "app1",
160
- settings: { title: "New Form" },
161
- });
162
-
163
- expect(result.record.kind).toBe("form");
164
- expect(result.record.parentId).toBe("app1");
165
- expect(result.record.settings).toEqual({ title: "New Form" });
166
- expect(mockedFs.writeJson).toHaveBeenCalled();
167
- });
168
-
169
- it("should throw without kind", async () => {
170
- await expect(
171
- createResource({
172
- sourceData,
173
- parentId: "app1",
174
- } as any),
175
- ).rejects.toThrow("--kind");
176
- });
177
-
178
- it("should throw without parent-id", async () => {
179
- await expect(
180
- createResource({
181
- sourceData,
182
- kind: "form",
183
- } as any),
184
- ).rejects.toThrow("--parent-id");
185
- });
186
- });
187
-
188
- describe("updateResource", () => {
189
- it("should update existing resource", async () => {
190
- mockedFs.readJson.mockResolvedValue([...sampleRecords]);
191
-
192
- const result = await updateResource({
193
- sourceData,
194
- id: "form1",
195
- settings: { title: "Updated Form" },
196
- });
197
-
198
- expect(result.record.id).toBe("form1");
199
- expect(result.record.settings).toEqual({
200
- slug: "form1",
201
- title: "Updated Form",
202
- description: "",
203
- });
204
- expect(mockedFs.writeJson).toHaveBeenCalled();
205
- });
206
-
207
- it("should throw on non-existent id", async () => {
208
- await expect(
209
- updateResource({
210
- sourceData,
211
- id: "nonexistent",
212
- settings: { title: "x" },
213
- }),
214
- ).rejects.toThrow("not found");
215
- });
216
- });
217
-
218
- describe("deleteResource", () => {
219
- it("should delete resource and children", async () => {
220
- mockedFs.readJson.mockResolvedValue([...sampleRecords]);
221
-
222
- const result = await deleteResource({
223
- sourceData,
224
- id: "table1",
225
- });
226
-
227
- expect(result.removed).toHaveLength(3);
228
- expect(result.removed.map((r) => r.id)).toEqual(["table1", "field1", "field2"]);
229
- });
230
-
231
- it("should throw on non-existent id", async () => {
232
- await expect(
233
- deleteResource({
234
- sourceData,
235
- id: "nonexistent",
236
- }),
237
- ).rejects.toThrow("not found");
238
- });
239
- });
240
-
241
- describe("diffResource", () => {
242
- const recordsA: ResourceRecords = [
243
- {
244
- id: "1",
245
- kind: "application",
246
- parentId: null,
247
- settings: { slug: "app-a", title: "App A", description: "", version: 1 },
248
- },
249
- ];
250
- const recordsB: ResourceRecords = [
251
- {
252
- id: "1",
253
- kind: "application",
254
- parentId: null,
255
- settings: { slug: "app-b", title: "App B", description: "", version: 1, newField: "new" },
256
- },
257
- ];
258
-
259
- it("should detect changed fields", async () => {
260
- const result = await diffResource({
261
- sourceA: "a.json",
262
- sourceB: "b.json",
263
- id: "1",
264
- recordsA,
265
- recordsB,
266
- });
267
-
268
- expect(result.changed.length).toBeGreaterThan(0);
269
- expect(result.changed.some((c) => c.path === "title")).toBe(true);
270
- });
271
-
272
- it("should detect added fields", async () => {
273
- const result = await diffResource({
274
- sourceA: "a.json",
275
- sourceB: "b.json",
276
- id: "1",
277
- recordsA,
278
- recordsB,
279
- });
280
-
281
- expect(result.added.some((a) => a.path === "newField")).toBe(true);
282
- });
283
-
284
- it("should handle resource only in one side", async () => {
285
- const result = await diffResource({
286
- sourceA: "a.json",
287
- sourceB: "b.json",
288
- id: "2",
289
- recordsA: [],
290
- recordsB: [
291
- {
292
- id: "2",
293
- kind: "application",
294
- parentId: null,
295
- settings: { slug: "app2", title: "App2", description: "" },
296
- },
297
- ],
298
- });
299
-
300
- expect(result.sideA).toBeNull();
301
- expect(result.sideB).not.toBeNull();
302
- });
303
-
304
- it("should report no differences for identical resources", async () => {
305
- const result = await diffResource({
306
- sourceA: "a.json",
307
- sourceB: "b.json",
308
- id: "1",
309
- recordsA,
310
- recordsB: recordsA,
311
- });
312
-
313
- expect(result.changed).toHaveLength(0);
314
- expect(result.added).toHaveLength(0);
315
- expect(result.removed).toHaveLength(0);
316
- });
317
- });
318
- });