@deenruv/cli 1.0.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 (102) hide show
  1. package/LICENSE +23 -0
  2. package/dist/cli.d.ts +2 -0
  3. package/dist/cli.js +64 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/add/add.d.ts +1 -0
  6. package/dist/commands/add/add.js +70 -0
  7. package/dist/commands/add/add.js.map +1 -0
  8. package/dist/commands/add/api-extension/add-api-extension.d.ts +9 -0
  9. package/dist/commands/add/api-extension/add-api-extension.js +524 -0
  10. package/dist/commands/add/api-extension/add-api-extension.js.map +1 -0
  11. package/dist/commands/add/api-extension/templates/api-extensions.template.ts +3 -0
  12. package/dist/commands/add/api-extension/templates/crud-resolver.template.ts +127 -0
  13. package/dist/commands/add/api-extension/templates/simple-resolver.template.ts +37 -0
  14. package/dist/commands/add/codegen/add-codegen.d.ts +8 -0
  15. package/dist/commands/add/codegen/add-codegen.js +113 -0
  16. package/dist/commands/add/codegen/add-codegen.js.map +1 -0
  17. package/dist/commands/add/codegen/codegen-config-ref.d.ts +10 -0
  18. package/dist/commands/add/codegen/codegen-config-ref.js +52 -0
  19. package/dist/commands/add/codegen/codegen-config-ref.js.map +1 -0
  20. package/dist/commands/add/codegen/templates/codegen.template.ts +17 -0
  21. package/dist/commands/add/entity/add-entity.d.ts +17 -0
  22. package/dist/commands/add/entity/add-entity.js +160 -0
  23. package/dist/commands/add/entity/add-entity.js.map +1 -0
  24. package/dist/commands/add/entity/codemods/add-entity-to-plugin/add-entity-to-plugin.d.ts +3 -0
  25. package/dist/commands/add/entity/codemods/add-entity-to-plugin/add-entity-to-plugin.js +17 -0
  26. package/dist/commands/add/entity/codemods/add-entity-to-plugin/add-entity-to-plugin.js.map +1 -0
  27. package/dist/commands/add/entity/templates/entity-translation.template.ts +31 -0
  28. package/dist/commands/add/entity/templates/entity.template.ts +36 -0
  29. package/dist/commands/add/job-queue/add-job-queue.d.ts +9 -0
  30. package/dist/commands/add/job-queue/add-job-queue.js +139 -0
  31. package/dist/commands/add/job-queue/add-job-queue.js.map +1 -0
  32. package/dist/commands/add/plugin/create-new-plugin.d.ts +10 -0
  33. package/dist/commands/add/plugin/create-new-plugin.js +240 -0
  34. package/dist/commands/add/plugin/create-new-plugin.js.map +1 -0
  35. package/dist/commands/add/plugin/templates/constants.template.ts +2 -0
  36. package/dist/commands/add/plugin/templates/plugin.template.ts +30 -0
  37. package/dist/commands/add/plugin/templates/types.template.ts +7 -0
  38. package/dist/commands/add/plugin/types.d.ts +8 -0
  39. package/dist/commands/add/plugin/types.js +3 -0
  40. package/dist/commands/add/plugin/types.js.map +1 -0
  41. package/dist/commands/add/service/add-service.d.ts +5 -0
  42. package/dist/commands/add/service/add-service.js +317 -0
  43. package/dist/commands/add/service/add-service.js.map +1 -0
  44. package/dist/commands/add/service/templates/basic-service.template.ts +20 -0
  45. package/dist/commands/add/service/templates/entity-service.template.ts +182 -0
  46. package/dist/commands/add/ui-extensions/add-ui-extensions.d.ts +6 -0
  47. package/dist/commands/add/ui-extensions/add-ui-extensions.js +101 -0
  48. package/dist/commands/add/ui-extensions/add-ui-extensions.js.map +1 -0
  49. package/dist/commands/add/ui-extensions/codemods/add-ui-extension-static-prop/add-ui-extension-static-prop.d.ts +2 -0
  50. package/dist/commands/add/ui-extensions/codemods/add-ui-extension-static-prop/add-ui-extension-static-prop.js +36 -0
  51. package/dist/commands/add/ui-extensions/codemods/add-ui-extension-static-prop/add-ui-extension-static-prop.js.map +1 -0
  52. package/dist/commands/add/ui-extensions/codemods/update-admin-ui-plugin-init/update-admin-ui-plugin-init.d.ts +5 -0
  53. package/dist/commands/add/ui-extensions/codemods/update-admin-ui-plugin-init/update-admin-ui-plugin-init.js +63 -0
  54. package/dist/commands/add/ui-extensions/codemods/update-admin-ui-plugin-init/update-admin-ui-plugin-init.js.map +1 -0
  55. package/dist/commands/add/ui-extensions/templates/providers.template.ts +3 -0
  56. package/dist/commands/add/ui-extensions/templates/routes.template.ts +3 -0
  57. package/dist/commands/migrate/generate-migration/generate-migration.d.ts +2 -0
  58. package/dist/commands/migrate/generate-migration/generate-migration.js +112 -0
  59. package/dist/commands/migrate/generate-migration/generate-migration.js.map +1 -0
  60. package/dist/commands/migrate/load-deenruv-config-file.d.ts +3 -0
  61. package/dist/commands/migrate/load-deenruv-config-file.js +66 -0
  62. package/dist/commands/migrate/load-deenruv-config-file.js.map +1 -0
  63. package/dist/commands/migrate/migrate.d.ts +1 -0
  64. package/dist/commands/migrate/migrate.js +50 -0
  65. package/dist/commands/migrate/migrate.js.map +1 -0
  66. package/dist/commands/migrate/revert-migration/revert-migration.d.ts +2 -0
  67. package/dist/commands/migrate/revert-migration/revert-migration.js +31 -0
  68. package/dist/commands/migrate/revert-migration/revert-migration.js.map +1 -0
  69. package/dist/commands/migrate/run-migration/run-migration.d.ts +2 -0
  70. package/dist/commands/migrate/run-migration/run-migration.js +34 -0
  71. package/dist/commands/migrate/run-migration/run-migration.js.map +1 -0
  72. package/dist/constants.d.ts +10 -0
  73. package/dist/constants.js +17 -0
  74. package/dist/constants.js.map +1 -0
  75. package/dist/shared/cli-command.d.ts +24 -0
  76. package/dist/shared/cli-command.js +22 -0
  77. package/dist/shared/cli-command.js.map +1 -0
  78. package/dist/shared/deenruv-config-ref.d.ts +14 -0
  79. package/dist/shared/deenruv-config-ref.js +69 -0
  80. package/dist/shared/deenruv-config-ref.js.map +1 -0
  81. package/dist/shared/deenruv-plugin-ref.d.ts +22 -0
  82. package/dist/shared/deenruv-plugin-ref.js +184 -0
  83. package/dist/shared/deenruv-plugin-ref.js.map +1 -0
  84. package/dist/shared/entity-ref.d.ts +16 -0
  85. package/dist/shared/entity-ref.js +61 -0
  86. package/dist/shared/entity-ref.js.map +1 -0
  87. package/dist/shared/package-json-ref.d.ts +25 -0
  88. package/dist/shared/package-json-ref.js +181 -0
  89. package/dist/shared/package-json-ref.js.map +1 -0
  90. package/dist/shared/service-ref.d.ts +25 -0
  91. package/dist/shared/service-ref.js +92 -0
  92. package/dist/shared/service-ref.js.map +1 -0
  93. package/dist/shared/shared-prompts.d.ts +16 -0
  94. package/dist/shared/shared-prompts.js +170 -0
  95. package/dist/shared/shared-prompts.js.map +1 -0
  96. package/dist/utilities/ast-utils.d.ts +20 -0
  97. package/dist/utilities/ast-utils.js +173 -0
  98. package/dist/utilities/ast-utils.js.map +1 -0
  99. package/dist/utilities/utils.d.ts +2 -0
  100. package/dist/utilities/utils.js +12 -0
  101. package/dist/utilities/utils.js.map +1 -0
  102. package/package.json +57 -0
