@launch77/cli 1.4.3 → 1.4.4
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 +8 -0
- package/dist/infrastructure/npm-package.d.ts +42 -0
- package/dist/infrastructure/npm-package.d.ts.map +1 -0
- package/dist/infrastructure/npm-package.js +46 -0
- package/dist/infrastructure/npm-package.js.map +1 -0
- package/dist/infrastructure/package-resolver.d.ts +107 -0
- package/dist/infrastructure/package-resolver.d.ts.map +1 -0
- package/dist/infrastructure/package-resolver.js +143 -0
- package/dist/infrastructure/package-resolver.js.map +1 -0
- package/dist/infrastructure/package-resolver.test.d.ts +2 -0
- package/dist/infrastructure/package-resolver.test.d.ts.map +1 -0
- package/dist/infrastructure/package-resolver.test.js +251 -0
- package/dist/infrastructure/package-resolver.test.js.map +1 -0
- package/dist/modules/app/commands/create-app.d.ts.map +1 -1
- package/dist/modules/app/commands/create-app.js +6 -2
- package/dist/modules/app/commands/create-app.js.map +1 -1
- package/dist/modules/app/lib/app-template-resolver.d.ts +14 -0
- package/dist/modules/app/lib/app-template-resolver.d.ts.map +1 -0
- package/dist/modules/app/lib/app-template-resolver.js +36 -0
- package/dist/modules/app/lib/app-template-resolver.js.map +1 -0
- package/dist/modules/app/services/app-svc.d.ts +2 -1
- package/dist/modules/app/services/app-svc.d.ts.map +1 -1
- package/dist/modules/app/services/app-svc.js +46 -11
- package/dist/modules/app/services/app-svc.js.map +1 -1
- package/dist/modules/plugin/lib/plugin-resolver.d.ts +10 -72
- package/dist/modules/plugin/lib/plugin-resolver.d.ts.map +1 -1
- package/dist/modules/plugin/lib/plugin-resolver.js +12 -115
- package/dist/modules/plugin/lib/plugin-resolver.js.map +1 -1
- package/dist/modules/plugin/lib/plugin-resolver.test.js +43 -39
- package/dist/modules/plugin/lib/plugin-resolver.test.js.map +1 -1
- package/dist/modules/plugin/services/plugin-svc.d.ts +2 -0
- package/dist/modules/plugin/services/plugin-svc.d.ts.map +1 -1
- package/dist/modules/plugin/services/plugin-svc.js +14 -17
- package/dist/modules/plugin/services/plugin-svc.js.map +1 -1
- package/package.json +1 -1
- package/src/infrastructure/npm-package.ts +73 -0
- package/src/infrastructure/package-resolver.test.ts +313 -0
- package/src/infrastructure/package-resolver.ts +194 -0
- package/src/modules/app/commands/create-app.ts +6 -2
- package/src/modules/app/lib/app-template-resolver.ts +40 -0
- package/src/modules/app/services/app-svc.ts +49 -12
- package/src/modules/plugin/lib/plugin-resolver.test.ts +46 -39
- package/src/modules/plugin/lib/plugin-resolver.ts +12 -142
- package/src/modules/plugin/services/plugin-svc.ts +15 -15
|
@@ -1,81 +1,85 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
-
import * as path from 'path';
|
|
3
1
|
import * as os from 'os';
|
|
2
|
+
import * as path from 'path';
|
|
4
3
|
import fs from 'fs-extra';
|
|
5
|
-
import {
|
|
4
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
5
|
+
import { PluginResolver } from './plugin-resolver.js';
|
|
6
6
|
describe('Plugin Resolver', () => {
|
|
7
|
-
|
|
7
|
+
let resolver;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
resolver = new PluginResolver();
|
|
10
|
+
});
|
|
11
|
+
describe('validateInput', () => {
|
|
8
12
|
it('should accept valid unscoped plugin names', () => {
|
|
9
|
-
expect(
|
|
10
|
-
expect(
|
|
11
|
-
expect(
|
|
13
|
+
expect(resolver.validateInput('release')).toEqual({ isValid: true });
|
|
14
|
+
expect(resolver.validateInput('my-plugin')).toEqual({ isValid: true });
|
|
15
|
+
expect(resolver.validateInput('analytics-v2')).toEqual({ isValid: true });
|
|
12
16
|
});
|
|
13
17
|
it('should accept valid scoped npm packages', () => {
|
|
14
|
-
expect(
|
|
15
|
-
expect(
|
|
16
|
-
expect(
|
|
18
|
+
expect(resolver.validateInput('@ibm/plugin-name')).toEqual({ isValid: true });
|
|
19
|
+
expect(resolver.validateInput('@launch77-shared/plugin-release')).toEqual({ isValid: true });
|
|
20
|
+
expect(resolver.validateInput('@org/analytics')).toEqual({ isValid: true });
|
|
17
21
|
});
|
|
18
22
|
it('should reject empty names', () => {
|
|
19
|
-
const result =
|
|
23
|
+
const result = resolver.validateInput('');
|
|
20
24
|
expect(result.isValid).toBe(false);
|
|
21
25
|
expect(result.error).toBeDefined();
|
|
22
26
|
});
|
|
23
27
|
it('should reject whitespace-only names', () => {
|
|
24
|
-
const result =
|
|
28
|
+
const result = resolver.validateInput(' ');
|
|
25
29
|
expect(result.isValid).toBe(false);
|
|
26
30
|
expect(result.error).toBeDefined();
|
|
27
31
|
});
|
|
28
32
|
it('should reject invalid scoped packages', () => {
|
|
29
|
-
const result1 =
|
|
33
|
+
const result1 = resolver.validateInput('@invalid');
|
|
30
34
|
expect(result1.isValid).toBe(false);
|
|
31
35
|
expect(result1.error).toBeDefined();
|
|
32
|
-
const result2 =
|
|
36
|
+
const result2 = resolver.validateInput('@/package');
|
|
33
37
|
expect(result2.isValid).toBe(false);
|
|
34
38
|
expect(result2.error).toBeDefined();
|
|
35
|
-
const result3 =
|
|
39
|
+
const result3 = resolver.validateInput('@org/');
|
|
36
40
|
expect(result3.isValid).toBe(false);
|
|
37
41
|
expect(result3.error).toBeDefined();
|
|
38
42
|
});
|
|
39
43
|
it('should reject names with uppercase letters', () => {
|
|
40
|
-
const result =
|
|
44
|
+
const result = resolver.validateInput('MyPlugin');
|
|
41
45
|
expect(result.isValid).toBe(false);
|
|
42
46
|
expect(result.error).toContain('lowercase');
|
|
43
47
|
});
|
|
44
48
|
it('should reject names starting with numbers', () => {
|
|
45
|
-
const result =
|
|
49
|
+
const result = resolver.validateInput('123plugin');
|
|
46
50
|
expect(result.isValid).toBe(false);
|
|
47
51
|
expect(result.error).toBeDefined();
|
|
48
52
|
});
|
|
49
53
|
it('should reject names with special characters', () => {
|
|
50
|
-
const result1 =
|
|
54
|
+
const result1 = resolver.validateInput('plugin_name');
|
|
51
55
|
expect(result1.isValid).toBe(false);
|
|
52
|
-
const result2 =
|
|
56
|
+
const result2 = resolver.validateInput('plugin.name');
|
|
53
57
|
expect(result2.isValid).toBe(false);
|
|
54
|
-
const result3 =
|
|
58
|
+
const result3 = resolver.validateInput('plugin name');
|
|
55
59
|
expect(result3.isValid).toBe(false);
|
|
56
60
|
});
|
|
57
61
|
it('should trim whitespace before validation', () => {
|
|
58
|
-
expect(
|
|
59
|
-
expect(
|
|
62
|
+
expect(resolver.validateInput(' release ')).toEqual({ isValid: true });
|
|
63
|
+
expect(resolver.validateInput(' @ibm/analytics ')).toEqual({ isValid: true });
|
|
60
64
|
});
|
|
61
65
|
});
|
|
62
66
|
describe('toNpmPackageName', () => {
|
|
63
67
|
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');
|
|
68
|
+
expect(resolver.toNpmPackageName('release')).toBe('@launch77-shared/plugin-release');
|
|
69
|
+
expect(resolver.toNpmPackageName('my-plugin')).toBe('@launch77-shared/plugin-my-plugin');
|
|
70
|
+
expect(resolver.toNpmPackageName('analytics-v2')).toBe('@launch77-shared/plugin-analytics-v2');
|
|
67
71
|
});
|
|
68
72
|
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');
|
|
73
|
+
expect(resolver.toNpmPackageName('@ibm/analytics')).toBe('@ibm/analytics');
|
|
74
|
+
expect(resolver.toNpmPackageName('@launch77-shared/plugin-release')).toBe('@launch77-shared/plugin-release');
|
|
75
|
+
expect(resolver.toNpmPackageName('@org/package')).toBe('@org/package');
|
|
72
76
|
});
|
|
73
77
|
it('should trim whitespace', () => {
|
|
74
|
-
expect(toNpmPackageName(' release ')).toBe('@launch77-shared/plugin-release');
|
|
75
|
-
expect(toNpmPackageName(' @ibm/analytics ')).toBe('@ibm/analytics');
|
|
78
|
+
expect(resolver.toNpmPackageName(' release ')).toBe('@launch77-shared/plugin-release');
|
|
79
|
+
expect(resolver.toNpmPackageName(' @ibm/analytics ')).toBe('@ibm/analytics');
|
|
76
80
|
});
|
|
77
81
|
});
|
|
78
|
-
describe('
|
|
82
|
+
describe('resolveLocation', () => {
|
|
79
83
|
let tempDir;
|
|
80
84
|
beforeEach(async () => {
|
|
81
85
|
// Create a temporary workspace directory
|
|
@@ -93,7 +97,7 @@ describe('Plugin Resolver', () => {
|
|
|
93
97
|
await fs.ensureDir(path.join(pluginPath, 'dist'));
|
|
94
98
|
await fs.writeFile(path.join(pluginPath, 'plugin.json'), JSON.stringify({ name: 'my-plugin', version: '1.0.0' }));
|
|
95
99
|
await fs.writeFile(path.join(pluginPath, 'dist/generator.js'), 'console.log("test")');
|
|
96
|
-
const result = await
|
|
100
|
+
const result = await resolver.resolveLocation('my-plugin', tempDir);
|
|
97
101
|
expect(result).toEqual({
|
|
98
102
|
source: 'local',
|
|
99
103
|
resolvedName: 'my-plugin',
|
|
@@ -101,7 +105,7 @@ describe('Plugin Resolver', () => {
|
|
|
101
105
|
});
|
|
102
106
|
});
|
|
103
107
|
it('should resolve to npm if local plugin does not exist', async () => {
|
|
104
|
-
const result = await
|
|
108
|
+
const result = await resolver.resolveLocation('release', tempDir);
|
|
105
109
|
expect(result).toEqual({
|
|
106
110
|
source: 'npm',
|
|
107
111
|
resolvedName: 'release',
|
|
@@ -114,7 +118,7 @@ describe('Plugin Resolver', () => {
|
|
|
114
118
|
await fs.ensureDir(pluginPath);
|
|
115
119
|
await fs.ensureDir(path.join(pluginPath, 'dist'));
|
|
116
120
|
await fs.writeFile(path.join(pluginPath, 'dist/generator.js'), 'console.log("test")');
|
|
117
|
-
const result = await
|
|
121
|
+
const result = await resolver.resolveLocation('incomplete', tempDir);
|
|
118
122
|
expect(result).toEqual({
|
|
119
123
|
source: 'npm',
|
|
120
124
|
resolvedName: 'incomplete',
|
|
@@ -126,7 +130,7 @@ describe('Plugin Resolver', () => {
|
|
|
126
130
|
const pluginPath = path.join(tempDir, 'plugins', 'incomplete');
|
|
127
131
|
await fs.ensureDir(pluginPath);
|
|
128
132
|
await fs.writeFile(path.join(pluginPath, 'plugin.json'), JSON.stringify({ name: 'incomplete', version: '1.0.0' }));
|
|
129
|
-
const result = await
|
|
133
|
+
const result = await resolver.resolveLocation('incomplete', tempDir);
|
|
130
134
|
expect(result).toEqual({
|
|
131
135
|
source: 'npm',
|
|
132
136
|
resolvedName: 'incomplete',
|
|
@@ -137,7 +141,7 @@ describe('Plugin Resolver', () => {
|
|
|
137
141
|
// Even if a directory exists locally, scoped names go to npm
|
|
138
142
|
const pluginPath = path.join(tempDir, 'plugins', '@ibm');
|
|
139
143
|
await fs.ensureDir(pluginPath);
|
|
140
|
-
const result = await
|
|
144
|
+
const result = await resolver.resolveLocation('@ibm/analytics', tempDir);
|
|
141
145
|
expect(result).toEqual({
|
|
142
146
|
source: 'npm',
|
|
143
147
|
resolvedName: '@ibm/analytics',
|
|
@@ -145,7 +149,7 @@ describe('Plugin Resolver', () => {
|
|
|
145
149
|
});
|
|
146
150
|
});
|
|
147
151
|
it('should resolve scoped @launch77-shared packages to npm', async () => {
|
|
148
|
-
const result = await
|
|
152
|
+
const result = await resolver.resolveLocation('@launch77-shared/plugin-release', tempDir);
|
|
149
153
|
expect(result).toEqual({
|
|
150
154
|
source: 'npm',
|
|
151
155
|
resolvedName: '@launch77-shared/plugin-release',
|
|
@@ -155,7 +159,7 @@ describe('Plugin Resolver', () => {
|
|
|
155
159
|
it('should handle plugins directory not existing', async () => {
|
|
156
160
|
// Remove plugins directory
|
|
157
161
|
await fs.remove(path.join(tempDir, 'plugins'));
|
|
158
|
-
const result = await
|
|
162
|
+
const result = await resolver.resolveLocation('release', tempDir);
|
|
159
163
|
expect(result).toEqual({
|
|
160
164
|
source: 'npm',
|
|
161
165
|
resolvedName: 'release',
|
|
@@ -163,7 +167,7 @@ describe('Plugin Resolver', () => {
|
|
|
163
167
|
});
|
|
164
168
|
});
|
|
165
169
|
it('should trim whitespace from plugin names', async () => {
|
|
166
|
-
const result = await
|
|
170
|
+
const result = await resolver.resolveLocation(' release ', tempDir);
|
|
167
171
|
expect(result).toEqual({
|
|
168
172
|
source: 'npm',
|
|
169
173
|
resolvedName: 'release',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-resolver.test.js","sourceRoot":"","sources":["../../../../src/modules/plugin/lib/plugin-resolver.test.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"plugin-resolver.test.js","sourceRoot":"","sources":["../../../../src/modules/plugin/lib/plugin-resolver.test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,OAAO,EAAE,MAAM,UAAU,CAAA;AACzB,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,QAAwB,CAAA;IAE5B,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;YACpE,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;YACtE,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;QAC3E,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;YAC7E,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,iCAAiC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;YAC5F,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7E,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;YACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;QACpC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;YAC5C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;QACpC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAA;YAClD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACnC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;YAEnC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,CAAA;YACnD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACnC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;YAEnC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;YAC/C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACnC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;QACrC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAA;YACjD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,CAAA;YAClD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;QACpC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAC,CAAA;YACrD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAEnC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAC,CAAA;YACrD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAEnC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAC,CAAA;YACrD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACrC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;YACxE,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;QACjF,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACpE,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAA;YACpF,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAA;YACxF,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;QAChG,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;YAC1E,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,iCAAiC,CAAC,CAAC,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAA;YAC5G,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QACxE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;YAChC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAA;YACxF,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAChF,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,IAAI,OAAe,CAAA;QAEnB,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,yCAAyC;YACzC,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAC,CAAA;YAC3E,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;QAEF,SAAS,CAAC,KAAK,IAAI,EAAE;YACnB,WAAW;YACX,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC1B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,8BAA8B;YAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;YAC7D,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;YAC9B,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;YACjD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;YACjH,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,EAAE,qBAAqB,CAAC,CAAA;YAErF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;YAEnE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,MAAM,EAAE,OAAO;gBACf,YAAY,EAAE,WAAW;gBACzB,SAAS,EAAE,UAAU;aACtB,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAEjE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,MAAM,EAAE,KAAK;gBACb,YAAY,EAAE,SAAS;gBACvB,UAAU,EAAE,iCAAiC;aAC9C,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;YACzF,kDAAkD;YAClD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC,CAAA;YAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;YAC9B,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;YACjD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,EAAE,qBAAqB,CAAC,CAAA;YAErF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;YAEpE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,MAAM,EAAE,KAAK;gBACb,YAAY,EAAE,YAAY;gBAC1B,UAAU,EAAE,oCAAoC;aACjD,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;YAC1F,mDAAmD;YACnD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC,CAAA;YAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;YAC9B,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;YAElH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;YAEpE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,MAAM,EAAE,KAAK;gBACb,YAAY,EAAE,YAAY;gBAC1B,UAAU,EAAE,oCAAoC;aACjD,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,6DAA6D;YAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;YACxD,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;YAE9B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAA;YAExE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,MAAM,EAAE,KAAK;gBACb,YAAY,EAAE,gBAAgB;gBAC9B,UAAU,EAAE,gBAAgB;aAC7B,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,iCAAiC,EAAE,OAAO,CAAC,CAAA;YAEzF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,MAAM,EAAE,KAAK;gBACb,YAAY,EAAE,iCAAiC;gBAC/C,UAAU,EAAE,iCAAiC;aAC9C,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,2BAA2B;YAC3B,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAA;YAE9C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAEjE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,MAAM,EAAE,KAAK;gBACb,YAAY,EAAE,SAAS;gBACvB,UAAU,EAAE,iCAAiC;aAC9C,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,aAAa,EAAE,OAAO,CAAC,CAAA;YAErE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,MAAM,EAAE,KAAK;gBACb,YAAY,EAAE,SAAS;gBACvB,UAAU,EAAE,iCAAiC;aAC9C,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
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
|
+
private pluginResolver;
|
|
5
|
+
constructor();
|
|
4
6
|
/**
|
|
5
7
|
* Validate that we're in a valid package directory and return the target type
|
|
6
8
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-svc.d.ts","sourceRoot":"","sources":["../../../../src/modules/plugin/services/plugin-svc.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin-svc.d.ts","sourceRoot":"","sources":["../../../../src/modules/plugin/services/plugin-svc.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,eAAe,EAA0F,MAAM,0BAA0B,CAAA;AACvJ,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAoBzF,qBAAa,aAAa;IACxB,OAAO,CAAC,cAAc,CAAgB;;IAMtC;;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;IAW/B,OAAO,CAAC,cAAc;YAgBR,YAAY;YAeZ,iBAAiB;IAmB/B;;OAEG;YACW,mBAAmB;CA4BlC"}
|
|
@@ -3,8 +3,9 @@ import * as fs from 'fs/promises';
|
|
|
3
3
|
import chalk from 'chalk';
|
|
4
4
|
import { execa } from 'execa';
|
|
5
5
|
import { readPluginMetadata } from '@launch77/plugin-runtime';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { downloadNpmPackage } from '../../../infrastructure/npm-package.js';
|
|
7
|
+
import { PluginInstallationError, InvalidPluginContextError, createInvalidContextError, MissingPluginTargetsError, createInvalidTargetError, PluginResolutionError } from '../errors/plugin-errors.js';
|
|
8
|
+
import { PluginResolver } from '../lib/plugin-resolver.js';
|
|
8
9
|
/**
|
|
9
10
|
* Map location type to target string
|
|
10
11
|
*/
|
|
@@ -23,6 +24,10 @@ function locationTypeToTarget(locationType) {
|
|
|
23
24
|
}
|
|
24
25
|
}
|
|
25
26
|
export class PluginService {
|
|
27
|
+
pluginResolver;
|
|
28
|
+
constructor() {
|
|
29
|
+
this.pluginResolver = new PluginResolver();
|
|
30
|
+
}
|
|
26
31
|
/**
|
|
27
32
|
* Validate that we're in a valid package directory and return the target type
|
|
28
33
|
*/
|
|
@@ -40,13 +45,13 @@ export class PluginService {
|
|
|
40
45
|
async validateAndResolvePlugin(pluginName, workspaceRoot, logger) {
|
|
41
46
|
logger(chalk.blue(`\n🔍 Resolving plugin "${pluginName}"...`));
|
|
42
47
|
logger(` ├─ Validating plugin name...`);
|
|
43
|
-
const validation =
|
|
48
|
+
const validation = this.pluginResolver.validateInput(pluginName);
|
|
44
49
|
if (!validation.isValid) {
|
|
45
50
|
throw new PluginResolutionError(pluginName, validation.error || 'Invalid plugin name');
|
|
46
51
|
}
|
|
47
52
|
logger(` │ └─ ${chalk.green('✓')} Valid plugin name`);
|
|
48
53
|
logger(` ├─ Checking local workspace: ${chalk.dim(`plugins/${pluginName}`)}`);
|
|
49
|
-
const resolution = await
|
|
54
|
+
const resolution = await this.pluginResolver.resolveLocation(pluginName, workspaceRoot);
|
|
50
55
|
let pluginPath;
|
|
51
56
|
if (resolution.source === 'local') {
|
|
52
57
|
logger(` │ └─ ${chalk.green('✓')} Found local plugin`);
|
|
@@ -130,19 +135,11 @@ export class PluginService {
|
|
|
130
135
|
*/
|
|
131
136
|
async downloadNpmPlugin(npmPackage, workspaceRoot, logger) {
|
|
132
137
|
logger(` └─ Installing from npm: ${chalk.cyan(npmPackage)}...`);
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
-
}
|
|
138
|
+
const result = await downloadNpmPackage({
|
|
139
|
+
packageName: npmPackage,
|
|
140
|
+
workspaceRoot,
|
|
141
|
+
});
|
|
142
|
+
return result.packagePath;
|
|
146
143
|
}
|
|
147
144
|
getPackagePath(context) {
|
|
148
145
|
// Determine the base directory based on location type
|
|
@@ -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;AAC5B,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AAEjC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAE7D,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,
|
|
1
|
+
{"version":3,"file":"plugin-svc.js","sourceRoot":"","sources":["../../../../src/modules/plugin/services/plugin-svc.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import * as path from 'path'
|
|
2
|
+
|
|
3
|
+
import { execa } from 'execa'
|
|
4
|
+
|
|
5
|
+
import { NpmInstallationError } from '../modules/plugin/errors/plugin-errors.js'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Options for downloading an npm package
|
|
9
|
+
*/
|
|
10
|
+
export interface DownloadNpmPackageOptions {
|
|
11
|
+
/** The npm package name to download */
|
|
12
|
+
packageName: string
|
|
13
|
+
/** The workspace root directory where node_modules will be */
|
|
14
|
+
workspaceRoot: string
|
|
15
|
+
/** Optional logger function for status messages */
|
|
16
|
+
logger?: (message: string) => void
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Result of downloading an npm package
|
|
21
|
+
*/
|
|
22
|
+
export interface DownloadNpmPackageResult {
|
|
23
|
+
/** Full path to the downloaded package in node_modules */
|
|
24
|
+
packagePath: string
|
|
25
|
+
/** The package name that was downloaded */
|
|
26
|
+
packageName: string
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Download and install an npm package to workspace node_modules
|
|
31
|
+
*
|
|
32
|
+
* This function:
|
|
33
|
+
* - Runs `npm install {packageName} --save-dev` in the workspace root
|
|
34
|
+
* - Adds the package to workspace package.json devDependencies
|
|
35
|
+
* - Returns the path to the installed package in node_modules
|
|
36
|
+
*
|
|
37
|
+
* @param options - Download options
|
|
38
|
+
* @returns The path to the installed package
|
|
39
|
+
* @throws NpmInstallationError if the download fails
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* const result = await downloadNpmPackage({
|
|
43
|
+
* packageName: '@launch77-shared/plugin-release',
|
|
44
|
+
* workspaceRoot: '/path/to/workspace',
|
|
45
|
+
* logger: (msg) => console.log(msg)
|
|
46
|
+
* })
|
|
47
|
+
* // result.packagePath: '/path/to/workspace/node_modules/@launch77-shared/plugin-release'
|
|
48
|
+
*/
|
|
49
|
+
export async function downloadNpmPackage(options: DownloadNpmPackageOptions): Promise<DownloadNpmPackageResult> {
|
|
50
|
+
const { packageName, workspaceRoot, logger } = options
|
|
51
|
+
|
|
52
|
+
if (logger) {
|
|
53
|
+
logger(`Installing from npm: ${packageName}...`)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
try {
|
|
57
|
+
// Install the npm package to the workspace
|
|
58
|
+
await execa('npm', ['install', packageName, '--save-dev'], {
|
|
59
|
+
cwd: workspaceRoot,
|
|
60
|
+
stdio: 'pipe', // Capture output for clean logging
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
// Return path to installed package in node_modules
|
|
64
|
+
const packagePath = path.join(workspaceRoot, 'node_modules', packageName)
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
packagePath,
|
|
68
|
+
packageName,
|
|
69
|
+
}
|
|
70
|
+
} catch (error) {
|
|
71
|
+
throw new NpmInstallationError(packageName, error instanceof Error ? error : undefined)
|
|
72
|
+
}
|
|
73
|
+
}
|