@comet/admin-generator 8.17.1 → 9.0.0-beta.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 (87) hide show
  1. package/bin/admin-generator.mjs +3 -0
  2. package/dist/adminGenerator.d.mts +1 -0
  3. package/dist/adminGenerator.mjs +4441 -0
  4. package/dist/index.d.mts +344 -0
  5. package/dist/index.mjs +4440 -0
  6. package/package.json +31 -21
  7. package/bin/admin-generator.js +0 -8
  8. package/lib/adminGenerator.d.ts +0 -1
  9. package/lib/adminGenerator.js +0 -8
  10. package/lib/commands/generate/config/parseConfig.d.ts +0 -1
  11. package/lib/commands/generate/config/parseConfig.js +0 -72
  12. package/lib/commands/generate/config/transformConfig.d.ts +0 -7
  13. package/lib/commands/generate/config/transformConfig.js +0 -264
  14. package/lib/commands/generate/generate-command.d.ts +0 -340
  15. package/lib/commands/generate/generate-command.js +0 -112
  16. package/lib/commands/generate/generateForm/asyncSelect/generateAsyncSelect.d.ts +0 -26
  17. package/lib/commands/generate/generateForm/asyncSelect/generateAsyncSelect.js +0 -364
  18. package/lib/commands/generate/generateForm/extractErrorEnums.d.ts +0 -16
  19. package/lib/commands/generate/generateForm/extractErrorEnums.js +0 -100
  20. package/lib/commands/generate/generateForm/flatFormFieldsFromFormConfig.d.ts +0 -2
  21. package/lib/commands/generate/generateForm/flatFormFieldsFromFormConfig.js +0 -22
  22. package/lib/commands/generate/generateForm/formField/findIntrospectionFieldType.d.ts +0 -6
  23. package/lib/commands/generate/generateForm/formField/findIntrospectionFieldType.js +0 -22
  24. package/lib/commands/generate/generateForm/formField/options.d.ts +0 -24
  25. package/lib/commands/generate/generateForm/formField/options.js +0 -85
  26. package/lib/commands/generate/generateForm/generateComponentFormField.d.ts +0 -5
  27. package/lib/commands/generate/generateForm/generateComponentFormField.js +0 -22
  28. package/lib/commands/generate/generateForm/generateErrorHandling.d.ts +0 -8
  29. package/lib/commands/generate/generateForm/generateErrorHandling.js +0 -24
  30. package/lib/commands/generate/generateForm/generateErrorMessages.d.ts +0 -11
  31. package/lib/commands/generate/generateForm/generateErrorMessages.js +0 -28
  32. package/lib/commands/generate/generateForm/generateFields.d.ts +0 -42
  33. package/lib/commands/generate/generateForm/generateFields.js +0 -87
  34. package/lib/commands/generate/generateForm/generateForm.d.ts +0 -14
  35. package/lib/commands/generate/generateForm/generateForm.js +0 -565
  36. package/lib/commands/generate/generateForm/generateFormField.d.ts +0 -12
  37. package/lib/commands/generate/generateForm/generateFormField.js +0 -368
  38. package/lib/commands/generate/generateForm/generateFormLayout.d.ts +0 -12
  39. package/lib/commands/generate/generateForm/generateFormLayout.js +0 -154
  40. package/lib/commands/generate/generateForm/generateFormValues.d.ts +0 -40
  41. package/lib/commands/generate/generateForm/generateFormValues.js +0 -219
  42. package/lib/commands/generate/generateForm/generateFragmentByFormFragmentFields.d.ts +0 -11
  43. package/lib/commands/generate/generateForm/generateFragmentByFormFragmentFields.js +0 -29
  44. package/lib/commands/generate/generateForm/getForwardedGqlArgs.d.ts +0 -18
  45. package/lib/commands/generate/generateForm/getForwardedGqlArgs.js +0 -79
  46. package/lib/commands/generate/generateGrid/detectMuiXVersion.d.ts +0 -5
  47. package/lib/commands/generate/generateGrid/detectMuiXVersion.js +0 -32
  48. package/lib/commands/generate/generateGrid/findInputObjectType.d.ts +0 -2
  49. package/lib/commands/generate/generateGrid/findInputObjectType.js +0 -15
  50. package/lib/commands/generate/generateGrid/generateGqlFieldList.d.ts +0 -6
  51. package/lib/commands/generate/generateGrid/generateGqlFieldList.js +0 -56
  52. package/lib/commands/generate/generateGrid/generateGrid.d.ts +0 -16
  53. package/lib/commands/generate/generateGrid/generateGrid.js +0 -1017
  54. package/lib/commands/generate/generateGrid/generateGridToolbar.d.ts +0 -15
  55. package/lib/commands/generate/generateGrid/generateGridToolbar.js +0 -90
  56. package/lib/commands/generate/generateGrid/getForwardedGqlArgs.d.ts +0 -13
  57. package/lib/commands/generate/generateGrid/getForwardedGqlArgs.js +0 -59
  58. package/lib/commands/generate/generateGrid/getPropsForFilterProp.d.ts +0 -14
  59. package/lib/commands/generate/generateGrid/getPropsForFilterProp.js +0 -13
  60. package/lib/commands/generate/generateGrid/usableFields.d.ts +0 -14
  61. package/lib/commands/generate/generateGrid/usableFields.js +0 -3
  62. package/lib/commands/generate/utils/camelCaseToHumanReadable.d.ts +0 -1
  63. package/lib/commands/generate/utils/camelCaseToHumanReadable.js +0 -7
  64. package/lib/commands/generate/utils/columnVisibility.d.ts +0 -6
  65. package/lib/commands/generate/utils/columnVisibility.js +0 -2
  66. package/lib/commands/generate/utils/convertConfigImport.d.ts +0 -6
  67. package/lib/commands/generate/utils/convertConfigImport.js +0 -14
  68. package/lib/commands/generate/utils/findMutationType.d.ts +0 -3
  69. package/lib/commands/generate/utils/findMutationType.js +0 -18
  70. package/lib/commands/generate/utils/findQueryType.d.ts +0 -2
  71. package/lib/commands/generate/utils/findQueryType.js +0 -18
  72. package/lib/commands/generate/utils/findRootBlocks.d.ts +0 -8
  73. package/lib/commands/generate/utils/findRootBlocks.js +0 -66
  74. package/lib/commands/generate/utils/generateGqlOperation.d.ts +0 -12
  75. package/lib/commands/generate/utils/generateGqlOperation.js +0 -87
  76. package/lib/commands/generate/utils/generateImportsCode.d.ts +0 -6
  77. package/lib/commands/generate/utils/generateImportsCode.js +0 -31
  78. package/lib/commands/generate/utils/intl.d.ts +0 -20
  79. package/lib/commands/generate/utils/intl.js +0 -44
  80. package/lib/commands/generate/utils/isFieldOptional.d.ts +0 -7
  81. package/lib/commands/generate/utils/isFieldOptional.js +0 -21
  82. package/lib/commands/generate/utils/runtimeTypeGuards.d.ts +0 -20
  83. package/lib/commands/generate/utils/runtimeTypeGuards.js +0 -22
  84. package/lib/commands/generate/utils/writeGenerated.d.ts +0 -1
  85. package/lib/commands/generate/utils/writeGenerated.js +0 -123
  86. package/lib/index.d.ts +0 -2
  87. package/lib/index.js +0 -6
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@comet/admin-generator",
3
- "version": "8.17.1",
3
+ "version": "9.0.0-beta.0",
4
4
  "description": "Comet Admin Generator CLI tool",
