@launch77/cli 1.3.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/cli.js +6 -3
  3. package/dist/cli.js.map +1 -1
  4. package/dist/infrastructure/template-generator.d.ts +1 -1
  5. package/dist/infrastructure/template-generator.d.ts.map +1 -1
  6. package/dist/infrastructure/template.d.ts +5 -0
  7. package/dist/infrastructure/template.d.ts.map +1 -1
  8. package/dist/infrastructure/template.js +11 -0
  9. package/dist/infrastructure/template.js.map +1 -1
  10. package/dist/modules/app/commands/create-app.js +1 -1
  11. package/dist/modules/app/commands/create-app.js.map +1 -1
  12. package/dist/modules/app/commands/delete-app.js +1 -1
  13. package/dist/modules/app/commands/delete-app.js.map +1 -1
  14. package/dist/modules/app/services/app-svc.d.ts +1 -1
  15. package/dist/modules/app/services/app-svc.d.ts.map +1 -1
  16. package/dist/modules/app/services/manifest-svc.d.ts +1 -1
  17. package/dist/modules/app/services/manifest-svc.d.ts.map +1 -1
  18. package/dist/modules/catalog/config/catalog-config.test.js +1 -1
  19. package/dist/modules/catalog/config/catalog-config.test.js.map +1 -1
  20. package/dist/modules/git/commands/git-connect.js +2 -2
  21. package/dist/modules/git/commands/git-connect.js.map +1 -1
  22. package/dist/modules/git/errors/git-errors.d.ts +3 -0
  23. package/dist/modules/git/errors/git-errors.d.ts.map +1 -1
  24. package/dist/modules/git/errors/git-errors.js +6 -0
  25. package/dist/modules/git/errors/git-errors.js.map +1 -1
  26. package/dist/modules/git/index.d.ts +3 -1
  27. package/dist/modules/git/index.d.ts.map +1 -1
  28. package/dist/modules/git/index.js +6 -1
  29. package/dist/modules/git/index.js.map +1 -1
  30. package/dist/modules/git/services/git-service.d.ts +5 -0
  31. package/dist/modules/git/services/git-service.d.ts.map +1 -1
  32. package/dist/modules/git/services/git-service.js +11 -1
  33. package/dist/modules/git/services/git-service.js.map +1 -1
  34. package/dist/modules/plugin/commands/plugin-create.d.ts +3 -0
  35. package/dist/modules/plugin/commands/plugin-create.d.ts.map +1 -0
  36. package/dist/modules/plugin/commands/plugin-create.js +59 -0
  37. package/dist/modules/plugin/commands/plugin-create.js.map +1 -0
  38. package/dist/modules/plugin/commands/plugin-install.d.ts.map +1 -1
  39. package/dist/modules/plugin/commands/plugin-install.js +9 -24
  40. package/dist/modules/plugin/commands/plugin-install.js.map +1 -1
  41. package/dist/modules/plugin/errors/plugin-errors.d.ts +24 -1
  42. package/dist/modules/plugin/errors/plugin-errors.d.ts.map +1 -1
  43. package/dist/modules/plugin/errors/plugin-errors.js +79 -6
  44. package/dist/modules/plugin/errors/plugin-errors.js.map +1 -1
  45. package/dist/modules/plugin/index.d.ts +4 -2
  46. package/dist/modules/plugin/index.d.ts.map +1 -1
  47. package/dist/modules/plugin/index.js +4 -2
  48. package/dist/modules/plugin/index.js.map +1 -1
  49. package/dist/modules/plugin/lib/plugin-registry.d.ts +6 -12
  50. package/dist/modules/plugin/lib/plugin-registry.d.ts.map +1 -1
  51. package/dist/modules/plugin/lib/plugin-registry.js +13 -30
  52. package/dist/modules/plugin/lib/plugin-registry.js.map +1 -1
  53. package/dist/modules/plugin/lib/plugin-resolver.d.ts +76 -0
  54. package/dist/modules/plugin/lib/plugin-resolver.d.ts.map +1 -0
  55. package/dist/modules/plugin/lib/plugin-resolver.js +128 -0
  56. package/dist/modules/plugin/lib/plugin-resolver.js.map +1 -0
  57. package/dist/modules/plugin/lib/plugin-resolver.test.d.ts +2 -0
  58. package/dist/modules/plugin/lib/plugin-resolver.test.d.ts.map +1 -0
  59. package/dist/modules/plugin/lib/plugin-resolver.test.js +175 -0
  60. package/dist/modules/plugin/lib/plugin-resolver.test.js.map +1 -0
  61. package/dist/modules/plugin/services/plugin-create-service.d.ts +16 -0
  62. package/dist/modules/plugin/services/plugin-create-service.d.ts.map +1 -0
  63. package/dist/modules/plugin/services/plugin-create-service.js +47 -0
  64. package/dist/modules/plugin/services/plugin-create-service.js.map +1 -0
  65. package/dist/modules/plugin/services/plugin-svc.d.ts +29 -3
  66. package/dist/modules/plugin/services/plugin-svc.d.ts.map +1 -1
  67. package/dist/modules/plugin/services/plugin-svc.js +192 -17
  68. package/dist/modules/plugin/services/plugin-svc.js.map +1 -1
  69. package/dist/modules/plugin/services/plugin-svc.test.d.ts +2 -0
  70. package/dist/modules/plugin/services/plugin-svc.test.d.ts.map +1 -0
  71. package/dist/modules/plugin/services/plugin-svc.test.js +362 -0
  72. package/dist/modules/plugin/services/plugin-svc.test.js.map +1 -0
  73. package/dist/modules/release/commands/release-init.d.ts +3 -0
  74. package/dist/modules/release/commands/release-init.d.ts.map +1 -0
  75. package/dist/modules/release/commands/release-init.js +92 -0
  76. package/dist/modules/release/commands/release-init.js.map +1 -0
  77. package/dist/modules/release/errors/release-errors.d.ts +7 -0
  78. package/dist/modules/release/errors/release-errors.d.ts.map +1 -0
  79. package/dist/modules/release/errors/release-errors.js +13 -0
  80. package/dist/modules/release/errors/release-errors.js.map +1 -0
  81. package/dist/modules/release/index.d.ts +4 -0
  82. package/dist/modules/release/index.d.ts.map +1 -0
  83. package/dist/modules/release/index.js +7 -0
  84. package/dist/modules/release/index.js.map +1 -0
  85. package/dist/modules/release/services/release-service.d.ts +34 -0
  86. package/dist/modules/release/services/release-service.d.ts.map +1 -0
  87. package/dist/modules/release/services/release-service.js +154 -0
  88. package/dist/modules/release/services/release-service.js.map +1 -0
  89. package/dist/templates/plugin/README.md.hbs +39 -0
  90. package/dist/templates/plugin/package.json.hbs +34 -0
  91. package/dist/templates/plugin/plugin.json.hbs +7 -0
  92. package/dist/templates/plugin/src/generator.ts.hbs +64 -0
  93. package/dist/templates/plugin/templates/src/.gitkeep +0 -0
  94. package/dist/templates/plugin/tsconfig.json +10 -0
  95. package/dist/templates/plugin/tsup.config.ts +9 -0
  96. package/dist/templates/workspace/.github/workflows/ci.yml +8 -5
  97. package/dist/templates/workspace/package.json +3 -1
  98. package/dist/templates/workspace/turbo.json +5 -0
  99. package/dist/utils/launch77-context.d.ts +1 -1
  100. package/dist/utils/launch77-context.d.ts.map +1 -1
  101. package/dist/utils/launch77-context.js +25 -2
  102. package/dist/utils/launch77-context.js.map +1 -1
  103. package/dist/utils/launch77-validation.d.ts +1 -1
  104. package/dist/utils/launch77-validation.d.ts.map +1 -1
  105. package/dist/utils/string.d.ts +13 -0
  106. package/dist/utils/string.d.ts.map +1 -0
  107. package/dist/utils/string.js +18 -0
  108. package/dist/utils/string.js.map +1 -0
  109. package/package.json +6 -9
  110. package/src/cli.ts +7 -3
  111. package/src/infrastructure/template-generator.ts +1 -1
  112. package/src/infrastructure/template.ts +14 -0
  113. package/src/modules/app/commands/create-app.ts +1 -1
  114. package/src/modules/app/commands/delete-app.ts +1 -1
  115. package/src/modules/app/services/app-svc.ts +1 -1
  116. package/src/modules/app/services/manifest-svc.ts +1 -1
  117. package/src/modules/catalog/config/catalog-config.test.ts +1 -1
  118. package/src/modules/git/commands/git-connect.ts +2 -2
  119. package/src/modules/git/errors/git-errors.ts +7 -0
  120. package/src/modules/git/index.ts +8 -1
  121. package/src/modules/git/services/git-service.ts +12 -1
  122. package/src/modules/plugin/commands/plugin-create.ts +68 -0
  123. package/src/modules/plugin/commands/plugin-install.ts +9 -26
  124. package/src/modules/plugin/errors/plugin-errors.ts +87 -6
  125. package/src/modules/plugin/index.ts +4 -2
  126. package/src/modules/plugin/lib/plugin-registry.ts +14 -37
  127. package/src/modules/plugin/lib/plugin-resolver.test.ts +215 -0
  128. package/src/modules/plugin/lib/plugin-resolver.ts +160 -0
  129. package/src/modules/plugin/services/plugin-create-service.ts +69 -0
  130. package/src/modules/plugin/services/plugin-svc.test.ts +418 -0
  131. package/src/modules/plugin/services/plugin-svc.ts +217 -17
  132. package/src/modules/release/commands/release-init.ts +102 -0
  133. package/src/modules/release/errors/release-errors.ts +13 -0
  134. package/src/modules/release/index.ts +8 -0
  135. package/src/modules/release/services/release-service.ts +170 -0
  136. package/src/utils/launch77-context.ts +29 -3
  137. package/src/utils/launch77-validation.ts +1 -1
  138. package/src/utils/string.ts +17 -0
  139. package/templates/plugin/README.md.hbs +39 -0
  140. package/templates/plugin/package.json.hbs +34 -0
  141. package/templates/plugin/plugin.json.hbs +7 -0
  142. package/templates/plugin/src/generator.ts.hbs +64 -0
  143. package/templates/plugin/templates/src/.gitkeep +0 -0
  144. package/templates/plugin/tsconfig.json +10 -0
  145. package/templates/plugin/tsup.config.ts +9 -0
  146. package/templates/workspace/.github/workflows/ci.yml +8 -5
  147. package/templates/workspace/package.json +3 -1
  148. package/templates/workspace/turbo.json +5 -0
  149. package/tests/integration/cli.test.ts +25 -0
  150. package/tests/integration/setup.ts +20 -0
  151. package/vitest.config.ts +9 -0
  152. package/vitest.integration.config.ts +9 -0
  153. package/dist/modules/git/commands/git-setup-releases.d.ts +0 -3
  154. package/dist/modules/git/commands/git-setup-releases.d.ts.map +0 -1
  155. package/dist/modules/git/commands/git-setup-releases.js +0 -128
  156. package/dist/modules/git/commands/git-setup-releases.js.map +0 -1
  157. package/launch77-cli-1.2.0.tgz +0 -0
  158. package/src/modules/git/commands/git-setup-releases.ts +0 -148
  159. package/src/modules/plugin/lib/launch77-workspace.code-workspace +0 -14
