@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,317 @@
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.addServiceCommand = 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 ts_morph_1 = require("ts-morph");
11
+ const constants_1 = require("../../../constants");
12
+ const cli_command_1 = require("../../../shared/cli-command");
13
+ const service_ref_1 = require("../../../shared/service-ref");
14
+ const shared_prompts_1 = require("../../../shared/shared-prompts");
15
+ const ast_utils_1 = require("../../../utilities/ast-utils");
16
+ const utils_1 = require("../../../utilities/utils");
17
+ const add_entity_1 = require("../entity/add-entity");
18
+ const cancelledMessage = "Add service cancelled";
19
+ exports.addServiceCommand = new cli_command_1.CliCommand({
20
+ id: "add-service",
21
+ category: "Plugin: Service",
22
+ description: "Add a new service to a plugin",
23
+ run: (options) => addService(options),
24
+ });
25
+ async function addService(providedOptions) {
26
+ var _a, _b;
27
+ const providedDeenruvPlugin = providedOptions === null || providedOptions === void 0 ? void 0 : providedOptions.plugin;
28
+ const { project } = await (0, shared_prompts_1.analyzeProject)({
29
+ providedDeenruvPlugin,
30
+ cancelledMessage,
31
+ });
32
+ const deenruvPlugin = providedDeenruvPlugin !== null && providedDeenruvPlugin !== void 0 ? providedDeenruvPlugin : (await (0, shared_prompts_1.selectPlugin)(project, cancelledMessage));
33
+ const modifiedSourceFiles = [];
34
+ const type = (_a = providedOptions === null || providedOptions === void 0 ? void 0 : providedOptions.type) !== null && _a !== void 0 ? _a : (await (0, prompts_1.select)({
35
+ message: "What type of service would you like to add?",
36
+ options: [
37
+ { value: "basic", label: "Basic empty service" },
38
+ {
39
+ value: "entity",
40
+ label: "Service to perform CRUD operations on an entity",
41
+ },
42
+ ],
43
+ maxItems: 10,
44
+ }));
45
+ if ((0, prompts_1.isCancel)(type)) {
46
+ (0, prompts_1.cancel)("Cancelled");
47
+ process.exit(0);
48
+ }
49
+ const options = {
50
+ type: type,
51
+ serviceName: "MyService",
52
+ };
53
+ if (type === "entity") {
54
+ let entityRef;
55
+ try {
56
+ entityRef = await (0, shared_prompts_1.selectEntity)(deenruvPlugin);
57
+ }
58
+ catch (e) {
59
+ if (e.message === constants_1.Messages.NoEntitiesFound) {
60
+ prompts_1.log.info(`No entities found in plugin ${deenruvPlugin.name}. Let's create one first.`);
61
+ const result = await add_entity_1.addEntityCommand.run({ plugin: deenruvPlugin });
62
+ entityRef = result.entityRef;
63
+ modifiedSourceFiles.push(...result.modifiedSourceFiles);
64
+ }
65
+ else {
66
+ throw e;
67
+ }
68
+ }
69
+ options.entityRef = entityRef;
70
+ options.serviceName = `${entityRef.name}Service`;
71
+ }
72
+ const serviceSpinner = (0, prompts_1.spinner)();
73
+ let serviceSourceFile;
74
+ let serviceClassDeclaration;
75
+ if (options.type === "basic") {
76
+ const name = await (0, prompts_1.text)({
77
+ message: "What is the name of the new service?",
78
+ initialValue: "MyService",
79
+ validate: (input) => {
80
+ if (!input) {
81
+ return "The service name cannot be empty";
82
+ }
83
+ if (!constants_1.pascalCaseRegex.test(input)) {
84
+ return 'The service name must be in PascalCase, e.g. "MyService"';
85
+ }
86
+ },
87
+ });
88
+ if ((0, prompts_1.isCancel)(name)) {
89
+ (0, prompts_1.cancel)(cancelledMessage);
90
+ process.exit(0);
91
+ }
92
+ options.serviceName = name;
93
+ serviceSpinner.start(`Creating ${options.serviceName}...`);
94
+ const serviceSourceFilePath = getServiceFilePath(deenruvPlugin, options.serviceName);
95
+ await (0, utils_1.pauseForPromptDisplay)();
96
+ serviceSourceFile = (0, ast_utils_1.createFile)(project, path_1.default.join(__dirname, "templates/basic-service.template.ts"), serviceSourceFilePath);
97
+ serviceClassDeclaration = serviceSourceFile
98
+ .getClass("BasicServiceTemplate")
99
+ .rename(options.serviceName);
100
+ }
101
+ else {
102
+ serviceSpinner.start(`Creating ${options.serviceName}...`);
103
+ await (0, utils_1.pauseForPromptDisplay)();
104
+ const serviceSourceFilePath = getServiceFilePath(deenruvPlugin, options.serviceName);
105
+ serviceSourceFile = (0, ast_utils_1.createFile)(project, path_1.default.join(__dirname, "templates/entity-service.template.ts"), serviceSourceFilePath);
106
+ serviceClassDeclaration = serviceSourceFile
107
+ .getClass("EntityServiceTemplate")
108
+ .rename(options.serviceName);
109
+ const entityRef = options.entityRef;
110
+ if (!entityRef) {
111
+ throw new Error("Entity class not found");
112
+ }
113
+ const templateEntityClass = serviceSourceFile.getClass("TemplateEntity");
114
+ if (templateEntityClass) {
115
+ templateEntityClass.rename(entityRef.name);
116
+ templateEntityClass.remove();
117
+ }
118
+ (0, ast_utils_1.addImportsToFile)(serviceClassDeclaration.getSourceFile(), {
119
+ moduleSpecifier: entityRef.classDeclaration.getSourceFile(),
120
+ namedImports: [entityRef.name],
121
+ });
122
+ const templateTranslationEntityClass = serviceSourceFile.getClass("TemplateEntityTranslation");
123
+ if (entityRef.isTranslatable()) {
124
+ const translationEntityClass = entityRef.getTranslationClass();
125
+ if (translationEntityClass && templateTranslationEntityClass) {
126
+ templateTranslationEntityClass.rename(translationEntityClass === null || translationEntityClass === void 0 ? void 0 : translationEntityClass.getName());
127
+ templateTranslationEntityClass.remove();
128
+ (0, ast_utils_1.addImportsToFile)(serviceClassDeclaration.getSourceFile(), {
129
+ moduleSpecifier: translationEntityClass.getSourceFile(),
130
+ namedImports: [translationEntityClass.getName()],
131
+ });
132
+ }
133
+ }
134
+ else {
135
+ templateTranslationEntityClass === null || templateTranslationEntityClass === void 0 ? void 0 : templateTranslationEntityClass.remove();
136
+ }
137
+ (0, ast_utils_1.customizeCreateUpdateInputInterfaces)(serviceSourceFile, entityRef);
138
+ customizeFindOneMethod(serviceClassDeclaration, entityRef);
139
+ customizeFindAllMethod(serviceClassDeclaration, entityRef);
140
+ customizeCreateMethod(serviceClassDeclaration, entityRef);
141
+ customizeUpdateMethod(serviceClassDeclaration, entityRef);
142
+ removedUnusedConstructorArgs(serviceClassDeclaration, entityRef);
143
+ }
144
+ const pluginOptions = deenruvPlugin.getPluginOptions();
145
+ if (pluginOptions) {
146
+ (0, ast_utils_1.addImportsToFile)(serviceSourceFile, {
147
+ moduleSpecifier: pluginOptions.constantDeclaration.getSourceFile(),
148
+ namedImports: [pluginOptions.constantDeclaration.getName()],
149
+ });
150
+ (0, ast_utils_1.addImportsToFile)(serviceSourceFile, {
151
+ moduleSpecifier: pluginOptions.typeDeclaration.getSourceFile(),
152
+ namedImports: [pluginOptions.typeDeclaration.getName()],
153
+ });
154
+ (0, ast_utils_1.addImportsToFile)(serviceSourceFile, {
155
+ moduleSpecifier: "@nestjs/common",
156
+ namedImports: ["Inject"],
157
+ });
158
+ (_b = serviceClassDeclaration
159
+ .getConstructors()[0]) === null || _b === void 0 ? void 0 : _b.addParameter({
160
+ scope: ts_morph_1.Scope.Private,
161
+ name: "options",
162
+ type: pluginOptions.typeDeclaration.getName(),
163
+ decorators: [
164
+ {
165
+ name: "Inject",
166
+ arguments: [pluginOptions.constantDeclaration.getName()],
167
+ },
168
+ ],
169
+ }).formatText();
170
+ }
171
+ modifiedSourceFiles.push(serviceSourceFile);
172
+ serviceSpinner.message(`Registering service with plugin...`);
173
+ deenruvPlugin.addProvider(options.serviceName);
174
+ (0, ast_utils_1.addImportsToFile)(deenruvPlugin.classDeclaration.getSourceFile(), {
175
+ moduleSpecifier: serviceSourceFile,
176
+ namedImports: [options.serviceName],
177
+ });
178
+ await project.save();
179
+ serviceSpinner.stop(`${options.serviceName} created`);
180
+ return {
181
+ project,
182
+ modifiedSourceFiles,
183
+ serviceRef: new service_ref_1.ServiceRef(serviceClassDeclaration),
184
+ };
185
+ }
186
+ function getServiceFilePath(plugin, serviceName) {
187
+ const serviceFileName = (0, change_case_1.paramCase)(serviceName).replace(/-service$/, ".service");
188
+ return path_1.default.join(plugin.getPluginDir().getPath(), "services", `${serviceFileName}.ts`);
189
+ }
190
+ function customizeFindOneMethod(serviceClassDeclaration, entityRef) {
191
+ const findOneMethod = serviceClassDeclaration.getMethod("findOne");
192
+ findOneMethod
193
+ .setBodyText((writer) => {
194
+ writer.write(` return this.connection
195
+ .getRepository(ctx, ${entityRef.name})
196
+ .findOne({
197
+ where: { id },
198
+ relations,
199
+ })`);
200
+ if (entityRef.isTranslatable()) {
201
+ writer.write(`.then(entity => entity && this.translator.translate(entity, ctx));`);
202
+ }
203
+ else {
204
+ writer.write(`;`);
205
+ }
206
+ })
207
+ .formatText();
208
+ if (!entityRef.isTranslatable()) {
209
+ findOneMethod.setReturnType(`Promise<${entityRef.name} | null>`);
210
+ }
211
+ }
212
+ function customizeFindAllMethod(serviceClassDeclaration, entityRef) {
213
+ const findAllMethod = serviceClassDeclaration.getMethod("findAll");
214
+ findAllMethod
215
+ .setBodyText((writer) => {
216
+ writer.writeLine(`return this.listQueryBuilder`);
217
+ writer.write(`.build(${entityRef.name}, options,`).block(() => {
218
+ writer.writeLine("relations,");
219
+ writer.writeLine("ctx,");
220
+ });
221
+ writer.write(")");
222
+ writer.write(".getManyAndCount()");
223
+ writer.write(".then(([items, totalItems]) =>").block(() => {
224
+ writer.write("return").block(() => {
225
+ if (entityRef.isTranslatable()) {
226
+ writer.writeLine("items: items.map(item => this.translator.translate(item, ctx)),");
227
+ }
228
+ else {
229
+ writer.writeLine("items,");
230
+ }
231
+ writer.writeLine("totalItems,");
232
+ });
233
+ });
234
+ writer.write(");");
235
+ })
236
+ .formatText();
237
+ if (!entityRef.isTranslatable()) {
238
+ findAllMethod.setReturnType(`Promise<PaginatedList<${entityRef.name}>>`);
239
+ }
240
+ }
241
+ function customizeCreateMethod(serviceClassDeclaration, entityRef) {
242
+ const createMethod = serviceClassDeclaration.getMethod("create");
243
+ createMethod
244
+ .setBodyText((writer) => {
245
+ var _a;
246
+ if (entityRef.isTranslatable()) {
247
+ writer.write(`const newEntity = await this.translatableSaver.create({
248
+ ctx,
249
+ input,
250
+ entityType: ${entityRef.name},
251
+ translationType: ${(_a = entityRef.getTranslationClass()) === null || _a === void 0 ? void 0 : _a.getName()},
252
+ beforeSave: async f => {
253
+ // Any pre-save logic can go here
254
+ },
255
+ });`);
256
+ }
257
+ else {
258
+ writer.writeLine(`const newEntity = await this.connection.getRepository(ctx, ${entityRef.name}).save(input);`);
259
+ }
260
+ if (entityRef.hasCustomFields()) {
261
+ writer.writeLine(`await this.customFieldRelationService.updateRelations(ctx, ${entityRef.name}, input, newEntity);`);
262
+ }
263
+ writer.writeLine(`return assertFound(this.findOne(ctx, newEntity.id));`);
264
+ })
265
+ .formatText();
266
+ if (!entityRef.isTranslatable()) {
267
+ createMethod.setReturnType(`Promise<${entityRef.name}>`);
268
+ }
269
+ }
270
+ function customizeUpdateMethod(serviceClassDeclaration, entityRef) {
271
+ const updateMethod = serviceClassDeclaration.getMethod("update");
272
+ updateMethod
273
+ .setBodyText((writer) => {
274
+ var _a;
275
+ if (entityRef.isTranslatable()) {
276
+ writer.write(`const updatedEntity = await this.translatableSaver.update({
277
+ ctx,
278
+ input,
279
+ entityType: ${entityRef.name},
280
+ translationType: ${(_a = entityRef.getTranslationClass()) === null || _a === void 0 ? void 0 : _a.getName()},
281
+ beforeSave: async f => {
282
+ // Any pre-save logic can go here
283
+ },
284
+ });`);
285
+ }
286
+ else {
287
+ writer.writeLine(`const entity = await this.connection.getEntityOrThrow(ctx, ${entityRef.name}, input.id);`);
288
+ writer.writeLine(`const updatedEntity = patchEntity(entity, input);`);
289
+ writer.writeLine(`await this.connection.getRepository(ctx, ${entityRef.name}).save(updatedEntity, { reload: false });`);
290
+ }
291
+ if (entityRef.hasCustomFields()) {
292
+ writer.writeLine(`await this.customFieldRelationService.updateRelations(ctx, ${entityRef.name}, input, updatedEntity);`);
293
+ }
294
+ writer.writeLine(`return assertFound(this.findOne(ctx, updatedEntity.id));`);
295
+ })
296
+ .formatText();
297
+ if (!entityRef.isTranslatable()) {
298
+ updateMethod.setReturnType(`Promise<${entityRef.name}>`);
299
+ }
300
+ }
301
+ function removedUnusedConstructorArgs(serviceClassDeclaration, entityRef) {
302
+ const isTranslatable = entityRef.isTranslatable();
303
+ const hasCustomFields = entityRef.hasCustomFields();
304
+ serviceClassDeclaration.getConstructors().forEach((constructor) => {
305
+ constructor.getParameters().forEach((param) => {
306
+ const paramName = param.getName();
307
+ if ((paramName === "translatableSaver" || paramName === "translator") &&
308
+ !isTranslatable) {
309
+ param.remove();
310
+ }
311
+ if (paramName === "customFieldRelationService" && !hasCustomFields) {
312
+ param.remove();
313
+ }
314
+ });
315
+ });
316
+ }
317
+ //# sourceMappingURL=add-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-service.js","sourceRoot":"","sources":["../../../../src/commands/add/service/add-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { Injectable } from "@nestjs/common";
2
+ import {
3
+ ID,
4
+ Product,
5
+ RequestContext,
6
+ TransactionalConnection,
7
+ } from "@deenruv/core";
8
+
9
+ @Injectable()
10
+ export class BasicServiceTemplate {
11
+ constructor(private connection: TransactionalConnection) {}
12
+
13
+ async exampleMethod(ctx: RequestContext, id: ID) {
14
+ // Add your method logic here
15
+ const result = await this.connection
16
+ .getRepository(ctx, Product)
17
+ .findOne({ where: { id } });
18
+ return result;
19
+ }
20
+ }
@@ -0,0 +1,182 @@
1
+ import { Injectable } from "@nestjs/common";
2
+ import {
3
+ DeletionResponse,
4
+ DeletionResult,
5
+ LanguageCode,
6
+ } from "@deenruv/common/lib/generated-types";
7
+ import {
8
+ CustomFieldsObject,
9
+ ID,
10
+ PaginatedList,
11
+ } from "@deenruv/common/lib/shared-types";
12
+ import {
13
+ assertFound,
14
+ CustomFieldRelationService,
15
+ HasCustomFields,
16
+ ListQueryBuilder,
17
+ ListQueryOptions,
18
+ RelationPaths,
19
+ RequestContext,
20
+ TransactionalConnection,
21
+ Translatable,
22
+ TranslatableSaver,
23
+ Translated,
24
+ Translation,
25
+ TranslationInput,
26
+ TranslatorService,
27
+ DeenruvEntity,
28
+ patchEntity,
29
+ } from "@deenruv/core";
30
+
31
+ // These can be replaced by generated types if you set up code generation
32
+ interface CreateEntityInput {
33
+ // Define the input fields here
34
+ customFields?: CustomFieldsObject;
35
+ translations: Array<TranslationInput<TemplateEntity>>;
36
+ }
37
+ interface UpdateEntityInput {
38
+ id: ID;
39
+ // Define the input fields here
40
+ customFields?: CustomFieldsObject;
41
+ translations: Array<TranslationInput<TemplateEntity>>;
42
+ }
43
+
44
+ class TemplateEntity
45
+ extends DeenruvEntity
46
+ implements Translatable, HasCustomFields
47
+ {
48
+ constructor() {
49
+ super();
50
+ }
51
+
52
+ customFields: CustomFieldsObject;
53
+
54
+ translations: Array<Translation<TemplateEntity>>;
55
+ }
56
+
57
+ class TemplateEntityTranslation
58
+ extends DeenruvEntity
59
+ implements Translation<TemplateEntity>
60
+ {
61
+ constructor() {
62
+ super();
63
+ }
64
+
65
+ id: ID;
66
+ languageCode: LanguageCode;
67
+ base: TemplateEntity;
68
+ customFields: CustomFieldsObject;
69
+ }
70
+
71
+ @Injectable()
72
+ export class EntityServiceTemplate {
73
+ constructor(
74
+ private connection: TransactionalConnection,
75
+ private translatableSaver: TranslatableSaver,
76
+ private listQueryBuilder: ListQueryBuilder,
77
+ private customFieldRelationService: CustomFieldRelationService,
78
+ private translator: TranslatorService,
79
+ ) {}
80
+
81
+ findAll(
82
+ ctx: RequestContext,
83
+ options?: ListQueryOptions<TemplateEntity>,
84
+ relations?: RelationPaths<TemplateEntity>,
85
+ ): Promise<PaginatedList<Translated<TemplateEntity>>> {
86
+ return this.listQueryBuilder
87
+ .build(TemplateEntity, options, {
88
+ relations,
89
+ ctx,
90
+ })
91
+ .getManyAndCount()
92
+ .then(([_items, totalItems]) => {
93
+ const items = _items.map((item) =>
94
+ this.translator.translate(item, ctx),
95
+ );
96
+ return {
97
+ items,
98
+ totalItems,
99
+ };
100
+ });
101
+ }
102
+
103
+ findOne(
104
+ ctx: RequestContext,
105
+ id: ID,
106
+ relations?: RelationPaths<TemplateEntity>,
107
+ ): Promise<Translated<TemplateEntity> | null> {
108
+ return this.connection
109
+ .getRepository(ctx, TemplateEntity)
110
+ .findOne({
111
+ where: { id },
112
+ relations,
113
+ })
114
+ .then((entity) => entity && this.translator.translate(entity, ctx));
115
+ }
116
+
117
+ async create(
118
+ ctx: RequestContext,
119
+ input: CreateEntityInput,
120
+ ): Promise<Translated<TemplateEntity>> {
121
+ const newEntity = await this.translatableSaver.create({
122
+ ctx,
123
+ input,
124
+ entityType: TemplateEntity,
125
+ translationType: TemplateEntityTranslation,
126
+ beforeSave: async (f) => {
127
+ // Any pre-save logic can go here
128
+ },
129
+ });
130
+ // Ensure any custom field relations get saved
131
+ await this.customFieldRelationService.updateRelations(
132
+ ctx,
133
+ TemplateEntity,
134
+ input,
135
+ newEntity,
136
+ );
137
+ return assertFound(this.findOne(ctx, newEntity.id));
138
+ }
139
+
140
+ async update(
141
+ ctx: RequestContext,
142
+ input: UpdateEntityInput,
143
+ ): Promise<Translated<TemplateEntity>> {
144
+ const updatedEntity = await this.translatableSaver.update({
145
+ ctx,
146
+ input,
147
+ entityType: TemplateEntity,
148
+ translationType: TemplateEntityTranslation,
149
+ beforeSave: async (f) => {
150
+ // Any pre-save logic can go here
151
+ },
152
+ });
153
+ // This is just here to stop the import being removed by the IDE
154
+ patchEntity(updatedEntity, {});
155
+ await this.customFieldRelationService.updateRelations(
156
+ ctx,
157
+ TemplateEntity,
158
+ input,
159
+ updatedEntity,
160
+ );
161
+ return assertFound(this.findOne(ctx, updatedEntity.id));
162
+ }
163
+
164
+ async delete(ctx: RequestContext, id: ID): Promise<DeletionResponse> {
165
+ const entity = await this.connection.getEntityOrThrow(
166
+ ctx,
167
+ TemplateEntity,
168
+ id,
169
+ );
170
+ try {
171
+ await this.connection.getRepository(ctx, TemplateEntity).remove(entity);
172
+ return {
173
+ result: DeletionResult.DELETED,
174
+ };
175
+ } catch (e: any) {
176
+ return {
177
+ result: DeletionResult.NOT_DELETED,
178
+ message: e.toString(),
179
+ };
180
+ }
181
+ }
182
+ }
@@ -0,0 +1,6 @@
1
+ import { CliCommand, CliCommandReturnVal } from "../../../shared/cli-command";
2
+ import { DeenruvPluginRef } from "../../../shared/deenruv-plugin-ref";
3
+ export interface AddUiExtensionsOptions {
4
+ plugin?: DeenruvPluginRef;
5
+ }
6
+ export declare const addUiExtensionsCommand: CliCommand<AddUiExtensionsOptions, CliCommandReturnVal<Record<string, any>>>;
@@ -0,0 +1,101 @@
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.addUiExtensionsCommand = void 0;
7
+ const prompts_1 = require("@clack/prompts");
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ const path_1 = __importDefault(require("path"));
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 deenruv_config_ref_1 = require("../../../shared/deenruv-config-ref");
14
+ const ast_utils_1 = require("../../../utilities/ast-utils");
15
+ const add_ui_extension_static_prop_1 = require("./codemods/add-ui-extension-static-prop/add-ui-extension-static-prop");
16
+ const update_admin_ui_plugin_init_1 = require("./codemods/update-admin-ui-plugin-init/update-admin-ui-plugin-init");
17
+ exports.addUiExtensionsCommand = new cli_command_1.CliCommand({
18
+ id: "add-ui-extensions",
19
+ category: "Plugin: UI",
20
+ description: "Set up Admin UI extensions",
21
+ run: (options) => addUiExtensions(options),
22
+ });
23
+ async function addUiExtensions(options) {
24
+ const providedDeenruvPlugin = options === null || options === void 0 ? void 0 : options.plugin;
25
+ const { project } = await (0, shared_prompts_1.analyzeProject)({ providedDeenruvPlugin });
26
+ const deenruvPlugin = providedDeenruvPlugin !== null && providedDeenruvPlugin !== void 0 ? providedDeenruvPlugin : (await (0, shared_prompts_1.selectPlugin)(project, "Add UI extensions cancelled"));
27
+ const packageJson = new package_json_ref_1.PackageJson(project);
28
+ if (deenruvPlugin.hasUiExtensions()) {
29
+ (0, prompts_1.outro)("This plugin already has UI extensions configured");
30
+ return { project, modifiedSourceFiles: [] };
31
+ }
32
+ (0, add_ui_extension_static_prop_1.addUiExtensionStaticProp)(deenruvPlugin);
33
+ prompts_1.log.success("Updated the plugin class");
34
+ const installSpinner = (0, prompts_1.spinner)();
35
+ const packageManager = packageJson.determinePackageManager();
36
+ const packageJsonFile = packageJson.locatePackageJsonWithDeenruvDependency();
37
+ prompts_1.log.info(`Detected package manager: ${packageManager}`);
38
+ if (!packageJsonFile) {
39
+ (0, prompts_1.cancel)(`Could not locate package.json file with a dependency on Deenruv.`);
40
+ process.exit(1);
41
+ }
42
+ prompts_1.log.info(`Detected package.json: ${packageJsonFile}`);
43
+ installSpinner.start(`Installing dependencies using ${packageManager}...`);
44
+ try {
45
+ const version = packageJson.determineDeenruvVersion();
46
+ await packageJson.installPackages([
47
+ {
48
+ pkg: "@deenruv/ui-devkit",
49
+ isDevDependency: true,
50
+ version,
51
+ },
52
+ {
53
+ pkg: "@types/react",
54
+ isDevDependency: true,
55
+ },
56
+ ]);
57
+ }
58
+ catch (e) {
59
+ prompts_1.log.error(`Failed to install dependencies: ${e.message}.`);
60
+ }
61
+ installSpinner.stop("Dependencies installed");
62
+ const pluginDir = deenruvPlugin.getPluginDir().getPath();
63
+ const providersFileDest = path_1.default.join(pluginDir, "ui", "providers.ts");
64
+ if (!fs_extra_1.default.existsSync(providersFileDest)) {
65
+ (0, ast_utils_1.createFile)(project, path_1.default.join(__dirname, "templates/providers.template.ts"), providersFileDest);
66
+ }
67
+ const routesFileDest = path_1.default.join(pluginDir, "ui", "routes.ts");
68
+ if (!fs_extra_1.default.existsSync(routesFileDest)) {
69
+ (0, ast_utils_1.createFile)(project, path_1.default.join(__dirname, "templates/routes.template.ts"), routesFileDest);
70
+ }
71
+ prompts_1.log.success("Created UI extension scaffold");
72
+ const deenruvConfig = new deenruv_config_ref_1.DeenruvConfigRef(project);
73
+ if (!deenruvConfig) {
74
+ prompts_1.log.warning(`Could not find the DeenruvConfig declaration in your project. You will need to manually set up the compileUiExtensions function.`);
75
+ }
76
+ else {
77
+ const pluginClassName = deenruvPlugin.name;
78
+ const pluginPath = (0, ast_utils_1.getRelativeImportPath)({
79
+ to: deenruvPlugin.classDeclaration.getSourceFile(),
80
+ from: deenruvConfig.sourceFile,
81
+ });
82
+ const updated = (0, update_admin_ui_plugin_init_1.updateAdminUiPluginInit)(deenruvConfig, {
83
+ pluginClassName,
84
+ pluginPath,
85
+ });
86
+ if (updated) {
87
+ prompts_1.log.success("Updated DeenruvConfig file");
88
+ }
89
+ else {
90
+ prompts_1.log.warning(`Could not update \`AdminUiPlugin.init()\` options.`);
91
+ (0, prompts_1.note)(`You will need to manually set up the compileUiExtensions function,\nadding ` +
92
+ `the \`${pluginClassName}.ui\` object to the \`extensions\` array.`, "Info");
93
+ }
94
+ }
95
+ await project.save();
96
+ return {
97
+ project,
98
+ modifiedSourceFiles: [deenruvPlugin.classDeclaration.getSourceFile()],
99
+ };
100
+ }
101
+ //# sourceMappingURL=add-ui-extensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-ui-extensions.js","sourceRoot":"","sources":["../../../../src/commands/add/ui-extensions/add-ui-extensions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { DeenruvPluginRef } from "../../../../../shared/deenruv-plugin-ref";
2
+ export declare function addUiExtensionStaticProp(plugin: DeenruvPluginRef): void;