5
5
  "repository": {
6
6
  "directory": "packages/admin/admin-generator",
@@ -8,48 +8,59 @@
8
8
  "url": "https://github.com/vivid-planet/comet"
9
9
  },
10
10
  "license": "BSD-2-Clause",
11
- "type": "commonjs",
12
- "main": "lib/index.js",
13
- "typings": "lib/index.d.ts",
11
+ "type": "module",
12
+ "exports": {
13
+ ".": {
14
+ "import": "./dist/index.mjs",
15
+ "types": "./dist/index.d.mts"
16
+ }
17
+ },
14
18
  "bin": {
15
- "comet-admin-generator": "bin/admin-generator.js"
19
+ "comet-admin-generator": "bin/admin-generator.mjs"
16
20
  },
17
21
  "files": [
18
- "bin/**/*.js",
19
- "lib/*"
22
+ "bin/**/*.mjs",
23
+ "dist/*"
20
24
  ],
21
25
  "dependencies": {
22
26
  "@graphql-tools/graphql-file-loader": "^7.5.17",
23
27
  "@graphql-tools/load": "^7.8.14",
28
+ "@mui/material": "^7.3.7",
29
+ "@mui/x-data-grid": "^7.29.8",
24
30
  "change-case": "^4.1.2",
25
31
  "commander": "^9.5.0",
26
32
  "glob": "^11.1.0",
27
33
  "graphql": "^16.11.0",
34
+ "jiti": "^2.6.1",
28
35
  "object-path": "^0.11.8",
29
36
  "pluralize": "^8.0.0",
30
- "ts-node": "^10.9.2"
37
+ "typescript": "5.9.3",
38
+ "@comet/admin": "9.0.0-beta.0",
39
+ "@comet/admin-icons": "9.0.0-beta.0",
40
+ "@comet/cms-admin": "9.0.0-beta.0"
31
41
  },