@@ -0,0 +1,175 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import * as path from 'path';
3
+ import * as os from 'os';
4
+ import fs from 'fs-extra';
5
+ import { validatePluginInput, toNpmPackageName, resolvePluginLocation } from './plugin-resolver.js';
6
+ describe('Plugin Resolver', () => {
7
+ describe('validatePluginInput', () => {
8
+ it('should accept valid unscoped plugin names', () => {
9
+ expect(validatePluginInput('release')).toEqual({ isValid: true });
10
+ expect(validatePluginInput('my-plugin')).toEqual({ isValid: true });
11
+ expect(validatePluginInput('analytics-v2')).toEqual({ isValid: true });
12
+ });
13
+ it('should accept valid scoped npm packages', () => {
14
+ expect(validatePluginInput('@ibm/plugin-name')).toEqual({ isValid: true });
15
+ expect(validatePluginInput('@launch77-shared/plugin-release')).toEqual({ isValid: true });
16
+ expect(validatePluginInput('@org/analytics')).toEqual({ isValid: true });
17
+ });
18
+ it('should reject empty names', () => {
19
+ const result = validatePluginInput('');
20
+ expect(result.isValid).toBe(false);
21
+ expect(result.error).toBeDefined();
22
+ });
23
+ it('should reject whitespace-only names', () => {
24
+ const result = validatePluginInput(' ');
25
+ expect(result.isValid).toBe(false);
26
+ expect(result.error).toBeDefined();
27
+ });
28
+ it('should reject invalid scoped packages', () => {
29
+ const result1 = validatePluginInput('@invalid');
30
+ expect(result1.isValid).toBe(false);
31
+ expect(result1.error).toBeDefined();
32
+ const result2 = validatePluginInput('@/package');
33
+ expect(result2.isValid).toBe(false);
34
+ expect(result2.error).toBeDefined();
35
+ const result3 = validatePluginInput('@org/');
36
+ expect(result3.isValid).toBe(false);
37
+ expect(result3.error).toBeDefined();
38
+ });
39
+ it('should reject names with uppercase letters', () => {
40
+ const result = validatePluginInput('MyPlugin');
41
+ expect(result.isValid).toBe(false);
42
+ expect(result.error).toContain('lowercase');
43
+ });
44
+ it('should reject names starting with numbers', () => {
45
+ const result = validatePluginInput('123plugin');
46
+ expect(result.isValid).toBe(false);
47
+ expect(result.error).toBeDefined();
48
+ });
49
+ it('should reject names with special characters', () => {
50
+ const result1 = validatePluginInput('plugin_name');
51
+ expect(result1.isValid).toBe(false);
52
+ const result2 = validatePluginInput('plugin.name');
53
+ expect(result2.isValid).toBe(false);
54
+ const result3 = validatePluginInput('plugin name');
55
+ expect(result3.isValid).toBe(false);
56
+ });
57
+ it('should trim whitespace before validation', () => {
58
+ expect(validatePluginInput(' release ')).toEqual({ isValid: true });
59
+ expect(validatePluginInput(' @ibm/analytics ')).toEqual({ isValid: true });
60
+ });
61
+ });
62
+ describe('toNpmPackageName', () => {
63
+ it('should prefix unscoped names with @launch77-shared/plugin-', () => {
64
+ expect(toNpmPackageName('release')).toBe('@launch77-shared/plugin-release');
65
+ expect(toNpmPackageName('my-plugin')).toBe('@launch77-shared/plugin-my-plugin');
66
+ expect(toNpmPackageName('analytics-v2')).toBe('@launch77-shared/plugin-analytics-v2');
67
+ });
68
+ it('should return scoped packages as-is', () => {
69
+ expect(toNpmPackageName('@ibm/analytics')).toBe('@ibm/analytics');
70
+ expect(toNpmPackageName('@launch77-shared/plugin-release')).toBe('@launch77-shared/plugin-release');
71
+ expect(toNpmPackageName('@org/package')).toBe('@org/package');
72
+ });
73
+ it('should trim whitespace', () => {
74
+ expect(toNpmPackageName(' release ')).toBe('@launch77-shared/plugin-release');
75
+ expect(toNpmPackageName(' @ibm/analytics ')).toBe('@ibm/analytics');
76
+ });
77
+ });
78
+ describe('resolvePluginLocation', () => {
79
+ let tempDir;
80
+ beforeEach(async () => {
81
+ // Create a temporary workspace directory
82
+ tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'plugin-resolver-test-'));
83
+ await fs.ensureDir(path.join(tempDir, 'plugins'));
84
+ });
85
+ afterEach(async () => {
86
+ // Clean up
87
+ await fs.remove(tempDir);
88
+ });
89
+ it('should resolve local plugins first', async () => {
90
+ // Create a valid local plugin
91
+ const pluginPath = path.join(tempDir, 'plugins', 'my-plugin');
92
+ await fs.ensureDir(pluginPath);
93
+ await fs.ensureDir(path.join(pluginPath, 'dist'));
94
+ await fs.writeFile(path.join(pluginPath, 'plugin.json'), JSON.stringify({ name: 'my-plugin', version: '1.0.0' }));
95
+ await fs.writeFile(path.join(pluginPath, 'dist/generator.js'), 'console.log("test")');
96
+ const result = await resolvePluginLocation('my-plugin', tempDir);
97
+ expect(result).toEqual({
98
+ source: 'local',
99
+ resolvedName: 'my-plugin',
100
+ localPath: pluginPath,
101
+ });
102
+ });
103
+ it('should resolve to npm if local plugin does not exist', async () => {
104
+ const result = await resolvePluginLocation('release', tempDir);
105
+ expect(result).toEqual({
106
+ source: 'npm',
107
+ resolvedName: 'release',
108
+ npmPackage: '@launch77-shared/plugin-release',
109
+ });
110
+ });
111
+ it('should resolve to npm if local plugin is incomplete (missing plugin.json)', async () => {
112
+ // Create incomplete local plugin (no plugin.json)
113
+ const pluginPath = path.join(tempDir, 'plugins', 'incomplete');
114
+ await fs.ensureDir(pluginPath);
115
+ await fs.ensureDir(path.join(pluginPath, 'dist'));
116
+ await fs.writeFile(path.join(pluginPath, 'dist/generator.js'), 'console.log("test")');
117
+ const result = await resolvePluginLocation('incomplete', tempDir);
118
+ expect(result).toEqual({
119
+ source: 'npm',
120
+ resolvedName: 'incomplete',
121
+ npmPackage: '@launch77-shared/plugin-incomplete',
122
+ });
123
+ });
124
+ it('should resolve to npm if local plugin is incomplete (missing generator.js)', async () => {
125
+ // Create incomplete local plugin (no generator.js)
126
+ const pluginPath = path.join(tempDir, 'plugins', 'incomplete');
127
+ await fs.ensureDir(pluginPath);
128
+ await fs.writeFile(path.join(pluginPath, 'plugin.json'), JSON.stringify({ name: 'incomplete', version: '1.0.0' }));
129
+ const result = await resolvePluginLocation('incomplete', tempDir);
130
+ expect(result).toEqual({
131
+ source: 'npm',
132
+ resolvedName: 'incomplete',
133
+ npmPackage: '@launch77-shared/plugin-incomplete',
134
+ });
135
+ });
136
+ it('should always resolve scoped packages to npm', async () => {
137
+ // Even if a directory exists locally, scoped names go to npm
138
+ const pluginPath = path.join(tempDir, 'plugins', '@ibm');
139
+ await fs.ensureDir(pluginPath);
140
+ const result = await resolvePluginLocation('@ibm/analytics', tempDir);
141
+ expect(result).toEqual({
142
+ source: 'npm',
143
+ resolvedName: '@ibm/analytics',
144
+ npmPackage: '@ibm/analytics',
145
+ });
146
+ });
147
+ it('should resolve scoped @launch77-shared packages to npm', async () => {
148
+ const result = await resolvePluginLocation('@launch77-shared/plugin-release', tempDir);
149
+ expect(result).toEqual({
150
+ source: 'npm',
151
+ resolvedName: '@launch77-shared/plugin-release',
152
+ npmPackage: '@launch77-shared/plugin-release',
153
+ });
154
+ });
155
+ it('should handle plugins directory not existing', async () => {
156
+ // Remove plugins directory
157
+ await fs.remove(path.join(tempDir, 'plugins'));
158
+ const result = await resolvePluginLocation('release', tempDir);
159
+ expect(result).toEqual({
160
+ source: 'npm',
161
+ resolvedName: 'release',
162
+ npmPackage: '@launch77-shared/plugin-release',
163
+ });
164
+ });
165
+ it('should trim whitespace from plugin names', async () => {
166
+ const result = await resolvePluginLocation(' release ', tempDir);
167
+ expect(result).toEqual({
168
+ source: 'npm',
169
+ resolvedName: 'release',
170
+ npmPackage: '@launch77-shared/plugin-release',
171
+ });
172
+ });
173
+ });
174
+ });
175
+ //# sourceMappingURL=plugin-resolver.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-resolver.test.js","sourceRoot":"","sources":["../../../../src/modules/plugin/lib/plugin-resolver.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Launch77Context } from '@launch77/plugin-runtime';
2
+ export interface CreatePluginRequest {
3
+ pluginName: string;
4
+ description?: string;
5
+ }
6
+ export interface CreatePluginResult {
7
+ pluginName: string;
8
+ pluginPath: string;
9
+ }
10
+ export declare class PluginCreateService {
11
+ /**
12
+ * Create a new plugin from template
13
+ */
14
+ createPlugin(request: CreatePluginRequest, context: Launch77Context): Promise<CreatePluginResult>;
15
+ }
16
+ //# sourceMappingURL=plugin-create-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-create-service.d.ts","sourceRoot":"","sources":["../../../../src/modules/plugin/services/plugin-create-service.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE/D,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,qBAAa,mBAAmB;IAC9B;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA4CxG"}
@@ -0,0 +1,47 @@
1
+ import * as path from 'path';
2
+ import fs from 'fs-extra';
3
+ import { validatePluginName } from '@launch77/plugin-runtime';
4
+ import { processTemplate, getPluginTemplatePath } from '../../../infrastructure/template.js';
5
+ import { toPascalCase } from '../../../utils/string.js';
6
+ export class PluginCreateService {
7
+ /**
8
+ * Create a new plugin from template
9
+ */
10
+ async createPlugin(request, context) {
11
+ const { pluginName, description } = request;
12
+ // 1. Validate plugin name
13
+ const nameValidation = validatePluginName(pluginName);
14
+ if (!nameValidation.isValid) {
15
+ throw new Error(nameValidation.error || 'Invalid plugin name');
16
+ }
17
+ // 2. Validate workspace context
18
+ if (!context.isValid) {
19
+ throw new Error('Must be run from within a Launch77 workspace');
20
+ }
21
+ // 3. Determine plugin path
22
+ const pluginPath = path.join(context.workspaceRoot, 'plugins', pluginName);
23
+ // 4. Check if plugin already exists
24
+ if (await fs.pathExists(pluginPath)) {
25
+ throw new Error(`Plugin '${pluginName}' already exists at ${pluginPath}`);
26
+ }
27
+ // 5. Get plugin template path
28
+ const templatePath = getPluginTemplatePath('plugin');
29
+ // 6. Check if template exists
30
+ if (!(await fs.pathExists(templatePath))) {
31
+ throw new Error(`Plugin template not found at ${templatePath}`);
32
+ }
33
+ // 7. Process template with context
34
+ await processTemplate(templatePath, pluginPath, {
35
+ appName: pluginName, // Required by TemplateContext but not used for plugin templates
36
+ pluginName,
37
+ pluginNamePascal: toPascalCase(pluginName),
38
+ workspaceName: context.workspaceName,
39
+ description: description || `Launch77 plugin for ${pluginName}`,
40
+ });
41
+ return {
42
+ pluginName,
43
+ pluginPath,
44
+ };
45
+ }
46
+ }
47
+ //# sourceMappingURL=plugin-create-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-create-service.js","sourceRoot":"","sources":["../../../../src/modules/plugin/services/plugin-create-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,OAAO,EAAE,MAAM,UAAU,CAAA;AAEzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAA;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAcvD,MAAM,OAAO,mBAAmB;IAC9B;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,OAA4B,EAAE,OAAwB;QACvE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,OAAO,CAAA;QAE3C,0BAA0B;QAC1B,MAAM,cAAc,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAA;QACrD,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,KAAK,IAAI,qBAAqB,CAAC,CAAA;QAChE,CAAC;QAED,gCAAgC;QAChC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;QACjE,CAAC;QAED,2BAA2B;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;QAE1E,oCAAoC;QACpC,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,WAAW,UAAU,uBAAuB,UAAU,EAAE,CAAC,CAAA;QAC3E,CAAC;QAED,8BAA8B;QAC9B,MAAM,YAAY,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAA;QAEpD,8BAA8B;QAC9B,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,gCAAgC,YAAY,EAAE,CAAC,CAAA;QACjE,CAAC;QAED,mCAAmC;QACnC,MAAM,eAAe,CAAC,YAAY,EAAE,UAAU,EAAE;YAC9C,OAAO,EAAE,UAAU,EAAE,gEAAgE;YACrF,UAAU;YACV,gBAAgB,EAAE,YAAY,CAAC,UAAU,CAAC;YAC1C,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,WAAW,EAAE,WAAW,IAAI,uBAAuB,UAAU,EAAE;SAChE,CAAC,CAAA;QAEF,OAAO;YACL,UAAU;YACV,UAAU;SACX,CAAA;IACH,CAAC;CACF"}
@@ -1,10 +1,36 @@
1
- import type { Launch77Context } from '../../../utils/launch77-context.js';
1
+ import type { Launch77Context } from '@launch77/plugin-runtime';
2
2
  import type { InstallPluginRequest, InstallPluginResult } from '../types/plugin-types.js';
