@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,362 @@
1
+ import { describe, test, 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 { PluginService } from './plugin-svc.js';
6
+ describe('PluginService', () => {
7
+ let tempDir;
8
+ let service;
9
+ beforeEach(async () => {
10
+ tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'plugin-svc-test-'));
11
+ service = new PluginService();
12
+ });
13
+ afterEach(async () => {
14
+ await fs.remove(tempDir);
15
+ });
16
+ describe('validateContext', () => {
17
+ // Valid contexts - test return values
18
+ test('should return "app" for workspace-app location', () => {
19
+ const context = {
20
+ isValid: true,
21
+ locationType: 'workspace-app',
22
+ workspaceRoot: tempDir,
23
+ workspaceName: 'test-workspace',
24
+ workspaceVersion: '1.0.0',
25
+ appsDir: path.join(tempDir, 'apps'),
26
+ packageName: 'test-app',
27
+ appName: 'test-app',
28
+ };
29
+ const result = service.validateContext(context);
30
+ expect(result).toBe('app');
31
+ });
32
+ test('should return "library" for workspace-library location', () => {
33
+ const context = {
34
+ isValid: true,
35
+ locationType: 'workspace-library',
36
+ workspaceRoot: tempDir,
37
+ workspaceName: 'test-workspace',
38
+ workspaceVersion: '1.0.0',
39
+ appsDir: path.join(tempDir, 'apps'),
40
+ packageName: 'test-library',
41
+ appName: 'test-library',
42
+ };
43
+ const result = service.validateContext(context);
44
+ expect(result).toBe('library');
45
+ });
46
+ test('should return "plugin" for workspace-plugin location', () => {
47
+ const context = {
48
+ isValid: true,
49
+ locationType: 'workspace-plugin',
50
+ workspaceRoot: tempDir,
51
+ workspaceName: 'test-workspace',
52
+ workspaceVersion: '1.0.0',
53
+ appsDir: path.join(tempDir, 'apps'),
54
+ packageName: 'test-plugin',
55
+ appName: 'test-plugin',
56
+ };
57
+ const result = service.validateContext(context);
58
+ expect(result).toBe('plugin');
59
+ });
60
+ test('should return "app-template" for workspace-app-template location', () => {
61
+ const context = {
62
+ isValid: true,
63
+ locationType: 'workspace-app-template',
64
+ workspaceRoot: tempDir,
65
+ workspaceName: 'test-workspace',
66
+ workspaceVersion: '1.0.0',
67
+ appsDir: path.join(tempDir, 'apps'),
68
+ packageName: 'test-template',
69
+ appName: 'test-template',
70
+ };
71
+ const result = service.validateContext(context);
72
+ expect(result).toBe('app-template');
73
+ });
74
+ // Invalid contexts - test exact error messages
75
+ test('should throw InvalidPluginContextError for workspace-root', () => {
76
+ const context = {
77
+ isValid: true,
78
+ locationType: 'workspace-root',
79
+ workspaceRoot: tempDir,
80
+ workspaceName: 'test-workspace',
81
+ workspaceVersion: '1.0.0',
82
+ appsDir: path.join(tempDir, 'apps'),
83
+ packageName: 'workspace',
84
+ appName: undefined,
85
+ };
86
+ expect(() => service.validateContext(context)).toThrow('plugin:install must be run from within a package directory.');
87
+ });
88
+ test('should throw InvalidPluginContextError for non-workspace', () => {
89
+ const context = {
90
+ isValid: false,
91
+ locationType: 'non-workspace',
92
+ workspaceRoot: tempDir,
93
+ workspaceName: 'test-workspace',
94
+ workspaceVersion: '1.0.0',
95
+ appsDir: path.join(tempDir, 'apps'),
96
+ packageName: 'unknown',
97
+ appName: undefined,
98
+ };
99
+ expect(() => service.validateContext(context)).toThrow('plugin:install must be run from within a package directory.');
100
+ });
101
+ test('should throw InvalidPluginContextError when appName is missing', () => {
102
+ const context = {
103
+ isValid: true,
104
+ locationType: 'workspace-app',
105
+ workspaceRoot: tempDir,
106
+ workspaceName: 'test-workspace',
107
+ workspaceVersion: '1.0.0',
108
+ appsDir: path.join(tempDir, 'apps'),
109
+ packageName: 'test-app',
110
+ appName: undefined,
111
+ };
112
+ expect(() => service.validateContext(context)).toThrow('Could not determine package name. This is a bug. Please report it.');
113
+ });
114
+ test('should throw InvalidPluginContextError when appName is empty string', () => {
115
+ const context = {
116
+ isValid: true,
117
+ locationType: 'workspace-app',
118
+ workspaceRoot: tempDir,
119
+ workspaceName: 'test-workspace',
120
+ workspaceVersion: '1.0.0',
121
+ appsDir: path.join(tempDir, 'apps'),
122
+ packageName: 'test-app',
123
+ appName: '',
124
+ };
125
+ expect(() => service.validateContext(context)).toThrow('Could not determine package name. This is a bug. Please report it.');
126
+ });
127
+ });
128
+ describe('validatePluginTargets', () => {
129
+ // Valid scenarios - verify metadata returned
130
+ test('should return metadata when plugin targets current package type', async () => {
131
+ const pluginDir = path.join(tempDir, 'test-plugin');
132
+ await fs.ensureDir(pluginDir);
133
+ await fs.writeJson(path.join(pluginDir, 'plugin.json'), {
134
+ name: 'test-plugin',
135
+ version: '1.0.0',
136
+ targets: ['app', 'library'],
137
+ });
138
+ const result = await service.validatePluginTargets(pluginDir, 'test-plugin', 'app');
139
+ expect(result).toEqual({
140
+ name: 'test-plugin',
141
+ version: '1.0.0',
142
+ targets: ['app', 'library'],
143
+ });
144
+ });
145
+ test('should accept plugin with multiple targets including current', async () => {
146
+ const pluginDir = path.join(tempDir, 'multi-target-plugin');
147
+ await fs.ensureDir(pluginDir);
148
+ await fs.writeJson(path.join(pluginDir, 'plugin.json'), {
149
+ name: 'multi-target-plugin',
150
+ version: '2.0.0',
151
+ targets: ['app', 'library', 'plugin', 'app-template'],
152
+ });
153
+ const result = await service.validatePluginTargets(pluginDir, 'multi-target-plugin', 'library');
154
+ expect(result.targets).toContain('library');
155
+ expect(result.targets).toHaveLength(4);
156
+ });
157
+ test('should handle plugin.json with optional fields (pluginDependencies, libraryDependencies)', async () => {
158
+ const pluginDir = path.join(tempDir, 'full-plugin');
159
+ await fs.ensureDir(pluginDir);
160
+ await fs.writeJson(path.join(pluginDir, 'plugin.json'), {
161
+ name: 'full-plugin',
162
+ version: '1.5.0',
163
+ targets: ['app'],
164
+ pluginDependencies: { 'other-plugin': '^1.0.0' },
165
+ libraryDependencies: { react: '^18.0.0' },
166
+ });
167
+ const result = await service.validatePluginTargets(pluginDir, 'full-plugin', 'app');
168
+ expect(result.pluginDependencies).toEqual({ 'other-plugin': '^1.0.0' });
169
+ expect(result.libraryDependencies).toEqual({ react: '^18.0.0' });
170
+ });
171
+ // Error scenarios - test exact error messages
172
+ test('should throw MissingPluginTargetsError when targets is undefined', async () => {
173
+ const pluginDir = path.join(tempDir, 'no-targets-plugin');
174
+ await fs.ensureDir(pluginDir);
175
+ await fs.writeJson(path.join(pluginDir, 'plugin.json'), {
176
+ name: 'no-targets-plugin',
177
+ version: '1.0.0',
178
+ });
179
+ await expect(service.validatePluginTargets(pluginDir, 'no-targets-plugin', 'app')).rejects.toThrow("Plugin 'no-targets-plugin' is missing the required 'targets' field in plugin.json.");
180
+ });
181
+ test('should throw MissingPluginTargetsError when targets is empty array', async () => {
182
+ const pluginDir = path.join(tempDir, 'empty-targets-plugin');
183
+ await fs.ensureDir(pluginDir);
184
+ await fs.writeJson(path.join(pluginDir, 'plugin.json'), {
185
+ name: 'empty-targets-plugin',
186
+ version: '1.0.0',
187
+ targets: [],
188
+ });
189
+ await expect(service.validatePluginTargets(pluginDir, 'empty-targets-plugin', 'app')).rejects.toThrow("Plugin 'empty-targets-plugin' is missing the required 'targets' field in plugin.json.");
190
+ });
191
+ test('should throw error when targets does not include current target', async () => {
192
+ const pluginDir = path.join(tempDir, 'incompatible-plugin');
193
+ await fs.ensureDir(pluginDir);
194
+ await fs.writeJson(path.join(pluginDir, 'plugin.json'), {
195
+ name: 'incompatible-plugin',
196
+ version: '1.0.0',
197
+ targets: ['library', 'plugin'],
198
+ });
199
+ await expect(service.validatePluginTargets(pluginDir, 'incompatible-plugin', 'app')).rejects.toThrow("Plugin 'incompatible-plugin' cannot be installed in a 'app' package.");
200
+ });
201
+ test('should handle missing plugin.json file gracefully', async () => {
202
+ const pluginDir = path.join(tempDir, 'no-plugin-json');
203
+ await fs.ensureDir(pluginDir);
204
+ await expect(service.validatePluginTargets(pluginDir, 'no-plugin-json', 'app')).rejects.toThrow();
205
+ });
206
+ });
207
+ describe('checkExistingInstallation', () => {
208
+ const mockLogger = (message) => {
209
+ /* capture logs */
210
+ };
211
+ // Not installed - return null
212
+ test('should return null when plugin is not installed', async () => {
213
+ const packageDir = path.join(tempDir, 'app1');
214
+ await fs.ensureDir(packageDir);
215
+ await fs.writeJson(path.join(packageDir, 'package.json'), {
216
+ name: 'app1',
217
+ version: '1.0.0',
218
+ launch77: {
219
+ installedPlugins: {},
220
+ },
221
+ });
222
+ const result = await service.checkExistingInstallation('test-plugin', packageDir, mockLogger);
223
+ expect(result).toBeNull();
224
+ });
225
+ test('should return null when package.json does not exist', async () => {
226
+ const packageDir = path.join(tempDir, 'nonexistent');
227
+ await fs.ensureDir(packageDir);
228
+ const result = await service.checkExistingInstallation('test-plugin', packageDir, mockLogger);
229
+ expect(result).toBeNull();
230
+ });
231
+ test('should return null when launch77 field is missing', async () => {
232
+ const packageDir = path.join(tempDir, 'app2');
233
+ await fs.ensureDir(packageDir);
234
+ await fs.writeJson(path.join(packageDir, 'package.json'), {
235
+ name: 'app2',
236
+ version: '1.0.0',
237
+ });
238
+ const result = await service.checkExistingInstallation('test-plugin', packageDir, mockLogger);
239
+ expect(result).toBeNull();
240
+ });
241
+ test('should return null when installedPlugins is missing', async () => {
242
+ const packageDir = path.join(tempDir, 'app3');
243
+ await fs.ensureDir(packageDir);
244
+ await fs.writeJson(path.join(packageDir, 'package.json'), {
245
+ name: 'app3',
246
+ version: '1.0.0',
247
+ launch77: {},
248
+ });
249
+ const result = await service.checkExistingInstallation('test-plugin', packageDir, mockLogger);
250
+ expect(result).toBeNull();
251
+ });
252
+ test('should return null when installedPlugins exists but plugin not in it', async () => {
253
+ const packageDir = path.join(tempDir, 'app4');
254
+ await fs.ensureDir(packageDir);
255
+ await fs.writeJson(path.join(packageDir, 'package.json'), {
256
+ name: 'app4',
257
+ version: '1.0.0',
258
+ launch77: {
259
+ installedPlugins: {
260
+ 'other-plugin': {
261
+ package: 'other-plugin',
262
+ version: '1.0.0',
263
+ installedAt: '2024-01-01T00:00:00.000Z',
264
+ source: 'local',
265
+ },
266
+ },
267
+ },
268
+ });
269
+ const result = await service.checkExistingInstallation('test-plugin', packageDir, mockLogger);
270
+ expect(result).toBeNull();
271
+ });
272
+ // Already installed - return result object
273
+ test('should return early-exit result with correct structure when plugin is installed', async () => {
274
+ const packageDir = path.join(tempDir, 'app5');
275
+ await fs.ensureDir(packageDir);
276
+ await fs.writeJson(path.join(packageDir, 'package.json'), {
277
+ name: 'app5',
278
+ version: '1.0.0',
279
+ launch77: {
280
+ installedPlugins: {
281
+ 'test-plugin': {
282
+ package: 'test-plugin',
283
+ version: '1.5.0',
284
+ installedAt: '2024-01-15T10:30:00.000Z',
285
+ source: 'local',
286
+ },
287
+ },
288
+ },
289
+ });
290
+ const result = await service.checkExistingInstallation('test-plugin', packageDir, mockLogger);
291
+ expect(result).toEqual({
292
+ pluginName: 'test-plugin',
293
+ filesInstalled: false,
294
+ packageJsonUpdated: false,
295
+ dependenciesInstalled: false,
296
+ });
297
+ });
298
+ test('should log correct message for local plugin (package name matches plugin name)', async () => {
299
+ const packageDir = path.join(tempDir, 'app6');
300
+ await fs.ensureDir(packageDir);
301
+ await fs.writeJson(path.join(packageDir, 'package.json'), {
302
+ name: 'app6',
303
+ version: '1.0.0',
304
+ launch77: {
305
+ installedPlugins: {
306
+ release: {
307
+ package: 'release',
308
+ version: '2.0.0',
309
+ installedAt: '2024-02-01T12:00:00.000Z',
310
+ source: 'local',
311
+ },
312
+ },
313
+ },
314
+ });
315
+ const logs = [];
316
+ const captureLogger = (message) => logs.push(message);
317
+ const result = await service.checkExistingInstallation('release', packageDir, captureLogger);
318
+ expect(result).not.toBeNull();
319
+ expect(logs.some((log) => log.includes("Plugin 'release' is already installed"))).toBe(true);
320
+ expect(logs.some((log) => log.includes('release') && log.includes('local'))).toBe(true);
321
+ });
322
+ test('should log correct message for npm plugin (package name is scoped)', async () => {
323
+ const packageDir = path.join(tempDir, 'app7');
324
+ await fs.ensureDir(packageDir);
325
+ await fs.writeJson(path.join(packageDir, 'package.json'), {
326
+ name: 'app7',
327
+ version: '1.0.0',
328
+ launch77: {
329
+ installedPlugins: {
330
+ analytics: {
331
+ package: '@myorg/analytics-plugin',
332
+ version: '3.1.0',
333
+ installedAt: '2024-03-01T15:45:00.000Z',
334
+ source: 'npm',
335
+ },
336
+ },
337
+ },
338
+ });
339
+ const logs = [];
340
+ const captureLogger = (message) => logs.push(message);
341
+ const result = await service.checkExistingInstallation('analytics', packageDir, captureLogger);
342
+ expect(result).not.toBeNull();
343
+ expect(logs.some((log) => log.includes("Plugin 'analytics' is already installed"))).toBe(true);
344
+ expect(logs.some((log) => log.includes('@myorg/analytics-plugin') && log.includes('npm'))).toBe(true);
345
+ });
346
+ // Edge cases
347
+ test('should handle malformed package.json gracefully (invalid JSON)', async () => {
348
+ const packageDir = path.join(tempDir, 'app8');
349
+ await fs.ensureDir(packageDir);
350
+ await fs.writeFile(path.join(packageDir, 'package.json'), '{ invalid json }');
351
+ const result = await service.checkExistingInstallation('test-plugin', packageDir, mockLogger);
352
+ expect(result).toBeNull();
353
+ });
354
+ test('should handle package.json read errors (permissions, etc.)', async () => {
355
+ const packageDir = path.join(tempDir, 'app9');
356
+ // Don't create the directory - simulate permission/access error
357
+ const result = await service.checkExistingInstallation('test-plugin', packageDir, mockLogger);
358
+ expect(result).toBeNull();
359
+ });
360
+ });
361
+ });
362
+ //# sourceMappingURL=plugin-svc.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-svc.test.js","sourceRoot":"","sources":["../../../../src/modules/plugin/services/plugin-svc.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function releaseInitCommand(): Command;
3
+ //# sourceMappingURL=release-init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-init.d.ts","sourceRoot":"","sources":["../../../../src/modules/release/commands/release-init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQnC,wBAAgB,kBAAkB,IAAI,OAAO,CA4F5C"}
@@ -0,0 +1,92 @@
1
+ import chalk from 'chalk';
2
+ import { Command } from 'commander';
3
+ import ora from 'ora';
4
+ import { detectLaunch77Context } from '@launch77/plugin-runtime';
5
+ import { GitService, GitHubService, GitHubCLINotInstalledError, GitHubNotAuthenticatedError, NotInWorkspaceError, GitHubNotConnectedError } from '../../git/index.js';
6
+ import { ReleaseService } from '../services/release-service.js';
7
+ import { ChangesetNotInitializedError } from '../errors/release-errors.js';
8
+ export function releaseInitCommand() {
9
+ return new Command('release:init').description('Initialize complete release workflow setup').action(async () => {
10
+ console.log(chalk.blue('\n🚀 Initializing release workflow...\n'));
11
+ const cwd = process.cwd();
12
+ const gitService = new GitService();
13
+ const githubService = new GitHubService();
14
+ const releaseService = new ReleaseService(githubService);
15
+ try {
16
+ // 1. Verify we're in a workspace root
17
+ const context = await detectLaunch77Context(cwd);
18
+ if (!context.isValid || context.locationType !== 'workspace-root') {
19
+ throw new NotInWorkspaceError(cwd);
20
+ }
21
+ // 2. Verify prerequisites (GitHub CLI installed and authenticated)
22
+ const spinner = ora('Checking prerequisites...').start();
23
+ await githubService.verifyPrerequisites();
24
+ spinner.succeed('Prerequisites verified');
25
+ // 3. Ensure connected to GitHub
26
+ try {
27
+ await gitService.ensureConnectedToGitHub(context.workspaceRoot);
28
+ }
29
+ catch (error) {
30
+ if (error instanceof GitHubNotConnectedError) {
31
+ console.error(chalk.red(`\n❌ ${error.message}\n`));
32
+ console.log(chalk.gray(` Connect to GitHub first: ${chalk.cyan('launch77 git:connect')}\n`));
33
+ process.exit(1);
34
+ }
35
+ throw error;
36
+ }
37
+ // 4. Get repository information
38
+ const repoSpinner = ora('Detecting repository...').start();
39
+ const { owner, repo } = await githubService.getCurrentRepository(context.workspaceRoot);
40
+ repoSpinner.succeed(`Repository: ${owner}/${repo}`);
41
+ // 5. Fix changeset config access setting
42
+ console.log(chalk.cyan('\n📝 Configuring changesets...\n'));
43
+ try {
44
+ const changesetSpinner = ora('Checking changeset configuration...').start();
45
+ const wasChanged = await releaseService.fixChangesetAccess(context.workspaceRoot);
46
+ if (wasChanged) {
47
+ changesetSpinner.succeed('Updated .changeset/config.json access to "public"');
48
+ }
49
+ else {
50
+ changesetSpinner.succeed('Changeset already configured correctly');
51
+ }
52
+ }
53
+ catch (error) {
54
+ if (error instanceof ChangesetNotInitializedError) {
55
+ console.error(chalk.red(`\n❌ ${error.message}\n`));
56
+ console.log(chalk.gray(' Changesets should be initialized during workspace creation.'));
57
+ console.log(chalk.gray(` Run manually: ${chalk.cyan('npx changeset init')}\n`));
58
+ process.exit(1);
59
+ }
60
+ throw error;
61
+ }
62
+ // 6. Setup RELEASE_TOKEN
63
+ releaseService.explainReleaseToken();
64
+ const token = await releaseService.promptForReleaseToken();
65
+ await releaseService.setupReleaseToken(owner, repo, token);
66
+ // 7. Guide npm Trusted Publishing setup
67
+ releaseService.explainNpmTrustedPublishing();
68
+ // 8. Show success summary
69
+ releaseService.showSuccessSummary();
70
+ }
71
+ catch (error) {
72
+ if (error instanceof GitHubCLINotInstalledError) {
73
+ console.error(chalk.red(`\n❌ ${error.message}\n`));
74
+ console.log(chalk.gray(` Install with: ${chalk.cyan('brew install gh')}\n`));
75
+ console.log(chalk.gray(` Or visit: ${chalk.cyan('https://cli.github.com/')}\n`));
76
+ process.exit(1);
77
+ }
78
+ if (error instanceof GitHubNotAuthenticatedError) {
79
+ console.error(chalk.red(`\n❌ ${error.message}\n`));
80
+ console.log(chalk.gray(` Authenticate with: ${chalk.cyan('gh auth login')}\n`));
81
+ process.exit(1);
82
+ }
83
+ if (error instanceof NotInWorkspaceError) {
84
+ console.error(chalk.red(`\n❌ ${error.message}\n`));
85
+ console.log(chalk.gray(` This command must be run from a Launch77 workspace root directory\n`));
86
+ process.exit(1);
87
+ }
88
+ throw error;
89
+ }
90
+ });
91
+ }
92
+ //# sourceMappingURL=release-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-init.js","sourceRoot":"","sources":["../../../../src/modules/release/commands/release-init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare class InvalidReleaseTokenError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare class ChangesetNotInitializedError extends Error {
5
+ constructor();
6
+ }
7
+ //# sourceMappingURL=release-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-errors.d.ts","sourceRoot":"","sources":["../../../../src/modules/release/errors/release-errors.ts"],"names":[],"mappings":"AAAA,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,4BAA6B,SAAQ,KAAK;;CAKtD"}
@@ -0,0 +1,13 @@
1
+ export class InvalidReleaseTokenError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'InvalidReleaseTokenError';
5
+ }
6
+ }
7
+ export class ChangesetNotInitializedError extends Error {
8
+ constructor() {
9
+ super('Changesets are not initialized in this workspace');
10
+ this.name = 'ChangesetNotInitializedError';
11
+ }
12
+ }
13
+ //# sourceMappingURL=release-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-errors.js","sourceRoot":"","sources":["../../../../src/modules/release/errors/release-errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAA;IACxC,CAAC;CACF;AAED,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACrD;QACE,KAAK,CAAC,kDAAkD,CAAC,CAAA;QACzD,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAA;IAC5C,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export { ReleaseService } from './services/release-service.js';
2
+ export { InvalidReleaseTokenError, ChangesetNotInitializedError } from './errors/release-errors.js';
3
+ export { releaseInitCommand } from './commands/release-init.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/release/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAG9D,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAA;AAGnG,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA"}
@@ -0,0 +1,7 @@
1
+ // Services
2
+ export { ReleaseService } from './services/release-service.js';
3
+ // Errors
4
+ export { InvalidReleaseTokenError, ChangesetNotInitializedError } from './errors/release-errors.js';
5
+ // Commands
6
+ export { releaseInitCommand } from './commands/release-init.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/release/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAE9D,SAAS;AACT,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAA;AAEnG,WAAW;AACX,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA"}
@@ -0,0 +1,34 @@
1
+ import { GitHubService } from '../../git/index.js';
2
+ export declare class ReleaseService {
3
+ private githubService;
4
+ constructor(githubService?: GitHubService);
5
+ /**
6
+ * Validate GitHub Personal Access Token format
7
+ */
8
+ validateReleaseToken(token: string): void;
9
+ /**
10
+ * Explain what RELEASE_TOKEN is and why it's needed
11
+ */
12
+ explainReleaseToken(): void;
13
+ /**
14
+ * Prompt user for RELEASE_TOKEN
15
+ */
16
+ promptForReleaseToken(): Promise<string>;
17
+ /**
18
+ * Setup RELEASE_TOKEN secret in GitHub repository
19
+ */
20
+ setupReleaseToken(owner: string, repo: string, token: string): Promise<void>;
21
+ /**
22
+ * Fix changeset config to set access to "public"
23
+ */
24
+ fixChangesetAccess(workspaceRoot: string): Promise<boolean>;
25
+ /**
26
+ * Explain npm Trusted Publishing (OIDC)
27
+ */
28
+ explainNpmTrustedPublishing(): void;
29
+ /**
30
+ * Show success summary for release setup
31
+ */
32
+ showSuccessSummary(): void;
33
+ }
34
+ //# sourceMappingURL=release-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-service.d.ts","sourceRoot":"","sources":["../../../../src/modules/release/services/release-service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAGlD,qBAAa,cAAc;IACb,OAAO,CAAC,aAAa;gBAAb,aAAa,GAAE,aAAmC;IAEtE;;OAEG;IACH,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAWzC;;OAEG;IACH,mBAAmB,IAAI,IAAI;IAoB3B;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAkB9C;;OAEG;IACG,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BlF;;OAEG;IACG,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BjE;;OAEG;IACH,2BAA2B,IAAI,IAAI;IAsBnC;;OAEG;IACH,kBAAkB,IAAI,IAAI;CAW3B"}