32
42
  "devDependencies": {
33
43
  "@apollo/client": "^3.14.0",
34
- "@mui/material": "^7.3.7",
35
- "@mui/x-data-grid": "^7.29.12",
36
44
  "@types/node": "^24.10.9",
37
45
  "@types/object-path": "^0.11.4",
38
46
  "@types/pluralize": "^0.0.33",
39
- "@types/react": "^18.3.27",
47
+ "@types/react": "^19.2.10",
48
+ "@types/react-dom": "^19.2.3",
40
49
  "eslint": "^9.39.2",
41
50
  "final-form": "^4.20.10",
42
51
  "npm-run-all2": "^8.0.4",
43
52
  "prettier": "^3.6.2",
44
- "react": "^18.3.1",
53
+ "react": "^19.2.4",
54
+ "react-dom": "^19.2.4",
45
55
  "react-intl": "^7.1.11",
46
- "rimraf": "^6.1.2",
47
- "typescript": "^5.9.3",
56
+ "tsdown": "0.20.0-beta.4",
48
57
  "vitest": "^4.0.16",
49
- "@comet/admin": "8.17.1",
50
- "@comet/admin-icons": "8.17.1",
51
- "@comet/cms-admin": "8.17.1",
52
- "@comet/eslint-config": "8.17.1"
58
+ "@comet/eslint-config": "9.0.0-beta.0"
59
+ },
60
+ "peerDependencies": {
61
+ "@apollo/client": "^3.7.0",
62
+ "final-form": "^4.0.0",
63
+ "react-intl": "^5.0.0 || ^6.0.0 || ^7.0.0"
53
64
  },
54
65
  "engines": {
55
66
  "node": ">=22.0.0"
@@ -59,9 +70,8 @@
59
70
  "registry": "https://registry.npmjs.org"
60
71
  },
