@launch77/cli 1.4.0 → 1.4.3
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.
- package/CHANGELOG.md +21 -0
- package/dist/modules/plugin/services/plugin-svc.d.ts +21 -0
- package/dist/modules/plugin/services/plugin-svc.d.ts.map +1 -1
- package/dist/modules/plugin/services/plugin-svc.js +107 -13
- package/dist/modules/plugin/services/plugin-svc.js.map +1 -1
- package/dist/modules/plugin/services/plugin-svc.test.d.ts +2 -0
- package/dist/modules/plugin/services/plugin-svc.test.d.ts.map +1 -0
- package/dist/modules/plugin/services/plugin-svc.test.js +362 -0
- package/dist/modules/plugin/services/plugin-svc.test.js.map +1 -0
- package/dist/templates/workspace/package.json +2 -1
- package/package.json +3 -3
- package/src/modules/plugin/services/plugin-svc.test.ts +418 -0
- package/src/modules/plugin/services/plugin-svc.ts +122 -15
- package/templates/workspace/package.json +2 -1
|
@@ -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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"}
|
|
@@ -19,7 +19,8 @@
|
|
|
19
19
|
"changeset": "changeset",
|
|
20
20
|
"version-packages": "changeset version",
|
|
21
21
|
"release": "turbo run build lint typecheck test && changeset publish",
|
|
22
|
-
"prepare": "husky"
|
|
22
|
+
"prepare": "husky",
|
|
23
|
+
"clean": "rm -rf node_modules apps/*/node_modules libraries/*/node_modules plugins/*/node_modules app-templates/*/node_modules package-lock.json apps/*/package-lock.json libraries/*/package-lock.json plugins/*/package-lock.json app-templates/*/package-lock.json dist apps/*/dist libraries/*/dist plugins/*/dist app-templates/*/dist .next apps/*/.next .turbo apps/*/.turbo libraries/*/.turbo plugins/*/.turbo app-templates/*/.turbo build apps/*/build out apps/*/out coverage apps/*/coverage .cache *.log .eslintcache"
|
|
23
24
|
},
|
|
24
25
|
"devDependencies": {
|
|
25
26
|
"@changesets/cli": "^2.29.8",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@launch77/cli",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.3",
|
|
4
4
|
"description": "Launch77 Platform CLI",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"type": "module",
|
|
@@ -29,6 +29,8 @@
|
|
|
29
29
|
"handlebars": "^4.7.8",
|
|
30
30
|
"inquirer": "^13.0.2",
|
|
31
31
|
"ora": "^8.0.1",
|
|
32
|
+
"prettier": "^3.8.0",
|
|
33
|
+
"typescript": "^5.9.3",
|
|
32
34
|
"zod": "^4.1.13"
|
|
33
35
|
},
|
|
34
36
|
"devDependencies": {
|
|
@@ -37,9 +39,7 @@
|
|
|
37
39
|
"@typescript-eslint/eslint-plugin": "^6.17.0",
|
|
38
40
|
"@typescript-eslint/parser": "^6.17.0",
|
|
39
41
|
"eslint": "^8.56.0",
|
|
40
|
-
"prettier": "^3.7.4",
|
|
41
42
|
"tsx": "^4.7.0",
|
|
42
|
-
"typescript": "^5.3.3",
|
|
43
43
|
"vitest": "^4.0.16"
|
|
44
44
|
}
|
|
45
45
|
}
|
|
@@ -0,0 +1,418 @@
|
|
|
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
|
+
import type { Launch77Context } from '@launch77/plugin-runtime'
|
|
7
|
+
|
|
8
|
+
describe('PluginService', () => {
|
|
9
|
+
let tempDir: string
|
|
10
|
+
let service: PluginService
|
|
11
|
+
|
|
12
|
+
beforeEach(async () => {
|
|
13
|
+
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'plugin-svc-test-'))
|
|
14
|
+
service = new PluginService()
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
afterEach(async () => {
|
|
18
|
+
await fs.remove(tempDir)
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
describe('validateContext', () => {
|
|
22
|
+
// Valid contexts - test return values
|
|
23
|
+
test('should return "app" for workspace-app location', () => {
|
|
24
|
+
const context: Launch77Context = {
|
|
25
|
+
isValid: true,
|
|
26
|
+
locationType: 'workspace-app',
|
|
27
|
+
workspaceRoot: tempDir,
|
|
28
|
+
workspaceName: 'test-workspace',
|
|
29
|
+
workspaceVersion: '1.0.0',
|
|
30
|
+
appsDir: path.join(tempDir, 'apps'),
|
|
31
|
+
packageName: 'test-app',
|
|
32
|
+
appName: 'test-app',
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const result = (service as any).validateContext(context)
|
|
36
|
+
expect(result).toBe('app')
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
test('should return "library" for workspace-library location', () => {
|
|
40
|
+
const context: Launch77Context = {
|
|
41
|
+
isValid: true,
|
|
42
|
+
locationType: 'workspace-library',
|
|
43
|
+
workspaceRoot: tempDir,
|
|
44
|
+
workspaceName: 'test-workspace',
|
|
45
|
+
workspaceVersion: '1.0.0',
|
|
46
|
+
appsDir: path.join(tempDir, 'apps'),
|
|
47
|
+
packageName: 'test-library',
|
|
48
|
+
appName: 'test-library',
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const result = (service as any).validateContext(context)
|
|
52
|
+
expect(result).toBe('library')
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
test('should return "plugin" for workspace-plugin location', () => {
|
|
56
|
+
const context: Launch77Context = {
|
|
57
|
+
isValid: true,
|
|
58
|
+
locationType: 'workspace-plugin',
|
|
59
|
+
workspaceRoot: tempDir,
|
|
60
|
+
workspaceName: 'test-workspace',
|
|
61
|
+
workspaceVersion: '1.0.0',
|
|
62
|
+
appsDir: path.join(tempDir, 'apps'),
|
|
63
|
+
packageName: 'test-plugin',
|
|
64
|
+
appName: 'test-plugin',
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const result = (service as any).validateContext(context)
|
|
68
|
+
expect(result).toBe('plugin')
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
test('should return "app-template" for workspace-app-template location', () => {
|
|
72
|
+
const context: Launch77Context = {
|
|
73
|
+
isValid: true,
|
|
74
|
+
locationType: 'workspace-app-template',
|
|
75
|
+
workspaceRoot: tempDir,
|
|
76
|
+
workspaceName: 'test-workspace',
|
|
77
|
+
workspaceVersion: '1.0.0',
|
|
78
|
+
appsDir: path.join(tempDir, 'apps'),
|
|
79
|
+
packageName: 'test-template',
|
|
80
|
+
appName: 'test-template',
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const result = (service as any).validateContext(context)
|
|
84
|
+
expect(result).toBe('app-template')
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
// Invalid contexts - test exact error messages
|
|
88
|
+
test('should throw InvalidPluginContextError for workspace-root', () => {
|
|
89
|
+
const context: Launch77Context = {
|
|
90
|
+
isValid: true,
|
|
91
|
+
locationType: 'workspace-root',
|
|
92
|
+
workspaceRoot: tempDir,
|
|
93
|
+
workspaceName: 'test-workspace',
|
|
94
|
+
workspaceVersion: '1.0.0',
|
|
95
|
+
appsDir: path.join(tempDir, 'apps'),
|
|
96
|
+
packageName: 'workspace',
|
|
97
|
+
appName: undefined,
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
expect(() => (service as any).validateContext(context)).toThrow('plugin:install must be run from within a package directory.')
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
test('should throw InvalidPluginContextError for non-workspace', () => {
|
|
104
|
+
const context = {
|
|
105
|
+
isValid: false,
|
|
106
|
+
locationType: 'non-workspace' as const,
|
|
107
|
+
workspaceRoot: tempDir,
|
|
108
|
+
workspaceName: 'test-workspace',
|
|
109
|
+
workspaceVersion: '1.0.0',
|
|
110
|
+
appsDir: path.join(tempDir, 'apps'),
|
|
111
|
+
packageName: 'unknown',
|
|
112
|
+
appName: undefined,
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
expect(() => (service as any).validateContext(context)).toThrow('plugin:install must be run from within a package directory.')
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
test('should throw InvalidPluginContextError when appName is missing', () => {
|
|
119
|
+
const context: Launch77Context = {
|
|
120
|
+
isValid: true,
|
|
121
|
+
locationType: 'workspace-app',
|
|
122
|
+
workspaceRoot: tempDir,
|
|
123
|
+
workspaceName: 'test-workspace',
|
|
124
|
+
workspaceVersion: '1.0.0',
|
|
125
|
+
appsDir: path.join(tempDir, 'apps'),
|
|
126
|
+
packageName: 'test-app',
|
|
127
|
+
appName: undefined,
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
expect(() => (service as any).validateContext(context)).toThrow('Could not determine package name. This is a bug. Please report it.')
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
test('should throw InvalidPluginContextError when appName is empty string', () => {
|
|
134
|
+
const context: Launch77Context = {
|
|
135
|
+
isValid: true,
|
|
136
|
+
locationType: 'workspace-app',
|
|
137
|
+
workspaceRoot: tempDir,
|
|
138
|
+
workspaceName: 'test-workspace',
|
|
139
|
+
workspaceVersion: '1.0.0',
|
|
140
|
+
appsDir: path.join(tempDir, 'apps'),
|
|
141
|
+
packageName: 'test-app',
|
|
142
|
+
appName: '',
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
expect(() => (service as any).validateContext(context)).toThrow('Could not determine package name. This is a bug. Please report it.')
|
|
146
|
+
})
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
describe('validatePluginTargets', () => {
|
|
150
|
+
// Valid scenarios - verify metadata returned
|
|
151
|
+
test('should return metadata when plugin targets current package type', async () => {
|
|
152
|
+
const pluginDir = path.join(tempDir, 'test-plugin')
|
|
153
|
+
await fs.ensureDir(pluginDir)
|
|
154
|
+
await fs.writeJson(path.join(pluginDir, 'plugin.json'), {
|
|
155
|
+
name: 'test-plugin',
|
|
156
|
+
version: '1.0.0',
|
|
157
|
+
targets: ['app', 'library'],
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
const result = await (service as any).validatePluginTargets(pluginDir, 'test-plugin', 'app')
|
|
161
|
+
expect(result).toEqual({
|
|
162
|
+
name: 'test-plugin',
|
|
163
|
+
version: '1.0.0',
|
|
164
|
+
targets: ['app', 'library'],
|
|
165
|
+
})
|
|
166
|
+
})
|
|
167
|
+
|
|
168
|
+
test('should accept plugin with multiple targets including current', async () => {
|
|
169
|
+
const pluginDir = path.join(tempDir, 'multi-target-plugin')
|
|
170
|
+
await fs.ensureDir(pluginDir)
|
|
171
|
+
await fs.writeJson(path.join(pluginDir, 'plugin.json'), {
|
|
172
|
+
name: 'multi-target-plugin',
|
|
173
|
+
version: '2.0.0',
|
|
174
|
+
targets: ['app', 'library', 'plugin', 'app-template'],
|
|
175
|
+
})
|
|
176
|
+
|
|
177
|
+
const result = await (service as any).validatePluginTargets(pluginDir, 'multi-target-plugin', 'library')
|
|
178
|
+
expect(result.targets).toContain('library')
|
|
179
|
+
expect(result.targets).toHaveLength(4)
|
|
180
|
+
})
|
|
181
|
+
|
|
182
|
+
test('should handle plugin.json with optional fields (pluginDependencies, libraryDependencies)', async () => {
|
|
183
|
+
const pluginDir = path.join(tempDir, 'full-plugin')
|
|
184
|
+
await fs.ensureDir(pluginDir)
|
|
185
|
+
await fs.writeJson(path.join(pluginDir, 'plugin.json'), {
|
|
186
|
+
name: 'full-plugin',
|
|
187
|
+
version: '1.5.0',
|
|
188
|
+
targets: ['app'],
|
|
189
|
+
pluginDependencies: { 'other-plugin': '^1.0.0' },
|
|
190
|
+
libraryDependencies: { react: '^18.0.0' },
|
|
191
|
+
})
|
|
192
|
+
|
|
193
|
+
const result = await (service as any).validatePluginTargets(pluginDir, 'full-plugin', 'app')
|
|
194
|
+
expect(result.pluginDependencies).toEqual({ 'other-plugin': '^1.0.0' })
|
|
195
|
+
expect(result.libraryDependencies).toEqual({ react: '^18.0.0' })
|
|
196
|
+
})
|
|
197
|
+
|
|
198
|
+
// Error scenarios - test exact error messages
|
|
199
|
+
test('should throw MissingPluginTargetsError when targets is undefined', async () => {
|
|
200
|
+
const pluginDir = path.join(tempDir, 'no-targets-plugin')
|
|
201
|
+
await fs.ensureDir(pluginDir)
|
|
202
|
+
await fs.writeJson(path.join(pluginDir, 'plugin.json'), {
|
|
203
|
+
name: 'no-targets-plugin',
|
|
204
|
+
version: '1.0.0',
|
|
205
|
+
})
|
|
206
|
+
|
|
207
|
+
await expect((service as any).validatePluginTargets(pluginDir, 'no-targets-plugin', 'app')).rejects.toThrow("Plugin 'no-targets-plugin' is missing the required 'targets' field in plugin.json.")
|
|
208
|
+
})
|
|
209
|
+
|
|
210
|
+
test('should throw MissingPluginTargetsError when targets is empty array', async () => {
|
|
211
|
+
const pluginDir = path.join(tempDir, 'empty-targets-plugin')
|
|
212
|
+
await fs.ensureDir(pluginDir)
|
|
213
|
+
await fs.writeJson(path.join(pluginDir, 'plugin.json'), {
|
|
214
|
+
name: 'empty-targets-plugin',
|
|
215
|
+
version: '1.0.0',
|
|
216
|
+
targets: [],
|
|
217
|
+
})
|
|
218
|
+
|
|
219
|
+
await expect((service as any).validatePluginTargets(pluginDir, 'empty-targets-plugin', 'app')).rejects.toThrow("Plugin 'empty-targets-plugin' is missing the required 'targets' field in plugin.json.")
|
|
220
|
+
})
|
|
221
|
+
|
|
222
|
+
test('should throw error when targets does not include current target', async () => {
|
|
223
|
+
const pluginDir = path.join(tempDir, 'incompatible-plugin')
|
|
224
|
+
await fs.ensureDir(pluginDir)
|
|
225
|
+
await fs.writeJson(path.join(pluginDir, 'plugin.json'), {
|
|
226
|
+
name: 'incompatible-plugin',
|
|
227
|
+
version: '1.0.0',
|
|
228
|
+
targets: ['library', 'plugin'],
|
|
229
|
+
})
|
|
230
|
+
|
|
231
|
+
await expect((service as any).validatePluginTargets(pluginDir, 'incompatible-plugin', 'app')).rejects.toThrow("Plugin 'incompatible-plugin' cannot be installed in a 'app' package.")
|
|
232
|
+
})
|
|
233
|
+
|
|
234
|
+
test('should handle missing plugin.json file gracefully', async () => {
|
|
235
|
+
const pluginDir = path.join(tempDir, 'no-plugin-json')
|
|
236
|
+
await fs.ensureDir(pluginDir)
|
|
237
|
+
|
|
238
|
+
await expect((service as any).validatePluginTargets(pluginDir, 'no-plugin-json', 'app')).rejects.toThrow()
|
|
239
|
+
})
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
describe('checkExistingInstallation', () => {
|
|
243
|
+
const mockLogger = (message: string) => {
|
|
244
|
+
/* capture logs */
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Not installed - return null
|
|
248
|
+
test('should return null when plugin is not installed', async () => {
|
|
249
|
+
const packageDir = path.join(tempDir, 'app1')
|
|
250
|
+
await fs.ensureDir(packageDir)
|
|
251
|
+
await fs.writeJson(path.join(packageDir, 'package.json'), {
|
|
252
|
+
name: 'app1',
|
|
253
|
+
version: '1.0.0',
|
|
254
|
+
launch77: {
|
|
255
|
+
installedPlugins: {},
|
|
256
|
+
},
|
|
257
|
+
})
|
|
258
|
+
|
|
259
|
+
const result = await (service as any).checkExistingInstallation('test-plugin', packageDir, mockLogger)
|
|
260
|
+
expect(result).toBeNull()
|
|
261
|
+
})
|
|
262
|
+
|
|
263
|
+
test('should return null when package.json does not exist', async () => {
|
|
264
|
+
const packageDir = path.join(tempDir, 'nonexistent')
|
|
265
|
+
await fs.ensureDir(packageDir)
|
|
266
|
+
|
|
267
|
+
const result = await (service as any).checkExistingInstallation('test-plugin', packageDir, mockLogger)
|
|
268
|
+
expect(result).toBeNull()
|
|
269
|
+
})
|
|
270
|
+
|
|
271
|
+
test('should return null when launch77 field is missing', async () => {
|
|
272
|
+
const packageDir = path.join(tempDir, 'app2')
|
|
273
|
+
await fs.ensureDir(packageDir)
|
|
274
|
+
await fs.writeJson(path.join(packageDir, 'package.json'), {
|
|
275
|
+
name: 'app2',
|
|
276
|
+
version: '1.0.0',
|
|
277
|
+
})
|
|
278
|
+
|
|
279
|
+
const result = await (service as any).checkExistingInstallation('test-plugin', packageDir, mockLogger)
|
|
280
|
+
expect(result).toBeNull()
|
|
281
|
+
})
|
|
282
|
+
|
|
283
|
+
test('should return null when installedPlugins is missing', async () => {
|
|
284
|
+
const packageDir = path.join(tempDir, 'app3')
|
|
285
|
+
await fs.ensureDir(packageDir)
|
|
286
|
+
await fs.writeJson(path.join(packageDir, 'package.json'), {
|
|
287
|
+
name: 'app3',
|
|
288
|
+
version: '1.0.0',
|
|
289
|
+
launch77: {},
|
|
290
|
+
})
|
|
291
|
+
|
|
292
|
+
const result = await (service as any).checkExistingInstallation('test-plugin', packageDir, mockLogger)
|
|
293
|
+
expect(result).toBeNull()
|
|
294
|
+
})
|
|
295
|
+
|
|
296
|
+
test('should return null when installedPlugins exists but plugin not in it', async () => {
|
|
297
|
+
const packageDir = path.join(tempDir, 'app4')
|
|
298
|
+
await fs.ensureDir(packageDir)
|
|
299
|
+
await fs.writeJson(path.join(packageDir, 'package.json'), {
|
|
300
|
+
name: 'app4',
|
|
301
|
+
version: '1.0.0',
|
|
302
|
+
launch77: {
|
|
303
|
+
installedPlugins: {
|
|
304
|
+
'other-plugin': {
|
|
305
|
+
package: 'other-plugin',
|
|
306
|
+
version: '1.0.0',
|
|
307
|
+
installedAt: '2024-01-01T00:00:00.000Z',
|
|
308
|
+
source: 'local',
|
|
309
|
+
},
|
|
310
|
+
},
|
|
311
|
+
},
|
|
312
|
+
})
|
|
313
|
+
|
|
314
|
+
const result = await (service as any).checkExistingInstallation('test-plugin', packageDir, mockLogger)
|
|
315
|
+
expect(result).toBeNull()
|
|
316
|
+
})
|
|
317
|
+
|
|
318
|
+
// Already installed - return result object
|
|
319
|
+
test('should return early-exit result with correct structure when plugin is installed', async () => {
|
|
320
|
+
const packageDir = path.join(tempDir, 'app5')
|
|
321
|
+
await fs.ensureDir(packageDir)
|
|
322
|
+
await fs.writeJson(path.join(packageDir, 'package.json'), {
|
|
323
|
+
name: 'app5',
|
|
324
|
+
version: '1.0.0',
|
|
325
|
+
launch77: {
|
|
326
|
+
installedPlugins: {
|
|
327
|
+
'test-plugin': {
|
|
328
|
+
package: 'test-plugin',
|
|
329
|
+
version: '1.5.0',
|
|
330
|
+
installedAt: '2024-01-15T10:30:00.000Z',
|
|
331
|
+
source: 'local',
|
|
332
|
+
},
|
|
333
|
+
},
|
|
334
|
+
},
|
|
335
|
+
})
|
|
336
|
+
|
|
337
|
+
const result = await (service as any).checkExistingInstallation('test-plugin', packageDir, mockLogger)
|
|
338
|
+
expect(result).toEqual({
|
|
339
|
+
pluginName: 'test-plugin',
|
|
340
|
+
filesInstalled: false,
|
|
341
|
+
packageJsonUpdated: false,
|
|
342
|
+
dependenciesInstalled: false,
|
|
343
|
+
})
|
|
344
|
+
})
|
|
345
|
+
|
|
346
|
+
test('should log correct message for local plugin (package name matches plugin name)', async () => {
|
|
347
|
+
const packageDir = path.join(tempDir, 'app6')
|
|
348
|
+
await fs.ensureDir(packageDir)
|
|
349
|
+
await fs.writeJson(path.join(packageDir, 'package.json'), {
|
|
350
|
+
name: 'app6',
|
|
351
|
+
version: '1.0.0',
|
|
352
|
+
launch77: {
|
|
353
|
+
installedPlugins: {
|
|
354
|
+
release: {
|
|
355
|
+
package: 'release',
|
|
356
|
+
version: '2.0.0',
|
|
357
|
+
installedAt: '2024-02-01T12:00:00.000Z',
|
|
358
|
+
source: 'local',
|
|
359
|
+
},
|
|
360
|
+
},
|
|
361
|
+
},
|
|
362
|
+
})
|
|
363
|
+
|
|
364
|
+
const logs: string[] = []
|
|
365
|
+
const captureLogger = (message: string) => logs.push(message)
|
|
366
|
+
|
|
367
|
+
const result = await (service as any).checkExistingInstallation('release', packageDir, captureLogger)
|
|
368
|
+
expect(result).not.toBeNull()
|
|
369
|
+
expect(logs.some((log) => log.includes("Plugin 'release' is already installed"))).toBe(true)
|
|
370
|
+
expect(logs.some((log) => log.includes('release') && log.includes('local'))).toBe(true)
|
|
371
|
+
})
|
|
372
|
+
|
|
373
|
+
test('should log correct message for npm plugin (package name is scoped)', async () => {
|
|
374
|
+
const packageDir = path.join(tempDir, 'app7')
|
|
375
|
+
await fs.ensureDir(packageDir)
|
|
376
|
+
await fs.writeJson(path.join(packageDir, 'package.json'), {
|
|
377
|
+
name: 'app7',
|
|
378
|
+
version: '1.0.0',
|
|
379
|
+
launch77: {
|
|
380
|
+
installedPlugins: {
|
|
381
|
+
analytics: {
|
|
382
|
+
package: '@myorg/analytics-plugin',
|
|
383
|
+
version: '3.1.0',
|
|
384
|
+
installedAt: '2024-03-01T15:45:00.000Z',
|
|
385
|
+
source: 'npm',
|
|
386
|
+
},
|
|
387
|
+
},
|
|
388
|
+
},
|
|
389
|
+
})
|
|
390
|
+
|
|
391
|
+
const logs: string[] = []
|
|
392
|
+
const captureLogger = (message: string) => logs.push(message)
|
|
393
|
+
|
|
394
|
+
const result = await (service as any).checkExistingInstallation('analytics', packageDir, captureLogger)
|
|
395
|
+
expect(result).not.toBeNull()
|
|
396
|
+
expect(logs.some((log) => log.includes("Plugin 'analytics' is already installed"))).toBe(true)
|
|
397
|
+
expect(logs.some((log) => log.includes('@myorg/analytics-plugin') && log.includes('npm'))).toBe(true)
|
|
398
|
+
})
|
|
399
|
+
|
|
400
|
+
// Edge cases
|
|
401
|
+
test('should handle malformed package.json gracefully (invalid JSON)', async () => {
|
|
402
|
+
const packageDir = path.join(tempDir, 'app8')
|
|
403
|
+
await fs.ensureDir(packageDir)
|
|
404
|
+
await fs.writeFile(path.join(packageDir, 'package.json'), '{ invalid json }')
|
|
405
|
+
|
|
406
|
+
const result = await (service as any).checkExistingInstallation('test-plugin', packageDir, mockLogger)
|
|
407
|
+
expect(result).toBeNull()
|
|
408
|
+
})
|
|
409
|
+
|
|
410
|
+
test('should handle package.json read errors (permissions, etc.)', async () => {
|
|
411
|
+
const packageDir = path.join(tempDir, 'app9')
|
|
412
|
+
// Don't create the directory - simulate permission/access error
|
|
413
|
+
|
|
414
|
+
const result = await (service as any).checkExistingInstallation('test-plugin', packageDir, mockLogger)
|
|
415
|
+
expect(result).toBeNull()
|
|
416
|
+
})
|
|
417
|
+
})
|
|
418
|
+
})
|