@nestjs-dash/schematics 0.0.1
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.
- package/README.md +19 -0
- package/dist/collection.json +58 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/action/action.factory.d.ts +4 -0
- package/dist/lib/action/action.factory.d.ts.map +1 -0
- package/dist/lib/action/action.factory.js +41 -0
- package/dist/lib/action/action.factory.js.map +1 -0
- package/dist/lib/action/schema.json +42 -0
- package/dist/lib/entity/entity.factory.d.ts +4 -0
- package/dist/lib/entity/entity.factory.d.ts.map +1 -0
- package/dist/lib/entity/entity.factory.js +20 -0
- package/dist/lib/entity/entity.factory.js.map +1 -0
- package/dist/lib/entity/files/ts/__name@dasherize__.entity.ts +32 -0
- package/dist/lib/entity/schema.json +38 -0
- package/dist/lib/filter/filter.factory.d.ts +4 -0
- package/dist/lib/filter/filter.factory.d.ts.map +1 -0
- package/dist/lib/filter/filter.factory.js +66 -0
- package/dist/lib/filter/filter.factory.js.map +1 -0
- package/dist/lib/filter/schema.json +46 -0
- package/dist/lib/module/module.factory.d.ts +4 -0
- package/dist/lib/module/module.factory.d.ts.map +1 -0
- package/dist/lib/module/module.factory.js +75 -0
- package/dist/lib/module/module.factory.js.map +1 -0
- package/dist/lib/module/module.render.d.ts +13 -0
- package/dist/lib/module/module.render.d.ts.map +1 -0
- package/dist/lib/module/module.render.js +42 -0
- package/dist/lib/module/module.render.js.map +1 -0
- package/dist/lib/module/schema.json +57 -0
- package/dist/lib/page/files/ts/pages/__name@dasherize__-overview.page.ts +15 -0
- package/dist/lib/page/page.factory.d.ts +4 -0
- package/dist/lib/page/page.factory.d.ts.map +1 -0
- package/dist/lib/page/page.factory.js +18 -0
- package/dist/lib/page/page.factory.js.map +1 -0
- package/dist/lib/page/schema.json +28 -0
- package/dist/lib/panel/files/ts/__name@dasherize__.panel.ts +17 -0
- package/dist/lib/panel/panel.factory.d.ts +4 -0
- package/dist/lib/panel/panel.factory.d.ts.map +1 -0
- package/dist/lib/panel/panel.factory.js +20 -0
- package/dist/lib/panel/panel.factory.js.map +1 -0
- package/dist/lib/panel/schema.json +28 -0
- package/dist/lib/relation-manager/files/ts/relation-managers/__name@dasherize__.relation-manager.ts +13 -0
- package/dist/lib/relation-manager/relation-manager.factory.d.ts +4 -0
- package/dist/lib/relation-manager/relation-manager.factory.d.ts.map +1 -0
- package/dist/lib/relation-manager/relation-manager.factory.js +59 -0
- package/dist/lib/relation-manager/relation-manager.factory.js.map +1 -0
- package/dist/lib/relation-manager/schema.json +56 -0
- package/dist/lib/resource/resource.factory.d.ts +4 -0
- package/dist/lib/resource/resource.factory.d.ts.map +1 -0
- package/dist/lib/resource/resource.factory.js +112 -0
- package/dist/lib/resource/resource.factory.js.map +1 -0
- package/dist/lib/resource/resource.render.d.ts +10 -0
- package/dist/lib/resource/resource.render.d.ts.map +1 -0
- package/dist/lib/resource/resource.render.js +125 -0
- package/dist/lib/resource/resource.render.js.map +1 -0
- package/dist/lib/resource/schema.json +62 -0
- package/dist/lib/widget/schema.json +39 -0
- package/dist/lib/widget/widget.factory.d.ts +4 -0
- package/dist/lib/widget/widget.factory.d.ts.map +1 -0
- package/dist/lib/widget/widget.factory.js +40 -0
- package/dist/lib/widget/widget.factory.js.map +1 -0
- package/dist/utils/class-codemod.d.ts +33 -0
- package/dist/utils/class-codemod.d.ts.map +1 -0
- package/dist/utils/class-codemod.js +146 -0
- package/dist/utils/class-codemod.js.map +1 -0
- package/dist/utils/detect.d.ts +27 -0
- package/dist/utils/detect.d.ts.map +1 -0
- package/dist/utils/detect.js +135 -0
- package/dist/utils/detect.js.map +1 -0
- package/dist/utils/entity-introspect.d.ts +17 -0
- package/dist/utils/entity-introspect.d.ts.map +1 -0
- package/dist/utils/entity-introspect.js +164 -0
- package/dist/utils/entity-introspect.js.map +1 -0
- package/dist/utils/field-mapping.d.ts +14 -0
- package/dist/utils/field-mapping.d.ts.map +1 -0
- package/dist/utils/field-mapping.js +100 -0
- package/dist/utils/field-mapping.js.map +1 -0
- package/dist/utils/module-codemod.d.ts +26 -0
- package/dist/utils/module-codemod.d.ts.map +1 -0
- package/dist/utils/module-codemod.js +134 -0
- package/dist/utils/module-codemod.js.map +1 -0
- package/dist/utils/naming.d.ts +5 -0
- package/dist/utils/naming.d.ts.map +1 -0
- package/dist/utils/naming.js +21 -0
- package/dist/utils/naming.js.map +1 -0
- package/dist/utils/ts-morph-utils.d.ts +10 -0
- package/dist/utils/ts-morph-utils.d.ts.map +1 -0
- package/dist/utils/ts-morph-utils.js +34 -0
- package/dist/utils/ts-morph-utils.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource.render.js","sourceRoot":"","sources":["../../../src/lib/resource/resource.render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/schema",
|
|
3
|
+
"$id": "SchematicsNestjs-DashResource",
|
|
4
|
+
"title": "Nestjs-Dash Resource Options Schema",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"name": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"description": "Name of the resource, e.g. Bid or bid.",
|
|
10
|
+
"$default": {
|
|
11
|
+
"$source": "argv",
|
|
12
|
+
"index": 0
|
|
13
|
+
},
|
|
14
|
+
"x-prompt": "What name would you like to use for this resource?"
|
|
15
|
+
},
|
|
16
|
+
"dir": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"format": "path",
|
|
19
|
+
"description": "Target directory relative to the project root. When omitted, an existing <name>-matching *.module.ts folder is fuzzy-matched, else src/<kebab>s/ is used."
|
|
20
|
+
},
|
|
21
|
+
"page": {
|
|
22
|
+
"type": "boolean",
|
|
23
|
+
"default": false,
|
|
24
|
+
"description": "Also scaffold a custom <Name>Page.",
|
|
25
|
+
"x-prompt": {
|
|
26
|
+
"message": "Also scaffold a custom overview page?",
|
|
27
|
+
"type": "confirmation"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"entity": {
|
|
31
|
+
"type": "boolean",
|
|
32
|
+
"default": true,
|
|
33
|
+
"description": "Generate a new entity. Set to false (--no-entity) to require reusing an existing one."
|
|
34
|
+
},
|
|
35
|
+
"softDelete": {
|
|
36
|
+
"type": "boolean",
|
|
37
|
+
"default": false,
|
|
38
|
+
"description": "Add a @DeleteDateColumn() to a newly generated entity (ignored with --no-entity)."
|
|
39
|
+
},
|
|
40
|
+
"withPermissions": {
|
|
41
|
+
"type": "boolean",
|
|
42
|
+
"default": false,
|
|
43
|
+
"description": "Scaffold a can(action, ctx) permission stub (view/create/update/delete) on the generated Resource."
|
|
44
|
+
},
|
|
45
|
+
"entityFilePath": {
|
|
46
|
+
"type": "string",
|
|
47
|
+
"format": "path",
|
|
48
|
+
"description": "Pre-resolved existing entity file to reuse — set by the CLI's interactive entity-disambiguation prompt, not user-facing in schema prompts."
|
|
49
|
+
},
|
|
50
|
+
"force": {
|
|
51
|
+
"type": "boolean",
|
|
52
|
+
"default": false,
|
|
53
|
+
"description": "Overwrite existing generated files without prompting."
|
|
54
|
+
},
|
|
55
|
+
"verbose": {
|
|
56
|
+
"type": "boolean",
|
|
57
|
+
"default": false,
|
|
58
|
+
"description": "Print detailed diagnostics (fuzzy-match reasoning, skipped-decorator warnings, codemod results)."
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"required": ["name"]
|
|
62
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/schema",
|
|
3
|
+
"$id": "SchematicsNestjs-DashWidget",
|
|
4
|
+
"title": "Nestjs-Dash Widget Options Schema",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"name": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"description": "The widget's title/label, e.g. \"Total Users\".",
|
|
10
|
+
"$default": {
|
|
11
|
+
"$source": "argv",
|
|
12
|
+
"index": 0
|
|
13
|
+
},
|
|
14
|
+
"x-prompt": "What should this widget be titled?"
|
|
15
|
+
},
|
|
16
|
+
"panel": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"format": "path",
|
|
19
|
+
"description": "Path to a Panel factory file (as scaffolded by the panel schematic) whose Panel.make() chain gets the new .widgets([...]) entry."
|
|
20
|
+
},
|
|
21
|
+
"kind": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"enum": ["stat", "bar", "line", "pie"],
|
|
24
|
+
"default": "stat",
|
|
25
|
+
"description": "stat -> StatCard (a single KPI number), bar/line/pie -> the matching chart builder."
|
|
26
|
+
},
|
|
27
|
+
"side": {
|
|
28
|
+
"type": "boolean",
|
|
29
|
+
"default": false,
|
|
30
|
+
"description": "Render in the narrow side column instead of the default main column."
|
|
31
|
+
},
|
|
32
|
+
"verbose": {
|
|
33
|
+
"type": "boolean",
|
|
34
|
+
"default": false,
|
|
35
|
+
"description": "Print diagnostics about the codemod result."
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"required": ["name", "panel"]
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget.factory.d.ts","sourceRoot":"","sources":["../../../src/lib/widget/widget.factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,IAAI,EAGV,MAAM,4BAA4B,CAAC;AAGpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAuBxD,wBAAgB,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAsBjD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { SchematicsException, } from '@angular-devkit/schematics';
|
|
2
|
+
import { codemodFluentChainArray } from '../../utils/class-codemod.js';
|
|
3
|
+
import { normalizePath } from '../../utils/detect.js';
|
|
4
|
+
const CHART_BUILDER_BY_KIND = { bar: 'BarChart', line: 'LineChart', pie: 'PieChart' };
|
|
5
|
+
function buildWidgetElement(options) {
|
|
6
|
+
const kind = options.kind ?? 'stat';
|
|
7
|
+
const side = options.side ? '.side()' : '';
|
|
8
|
+
if (kind === 'stat') {
|
|
9
|
+
const text = `StatCard.make('${options.name}')${side}` +
|
|
10
|
+
`.value(async (ctx) => {\n // TODO: query real data\n return 0;\n })`;
|
|
11
|
+
return { elementText: text, builder: 'StatCard' };
|
|
12
|
+
}
|
|
13
|
+
const builder = CHART_BUILDER_BY_KIND[kind];
|
|
14
|
+
const text = `${builder}.make()${side}.title('${options.name}')` +
|
|
15
|
+
`.category('category').series([{ key: 'value', label: 'Value' }])` +
|
|
16
|
+
`.data(async (ctx) => {\n // TODO: query real data\n return [];\n })`;
|
|
17
|
+
return { elementText: text, builder };
|
|
18
|
+
}
|
|
19
|
+
export function main(options) {
|
|
20
|
+
return (tree, context) => {
|
|
21
|
+
const panelPath = normalizePath(options.panel);
|
|
22
|
+
if (!tree.exists(panelPath)) {
|
|
23
|
+
throw new SchematicsException(`--panel points at ${panelPath}, which doesn't exist.`);
|
|
24
|
+
}
|
|
25
|
+
const { elementText, builder } = buildWidgetElement(options);
|
|
26
|
+
const result = codemodFluentChainArray({
|
|
27
|
+
tree,
|
|
28
|
+
filePath: panelPath,
|
|
29
|
+
owner: { kind: 'function' },
|
|
30
|
+
chainMethodName: 'widgets',
|
|
31
|
+
elementText,
|
|
32
|
+
namedImports: [{ moduleSpecifier: '@nestjs-dash/core', name: builder }],
|
|
33
|
+
});
|
|
34
|
+
if (options.verbose) {
|
|
35
|
+
context.logger.info(`${result.changed ? 'Modified' : 'No changes needed'}: ${panelPath}`);
|
|
36
|
+
}
|
|
37
|
+
return tree;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=widget.factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget.factory.js","sourceRoot":"","sources":["../../../src/lib/widget/widget.factory.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,GAIpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,MAAM,qBAAqB,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,UAAU,EAAW,CAAC;AAE/F,SAAS,kBAAkB,CAAC,OAAsB;IAChD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAE3C,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,IAAI,GACR,kBAAkB,OAAO,CAAC,IAAI,KAAK,IAAI,EAAE;YACzC,4EAA4E,CAAC;QAC/E,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,IAAI,GACR,GAAG,OAAO,UAAU,IAAI,WAAW,OAAO,CAAC,IAAI,IAAI;QACnD,kEAAkE;QAClE,4EAA4E,CAAC;IAC/E,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAsB;IACzC,OAAO,CAAC,IAAU,EAAE,OAAyB,EAAE,EAAE;QAC/C,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,mBAAmB,CAAC,qBAAqB,SAAS,wBAAwB,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,uBAAuB,CAAC;YACrC,IAAI;YACJ,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;YAC3B,eAAe,EAAE,SAAS;YAC1B,WAAW;YACX,YAAY,EAAE,CAAC,EAAE,eAAe,EAAE,mBAAmB,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;SACxE,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Tree } from '@angular-devkit/schematics';
|
|
2
|
+
import { type CodemodResult } from './ts-morph-utils.js';
|
|
3
|
+
export interface NamedImportRef {
|
|
4
|
+
moduleSpecifier: string;
|
|
5
|
+
name: string;
|
|
6
|
+
}
|
|
7
|
+
export type ChainOwner = {
|
|
8
|
+
kind: 'class-static-method';
|
|
9
|
+
className?: string;
|
|
10
|
+
methodName: string;
|
|
11
|
+
} | {
|
|
12
|
+
kind: 'function';
|
|
13
|
+
functionName?: string;
|
|
14
|
+
};
|
|
15
|
+
export interface FluentChainCodemodInput {
|
|
16
|
+
tree: Tree;
|
|
17
|
+
filePath: string;
|
|
18
|
+
owner: ChainOwner;
|
|
19
|
+
chainMethodName: string;
|
|
20
|
+
elementText: string;
|
|
21
|
+
namedImports?: NamedImportRef[];
|
|
22
|
+
}
|
|
23
|
+
export interface StaticArrayPropertyCodemodInput {
|
|
24
|
+
tree: Tree;
|
|
25
|
+
filePath: string;
|
|
26
|
+
className?: string;
|
|
27
|
+
propertyName: string;
|
|
28
|
+
elementText: string;
|
|
29
|
+
namedImports?: NamedImportRef[];
|
|
30
|
+
}
|
|
31
|
+
export declare function codemodFluentChainArray(input: FluentChainCodemodInput): CodemodResult;
|
|
32
|
+
export declare function codemodStaticArrayProperty(input: StaticArrayPropertyCodemodInput): CodemodResult;
|
|
33
|
+
//# sourceMappingURL=class-codemod.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class-codemod.d.ts","sourceRoot":"","sources":["../../src/utils/class-codemod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AASvD,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAGD,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;IAElB,eAAe,EAAE,MAAM,CAAC;IAExB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,cAAc,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,cAAc,EAAE,CAAC;CACjC;AA0ED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,uBAAuB,GAAG,aAAa,CA0DrF;AAQD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,+BAA+B,GAAG,aAAa,CAkDhG"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { Node, SyntaxKind, } from 'ts-morph';
|
|
2
|
+
import { appendUniqueElement, ensureNamedImport, newProject, } from './ts-morph-utils.js';
|
|
3
|
+
function findClass(sourceFile, className) {
|
|
4
|
+
const classes = sourceFile.getClasses();
|
|
5
|
+
if (className) {
|
|
6
|
+
const found = classes.find((c) => c.getName() === className);
|
|
7
|
+
if (!found) {
|
|
8
|
+
throw new Error(`No class named ${className} found in ${sourceFile.getFilePath()}`);
|
|
9
|
+
}
|
|
10
|
+
return found;
|
|
11
|
+
}
|
|
12
|
+
const last = classes[classes.length - 1];
|
|
13
|
+
if (!last) {
|
|
14
|
+
throw new Error(`No class declaration found in ${sourceFile.getFilePath()}`);
|
|
15
|
+
}
|
|
16
|
+
return last;
|
|
17
|
+
}
|
|
18
|
+
function findFunction(sourceFile, functionName) {
|
|
19
|
+
if (functionName) {
|
|
20
|
+
const fn = sourceFile.getFunction(functionName);
|
|
21
|
+
if (!fn) {
|
|
22
|
+
throw new Error(`No function named ${functionName} found in ${sourceFile.getFilePath()}`);
|
|
23
|
+
}
|
|
24
|
+
return fn;
|
|
25
|
+
}
|
|
26
|
+
const first = sourceFile.getFunctions()[0];
|
|
27
|
+
if (!first) {
|
|
28
|
+
throw new Error(`No function declaration found in ${sourceFile.getFilePath()}`);
|
|
29
|
+
}
|
|
30
|
+
return first;
|
|
31
|
+
}
|
|
32
|
+
function directReturnStatement(body, ownerLabel) {
|
|
33
|
+
if (!body || !Node.isBlock(body)) {
|
|
34
|
+
throw new Error(`${ownerLabel} has no block body to codemod`);
|
|
35
|
+
}
|
|
36
|
+
const ret = body.getStatements().find((s) => Node.isReturnStatement(s));
|
|
37
|
+
if (!ret) {
|
|
38
|
+
throw new Error(`${ownerLabel} has no top-level return statement to codemod`);
|
|
39
|
+
}
|
|
40
|
+
return ret;
|
|
41
|
+
}
|
|
42
|
+
function findChainReturnStatement(sourceFile, owner) {
|
|
43
|
+
if (owner.kind === 'function') {
|
|
44
|
+
const fn = findFunction(sourceFile, owner.functionName);
|
|
45
|
+
return directReturnStatement(fn.getBody(), `Function ${fn.getName() ?? '(anonymous)'}()`);
|
|
46
|
+
}
|
|
47
|
+
const cls = findClass(sourceFile, owner.className);
|
|
48
|
+
const method = cls.getStaticMethod(owner.methodName);
|
|
49
|
+
if (!method) {
|
|
50
|
+
throw new Error(`No static ${owner.methodName}() method found on ${cls.getName()}`);
|
|
51
|
+
}
|
|
52
|
+
return directReturnStatement(method.getBody(), `${cls.getName()}.${owner.methodName}()`);
|
|
53
|
+
}
|
|
54
|
+
export function codemodFluentChainArray(input) {
|
|
55
|
+
const project = newProject();
|
|
56
|
+
const content = input.tree.read(input.filePath);
|
|
57
|
+
if (content === null) {
|
|
58
|
+
throw new Error(`No file at ${input.filePath}`);
|
|
59
|
+
}
|
|
60
|
+
const sourceFile = project.createSourceFile(input.filePath, content.toString('utf-8'), {
|
|
61
|
+
overwrite: true,
|
|
62
|
+
});
|
|
63
|
+
const before = sourceFile.getFullText();
|
|
64
|
+
const returnStatement = findChainReturnStatement(sourceFile, input.owner);
|
|
65
|
+
const returnExpr = returnStatement.getExpression();
|
|
66
|
+
if (!returnExpr) {
|
|
67
|
+
throw new Error(`Return statement in ${input.filePath} has no expression to codemod`);
|
|
68
|
+
}
|
|
69
|
+
const candidateCalls = [
|
|
70
|
+
...(Node.isCallExpression(returnExpr) ? [returnExpr] : []),
|
|
71
|
+
...returnExpr.getDescendantsOfKind(SyntaxKind.CallExpression),
|
|
72
|
+
];
|
|
73
|
+
const existingCall = candidateCalls.find((call) => {
|
|
74
|
+
const expr = call.getExpression();
|
|
75
|
+
return Node.isPropertyAccessExpression(expr) && expr.getName() === input.chainMethodName;
|
|
76
|
+
});
|
|
77
|
+
let mutated;
|
|
78
|
+
if (existingCall) {
|
|
79
|
+
const arg = existingCall.getArguments()[0];
|
|
80
|
+
if (!arg || !Node.isArrayLiteralExpression(arg)) {
|
|
81
|
+
throw new Error(`.${input.chainMethodName}(...) in ${input.filePath} doesn't take a plain array literal argument — cannot safely codemod it`);
|
|
82
|
+
}
|
|
83
|
+
mutated = appendUniqueElement(arg, input.elementText);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
const exprText = returnExpr.getText();
|
|
87
|
+
returnExpr.replaceWithText(`${exprText}\n .${input.chainMethodName}([${input.elementText}])`);
|
|
88
|
+
mutated = true;
|
|
89
|
+
}
|
|
90
|
+
for (const imp of input.namedImports ?? []) {
|
|
91
|
+
const added = ensureNamedImport(sourceFile, imp.moduleSpecifier, imp.name);
|
|
92
|
+
mutated = mutated || added;
|
|
93
|
+
}
|
|
94
|
+
if (!mutated) {
|
|
95
|
+
return { before, after: before, changed: false };
|
|
96
|
+
}
|
|
97
|
+
sourceFile.formatText({ indentSize: 2 });
|
|
98
|
+
const after = sourceFile.getFullText();
|
|
99
|
+
input.tree.overwrite(input.filePath, after);
|
|
100
|
+
return { before, after, changed: true };
|
|
101
|
+
}
|
|
102
|
+
export function codemodStaticArrayProperty(input) {
|
|
103
|
+
const project = newProject();
|
|
104
|
+
const content = input.tree.read(input.filePath);
|
|
105
|
+
if (content === null) {
|
|
106
|
+
throw new Error(`No file at ${input.filePath}`);
|
|
107
|
+
}
|
|
108
|
+
const sourceFile = project.createSourceFile(input.filePath, content.toString('utf-8'), {
|
|
109
|
+
overwrite: true,
|
|
110
|
+
});
|
|
111
|
+
const before = sourceFile.getFullText();
|
|
112
|
+
const cls = findClass(sourceFile, input.className);
|
|
113
|
+
const existing = cls.getStaticMember(input.propertyName);
|
|
114
|
+
let mutated;
|
|
115
|
+
if (existing && Node.isPropertyDeclaration(existing)) {
|
|
116
|
+
const init = existing.getInitializerIfKind(SyntaxKind.ArrayLiteralExpression);
|
|
117
|
+
if (!init) {
|
|
118
|
+
throw new Error(`static ${input.propertyName} on ${cls.getName()} doesn't have a plain array-literal initializer — cannot safely codemod it`);
|
|
119
|
+
}
|
|
120
|
+
mutated = appendUniqueElement(init, input.elementText);
|
|
121
|
+
}
|
|
122
|
+
else if (existing) {
|
|
123
|
+
throw new Error(`${input.propertyName} on ${cls.getName()} is not a plain static property — cannot safely codemod it`);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
cls.addProperty({
|
|
127
|
+
isStatic: true,
|
|
128
|
+
hasOverrideKeyword: true,
|
|
129
|
+
name: input.propertyName,
|
|
130
|
+
initializer: `[${input.elementText}]`,
|
|
131
|
+
});
|
|
132
|
+
mutated = true;
|
|
133
|
+
}
|
|
134
|
+
for (const imp of input.namedImports ?? []) {
|
|
135
|
+
const added = ensureNamedImport(sourceFile, imp.moduleSpecifier, imp.name);
|
|
136
|
+
mutated = mutated || added;
|
|
137
|
+
}
|
|
138
|
+
if (!mutated) {
|
|
139
|
+
return { before, after: before, changed: false };
|
|
140
|
+
}
|
|
141
|
+
sourceFile.formatText({ indentSize: 2 });
|
|
142
|
+
const after = sourceFile.getFullText();
|
|
143
|
+
input.tree.overwrite(input.filePath, after);
|
|
144
|
+
return { before, after, changed: true };
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=class-codemod.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class-codemod.js","sourceRoot":"","sources":["../../src/utils/class-codemod.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Tree } from '@angular-devkit/schematics';
|
|
2
|
+
export declare function normalizePath(path: string): string;
|
|
3
|
+
export declare function hasNestCoreDependency(tree: Tree): boolean;
|
|
4
|
+
export type DetectedOrm = 'typeorm' | 'mikroorm' | 'prisma';
|
|
5
|
+
export interface OrmDetectionResult {
|
|
6
|
+
detected: DetectedOrm[];
|
|
7
|
+
orm?: DetectedOrm;
|
|
8
|
+
}
|
|
9
|
+
export declare function detectOrm(tree: Tree): OrmDetectionResult;
|
|
10
|
+
export declare function resolveSourceRoot(tree: Tree): string;
|
|
11
|
+
export interface ResolveTargetDirResult {
|
|
12
|
+
dir: string;
|
|
13
|
+
folderName: string;
|
|
14
|
+
matched: boolean;
|
|
15
|
+
matchedModulePath?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function resolveTargetDir(tree: Tree, options: {
|
|
18
|
+
sourceRoot: string;
|
|
19
|
+
name: string;
|
|
20
|
+
explicitDir?: string;
|
|
21
|
+
}): ResolveTargetDirResult;
|
|
22
|
+
export declare function findModuleFileInDir(tree: Tree, dir: string): string | null;
|
|
23
|
+
export declare function findEntityFile(tree: Tree, dir: string, name: string): string | null;
|
|
24
|
+
export declare function findAllEntityFiles(tree: Tree, dir: string): string[];
|
|
25
|
+
export declare function findRootAppModule(tree: Tree, sourceRoot: string): string | null;
|
|
26
|
+
export declare function relativeImportPath(fromFile: string, toFile: string): string;
|
|
27
|
+
//# sourceMappingURL=detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/utils/detect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAKvD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGlD;AAuBD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAIzD;AAGD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE5D,MAAM,WAAW,kBAAkB;IAEjC,QAAQ,EAAE,WAAW,EAAE,CAAC;IAExB,GAAG,CAAC,EAAE,WAAW,CAAC;CACnB;AAoBD,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,kBAAkB,CAQxD;AAGD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAWpD;AA4BD,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IAEjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAQD,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAClE,sBAAsB,CAkBxB;AAGD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO1E;AAGD,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQnF;AAGD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CASpE;AAGD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM/E;AAGD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAI3E"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { basename, dirname, join, relative } from 'node:path/posix';
|
|
2
|
+
import { toKebabCase } from './naming.js';
|
|
3
|
+
export function normalizePath(path) {
|
|
4
|
+
const withLeadingSlash = path.startsWith('/') ? path : `/${path}`;
|
|
5
|
+
return withLeadingSlash === '/' ? withLeadingSlash : withLeadingSlash.replace(/\/+$/, '');
|
|
6
|
+
}
|
|
7
|
+
function treeDirExists(tree, path) {
|
|
8
|
+
const dir = tree.getDir(normalizePath(path));
|
|
9
|
+
return dir.subfiles.length > 0 || dir.subdirs.length > 0;
|
|
10
|
+
}
|
|
11
|
+
function readPackageJson(tree) {
|
|
12
|
+
const content = tree.read('/package.json');
|
|
13
|
+
if (!content)
|
|
14
|
+
return null;
|
|
15
|
+
try {
|
|
16
|
+
return JSON.parse(content.toString('utf-8'));
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function hasNestCoreDependency(tree) {
|
|
23
|
+
const pkg = readPackageJson(tree);
|
|
24
|
+
if (!pkg)
|
|
25
|
+
return false;
|
|
26
|
+
return Boolean(pkg.dependencies?.['@nestjs/core'] || pkg.devDependencies?.['@nestjs/core']);
|
|
27
|
+
}
|
|
28
|
+
const ORM_DEPENDENCY = {
|
|
29
|
+
typeorm: 'typeorm',
|
|
30
|
+
mikroorm: '@mikro-orm/core',
|
|
31
|
+
prisma: '@prisma/client',
|
|
32
|
+
};
|
|
33
|
+
export function detectOrm(tree) {
|
|
34
|
+
const pkg = readPackageJson(tree);
|
|
35
|
+
if (!pkg)
|
|
36
|
+
return { detected: [] };
|
|
37
|
+
const has = (name) => Boolean(pkg.dependencies?.[name] || pkg.devDependencies?.[name]);
|
|
38
|
+
const detected = Object.keys(ORM_DEPENDENCY).filter((orm) => has(ORM_DEPENDENCY[orm]));
|
|
39
|
+
return { detected, orm: detected.length === 1 ? detected[0] : undefined };
|
|
40
|
+
}
|
|
41
|
+
export function resolveSourceRoot(tree) {
|
|
42
|
+
const content = tree.read('/nest-cli.json');
|
|
43
|
+
if (content) {
|
|
44
|
+
try {
|
|
45
|
+
const nestCli = JSON.parse(content.toString('utf-8'));
|
|
46
|
+
if (nestCli.sourceRoot)
|
|
47
|
+
return normalizePath(nestCli.sourceRoot);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return '/src';
|
|
53
|
+
}
|
|
54
|
+
function walkTreeFiles(tree, root, predicate, maxDepth = 6) {
|
|
55
|
+
const results = [];
|
|
56
|
+
const skip = new Set(['node_modules', 'dist', '.git', '.turbo']);
|
|
57
|
+
function walk(dirPath, depth) {
|
|
58
|
+
if (depth > maxDepth)
|
|
59
|
+
return;
|
|
60
|
+
const dir = tree.getDir(dirPath);
|
|
61
|
+
for (const fileName of dir.subfiles) {
|
|
62
|
+
const filePath = join(dirPath, fileName);
|
|
63
|
+
if (predicate(filePath))
|
|
64
|
+
results.push(filePath);
|
|
65
|
+
}
|
|
66
|
+
for (const dirName of dir.subdirs) {
|
|
67
|
+
if (skip.has(dirName))
|
|
68
|
+
continue;
|
|
69
|
+
walk(join(dirPath, dirName), depth + 1);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
walk(normalizePath(root), 0);
|
|
73
|
+
return results;
|
|
74
|
+
}
|
|
75
|
+
export function resolveTargetDir(tree, options) {
|
|
76
|
+
if (options.explicitDir) {
|
|
77
|
+
const dir = normalizePath(options.explicitDir);
|
|
78
|
+
return { dir, folderName: basename(dir), matched: treeDirExists(tree, dir) };
|
|
79
|
+
}
|
|
80
|
+
const kebab = toKebabCase(options.name);
|
|
81
|
+
const moduleFiles = walkTreeFiles(tree, options.sourceRoot, (p) => p.endsWith('.module.ts'));
|
|
82
|
+
for (const moduleFile of moduleFiles) {
|
|
83
|
+
const moduleBase = basename(moduleFile).replace(/\.module\.ts$/, '');
|
|
84
|
+
if (moduleBase.includes(kebab) || kebab.includes(moduleBase)) {
|
|
85
|
+
const dir = dirname(moduleFile);
|
|
86
|
+
return { dir, folderName: basename(dir), matched: true, matchedModulePath: moduleFile };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const folderName = `${kebab}s`;
|
|
90
|
+
return { dir: join(normalizePath(options.sourceRoot), folderName), folderName, matched: false };
|
|
91
|
+
}
|
|
92
|
+
export function findModuleFileInDir(tree, dir) {
|
|
93
|
+
const normalizedDir = normalizePath(dir);
|
|
94
|
+
const folderName = basename(normalizedDir);
|
|
95
|
+
const candidate = join(normalizedDir, `${folderName}.module.ts`);
|
|
96
|
+
if (tree.exists(candidate))
|
|
97
|
+
return candidate;
|
|
98
|
+
const moduleFiles = tree.getDir(normalizedDir).subfiles.filter((f) => f.endsWith('.module.ts'));
|
|
99
|
+
return moduleFiles.length > 0 ? join(normalizedDir, moduleFiles[0]) : null;
|
|
100
|
+
}
|
|
101
|
+
export function findEntityFile(tree, dir, name) {
|
|
102
|
+
const normalizedDir = normalizePath(dir);
|
|
103
|
+
const kebab = toKebabCase(name);
|
|
104
|
+
const candidates = [
|
|
105
|
+
join(normalizedDir, 'entities', `${kebab}.entity.ts`),
|
|
106
|
+
join(normalizedDir, `${kebab}.entity.ts`),
|
|
107
|
+
];
|
|
108
|
+
return candidates.find((c) => tree.exists(c)) ?? null;
|
|
109
|
+
}
|
|
110
|
+
export function findAllEntityFiles(tree, dir) {
|
|
111
|
+
const normalizedDir = normalizePath(dir);
|
|
112
|
+
const found = new Set();
|
|
113
|
+
for (const candidateDir of [normalizedDir, join(normalizedDir, 'entities')]) {
|
|
114
|
+
for (const entry of tree.getDir(candidateDir).subfiles) {
|
|
115
|
+
if (entry.endsWith('.entity.ts'))
|
|
116
|
+
found.add(join(candidateDir, entry));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return [...found].sort();
|
|
120
|
+
}
|
|
121
|
+
export function findRootAppModule(tree, sourceRoot) {
|
|
122
|
+
const normalizedRoot = normalizePath(sourceRoot);
|
|
123
|
+
const direct = join(normalizedRoot, 'app.module.ts');
|
|
124
|
+
if (tree.exists(direct))
|
|
125
|
+
return direct;
|
|
126
|
+
const found = walkTreeFiles(tree, normalizedRoot, (p) => basename(p) === 'app.module.ts', 4);
|
|
127
|
+
return found[0] ?? null;
|
|
128
|
+
}
|
|
129
|
+
export function relativeImportPath(fromFile, toFile) {
|
|
130
|
+
let rel = relative(dirname(fromFile), toFile).replace(/\\/g, '/');
|
|
131
|
+
if (!rel.startsWith('.'))
|
|
132
|
+
rel = `./${rel}`;
|
|
133
|
+
return rel.replace(/\.ts$/, '.js');
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/utils/detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type EntityFieldRole = 'primary' | 'createdAt' | 'updatedAt' | 'deletedAt' | 'version' | 'relation' | 'column';
|
|
2
|
+
export type EntityFieldType = 'string' | 'number' | 'boolean' | 'date' | 'json' | 'enum' | 'unknown';
|
|
3
|
+
export interface EntityField {
|
|
4
|
+
name: string;
|
|
5
|
+
role: EntityFieldRole;
|
|
6
|
+
type: EntityFieldType;
|
|
7
|
+
nullable: boolean;
|
|
8
|
+
sortable: boolean;
|
|
9
|
+
searchable: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface IntrospectedEntity {
|
|
12
|
+
className: string;
|
|
13
|
+
tableName?: string;
|
|
14
|
+
fields: EntityField[];
|
|
15
|
+
}
|
|
16
|
+
export declare function introspectEntitySource(filePath: string, content: string): IntrospectedEntity;
|
|
17
|
+
//# sourceMappingURL=entity-introspect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-introspect.d.ts","sourceRoot":"","sources":["../../src/utils/entity-introspect.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,WAAW,GACX,WAAW,GACX,WAAW,GACX,SAAS,GACT,UAAU,GACV,QAAQ,CAAC;AAEb,MAAM,MAAM,eAAe,GACvB,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,MAAM,GACN,MAAM,GACN,MAAM,GACN,SAAS,CAAC;AAEd,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAsGD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAiE5F"}
|