@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,36 @@
1
+ import {
2
+ DeepPartial,
3
+ HasCustomFields,
4
+ LocaleString,
5
+ Translatable,
6
+ Translation,
7
+ DeenruvEntity,
8
+ } from "@deenruv/core";
9
+ import { Column, Entity, OneToMany } from "typeorm";
10
+
11
+ import { ScaffoldTranslation } from "./entity-translation.template";
12
+
13
+ export class ScaffoldEntityCustomFields {}
14
+
15
+ @Entity()
16
+ export class ScaffoldEntity
17
+ extends DeenruvEntity
18
+ implements Translatable, HasCustomFields
19
+ {
20
+ constructor(input?: DeepPartial<ScaffoldEntity>) {
21
+ super(input);
22
+ }
23
+
24
+ @Column()
25
+ code: string;
26
+
27
+ @Column((type) => ScaffoldEntityCustomFields)
28
+ customFields: ScaffoldEntityCustomFields;
29
+
30
+ localizedName: LocaleString;
31
+
32
+ @OneToMany((type) => ScaffoldTranslation, (translation) => translation.base, {
33
+ eager: true,
34
+ })
35
+ translations: Array<Translation<ScaffoldEntity>>;
36
+ }
@@ -0,0 +1,9 @@
1
+ import { CliCommand, CliCommandReturnVal } from "../../../shared/cli-command";
2
+ import { ServiceRef } from "../../../shared/service-ref";
3
+ import { DeenruvPluginRef } from "../../../shared/deenruv-plugin-ref";
4
+ export interface AddJobQueueOptions {
5
+ plugin?: DeenruvPluginRef;
6
+ }
7
+ export declare const addJobQueueCommand: CliCommand<Record<string, any>, CliCommandReturnVal<{
8
+ serviceRef: ServiceRef;
9
+ }>>;
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.addJobQueueCommand = void 0;
4
+ const prompts_1 = require("@clack/prompts");
5
+ const change_case_1 = require("change-case");
6
+ const ts_morph_1 = require("ts-morph");
7
+ const cli_command_1 = require("../../../shared/cli-command");
8
+ const shared_prompts_1 = require("../../../shared/shared-prompts");
9
+ const ast_utils_1 = require("../../../utilities/ast-utils");
10
+ const cancelledMessage = "Add API extension cancelled";
11
+ exports.addJobQueueCommand = new cli_command_1.CliCommand({
12
+ id: "add-job-queue",
13
+ category: "Plugin: Job Queue",
14
+ description: "Defines an new job queue on a service",
15
+ run: (options) => addJobQueue(options),
16
+ });
17
+ async function addJobQueue(options) {
18
+ var _a;
19
+ const providedDeenruvPlugin = options === null || options === void 0 ? void 0 : options.plugin;
20
+ const { project } = await (0, shared_prompts_1.analyzeProject)({
21
+ providedDeenruvPlugin,
22
+ cancelledMessage,
23
+ });
24
+ const plugin = providedDeenruvPlugin !== null && providedDeenruvPlugin !== void 0 ? providedDeenruvPlugin : (await (0, shared_prompts_1.selectPlugin)(project, cancelledMessage));
25
+ const serviceRef = await (0, shared_prompts_1.selectServiceRef)(project, plugin);
26
+ const jobQueueName = await (0, prompts_1.text)({
27
+ message: "What is the name of the job queue?",
28
+ initialValue: "my-background-task",
29
+ validate: (input) => {
30
+ if (!/^[a-z][a-z-0-9]+$/.test(input)) {
31
+ return "The job queue name must be lowercase and contain only letters, numbers and dashes";
32
+ }
33
+ },
34
+ });
35
+ if ((0, prompts_1.isCancel)(jobQueueName)) {
36
+ (0, prompts_1.cancel)(cancelledMessage);
37
+ process.exit(0);
38
+ }
39
+ (0, ast_utils_1.addImportsToFile)(serviceRef.classDeclaration.getSourceFile(), {
40
+ moduleSpecifier: "@deenruv/core",
41
+ namedImports: ["JobQueue", "JobQueueService", "SerializedRequestContext"],
42
+ });
43
+ (0, ast_utils_1.addImportsToFile)(serviceRef.classDeclaration.getSourceFile(), {
44
+ moduleSpecifier: "@deenruv/common/lib/generated-types",
45
+ namedImports: ["JobState"],
46
+ });
47
+ (0, ast_utils_1.addImportsToFile)(serviceRef.classDeclaration.getSourceFile(), {
48
+ moduleSpecifier: "@nestjs/common",
49
+ namedImports: ["OnModuleInit"],
50
+ });
51
+ serviceRef.injectDependency({
52
+ name: "jobQueueService",
53
+ type: "JobQueueService",
54
+ });
55
+ const jobQueuePropertyName = (0, change_case_1.camelCase)(jobQueueName) + "Queue";
56
+ serviceRef.classDeclaration.insertProperty(0, {
57
+ name: jobQueuePropertyName,
58
+ scope: ts_morph_1.Scope.Private,
59
+ type: (writer) => writer.write("JobQueue<{ ctx: SerializedRequestContext, someArg: string; }>"),
60
+ });
61
+ serviceRef.classDeclaration.addImplements("OnModuleInit");
62
+ let onModuleInitMethod = serviceRef.classDeclaration.getMethod("onModuleInit");
63
+ if (!onModuleInitMethod) {
64
+ const constructor = serviceRef.classDeclaration.getConstructors()[0];
65
+ const constructorChildIndex = (_a = constructor === null || constructor === void 0 ? void 0 : constructor.getChildIndex()) !== null && _a !== void 0 ? _a : 0;
66
+ onModuleInitMethod = serviceRef.classDeclaration.insertMethod(constructorChildIndex + 1, {
67
+ name: "onModuleInit",
68
+ isAsync: false,
69
+ returnType: "void",
70
+ scope: ts_morph_1.Scope.Public,
71
+ });
72
+ }
73
+ onModuleInitMethod.setIsAsync(true);
74
+ onModuleInitMethod.setReturnType("Promise<void>");
75
+ const body = onModuleInitMethod.getBody();
76
+ if (ts_morph_1.Node.isBlock(body)) {
77
+ body
78
+ .addStatements((writer) => {
79
+ writer
80
+ .write(`this.${jobQueuePropertyName} = await this.jobQueueService.createQueue({
81
+ name: '${jobQueueName}',
82
+ process: async job => {
83
+ // Deserialize the RequestContext from the job data
84
+ const ctx = RequestContext.deserialize(job.data.ctx);
85
+ // The "someArg" property is passed in when the job is triggered
86
+ const someArg = job.data.someArg;
87
+
88
+ // Inside the \`process\` function we define how each job
89
+ // in the queue will be processed.
90
+ // Let's simulate some long-running task
91
+ const totalItems = 10;
92
+ for (let i = 0; i < totalItems; i++) {
93
+ await new Promise(resolve => setTimeout(resolve, 500));
94
+
95
+ // You can optionally respond to the job being cancelled
96
+ // during processing. This can be useful for very long-running
97
+ // tasks which can be cancelled by the user.
98
+ if (job.state === JobState.CANCELLED) {
99
+ throw new Error('Job was cancelled');
100
+ }
101
+
102
+ // Progress can be reported as a percentage like this
103
+ job.setProgress(Math.floor(i / totalItems * 100));
104
+ }
105
+
106
+ // The value returned from the \`process\` function is stored
107
+ // as the "result" field of the job
108
+ return {
109
+ processedCount: totalItems,
110
+ message: \`Successfully processed \${totalItems} items\`,
111
+ };
112
+ },
113
+ })`)
114
+ .newLine();
115
+ })
116
+ .forEach((s) => s.formatText());
117
+ }
118
+ serviceRef.classDeclaration
119
+ .addMethod({
120
+ name: `trigger${(0, change_case_1.pascalCase)(jobQueueName)}`,
121
+ scope: ts_morph_1.Scope.Public,
122
+ parameters: [{ name: "ctx", type: "RequestContext" }],
123
+ statements: (writer) => {
124
+ writer.write(`return this.${jobQueuePropertyName}.add({
125
+ ctx: ctx.serialize(),
126
+ someArg: 'foo',
127
+ })`);
128
+ },
129
+ })
130
+ .formatText();
131
+ prompts_1.log.success(`New job queue created in ${serviceRef.name}`);
132
+ await project.save();
133
+ return {
134
+ project,
135
+ modifiedSourceFiles: [serviceRef.classDeclaration.getSourceFile()],
136
+ serviceRef,
137
+ };
138
+ }
139
+ //# sourceMappingURL=add-job-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-job-queue.js","sourceRoot":"","sources":["../../../../src/commands/add/job-queue/add-job-queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Project, SourceFile } from "ts-morph";
2
+ import { CliCommand, CliCommandReturnVal } from "../../../shared/cli-command";
3
+ import { DeenruvPluginRef } from "../../../shared/deenruv-plugin-ref";
4
+ import { GeneratePluginOptions } from "./types";
5
+ export declare const createNewPluginCommand: CliCommand<Record<string, any>, CliCommandReturnVal>;
6
+ export declare function createNewPlugin(): Promise<CliCommandReturnVal>;
7
+ export declare function generatePlugin(project: Project, options: GeneratePluginOptions): Promise<{
8
+ plugin: DeenruvPluginRef;
9
+ modifiedSourceFiles: SourceFile[];
10
+ }>;
@@ -0,0 +1,240 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.generatePlugin = exports.createNewPlugin = exports.createNewPluginCommand = void 0;
30
+ const prompts_1 = require("@clack/prompts");
31
+ const change_case_1 = require("change-case");
32
+ const fs = __importStar(require("fs-extra"));
33
+ const path_1 = __importDefault(require("path"));
34
+ const cli_command_1 = require("../../../shared/cli-command");
35
+ const shared_prompts_1 = require("../../../shared/shared-prompts");
36
+ const deenruv_config_ref_1 = require("../../../shared/deenruv-config-ref");
37
+ const deenruv_plugin_ref_1 = require("../../../shared/deenruv-plugin-ref");
38
+ const ast_utils_1 = require("../../../utilities/ast-utils");
39
+ const utils_1 = require("../../../utilities/utils");
40
+ const add_api_extension_1 = require("../api-extension/add-api-extension");
41
+ const add_codegen_1 = require("../codegen/add-codegen");
42
+ const add_entity_1 = require("../entity/add-entity");
43
+ const add_job_queue_1 = require("../job-queue/add-job-queue");
44
+ const add_service_1 = require("../service/add-service");
45
+ const add_ui_extensions_1 = require("../ui-extensions/add-ui-extensions");
46
+ exports.createNewPluginCommand = new cli_command_1.CliCommand({
47
+ id: "create-new-plugin",
48
+ category: "Plugin",
49
+ description: "Create a new Deenruv plugin",
50
+ run: createNewPlugin,
51
+ });
52
+ const cancelledMessage = "Plugin setup cancelled.";
53
+ async function createNewPlugin() {
54
+ const options = {
55
+ name: "",
56
+ customEntityName: "",
57
+ pluginDir: "",
58
+ };
59
+ (0, prompts_1.intro)("Adding a new Deenruv plugin!");
60
+ const { project } = await (0, shared_prompts_1.analyzeProject)({ cancelledMessage });
61
+ if (!options.name) {
62
+ const name = await (0, prompts_1.text)({
63
+ message: "What is the name of the plugin?",
64
+ initialValue: "my-new-feature",
65
+ validate: (input) => {
66
+ if (!/^[a-z][a-z-0-9]+$/.test(input)) {
67
+ return "The plugin name must be lowercase and contain only letters, numbers and dashes";
68
+ }
69
+ },
70
+ });
71
+ if ((0, prompts_1.isCancel)(name)) {
72
+ (0, prompts_1.cancel)(cancelledMessage);
73
+ process.exit(0);
74
+ }
75
+ else {
76
+ options.name = name;
77
+ }
78
+ }
79
+ const existingPluginDir = findExistingPluginsDir(project);
80
+ const pluginDir = getPluginDirName(options.name, existingPluginDir);
81
+ const confirmation = await (0, prompts_1.text)({
82
+ message: "Plugin location",
83
+ initialValue: pluginDir,
84
+ placeholder: "",
85
+ validate: (input) => {
86
+ if (fs.existsSync(input)) {
87
+ return `A directory named "${input}" already exists. Please specify a different directory.`;
88
+ }
89
+ },
90
+ });
91
+ if ((0, prompts_1.isCancel)(confirmation)) {
92
+ (0, prompts_1.cancel)(cancelledMessage);
93
+ process.exit(0);
94
+ }
95
+ options.pluginDir = confirmation;
96
+ const { plugin, modifiedSourceFiles } = await generatePlugin(project, options);
97
+ const configSpinner = (0, prompts_1.spinner)();
98
+ configSpinner.start("Updating DeenruvConfig...");
99
+ await (0, utils_1.pauseForPromptDisplay)();
100
+ const deenruvConfig = new deenruv_config_ref_1.DeenruvConfigRef(project);
101
+ deenruvConfig.addToPluginsArray(`${plugin.name}.init({})`);
102
+ (0, ast_utils_1.addImportsToFile)(deenruvConfig.sourceFile, {
103
+ moduleSpecifier: plugin.getSourceFile(),
104
+ namedImports: [plugin.name],
105
+ });
106
+ await deenruvConfig.sourceFile.getProject().save();
107
+ configSpinner.stop("Updated DeenruvConfig");
108
+ let done = false;
109
+ const followUpCommands = [
110
+ add_entity_1.addEntityCommand,
111
+ add_service_1.addServiceCommand,
112
+ add_api_extension_1.addApiExtensionCommand,
113
+ add_job_queue_1.addJobQueueCommand,
114
+ add_ui_extensions_1.addUiExtensionsCommand,
115
+ add_codegen_1.addCodegenCommand,
116
+ ];
117
+ let allModifiedSourceFiles = [...modifiedSourceFiles];
118
+ while (!done) {
119
+ const featureType = await (0, prompts_1.select)({
120
+ message: `Add features to ${options.name}?`,
121
+ options: [
122
+ { value: "no", label: "[Finish] No, I'm done!" },
123
+ ...followUpCommands.map((c) => ({
124
+ value: c.id,
125
+ label: `[${c.category}] ${c.description}`,
126
+ })),
127
+ ],
128
+ });
129
+ if ((0, prompts_1.isCancel)(featureType)) {
130
+ done = true;
131
+ }
132
+ if (featureType === "no") {
133
+ done = true;
134
+ }
135
+ else {
136
+ const command = followUpCommands.find((c) => c.id === featureType);
137
+ try {
138
+ const result = await command.run({ plugin });
139
+ allModifiedSourceFiles = result.modifiedSourceFiles;
140
+ for (const sourceFile of allModifiedSourceFiles) {
141
+ sourceFile.organizeImports();
142
+ }
143
+ }
144
+ catch (e) {
145
+ prompts_1.log.error(`Error adding feature "${command.id}"`);
146
+ prompts_1.log.error(e.stack);
147
+ }
148
+ }
149
+ }
150
+ return {
151
+ project,
152
+ modifiedSourceFiles: [],
153
+ };
154
+ }
155
+ exports.createNewPlugin = createNewPlugin;
156
+ async function generatePlugin(project, options) {
157
+ var _a, _b, _c, _d;
158
+ const nameWithoutPlugin = options.name.replace(/-?plugin$/i, "");
159
+ const normalizedName = nameWithoutPlugin + "-plugin";
160
+ const templateContext = Object.assign(Object.assign({}, options), { pluginName: (0, change_case_1.pascalCase)(normalizedName), pluginInitOptionsName: (0, change_case_1.constantCase)(normalizedName) + "_OPTIONS" });
161
+ const projectSpinner = (0, prompts_1.spinner)();
162
+ projectSpinner.start("Generating plugin scaffold...");
163
+ await (0, utils_1.pauseForPromptDisplay)();
164
+ const pluginFile = (0, ast_utils_1.createFile)(project, path_1.default.join(__dirname, "templates/plugin.template.ts"), path_1.default.join(options.pluginDir, (0, change_case_1.paramCase)(nameWithoutPlugin) + ".plugin.ts"));
165
+ const pluginClass = pluginFile.getClass("TemplatePlugin");
166
+ if (!pluginClass) {
167
+ throw new Error("Could not find the plugin class in the generated file");
168
+ }
169
+ (_a = pluginFile
170
+ .getImportDeclaration("./constants.template")) === null || _a === void 0 ? void 0 : _a.setModuleSpecifier("./constants");
171
+ (_b = pluginFile
172
+ .getImportDeclaration("./types.template")) === null || _b === void 0 ? void 0 : _b.setModuleSpecifier("./types");
173
+ pluginClass.rename(templateContext.pluginName);
174
+ const typesFile = (0, ast_utils_1.createFile)(project, path_1.default.join(__dirname, "templates/types.template.ts"), path_1.default.join(options.pluginDir, "types.ts"));
175
+ const constantsFile = (0, ast_utils_1.createFile)(project, path_1.default.join(__dirname, "templates/constants.template.ts"), path_1.default.join(options.pluginDir, "constants.ts"));
176
+ (_c = constantsFile
177
+ .getVariableDeclaration("TEMPLATE_PLUGIN_OPTIONS")) === null || _c === void 0 ? void 0 : _c.rename(templateContext.pluginInitOptionsName).set({ initializer: `Symbol('${templateContext.pluginInitOptionsName}')` });
178
+ (_d = constantsFile
179
+ .getVariableDeclaration("loggerCtx")) === null || _d === void 0 ? void 0 : _d.set({ initializer: `'${templateContext.pluginName}'` });
180
+ projectSpinner.stop("Generated plugin scaffold");
181
+ await project.save();
182
+ return {
183
+ modifiedSourceFiles: [pluginFile, typesFile, constantsFile],
184
+ plugin: new deenruv_plugin_ref_1.DeenruvPluginRef(pluginClass),
185
+ };
186
+ }
187
+ exports.generatePlugin = generatePlugin;
188
+ function findExistingPluginsDir(project) {
189
+ const pluginClasses = (0, ast_utils_1.getPluginClasses)(project);
190
+ if (pluginClasses.length === 0) {
191
+ return;
192
+ }
193
+ if (pluginClasses.length === 1) {
194
+ return {
195
+ prefix: path_1.default.dirname(pluginClasses[0].getSourceFile().getDirectoryPath()),
196
+ suffix: "",
197
+ };
198
+ }
199
+ const pluginDirs = pluginClasses.map((c) => {
200
+ return c.getSourceFile().getDirectoryPath();
201
+ });
202
+ const prefix = findCommonPath(pluginDirs);
203
+ const suffixStartIndex = prefix.length;
204
+ const rest = pluginDirs[0]
205
+ .substring(suffixStartIndex)
206
+ .replace(/^\//, "")
207
+ .split("/");
208
+ const suffix = rest.length > 1 ? rest.slice(1).join("/") : "";
209
+ return { prefix, suffix };
210
+ }
211
+ function getPluginDirName(name, existingPluginDirPattern) {
212
+ const cwd = process.cwd();
213
+ const nameWithoutPlugin = name.replace(/-?plugin$/i, "");
214
+ if (existingPluginDirPattern) {
215
+ return path_1.default.join(existingPluginDirPattern.prefix, (0, change_case_1.paramCase)(nameWithoutPlugin), existingPluginDirPattern.suffix);
216
+ }
217
+ else {
218
+ return path_1.default.join(cwd, "src", "plugins", (0, change_case_1.paramCase)(nameWithoutPlugin));
219
+ }
220
+ }
221
+ function findCommonPath(paths) {
222
+ if (paths.length === 0) {
223
+ return "";
224
+ }
225
+ const pathSegmentsList = paths.map((p) => p.split("/"));
226
+ const minLength = Math.min(...pathSegmentsList.map((segments) => segments.length));
227
+ const commonPath = [];
228
+ for (let i = 0; i < minLength; i++) {
229
+ const currentSegment = pathSegmentsList[0][i];
230
+ const isCommon = pathSegmentsList.every((segments) => segments[i] === currentSegment);
231
+ if (isCommon) {
232
+ commonPath.push(currentSegment);
233
+ }
234
+ else {
235
+ break;
236
+ }
237
+ }
238
+ return commonPath.join("/");
239
+ }
240
+ //# sourceMappingURL=create-new-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-new-plugin.js","sourceRoot":"","sources":["../../../../src/commands/add/plugin/create-new-plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAQwB;AACxB,6CAAkE;AAClE,6CAA+B;AAC/B,gDAAwB;AAGxB,6DAA8E;AAC9E,mEAAgE;AAChE,2EAAsE;AACtE,2EAAsE;AACtE,4DAIsC;AACtC,oDAAiE;AACjE,0EAA4E;AAC5E,wDAA2D;AAC3D,qDAAwD;AACxD,8DAAgE;AAChE,wDAA2D;AAC3D,0EAA4E;AAI/D,QAAA,sBAAsB,GAAG,IAAI,wBAAU,CAAC;IACnD,EAAE,EAAE,mBAAmB;IACvB,QAAQ,EAAE,QAAQ;IAClB,WAAW,EAAE,6BAA6B;IAC1C,GAAG,EAAE,eAAe;CACrB,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,yBAAyB,CAAC;AAE5C,KAAK,UAAU,eAAe;IACnC,MAAM,OAAO,GAA0B;QACrC,IAAI,EAAE,EAAE;QACR,gBAAgB,EAAE,EAAE;QACpB,SAAS,EAAE,EAAE;KACP,CAAC;IACT,IAAA,eAAK,EAAC,8BAA8B,CAAC,CAAC;IACtC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAA,+BAAc,EAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC/D,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,MAAM,IAAA,cAAI,EAAC;YACtB,OAAO,EAAE,iCAAiC;YAC1C,YAAY,EAAE,gBAAgB;YAC9B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;gBAClB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACrC,OAAO,gFAAgF,CAAC;gBAC1F,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,IAAA,kBAAQ,EAAC,IAAI,CAAC,EAAE,CAAC;YACnB,IAAA,gBAAM,EAAC,gBAAgB,CAAC,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC;IACD,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IACpE,MAAM,YAAY,GAAG,MAAM,IAAA,cAAI,EAAC;QAC9B,OAAO,EAAE,iBAAiB;QAC1B,YAAY,EAAE,SAAS;QACvB,WAAW,EAAE,EAAE;QACf,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,sBAAsB,KAAK,yDAAyD,CAAC;YAC9F,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,IAAA,kBAAQ,EAAC,YAAY,CAAC,EAAE,CAAC;QAC3B,IAAA,gBAAM,EAAC,gBAAgB,CAAC,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,SAAS,GAAG,YAAY,CAAC;IACjC,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,cAAc,CAC1D,OAAO,EACP,OAAO,CACR,CAAC;IAEF,MAAM,aAAa,GAAG,IAAA,iBAAO,GAAE,CAAC;IAChC,aAAa,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACjD,MAAM,IAAA,6BAAqB,GAAE,CAAC;IAC9B,MAAM,aAAa,GAAG,IAAI,qCAAgB,CAAC,OAAO,CAAC,CAAC;IACpD,aAAa,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAAC,IAAI,WAAW,CAAC,CAAC;IAC3D,IAAA,4BAAgB,EAAC,aAAa,CAAC,UAAU,EAAE;QACzC,eAAe,EAAE,MAAM,CAAC,aAAa,EAAE;QACvC,YAAY,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;KAC5B,CAAC,CAAC;IACH,MAAM,aAAa,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC;IACnD,aAAa,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAE5C,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,MAAM,gBAAgB,GAAG;QACvB,6BAAgB;QAChB,+BAAiB;QACjB,0CAAsB;QACtB,kCAAkB;QAClB,0CAAsB;QACtB,+BAAiB;KAClB,CAAC;IACF,IAAI,sBAAsB,GAAG,CAAC,GAAG,mBAAmB,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,WAAW,GAAG,MAAM,IAAA,gBAAM,EAAC;YAC/B,OAAO,EAAE,mBAAmB,OAAO,CAAC,IAAI,GAAG;YAC3C,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,wBAAwB,EAAE;gBAChD,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC9B,KAAK,EAAE,CAAC,CAAC,EAAE;oBACX,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,WAAW,EAAE;iBAC1C,CAAC,CAAC;aACJ;SACF,CAAC,CAAC;QACH,IAAI,IAAA,kBAAQ,EAAC,WAAW,CAAC,EAAE,CAAC;YAC1B,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;QACD,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAE,CAAC;YAEpE,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC7C,sBAAsB,GAAG,MAAM,CAAC,mBAAmB,CAAC;gBAGpD,KAAK,MAAM,UAAU,IAAI,sBAAsB,EAAE,CAAC;oBAChD,UAAU,CAAC,eAAe,EAAE,CAAC;gBAC/B,CAAC;YACH,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,aAAG,CAAC,KAAK,CAAC,yBAAyB,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;gBAClD,aAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO;QACP,mBAAmB,EAAE,EAAE;KACxB,CAAC;AACJ,CAAC;AA9GD,0CA8GC;AAEM,KAAK,UAAU,cAAc,CAClC,OAAgB,EAChB,OAA8B;;IAE9B,MAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IACjE,MAAM,cAAc,GAAG,iBAAiB,GAAG,SAAS,CAAC;IACrD,MAAM,eAAe,mCAChB,OAAO,KACV,UAAU,EAAE,IAAA,wBAAU,EAAC,cAAc,CAAC,EACtC,qBAAqB,EAAE,IAAA,0BAAY,EAAC,cAAc,CAAC,GAAG,UAAU,GACjE,CAAC;IAEF,MAAM,cAAc,GAAG,IAAA,iBAAO,GAAE,CAAC;IACjC,cAAc,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACtD,MAAM,IAAA,6BAAqB,GAAE,CAAC;IAE9B,MAAM,UAAU,GAAG,IAAA,sBAAU,EAC3B,OAAO,EACP,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,8BAA8B,CAAC,EACpD,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAA,uBAAS,EAAC,iBAAiB,CAAC,GAAG,YAAY,CAAC,CAC1E,CAAC;IACF,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAC1D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,MAAA,UAAU;SACP,oBAAoB,CAAC,sBAAsB,CAAC,0CAC3C,kBAAkB,CAAC,aAAa,CAAC,CAAC;IACtC,MAAA,UAAU;SACP,oBAAoB,CAAC,kBAAkB,CAAC,0CACvC,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAClC,WAAW,CAAC,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;IAE/C,MAAM,SAAS,GAAG,IAAA,sBAAU,EAC1B,OAAO,EACP,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,6BAA6B,CAAC,EACnD,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CACzC,CAAC;IAEF,MAAM,aAAa,GAAG,IAAA,sBAAU,EAC9B,OAAO,EACP,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iCAAiC,CAAC,EACvD,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,CAC7C,CAAC;IACF,MAAA,aAAa;SACV,sBAAsB,CAAC,yBAAyB,CAAC,0CAChD,MAAM,CAAC,eAAe,CAAC,qBAAqB,EAC7C,GAAG,CAAC,EAAE,WAAW,EAAE,WAAW,eAAe,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;IAC9E,MAAA,aAAa;SACV,sBAAsB,CAAC,WAAW,CAAC,0CAClC,GAAG,CAAC,EAAE,WAAW,EAAE,IAAI,eAAe,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;IAE5D,cAAc,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACjD,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACrB,OAAO;QACL,mBAAmB,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC;QAC3D,MAAM,EAAE,IAAI,qCAAgB,CAAC,WAAW,CAAC;KAC1C,CAAC;AACJ,CAAC;AA1DD,wCA0DC;AAED,SAAS,sBAAsB,CAC7B,OAAgB;IAEhB,MAAM,aAAa,GAAG,IAAA,4BAAgB,EAAC,OAAO,CAAC,CAAC;IAChD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IACD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,MAAM,EAAE,cAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,gBAAgB,EAAE,CAAC;YACzE,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACzC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC,gBAAgB,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC;IACvC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC;SACvB,SAAS,CAAC,gBAAgB,CAAC;SAC3B,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,KAAK,CAAC,GAAG,CAAC,CAAC;IACd,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,gBAAgB,CACvB,IAAY,EACZ,wBAAwE;IAExE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IACzD,IAAI,wBAAwB,EAAE,CAAC;QAC7B,OAAO,cAAI,CAAC,IAAI,CACd,wBAAwB,CAAC,MAAM,EAC/B,IAAA,uBAAS,EAAC,iBAAiB,CAAC,EAC5B,wBAAwB,CAAC,MAAM,CAChC,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,IAAA,uBAAS,EAAC,iBAAiB,CAAC,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAe;IACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAGD,MAAM,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAGxD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CACvD,CAAC;IAGF,MAAM,UAAU,GAAa,EAAE,CAAC;IAGhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QAEnC,MAAM,cAAc,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CACrC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,cAAc,CAC7C,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YAEb,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YAEN,MAAM;QACR,CAAC;IACH,CAAC;IAGD,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const TEMPLATE_PLUGIN_OPTIONS = Symbol("TEMPLATE_PLUGIN_OPTIONS");
2
+ export const loggerCtx = "TemplatePlugin";
@@ -0,0 +1,30 @@
1
+ import { PluginCommonModule, Type, DeenruvPlugin } from "@deenruv/core";
2
+
3
+ import { TEMPLATE_PLUGIN_OPTIONS } from "./constants.template";
4
+ import { PluginInitOptions } from "./types.template";
5
+
6
+ @DeenruvPlugin({
7
+ imports: [PluginCommonModule],
8
+ providers: [
9
+ {
10
+ provide: TEMPLATE_PLUGIN_OPTIONS,
11
+ useFactory: () => TemplatePlugin.options,
12
+ },
13
+ ],
14
+ configuration: (config) => {
15
+ // Plugin-specific configuration
16
+ // such as custom fields, custom permissions,
17
+ // strategies etc. can be configured here by
18
+ // modifying the `config` object.
19
+ return config;
20
+ },
21
+ compatibility: "^0.0.0",
22
+ })
23
+ export class TemplatePlugin {
24
+ static options: PluginInitOptions;
25
+
26
+ static init(options: PluginInitOptions): Type<TemplatePlugin> {
27
+ this.options = options;
28
+ return TemplatePlugin;
29
+ }
30
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @description
3
+ * The plugin can be configured using the following options:
4
+ */
5
+ export interface PluginInitOptions {
6
+ exampleOption?: string;
7
+ }
@@ -0,0 +1,8 @@
1
+ export interface GeneratePluginOptions {
2
+ name: string;
3
+ pluginDir: string;
4
+ }
5
+ export type NewPluginTemplateContext = GeneratePluginOptions & {
6
+ pluginName: string;
7
+ pluginInitOptionsName: string;
8
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/commands/add/plugin/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import { CliCommand, CliCommandReturnVal } from "../../../shared/cli-command";
2
+ import { ServiceRef } from "../../../shared/service-ref";
3
+ export declare const addServiceCommand: CliCommand<Record<string, any>, CliCommandReturnVal<{
4
+ serviceRef: ServiceRef;
5
+ }>>;