3
3
  export declare class PluginService {
4
4
  /**
5
- * Install a plugin to the current app
5
+ * Validate that we're in a valid package directory and return the target type
6
6
  */
7
- installPlugin(request: InstallPluginRequest, context: Launch77Context): Promise<InstallPluginResult>;
7
+ private validateContext;
8
+ /**
9
+ * Validate plugin name, resolve its location, and download if needed
10
+ */
11
+ private validateAndResolvePlugin;
12
+ /**
13
+ * Read plugin metadata and validate it supports the current target
14
+ */
15
+ private validatePluginTargets;
16
+ /**
17
+ * Check if plugin is already installed and return early-exit result if so
18
+ */
19
+ private checkExistingInstallation;
20
+ /**
21
+ * Install a plugin to the current package
22
+ */
23
+ installPlugin(request: InstallPluginRequest, context: Launch77Context, logger?: (message: string) => void): Promise<InstallPluginResult>;
24
+ /**
25
+ * Download and install an npm plugin package
26
+ */
27
+ private downloadNpmPlugin;
28
+ private getPackagePath;
8
29
  private runGenerator;
30
+ private isPluginInstalled;
31
+ /**
32
+ * Write plugin installation metadata to the target package's package.json
33
+ */
34
+ private writePluginManifest;
9
35
  }