@@ -0,0 +1,127 @@
1
+ import { Args, Mutation, Query, Resolver } from "@nestjs/graphql";
2
+ import {
3
+ DeletionResponse,
4
+ Permission,
5
+ } from "@deenruv/common/lib/generated-types";
6
+ import { CustomFieldsObject } from "@deenruv/common/lib/shared-types";
7
+ import {
8
+ Allow,
9
+ Ctx,
10
+ PaginatedList,
11
+ RequestContext,
12
+ Transaction,
13
+ Relations,
14
+ DeenruvEntity,
15
+ ID,
16
+ TranslationInput,
17
+ ListQueryOptions,
18
+ RelationPaths,
19
+ } from "@deenruv/core";
20
+
21
+ class TemplateEntity extends DeenruvEntity {
22
+ constructor() {
23
+ super();
24
+ }
25
+ }
26
+
27
+ class TemplateService {
28
+ findAll(
29
+ ctx: RequestContext,
30
+ options?: any,
31
+ relations?: any,
32
+ ): Promise<PaginatedList<TemplateEntity>> {
33
+ throw new Error("Method not implemented.");
34
+ }
35
+
36
+ findOne(
37
+ ctx: RequestContext,
38
+ id: ID,
39
+ relations?: any,
40
+ ): Promise<TemplateEntity | null> {
41
+ throw new Error("Method not implemented.");
42
+ }
43
+
44
+ create(ctx: RequestContext, input: any): Promise<TemplateEntity> {
45
+ throw new Error("Method not implemented.");
46
+ }
47
+
48
+ update(ctx: RequestContext, input: any): Promise<TemplateEntity> {
49
+ throw new Error("Method not implemented.");
50
+ }
51
+
52
+ delete(ctx: RequestContext, id: ID): Promise<DeletionResponse> {
53
+ throw new Error("Method not implemented.");
54
+ }
55
+ }
56
+
57
+ // These can be replaced by generated types if you set up code generation
58
+ interface CreateEntityInput {
59
+ // Define the input fields here
60
+ customFields?: CustomFieldsObject;
61
+ translations: Array<TranslationInput<TemplateEntity>>;
62
+ }
63
+ interface UpdateEntityInput {
64
+ id: ID;
65
+ // Define the input fields here
66
+ customFields?: CustomFieldsObject;
67
+ translations: Array<TranslationInput<TemplateEntity>>;
68
+ }
69
+
70
+ @Resolver()
71
+ export class EntityAdminResolver {
72
+ constructor(private templateService: TemplateService) {}
73
+
74
+ @Query()
75
+ @Allow(Permission.SuperAdmin)
76
+ async entity(
77
+ @Ctx() ctx: RequestContext,
78
+ @Args() args: { id: ID },
79
+ @Relations(TemplateEntity) relations: RelationPaths<TemplateEntity>,
80
+ ): Promise<TemplateEntity | null> {
81
+ return this.templateService.findOne(ctx, args.id, relations);
82
+ }
83
+
84
+ @Query()
85
+ @Allow(Permission.SuperAdmin)
86
+ async entities(
87
+ @Ctx() ctx: RequestContext,
88
+ @Args() args: { options: ListQueryOptions<TemplateEntity> },
89
+ @Relations(TemplateEntity) relations: RelationPaths<TemplateEntity>,
90
+ ): Promise<PaginatedList<TemplateEntity>> {
91
+ return this.templateService.findAll(
92
+ ctx,
93
+ args.options || undefined,
94
+ relations,
95
+ );
96
+ }
97
+
98
+ @Mutation()
99
+ @Transaction()
100
+ @Allow(Permission.SuperAdmin)
101
+ async createEntity(
102
+ @Ctx() ctx: RequestContext,
103
+ @Args() args: { input: CreateEntityInput },
104
+ ): Promise<TemplateEntity> {
105
+ return this.templateService.create(ctx, args.input);
106
+ }
107
+
108
+ @Mutation()
109
+ @Transaction()
110
+ @Allow(Permission.SuperAdmin)
111
+ async updateEntity(
112
+ @Ctx() ctx: RequestContext,
113
+ @Args() args: { input: UpdateEntityInput },
114
+ ): Promise<TemplateEntity> {
115
+ return this.templateService.update(ctx, args.input);
116
+ }
117
+
118
+ @Mutation()
119
+ @Transaction()
120
+ @Allow(Permission.SuperAdmin)
121
+ async deleteEntity(
122
+ @Ctx() ctx: RequestContext,
123
+ @Args() args: { id: ID },
124
+ ): Promise<DeletionResponse> {
125
+ return this.templateService.delete(ctx, args.id);
126
+ }
127
+ }
@@ -0,0 +1,37 @@
1
+ import { Args, Mutation, Query, Resolver } from "@nestjs/graphql";
2
+ import { Permission } from "@deenruv/common/lib/generated-types";
3
+ import { ID } from "@deenruv/common/lib/shared-types";
4
+ import { Allow, Ctx, RequestContext, Transaction } from "@deenruv/core";
5
+
6
+ class TemplateService {
7
+ async exampleQueryHandler(ctx: RequestContext, id: ID) {
8
+ return true;
9
+ }
10
+ async exampleMutationHandler(ctx: RequestContext, id: ID) {
11
+ return true;
12
+ }
13
+ }
14
+
15
+ @Resolver()
16
+ export class SimpleAdminResolver {
17
+ constructor(private templateService: TemplateService) {}
18
+
19
+ @Query()
20
+ @Allow(Permission.SuperAdmin)
21
+ async exampleQuery(
22
+ @Ctx() ctx: RequestContext,
23
+ @Args() args: { id: ID },
24
+ ): Promise<boolean> {
25
+ return this.templateService.exampleQueryHandler(ctx, args.id);
26
+ }
27
+
28
+ @Mutation()
29
+ @Transaction()
30
+ @Allow(Permission.SuperAdmin)
31
+ async exampleMutation(
32
+ @Ctx() ctx: RequestContext,
33
+ @Args() args: { id: ID },
34
+ ): Promise<boolean> {
35
+ return this.templateService.exampleMutationHandler(ctx, args.id);
36
+ }
37
+ }
@@ -0,0 +1,8 @@
1
+ import { CliCommand, CliCommandReturnVal } from "../../../shared/cli-command";
2
+ import { DeenruvPluginRef } from "../../../shared/deenruv-plugin-ref";
3
+ export interface AddCodegenOptions {
4
+ plugin?: DeenruvPluginRef;
5
+ }
6
+ export declare const addCodegenCommand: CliCommand<{
7
+ plugin: DeenruvPluginRef;
8
+ }, CliCommandReturnVal>;
@@ -0,0 +1,113 @@
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.addCodegenCommand = void 0;
7
+ const prompts_1 = require("@clack/prompts");
8
+ const path_1 = __importDefault(require("path"));
9
+ const ts_morph_1 = require("ts-morph");
10
+ const cli_command_1 = require("../../../shared/cli-command");
11
+ const package_json_ref_1 = require("../../../shared/package-json-ref");
12
+ const shared_prompts_1 = require("../../../shared/shared-prompts");
13
+ const ast_utils_1 = require("../../../utilities/ast-utils");
14
+ const utils_1 = require("../../../utilities/utils");
15
+ const codegen_config_ref_1 = require("./codegen-config-ref");
16
+ exports.addCodegenCommand = new cli_command_1.CliCommand({
17
+ id: "add-codegen",
18
+ category: "Project: Codegen",
19
+ description: "Set up GraphQL code generation",
20
+ run: addCodegen,
21
+ });
22
+ async function addCodegen(options) {
23
+ const providedDeenruvPlugin = options === null || options === void 0 ? void 0 : options.plugin;
24
+ const { project } = await (0, shared_prompts_1.analyzeProject)({
25
+ providedDeenruvPlugin,
26
+ cancelledMessage: "Add codegen cancelled",
27
+ });
28
+ const plugins = providedDeenruvPlugin
29
+ ? [providedDeenruvPlugin]
30
+ : await (0, shared_prompts_1.selectMultiplePluginClasses)(project, "Add codegen cancelled");
31
+ const packageJson = new package_json_ref_1.PackageJson(project);
32
+ const installSpinner = (0, prompts_1.spinner)();
33
+ installSpinner.start(`Installing dependencies...`);
34
+ const packagesToInstall = [
35
+ {
36
+ pkg: "@graphql-codegen/cli",
37
+ isDevDependency: true,
38
+ },
39
+ {
40
+ pkg: "@graphql-codegen/typescript",
41
+ isDevDependency: true,
42
+ },
43
+ ];
44
+ if (plugins.some((p) => p.hasUiExtensions())) {
45
+ packagesToInstall.push({
46
+ pkg: "@graphql-codegen/client-preset",
47
+ isDevDependency: true,
48
+ });
49
+ }
50
+ const packageManager = packageJson.determinePackageManager();
51
+ const packageJsonFile = packageJson.locatePackageJsonWithDeenruvDependency();
52
+ prompts_1.log.info(`Detected package manager: ${packageManager}`);
53
+ if (!packageJsonFile) {
54
+ (0, prompts_1.cancel)(`Could not locate package.json file with a dependency on Deenruv.`);
55
+ process.exit(1);
56
+ }
57
+ prompts_1.log.info(`Detected package.json: ${packageJsonFile}`);
58
+ try {
59
+ await packageJson.installPackages(packagesToInstall);
60
+ }
61
+ catch (e) {
62
+ prompts_1.log.error(`Failed to install dependencies: ${e.message}.`);
63
+ }
64
+ installSpinner.stop("Dependencies installed");
65
+ const configSpinner = (0, prompts_1.spinner)();
66
+ configSpinner.start("Configuring codegen file...");
67
+ await (0, utils_1.pauseForPromptDisplay)();
68
+ const codegenFile = new codegen_config_ref_1.CodegenConfigRef(project, packageJson.getPackageRootDir());
69
+ const rootDir = project.getDirectory(".");
70
+ if (!rootDir) {
71
+ throw new Error("Could not find the root directory of the project");
72
+ }
73
+ for (const plugin of plugins) {
74
+ const relativePluginPath = (0, ast_utils_1.getRelativeImportPath)({
75
+ from: rootDir,
76
+ to: plugin.classDeclaration.getSourceFile(),
77
+ });
78
+ const generatedTypesPath = `${path_1.default.dirname(relativePluginPath)}/gql/generated.ts`;
79
+ codegenFile.addEntryToGeneratesObject({
80
+ name: `'${generatedTypesPath}'`,
81
+ kind: ts_morph_1.StructureKind.PropertyAssignment,
82
+ initializer: `{ plugins: ['typescript'] }`,
83
+ });
84
+ if (plugin.hasUiExtensions()) {
85
+ const uiExtensionsPath = `${path_1.default.dirname(relativePluginPath)}/ui`;
86
+ codegenFile.addEntryToGeneratesObject({
87
+ name: `'${uiExtensionsPath}/gql/'`,
88
+ kind: ts_morph_1.StructureKind.PropertyAssignment,
89
+ initializer: `{
90
+ preset: 'client',
91
+ documents: '${uiExtensionsPath}/**/*.ts',
92
+ presetConfig: {
93
+ fragmentMasking: false,
94
+ },
95
+ }`,
96
+ });
97
+ }
98
+ }
99
+ packageJson.addScript("codegen", "graphql-codegen --config codegen.ts");
100
+ configSpinner.stop("Configured codegen file");
101
+ await project.save();
102
+ const nextSteps = [
103
+ `You can run codegen by doing the following:`,
104
+ `1. Ensure your dev server is running`,
105
+ `2. Run "npm run codegen"`,
106
+ ];
107
+ (0, prompts_1.note)(nextSteps.join("\n"));
108
+ return {
109
+ project,
110
+ modifiedSourceFiles: [codegenFile.sourceFile],
111
+ };
112
+ }
113
+ //# sourceMappingURL=add-codegen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-codegen.js","sourceRoot":"","sources":["../../../../src/commands/add/codegen/add-codegen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Directory, ObjectLiteralExpression, Project, PropertyAssignmentStructure, SourceFile } from "ts-morph";
2
+ export declare class CodegenConfigRef {
3
+ private readonly project;
4
+ readonly sourceFile: SourceFile;
5
+ private configObject;
6
+ constructor(project: Project, rootDir: Directory);
7
+ addEntryToGeneratesObject(structure: PropertyAssignmentStructure): void;
8
+ getConfigObject(): ObjectLiteralExpression;
9
+ save(): Promise<void>;
10
+ }
@@ -0,0 +1,52 @@
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.CodegenConfigRef = void 0;
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const ts_morph_1 = require("ts-morph");
10
+ const ast_utils_1 = require("../../../utilities/ast-utils");
11
+ class CodegenConfigRef {
12
+ constructor(project, rootDir) {
13
+ this.project = project;
14
+ const codegenFilePath = path_1.default.join(rootDir.getPath(), "codegen.ts");
15
+ if (fs_extra_1.default.existsSync(codegenFilePath)) {
16
+ this.sourceFile = this.project.addSourceFileAtPath(codegenFilePath);
17
+ }
18
+ else {
19
+ this.sourceFile = (0, ast_utils_1.createFile)(this.project, path_1.default.join(__dirname, "templates/codegen.template.ts"), path_1.default.join(rootDir.getPath(), "codegen.ts"));
20
+ }
21
+ }
22
+ addEntryToGeneratesObject(structure) {
23
+ var _a;
24
+ const generatesProp = (_a = this.getConfigObject()
25
+ .getProperty("generates")) === null || _a === void 0 ? void 0 : _a.getFirstChildByKind(ts_morph_1.SyntaxKind.ObjectLiteralExpression);
26
+ if (!generatesProp) {
27
+ throw new Error("Could not find the generates property in the template codegen file");
28
+ }
29
+ if (generatesProp.getProperty(structure.name)) {
30
+ return;
31
+ }
32
+ generatesProp.addProperty(structure).formatText();
33
+ }
34
+ getConfigObject() {
35
+ var _a;
36
+ if (this.configObject) {
37
+ return this.configObject;
38
+ }
39
+ const codegenConfig = (_a = this.sourceFile
40
+ .getVariableDeclaration("config")) === null || _a === void 0 ? void 0 : _a.getChildrenOfKind(ts_morph_1.SyntaxKind.ObjectLiteralExpression)[0];
41
+ if (!codegenConfig) {
42
+ throw new Error("Could not find the config variable in the template codegen file");
43
+ }
44
+ this.configObject = codegenConfig;
45
+ return this.configObject;
46
+ }
47
+ save() {
48
+ return this.project.save();
49
+ }
50
+ }
51
+ exports.CodegenConfigRef = CodegenConfigRef;
52
+ //# sourceMappingURL=codegen-config-ref.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen-config-ref.js","sourceRoot":"","sources":["../../../../src/commands/add/codegen/codegen-config-ref.ts"],"names":[],"mappings":";;;;;;AAAA,wDAA0B;AAC1B,gDAAwB;AACxB,uCAQkB;AAElB,4DAA6E;AAE7E,MAAa,gBAAgB;IAG3B,YACmB,OAAgB,EACjC,OAAkB;QADD,YAAO,GAAP,OAAO,CAAS;QAGjC,MAAM,eAAe,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;QACnE,IAAI,kBAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,GAAG,IAAA,sBAAU,EAC1B,IAAI,CAAC,OAAO,EACZ,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,+BAA+B,CAAC,EACrD,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAC3C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,yBAAyB,CAAC,SAAsC;;QAC9D,MAAM,aAAa,GAAG,MAAA,IAAI,CAAC,eAAe,EAAE;aACzC,WAAW,CAAC,WAAW,CAAC,0CACvB,mBAAmB,CAAC,qBAAU,CAAC,uBAAuB,CAAC,CAAC;QAC5D,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAC;QACJ,CAAC;QACD,IAAI,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,OAAO;QACT,CAAC;QACD,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,CAAC;IACpD,CAAC;IAED,eAAe;;QACb,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B,CAAC;QACD,MAAM,aAAa,GAAG,MAAA,IAAI,CAAC,UAAU;aAClC,sBAAsB,CAAC,QAAQ,CAAC,0CAC/B,iBAAiB,CAAC,qBAAU,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC;QAClC,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC;CACF;AArDD,4CAqDC"}
@@ -0,0 +1,17 @@
1
+ import type { CodegenConfig } from "@graphql-codegen/cli";
2
+
3
+ const config: CodegenConfig = {
4
+ overwrite: true,
5
+ // This assumes your server is running on the standard port
6
+ // and with the default admin API path. Adjust accordingly.
7
+ schema: "http://localhost:3000/admin-api",
8
+ config: {
9
+ // This tells codegen that the `Money` scalar is a number
10
+ scalars: { Money: "number" },
11
+ // This ensures generated enums do not conflict with the built-in types.
12
+ namingConvention: { enumValues: "keep" },
13
+ },
14
+ generates: {},
15
+ };
16
+
17
+ export default config;
@@ -0,0 +1,17 @@
1
+ import { CliCommand, CliCommandReturnVal } from "../../../shared/cli-command";
2
+ import { EntityRef } from "../../../shared/entity-ref";
3
+ import { DeenruvPluginRef } from "../../../shared/deenruv-plugin-ref";
4
+ export interface AddEntityOptions {
5
+ plugin?: DeenruvPluginRef;
6
+ className: string;
7
+ fileName: string;
8
+ translationFileName: string;
9
+ features: {
10
+ customFields: boolean;
11
+ translatable: boolean;
12
+ };
13
+ }
14
+ export declare const addEntityCommand: CliCommand<Record<string, any>, CliCommandReturnVal<{
15
+ entityRef: EntityRef;
16
+ }>>;
17
+ export declare function getCustomEntityName(_cancelledMessage: string): Promise<string>;
@@ -0,0 +1,160 @@
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.getCustomEntityName = exports.addEntityCommand = void 0;
7
+ const prompts_1 = require("@clack/prompts");
8
+ const change_case_1 = require("change-case");
9
+ const path_1 = __importDefault(require("path"));
10
+ const constants_1 = require("../../../constants");
11
+ const cli_command_1 = require("../../../shared/cli-command");
12
+ const entity_ref_1 = require("../../../shared/entity-ref");
13
+ const shared_prompts_1 = require("../../../shared/shared-prompts");
14
+ const ast_utils_1 = require("../../../utilities/ast-utils");
15
+ const utils_1 = require("../../../utilities/utils");
16
+ const add_entity_to_plugin_1 = require("./codemods/add-entity-to-plugin/add-entity-to-plugin");
17
+ const cancelledMessage = "Add entity cancelled";
18
+ exports.addEntityCommand = new cli_command_1.CliCommand({
19
+ id: "add-entity",
20
+ category: "Plugin: Entity",
21
+ description: "Add a new entity to a plugin",
22
+ run: (options) => addEntity(options),
23
+ });
24
+ async function addEntity(options) {
25
+ var _a;
26
+ const providedDeenruvPlugin = options === null || options === void 0 ? void 0 : options.plugin;
27
+ const { project } = await (0, shared_prompts_1.analyzeProject)({
28
+ providedDeenruvPlugin,
29
+ cancelledMessage,
30
+ });
31
+ const deenruvPlugin = providedDeenruvPlugin !== null && providedDeenruvPlugin !== void 0 ? providedDeenruvPlugin : (await (0, shared_prompts_1.selectPlugin)(project, cancelledMessage));
32
+ const modifiedSourceFiles = [];
33
+ const customEntityName = (_a = options === null || options === void 0 ? void 0 : options.className) !== null && _a !== void 0 ? _a : (await getCustomEntityName(cancelledMessage));
34
+ const context = {
35
+ className: customEntityName,
36
+ fileName: (0, change_case_1.paramCase)(customEntityName) + ".entity",
37
+ translationFileName: (0, change_case_1.paramCase)(customEntityName) + "-translation.entity",
38
+ features: await getFeatures(options),
39
+ };
40
+ const entitySpinner = (0, prompts_1.spinner)();
41
+ entitySpinner.start("Creating entity...");
42
+ await (0, utils_1.pauseForPromptDisplay)();
43
+ const { entityClass, translationClass } = createEntity(deenruvPlugin, context);
44
+ (0, add_entity_to_plugin_1.addEntityToPlugin)(deenruvPlugin, entityClass);
45
+ modifiedSourceFiles.push(entityClass.getSourceFile());
46
+ if (context.features.translatable) {
47
+ (0, add_entity_to_plugin_1.addEntityToPlugin)(deenruvPlugin, translationClass);
48
+ modifiedSourceFiles.push(translationClass.getSourceFile());
49
+ }
50
+ entitySpinner.stop("Entity created");
51
+ await project.save();
52
+ return {
53
+ project,
54
+ modifiedSourceFiles,
55
+ entityRef: new entity_ref_1.EntityRef(entityClass),
56
+ };
57
+ }
58
+ async function getFeatures(options) {
59
+ if (options === null || options === void 0 ? void 0 : options.features) {
60
+ return options === null || options === void 0 ? void 0 : options.features;
61
+ }
62
+ const features = await (0, prompts_1.multiselect)({
63
+ message: "Entity features (use ↑, ↓, space to select)",
64
+ required: false,
65
+ initialValues: ["customFields"],
66
+ options: [
67
+ {
68
+ label: "Custom fields",
69
+ value: "customFields",
70
+ hint: "Adds support for custom fields on this entity",
71
+ },
72
+ {
73
+ label: "Translatable",
74
+ value: "translatable",
75
+ hint: "Adds support for localized properties on this entity",
76
+ },
77
+ ],
78
+ });
79
+ if ((0, prompts_1.isCancel)(features)) {
80
+ (0, prompts_1.cancel)(cancelledMessage);
81
+ process.exit(0);
82
+ }
83
+ return {
84
+ customFields: features.includes("customFields"),
85
+ translatable: features.includes("translatable"),
86
+ };
87
+ }
88
+ function createEntity(plugin, options) {
89
+ var _a, _b, _c, _d;
90
+ const entitiesDir = path_1.default.join(plugin.getPluginDir().getPath(), "entities");
91
+ const entityFile = (0, ast_utils_1.createFile)(plugin.getSourceFile().getProject(), path_1.default.join(__dirname, "templates/entity.template.ts"), path_1.default.join(entitiesDir, `${options.fileName}.ts`));
92
+ const translationFile = (0, ast_utils_1.createFile)(plugin.getSourceFile().getProject(), path_1.default.join(__dirname, "templates/entity-translation.template.ts"), path_1.default.join(entitiesDir, `${options.translationFileName}.ts`));
93
+ const entityClass = entityFile.getClass("ScaffoldEntity");
94
+ const customFieldsClass = entityFile.getClass("ScaffoldEntityCustomFields");
95
+ const translationClass = translationFile.getClass("ScaffoldTranslation");
96
+ const translationCustomFieldsClass = translationFile.getClass("ScaffoldEntityCustomFieldsTranslation");
97
+ if (!options.features.customFields) {
98
+ customFieldsClass === null || customFieldsClass === void 0 ? void 0 : customFieldsClass.remove();
99
+ translationCustomFieldsClass === null || translationCustomFieldsClass === void 0 ? void 0 : translationCustomFieldsClass.remove();
100
+ removeCustomFieldsFromClass(entityClass);
101
+ removeCustomFieldsFromClass(translationClass);
102
+ }
103
+ if (!options.features.translatable) {
104
+ translationClass === null || translationClass === void 0 ? void 0 : translationClass.remove();
105
+ (_a = entityClass === null || entityClass === void 0 ? void 0 : entityClass.getProperty("localizedName")) === null || _a === void 0 ? void 0 : _a.remove();
106
+ (_b = entityClass === null || entityClass === void 0 ? void 0 : entityClass.getProperty("translations")) === null || _b === void 0 ? void 0 : _b.remove();
107
+ removeImplementsFromClass("Translatable", entityClass);
108
+ translationFile.delete();
109
+ }
110
+ else {
111
+ (_c = entityFile
112
+ .getImportDeclaration("./entity-translation.template")) === null || _c === void 0 ? void 0 : _c.setModuleSpecifier(`./${options.translationFileName}`);
113
+ (_d = translationFile
114
+ .getImportDeclaration("./entity.template")) === null || _d === void 0 ? void 0 : _d.setModuleSpecifier(`./${options.fileName}`);
115
+ }
116
+ entityClass === null || entityClass === void 0 ? void 0 : entityClass.rename(options.className);
117
+ if (!(customFieldsClass === null || customFieldsClass === void 0 ? void 0 : customFieldsClass.wasForgotten())) {
118
+ customFieldsClass === null || customFieldsClass === void 0 ? void 0 : customFieldsClass.rename(`${options.className}CustomFields`);
119
+ }
120
+ if (!(translationClass === null || translationClass === void 0 ? void 0 : translationClass.wasForgotten())) {
121
+ translationClass === null || translationClass === void 0 ? void 0 : translationClass.rename(`${options.className}Translation`);
122
+ }
123
+ if (!(translationCustomFieldsClass === null || translationCustomFieldsClass === void 0 ? void 0 : translationCustomFieldsClass.wasForgotten())) {
124
+ translationCustomFieldsClass === null || translationCustomFieldsClass === void 0 ? void 0 : translationCustomFieldsClass.rename(`${options.className}CustomFieldsTranslation`);
125
+ }
126
+ return { entityClass: entityClass, translationClass: translationClass };
127
+ }
128
+ function removeCustomFieldsFromClass(entityClass) {
129
+ var _a;
130
+ (_a = entityClass === null || entityClass === void 0 ? void 0 : entityClass.getProperty("customFields")) === null || _a === void 0 ? void 0 : _a.remove();
131
+ removeImplementsFromClass("HasCustomFields", entityClass);
132
+ }
133
+ function removeImplementsFromClass(implementsName, entityClass) {
134
+ var _a;
135
+ const index = (_a = entityClass === null || entityClass === void 0 ? void 0 : entityClass.getImplements().findIndex((i) => i.getText() === implementsName)) !== null && _a !== void 0 ? _a : -1;
136
+ if (index > -1) {
137
+ entityClass === null || entityClass === void 0 ? void 0 : entityClass.removeImplements(index);
138
+ }
139
+ }
140
+ async function getCustomEntityName(_cancelledMessage) {
141
+ const entityName = await (0, prompts_1.text)({
142
+ message: "What is the name of the custom entity?",
143
+ initialValue: "",
144
+ validate: (input) => {
145
+ if (!input) {
146
+ return "The custom entity name cannot be empty";
147
+ }
148
+ if (!constants_1.pascalCaseRegex.test(input)) {
149
+ return 'The custom entity name must be in PascalCase, e.g. "ProductReview"';
150
+ }
151
+ },
152
+ });
153
+ if ((0, prompts_1.isCancel)(entityName)) {
154
+ (0, prompts_1.cancel)(_cancelledMessage);
155
+ process.exit(0);
156
+ }
157
+ return (0, change_case_1.pascalCase)(entityName);
158
+ }
159
+ exports.getCustomEntityName = getCustomEntityName;
160
+ //# sourceMappingURL=add-entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-entity.js","sourceRoot":"","sources":["../../../../src/commands/add/entity/add-entity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ClassDeclaration } from "ts-morph";
2
+ import { DeenruvPluginRef } from "../../../../../shared/deenruv-plugin-ref";
3
+ export declare function addEntityToPlugin(plugin: DeenruvPluginRef, entityClass: ClassDeclaration): void;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.addEntityToPlugin = void 0;
4
+ const ast_utils_1 = require("../../../../../utilities/ast-utils");
5
+ function addEntityToPlugin(plugin, entityClass) {
6
+ if (!entityClass) {
7
+ throw new Error("Could not find entity class");
8
+ }
9
+ const entityClassName = entityClass.getName();
10
+ plugin.addEntity(entityClassName);
11
+ (0, ast_utils_1.addImportsToFile)(plugin.classDeclaration.getSourceFile(), {
12
+ moduleSpecifier: entityClass.getSourceFile(),
13
+ namedImports: [entityClassName],
14
+ });
15
+ }
16
+ exports.addEntityToPlugin = addEntityToPlugin;
17
+ //# sourceMappingURL=add-entity-to-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-entity-to-plugin.js","sourceRoot":"","sources":["../../../../../../src/commands/add/entity/codemods/add-entity-to-plugin/add-entity-to-plugin.ts"],"names":[],"mappings":";;;AAGA,kEAAsE;AAEtE,SAAgB,iBAAiB,CAC/B,MAAwB,EACxB,WAA6B;IAE7B,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,eAAe,GAAG,WAAW,CAAC,OAAO,EAAY,CAAC;IACxD,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAElC,IAAA,4BAAgB,EAAC,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,EAAE;QACxD,eAAe,EAAE,WAAW,CAAC,aAAa,EAAE;QAC5C,YAAY,EAAE,CAAC,eAAe,CAAC;KAChC,CAAC,CAAC;AACL,CAAC;AAdD,8CAcC"}
@@ -0,0 +1,31 @@
1
+ import { LanguageCode } from "@deenruv/common/lib/generated-types";
2
+ import { DeepPartial } from "@deenruv/common/lib/shared-types";
3
+ import { HasCustomFields, Translation, DeenruvEntity } from "@deenruv/core";
4
+ import { Column, Entity, Index, ManyToOne } from "typeorm";
5
+
6
+ import { ScaffoldEntity } from "./entity.template";
7
+
8
+ export class ScaffoldEntityCustomFieldsTranslation {}
9
+
10
+ @Entity()
11
+ export class ScaffoldTranslation
12
+ extends DeenruvEntity
13
+ implements Translation<ScaffoldEntity>, HasCustomFields
14
+ {
15
+ constructor(input?: DeepPartial<Translation<ScaffoldTranslation>>) {
16
+ super(input);
17
+ }
18
+
19
+ @Column("varchar") languageCode: LanguageCode;
20
+
21
+ @Column() localizedName: string;
22
+
23
+ @Index()
24
+ @ManyToOne((type) => ScaffoldEntity, (base) => base.translations, {
25
+ onDelete: "CASCADE",
26
+ })
27
+ base: ScaffoldEntity;
28
+
29
+ @Column((type) => ScaffoldEntityCustomFieldsTranslation)
30
+ customFields: ScaffoldEntityCustomFieldsTranslation;
31
+ }