61
72
  "scripts": {
62
- "build": "pnpm run clean && tsc -p tsconfig.build.json",
63
- "clean": "rimraf lib",
64
- "dev": "tsc --watch --preserveWatchOutput -p tsconfig.build.json",
73
+ "build": "tsdown",
74
+ "dev": "tsdown --watch",
65
75
  "lint": "run-p lint:prettier lint:eslint lint:tsc",
66
76
  "lint:ci": "pnpm run lint",
67
77
  "lint:eslint": "eslint --max-warnings 0 src/ **/*.json --no-warn-ignored",
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- require("ts-node").register({
4
- require: ["tsconfig-paths/register"],
5
- transpileOnly: true,
6
- });
7
-
8
- require("../lib/adminGenerator");
@@ -1 +0,0 @@
1
- export {};
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const commander_1 = require("commander");
4
- const generate_command_1 = require("./commands/generate/generate-command");
5
- const program = new commander_1.Command();
6
- program.addCommand(generate_command_1.generateCommand);
7
- program.addHelpText("beforeAll", `⚠️️️⚠️️️⚠️️️ Admin Generator is still experimental and in beta phase. ⚠️️️⚠️️️⚠️️️ \n\n`);
8
- program.parse();
@@ -1 +0,0 @@
1
- export declare function parseConfig(file: string): Promise<any>;
@@ -1,72 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
- return new (P || (P = Promise))(function (resolve, reject) {
38
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
- step((generator = generator.apply(thisArg, _arguments || [])).next());
42
- });
43
- };
44
- Object.defineProperty(exports, "__esModule", { value: true });
45
- exports.parseConfig = parseConfig;
46
- const fs_1 = require("fs");
47
- const path_1 = require("path");
48
- const transformConfig_1 = require("./transformConfig");
49
- function parseConfig(file) {
50
- return __awaiter(this, void 0, void 0, function* () {
51
- //1. parse config file using TypeScript Complier Api and transform it (replace imports and functions that can't be executed)
52
- const transformedConfig = (0, transformConfig_1.transformConfigFile)(file, yield fs_1.promises.readFile(file, "utf-8"));
53
- //2. save modified config file to temp file
54
- const tempFileName = `${(0, path_1.dirname)(file)}/.temp-${(0, path_1.basename)(file)}`;
55
- yield fs_1.promises.writeFile(tempFileName, transformedConfig, "utf-8");
56
- //3. import (=execute) temp modified config file
57
- let executedConfig;
58
- try {
59
- const configFile = yield Promise.resolve(`${tempFileName.replace(/\.tsx?$/, "")}`).then(s => __importStar(require(s)));
60
- if (!configFile.default) {
61
- throw new Error(`No default export found in ${file}`);
62
- }
63
- executedConfig = configFile.default;
64
- }
65
- catch (e) {
66
- console.error(e);
67
- throw new Error(`Error executing config file ${file}: ${e}`);
68
- }
69
- yield fs_1.promises.rm(tempFileName);
70
- return executedConfig;
71
- });
72
- }
@@ -1,7 +0,0 @@
1
- import * as ts from "typescript";
2
- export declare function transformConfigFile(fileName: string, sourceText: string): string;
3
- export declare function collectImports(rootNode: ts.Node): Map<string, {
4
- name: string;
5
- import: string;
6
- defaultImport?: boolean;
7
- }>;
@@ -1,264 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.transformConfigFile = transformConfigFile;
37
- exports.collectImports = collectImports;
38
- const ts = __importStar(require("typescript"));
39
- const supportedImportPaths = [
40
- "[type=grid].columns.filterOperators",
41
- "[type=grid].columns.block",
42
- "[type=grid].columns.component",
43
- // TODO implement in generator "[type=grid].columns.renderCell",
44
- //support in up to 5 levels of nested fields (eg. fieldSet)
45
- ...Array.from(Array(5).keys()).map((i) => `[type=form]${".fields".repeat(i + 1)}.validate`),
46
- ...Array.from(Array(5).keys()).map((i) => `[type=form]${".fields".repeat(i + 1)}.block`),
47
- ...Array.from(Array(5).keys()).map((i) => `[type=form]${".fields".repeat(i + 1)}.component`),
48
- ];
49
- const supportedInlineCodePaths = [
50
- // TODO implement in generator "[type=grid].columns.filterOperators",
51
- "[type=grid].columns.renderCell",
52
- //support in up to 5 levels of nested fields (eg. fieldSet)
53
- ...Array.from(Array(5).keys()).map((i) => `[type=form]${".fields".repeat(i + 1)}.validate`),
54
- ];
55
- // transform the config file to replace all imports and inline code with a { code, imports } object
56
- // this is needed to be able to execute the config file in a node environment
57
- function transformConfigFile(fileName, sourceText) {
58
- const sourceFile = ts.createSourceFile(fileName, sourceText, ts.ScriptTarget.ES2024, // language version
59
- true);
60
- const importedIdentifiers = collectImports(sourceFile);
61
- function configTransformer() {
62
- return (context) => {
63
- const visit = (node, path) => {
64
- if (ts.isCallExpression(node)) {
65
- if (node.expression.getText() === "injectFormVariables") {
66
- if (!path.startsWith("[type=form].fields")) {
67
- throw new Error(`injectFormVariables can only be used in form field definitions: ${path}`);
68
- }
69
- if (node.arguments.length !== 1) {
70
- throw new Error(`injectFormVariables expects exactly one argument`);
71
- }
72
- const injectFormVariablesArg = node.arguments[0];
73
- if (!ts.isArrowFunction(injectFormVariablesArg)) {
74
- throw new Error(`injectFormVariables expects an arrow function as its argument`);
75
- }
76
- node = injectFormVariablesArg.body;
77
- }
78
- }
79
- if (ts.isArrowFunction(node)) {
80
- if (supportedInlineCodePaths.includes(path)) {
81
- let code = node.getText();
82
- if (code.endsWith(","))
83
- code = code.slice(0, -1); // for some unknown reason node can contain the trailing comma
84
- const imports = findUsedImports(node.body, importedIdentifiers); //find all imports used in the function body
85
- // replace inline code with { code, imports } object
86
- return ts.factory.createObjectLiteralExpression([
87
- ts.factory.createPropertyAssignment("code", ts.factory.createStringLiteral(code)),
88
- ts.factory.createPropertyAssignment("imports", ts.factory.createArrayLiteralExpression(imports.map((imprt) => {
89
- return ts.factory.createObjectLiteralExpression([
90
- ts.factory.createPropertyAssignment("name", ts.factory.createStringLiteral(imprt.name)),
91
- ts.factory.createPropertyAssignment("import", ts.factory.createStringLiteral(imprt.import)),
92
- ...(imprt.defaultImport
93
- ? [ts.factory.createPropertyAssignment("defaultImport", ts.factory.createTrue())]
94
- : []),
95
- ]);
96
- }))),
97
- ], true);
98
- }
99
- else {
100
- throw new Error(`Inline Function is not allowed here and calling the function is not supported: ${path}`);
101
- }
102
- }
103
- else if (ts.isIdentifier(node)) {
104
- const imported = importedIdentifiers.get(node.text);
105
- if (imported) {
106
- if (supportedImportPaths.includes(path)) {
107
- // replace imported identifier with { name, import } object
108
- return ts.factory.createObjectLiteralExpression([
109
- ts.factory.createPropertyAssignment("name", ts.factory.createStringLiteral(node.text)),
110
- ts.factory.createPropertyAssignment("import", ts.factory.createStringLiteral(imported.import)),
111
- ], true);
112
- }
113
- }
114
- }
115
- const transformKinds = [
116
- ts.SyntaxKind.Identifier,
117
- ts.SyntaxKind.ArrayLiteralExpression,
118
- ts.SyntaxKind.ObjectLiteralExpression,
119
- ts.SyntaxKind.TaggedTemplateExpression,
120
- ts.SyntaxKind.SpreadElement,
121
- ts.SyntaxKind.PropertyAssignment,
122
- ts.SyntaxKind.ShorthandPropertyAssignment,
123
- ];
124
- if (!transformKinds.includes(node.kind)) {
125
- // if the node is not one of the transformKinds, stop transformation at this level return it as is
126
- return node;
127
- }
128
- let newPath = path;
129
- if (path == "") {
130
- // first entry of path is the type, then property names (. separated) are added
131
- if (ts.isObjectLiteralExpression(node)) {
132
- const typeProperty = getTypePropertyFromObjectLiteral(node);
133
- newPath = typeProperty ? `[type=${typeProperty}]` : "";
134
- }
135
- }
136
- else {
137
- if (ts.isPropertyAssignment(node)) {
138
- newPath = `${path}.${node.name.getText()}`;
139
- }
140
- }
141
- return ts.visitEachChild(node, (child) => {
142
- return visit(child, newPath);
143
- }, context);
144
- };
145
- return (node) => ts.visitNode(node, (child) => visit(child, ""));
146
- };
147
- }
148
- const configNode = findConfigNode(sourceFile);
149
- const transformedConfigNode = ts.transform(configNode, [configTransformer()]).transformed[0];
150
- const updatedSource = ts.transform(sourceFile, [
151
- (context) => {
152
- const visitor = (node) => {
153
- if (node === configNode)
154
- return transformedConfigNode;
155
- return ts.visitEachChild(node, visitor, context);
156
- };
157
- return (node) => ts.visitNode(node, visitor);
158
- },
159
- ]).transformed[0];
160
- const printer = ts.createPrinter();
161
- return printer.printFile(updatedSource);
162
- }
163
- // finds the config node in the source file (=default export, might be wrapped in defineConfig or uses satisfies)
164
- function findConfigNode(sourceFile) {
165
- let ret;
166
- sourceFile.forEachChild((node) => {
167
- if (ts.isExportAssignment(node)) {
168
- const exportedNode = node.expression;
169
- if (ts.isCallExpression(exportedNode) && exportedNode.expression.getText() == "defineConfig") {
170
- //export default defineConfig<Foo>({ ... });
171
- const args = exportedNode.arguments;
172
- if (args.length != 1) {
173
- throw new Error(`Expected exactly one argument for defineConfig`);
174
- }
175
- ret = args[0];
176
- return false;
177
- }
178
- else if (ts.isSatisfiesExpression(exportedNode)) {
179
- //export default { ... } satisfies GeneratorConfig<Foo>;
180
- if (ts.isObjectLiteralExpression(exportedNode.expression)) {
181
- ret = exportedNode.expression;
182
- return false;
183
- }
184
- }
185
- else if (ts.isObjectLiteralExpression(exportedNode)) {
186
- //export default { ... };
187
- ret = exportedNode;
188
- return false;
189
- }
190
- }
191
- });
192
- if (!ret) {
193
- throw new Error(`No default export found, please export the GeneratorConfig as default, preferrable using defineConfig helper.`);
194
- }
195
- return ret;
196
- }
197
- // simple helper that extracts the value of the type property from a object literal ({ type: "grid" } returns "grid")
198
- function getTypePropertyFromObjectLiteral(node) {
199
- for (const property of node.properties) {
200
- if (ts.isPropertyAssignment(property)) {
201
- if (property.name.getText() == "type") {
202
- const propertyAssignmentInitializer = property.initializer;
203
- if (ts.isStringLiteral(propertyAssignmentInitializer)) {
204
- return propertyAssignmentInitializer.text;
205
- }
206
- }
207
- }
208
- }
209
- return null;
210
- }
211
- // visits ast and collects all imports statements in the source file
212
- function collectImports(rootNode) {
213
- const importedIdentifiers = new Map();
214
- function visit(node) {
215
- if (ts.isImportDeclaration(node) && node.importClause) {
216
- const moduleSpecifier = node.moduleSpecifier.text;
217
- if (node.importClause.namedBindings && ts.isNamedImports(node.importClause.namedBindings)) {
218
- //named import
219
- for (const element of node.importClause.namedBindings.elements) {
220
- const localName = element.name.text;
221
- const originalName = element.propertyName ? element.propertyName.text : localName;
222
- importedIdentifiers.set(localName, {
223
- name: originalName,
224
- import: moduleSpecifier,
225
- });
226
- }
227
- }
228
- else if (node.importClause.name && ts.isIdentifier(node.importClause.name)) {
229
- //default import
230
- const localName = node.importClause.name.text;
231
- importedIdentifiers.set(localName, {
232
- defaultImport: true,
233
- name: localName,
234
- import: moduleSpecifier,
235
- });
236
- }
237
- }
238
- ts.forEachChild(node, visit);
239
- }
240
- visit(rootNode);
241
- return importedIdentifiers;
242
- }
243
- // visits ast and collects all identifiers that are an import
244
- function findUsedImports(rootNode, importedIdentifiers) {
245
- const imports = [];
246
- const usedNames = new Set();
247
- // Collect all identifiers used in the rootNode
248
- function collectUsedIdentifiers(node) {
249
- if (ts.isIdentifier(node)) {
250
- usedNames.add(node.text);
251
- }
252
- ts.forEachChild(node, collectUsedIdentifiers);
253
- }
254
- collectUsedIdentifiers(rootNode);
255
- // Match used identifiers to imported ones
256
- // NOTE: this is not 100% correct as it doesn't recognize cases where a import is overwritten by a local variable. But it is fast.
257
- for (const name of usedNames) {
258
- const imported = importedIdentifiers.get(name);
259
- if (imported) {
260
- imports.push(imported);
261
- }
262
- }
263
- return imports;
264
- }