10
36
  //# sourceMappingURL=plugin-svc.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-svc.d.ts","sourceRoot":"","sources":["../../../../src/modules/plugin/services/plugin-svc.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;AACzE,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAEzF,qBAAa,aAAa;IACxB;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;YA0B5F,YAAY;CAY3B"}
1
+ {"version":3,"file":"plugin-svc.d.ts","sourceRoot":"","sources":["../../../../src/modules/plugin/services/plugin-svc.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAA0F,MAAM,0BAA0B,CAAA;AACvJ,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAoBzF,qBAAa,aAAa;IACxB;;OAEG;IACH,OAAO,CAAC,eAAe;IAOvB;;OAEG;YACW,wBAAwB;IAkCtC;;OAEG;YACW,qBAAqB;IAcnC;;OAEG;YACW,yBAAyB;IAmBvC;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA6B3J;;OAEG;YACW,iBAAiB;IAkB/B,OAAO,CAAC,cAAc;YAgBR,YAAY;YAeZ,iBAAiB;IAmB/B;;OAEG;YACW,mBAAmB;CA4BlC"}
@@ -1,26 +1,123 @@
1
1
  import * as path from 'path';
2
+ import * as fs from 'fs/promises';
3
+ import chalk from 'chalk';
2
4
  import { execa } from 'execa';
3
- import { PluginInstallationError, PluginNotFoundError, InvalidPluginContextError, createInvalidContextError } from '../errors/plugin-errors.js';
4
- import { pluginExists, getPluginPath } from '../lib/plugin-registry.js';
5
+ import { readPluginMetadata } from '@launch77/plugin-runtime';
6
+ import { PluginInstallationError, InvalidPluginContextError, createInvalidContextError, MissingPluginTargetsError, createInvalidTargetError, NpmInstallationError, PluginResolutionError } from '../errors/plugin-errors.js';
7
+ import { validatePluginInput, resolvePluginLocation } from '../lib/plugin-resolver.js';
8
+ /**
9
+ * Map location type to target string
10
+ */
11
+ function locationTypeToTarget(locationType) {
12
+ switch (locationType) {
13
+ case 'workspace-app':
14
+ return 'app';
15
+ case 'workspace-library':
16
+ return 'library';
17
+ case 'workspace-plugin':
18
+ return 'plugin';
19
+ case 'workspace-app-template':
20
+ return 'app-template';
21
+ default:
22
+ return null;
23
+ }
24
+ }
5
25
  export class PluginService {
6
26
  /**
7
- * Install a plugin to the current app
27
+ * Validate that we're in a valid package directory and return the target type
8
28
  */
9
- async installPlugin(request, context) {
10
- const { pluginName } = request;
11
- // Validate context - must be in app directory
12
- if (context.locationType !== 'workspace-app')
29
+ validateContext(context) {
30
+ const currentTarget = locationTypeToTarget(context.locationType);
31
+ if (!currentTarget)
13
32
  throw createInvalidContextError(context.locationType);
14
33
  if (!context.appName)
15
- throw new InvalidPluginContextError('Could not determine app name. This is a bug. Please report it.');
16
- // Get app directory path
17
- const appPath = path.join(context.appsDir, context.appName);
18
- // Check if plugin exists
19
- if (!(await pluginExists(pluginName)))
20
- throw new PluginNotFoundError(pluginName);
21
- const pluginPath = getPluginPath(pluginName);
22
- // Run generator
23
- await this.runGenerator(pluginPath, appPath, context);
34
+ throw new InvalidPluginContextError('Could not determine package name. This is a bug. Please report it.');
35
+ return currentTarget;
36
+ }
37
+ /**
38
+ * Validate plugin name, resolve its location, and download if needed
39
+ */
40
+ async validateAndResolvePlugin(pluginName, workspaceRoot, logger) {
41
+ logger(chalk.blue(`\n🔍 Resolving plugin "${pluginName}"...`));
42
+ logger(` ├─ Validating plugin name...`);
43
+ const validation = validatePluginInput(pluginName);
44
+ if (!validation.isValid) {
45
+ throw new PluginResolutionError(pluginName, validation.error || 'Invalid plugin name');
46
+ }
47
+ logger(` │ └─ ${chalk.green('✓')} Valid plugin name`);
48
+ logger(` ├─ Checking local workspace: ${chalk.dim(`plugins/${pluginName}`)}`);
49
+ const resolution = await resolvePluginLocation(pluginName, workspaceRoot);
50
+ let pluginPath;
51
+ if (resolution.source === 'local') {
52
+ logger(` │ └─ ${chalk.green('✓')} Found local plugin`);
53
+ pluginPath = resolution.localPath;
54
+ }
55
+ else {
56
+ logger(` │ └─ ${chalk.dim('Not found locally')}`);
57
+ logger(` ├─ Resolving to npm package: ${chalk.cyan(resolution.npmPackage)}`);
58
+ pluginPath = await this.downloadNpmPlugin(resolution.npmPackage, workspaceRoot, logger);
59
+ }
60
+ logger(` └─ ${chalk.green('✓')} Plugin resolved\n`);
61
+ return {
62
+ pluginPath,
63
+ source: resolution.source,
64
+ npmPackage: resolution.npmPackage,
65
+ };
66
+ }
67
+ /**
68
+ * Read plugin metadata and validate it supports the current target
69
+ */
70
+ async validatePluginTargets(pluginPath, pluginName, currentTarget) {
71
+ const metadata = await readPluginMetadata(pluginPath);
72
+ if (!metadata.targets || metadata.targets.length === 0) {
73
+ throw new MissingPluginTargetsError(pluginName);
74
+ }
75
+ if (!metadata.targets.includes(currentTarget)) {
76
+ throw createInvalidTargetError(pluginName, currentTarget, metadata.targets);
77
+ }
78
+ return metadata;
79
+ }
80
+ /**
81
+ * Check if plugin is already installed and return early-exit result if so
82
+ */
83
+ async checkExistingInstallation(pluginName, packagePath, logger) {
84
+ const existingInstallation = await this.isPluginInstalled(pluginName, packagePath);
85
+ if (existingInstallation) {
86
+ logger(chalk.yellow(`\nℹ️ Plugin '${pluginName}' is already installed in this package.\n`));
87
+ logger(`Package: ${chalk.cyan(existingInstallation.package)} (${existingInstallation.source})`);
88
+ logger(`Version: ${existingInstallation.version}`);
89
+ logger(`Installed: ${existingInstallation.installedAt}\n`);
90
+ logger(chalk.gray('To reinstall: Remove from package.json launch77.installedPlugins'));
91
+ logger(chalk.gray('(plugin:remove command coming soon)\n'));
92
+ return {
93
+ pluginName,
94
+ filesInstalled: false,
95
+ packageJsonUpdated: false,
96
+ dependenciesInstalled: false,
97
+ };
98
+ }
99
+ return null;
100
+ }
101
+ /**
102
+ * Install a plugin to the current package
103
+ */
104
+ async installPlugin(request, context, logger = console.log) {
105
+ const { pluginName } = request;
106
+ const currentTarget = this.validateContext(context);
107
+ const { pluginPath, source, npmPackage } = await this.validateAndResolvePlugin(pluginName, context.workspaceRoot, logger);
108
+ const metadata = await this.validatePluginTargets(pluginPath, pluginName, currentTarget);
109
+ const packagePath = this.getPackagePath(context);
110
+ const earlyExit = await this.checkExistingInstallation(pluginName, packagePath, logger);
111
+ if (earlyExit)
112
+ return earlyExit;
113
+ await this.runGenerator(pluginPath, packagePath, context);
114
+ const packageName = source === 'npm' ? npmPackage : pluginName;
115
+ await this.writePluginManifest(packagePath, {
116
+ pluginName,
117
+ packageName,
118
+ version: metadata.version,
119
+ source,
120
+ });
24
121
  return {
25
122
  pluginName,
26
123
  filesInstalled: true,
@@ -28,10 +125,45 @@ export class PluginService {
28
125
  dependenciesInstalled: true,
29
126
  };
30
127
  }
128
+ /**
129
+ * Download and install an npm plugin package
130
+ */
131
+ async downloadNpmPlugin(npmPackage, workspaceRoot, logger) {
132
+ logger(` └─ Installing from npm: ${chalk.cyan(npmPackage)}...`);
133
+ try {
134
+ // Install the npm package to the workspace
135
+ await execa('npm', ['install', npmPackage, '--save-dev'], {
136
+ cwd: workspaceRoot,
137
+ stdio: 'pipe', // Capture output for clean logging
138
+ });
139
+ // Return path to installed plugin in node_modules
140
+ const pluginPath = path.join(workspaceRoot, 'node_modules', npmPackage);
141
+ return pluginPath;
142
+ }
143
+ catch (error) {
144
+ throw new NpmInstallationError(npmPackage, error instanceof Error ? error : undefined);
145
+ }
146
+ }
147
+ getPackagePath(context) {
148
+ // Determine the base directory based on location type
149
+ switch (context.locationType) {
150
+ case 'workspace-app':
151
+ return path.join(context.appsDir, context.appName);
152
+ case 'workspace-library':
153
+ return path.join(context.workspaceRoot, 'libraries', context.appName);
154
+ case 'workspace-plugin':
155
+ return path.join(context.workspaceRoot, 'plugins', context.appName);
156
+ case 'workspace-app-template':
157
+ return path.join(context.workspaceRoot, 'app-templates', context.appName);
158
+ default:
159
+ throw new InvalidPluginContextError(`Cannot install plugin from ${context.locationType}`);
160
+ }
161
+ }
31
162
  async runGenerator(pluginPath, appPath, context) {
32
163
  try {
33
164
  const generatorPath = path.join(pluginPath, 'dist/generator.js');
34
- await execa('node', [generatorPath, `--appPath=${appPath}`, `--appName=${context.appName}`, `--workspaceName=${context.workspaceName}`, `--pluginPath=${pluginPath}`], {
165
+ const args = [generatorPath, `--appPath=${appPath}`, `--appName=${context.appName}`, `--workspaceName=${context.workspaceName}`, `--pluginPath=${pluginPath}`];
166
+ await execa('node', args, {
35
167
  cwd: pluginPath,
36
168
  stdio: 'inherit',
37
169
  });
@@ -40,5 +172,48 @@ export class PluginService {
40
172
  throw new PluginInstallationError(`Generator failed: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
41
173
  }
42
174
  }
175
+ async isPluginInstalled(pluginName, packagePath) {
176
+ try {
177
+ const packageJsonPath = path.join(packagePath, 'package.json');
178
+ const packageJsonContent = await fs.readFile(packageJsonPath, 'utf-8');
179
+ const packageJson = JSON.parse(packageJsonContent);
180
+ const manifest = packageJson.launch77;
181
+ if (manifest?.installedPlugins?.[pluginName]) {
182
+ return manifest.installedPlugins[pluginName];
183
+ }
184
+ return null;
185
+ }
186
+ catch (error) {
187
+ // If package.json doesn't exist or can't be read, assume not installed
188
+ return null;
189
+ }
190
+ }
191
+ /**
192
+ * Write plugin installation metadata to the target package's package.json
193
+ */
194
+ async writePluginManifest(packagePath, installationInfo) {
195
+ try {
196
+ const packageJsonPath = path.join(packagePath, 'package.json');
197
+ const packageJsonContent = await fs.readFile(packageJsonPath, 'utf-8');
198
+ const packageJson = JSON.parse(packageJsonContent);
199
+ if (!packageJson.launch77) {
200
+ packageJson.launch77 = {};
201
+ }
202
+ if (!packageJson.launch77.installedPlugins) {
203
+ packageJson.launch77.installedPlugins = {};
204
+ }
205
+ const manifest = packageJson.launch77;
206
+ manifest.installedPlugins[installationInfo.pluginName] = {
207
+ package: installationInfo.packageName,
208
+ version: installationInfo.version,
209
+ installedAt: new Date().toISOString(),
210
+ source: installationInfo.source,
211
+ };
212
+ await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n', 'utf-8');
213
+ }
214
+ catch (error) {
215
+ throw new PluginInstallationError(`Failed to write plugin manifest: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
216
+ }
217
+ }
43
218
  }
44
219
  //# sourceMappingURL=plugin-svc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-svc.js","sourceRoot":"","sources":["../../../../src/modules/plugin/services/plugin-svc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAE7B,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AAC/I,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAKvE,MAAM,OAAO,aAAa;IACxB;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,OAA6B,EAAE,OAAwB;QACzE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;QAE9B,8CAA8C;QAC9C,IAAI,OAAO,CAAC,YAAY,KAAK,eAAe;YAAE,MAAM,yBAAyB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;QACnG,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,MAAM,IAAI,yBAAyB,CAAC,gEAAgE,CAAC,CAAA;QAE3H,yBAAyB;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;QAE3D,yBAAyB;QACzB,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;YAAE,MAAM,IAAI,mBAAmB,CAAC,UAAU,CAAC,CAAA;QAEhF,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,CAAA;QAE5C,gBAAgB;QAChB,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QAErD,OAAO;YACL,UAAU;YACV,cAAc,EAAE,IAAI;YACpB,kBAAkB,EAAE,IAAI;YACxB,qBAAqB,EAAE,IAAI;SAC5B,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,UAAkB,EAAE,OAAe,EAAE,OAAwB;QACtF,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAA;YAEhE,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,aAAa,OAAO,EAAE,EAAE,aAAa,OAAO,CAAC,OAAO,EAAE,EAAE,mBAAmB,OAAO,CAAC,aAAa,EAAE,EAAE,gBAAgB,UAAU,EAAE,CAAC,EAAE;gBACrK,GAAG,EAAE,UAAU;gBACf,KAAK,EAAE,SAAS;aACjB,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,uBAAuB,CAAC,qBAAqB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAC9J,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"plugin-svc.js","sourceRoot":"","sources":["../../../../src/modules/plugin/services/plugin-svc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plugin-svc.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-svc.test.d.ts","sourceRoot":"","sources":["../../../../src/modules/plugin/services/plugin-svc.test.ts"],"names":[],"mappings":""}