@launch77/cli 1.4.3 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/dist/cli.js +1 -4
- package/dist/cli.js.map +1 -1
- 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 +117 -0
- package/dist/infrastructure/package-resolver.d.ts.map +1 -0
- package/dist/infrastructure/package-resolver.js +170 -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/infrastructure/template.d.ts +0 -1
- package/dist/infrastructure/template.d.ts.map +1 -1
- package/dist/infrastructure/template.js.map +1 -1
- package/dist/modules/app/commands/create-app.d.ts.map +1 -1
- package/dist/modules/app/commands/create-app.js +14 -15
- package/dist/modules/app/commands/create-app.js.map +1 -1
- package/dist/modules/app/commands/delete-app.js +1 -1
- package/dist/modules/app/commands/delete-app.js.map +1 -1
- package/dist/modules/app/commands/validate-manifest.d.ts.map +1 -1
- package/dist/modules/app/commands/validate-manifest.js +0 -1
- package/dist/modules/app/commands/validate-manifest.js.map +1 -1
- package/dist/modules/app/index.d.ts +1 -2
- package/dist/modules/app/index.d.ts.map +1 -1
- package/dist/modules/app/index.js +0 -1
- package/dist/modules/app/index.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 +51 -0
- package/dist/modules/app/lib/app-template-resolver.js.map +1 -0
- package/dist/modules/app/lib/manifest-schema.d.ts +0 -7
- package/dist/modules/app/lib/manifest-schema.d.ts.map +1 -1
- package/dist/modules/app/lib/manifest-schema.js +0 -2
- package/dist/modules/app/lib/manifest-schema.js.map +1 -1
- 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 +77 -12
- package/dist/modules/app/services/app-svc.js.map +1 -1
- package/dist/modules/app/services/manifest-svc.d.ts +2 -2
- package/dist/modules/app/services/manifest-svc.d.ts.map +1 -1
- package/dist/modules/app/services/manifest-svc.js +9 -50
- package/dist/modules/app/services/manifest-svc.js.map +1 -1
- package/dist/modules/app/types/app-types.d.ts +2 -5
- package/dist/modules/app/types/app-types.d.ts.map +1 -1
- package/dist/modules/app/types/app-types.js +1 -4
- package/dist/modules/app/types/app-types.js.map +1 -1
- package/dist/modules/catalog/commands/scan.js +3 -3
- package/dist/modules/catalog/commands/scan.js.map +1 -1
- package/dist/modules/catalog/services/catalog-svc.d.ts +2 -2
- package/dist/modules/catalog/services/catalog-svc.d.ts.map +1 -1
- package/dist/modules/catalog/services/catalog-svc.js +2 -2
- package/dist/modules/catalog/services/catalog-svc.js.map +1 -1
- package/dist/modules/deploy/commands/deploy-init-action.d.ts.map +1 -1
- package/dist/modules/deploy/commands/deploy-init-action.js +21 -20
- package/dist/modules/deploy/commands/deploy-init-action.js.map +1 -1
- package/dist/modules/deploy/commands/deploy-logs-action.d.ts.map +1 -1
- package/dist/modules/deploy/commands/deploy-logs-action.js +16 -13
- package/dist/modules/deploy/commands/deploy-logs-action.js.map +1 -1
- package/dist/modules/deploy/commands/deploy-status-action.d.ts.map +1 -1
- package/dist/modules/deploy/commands/deploy-status-action.js +16 -13
- package/dist/modules/deploy/commands/deploy-status-action.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 +23 -115
- package/dist/modules/plugin/lib/plugin-resolver.js.map +1 -1
- package/dist/modules/plugin/lib/plugin-resolver.test.js +45 -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 +24 -19
- package/dist/modules/plugin/services/plugin-svc.js.map +1 -1
- package/dist/modules/plugin/services/plugin-svc.test.js +12 -6
- package/dist/modules/plugin/services/plugin-svc.test.js.map +1 -1
- package/dist/templates/plugin/package.json.hbs +1 -1
- package/dist/templates/plugin/plugin.json.hbs +1 -3
- package/dist/utils/validation.d.ts +3 -7
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +7 -31
- package/dist/utils/validation.js.map +1 -1
- package/package.json +1 -1
- package/src/cli.ts +1 -4
- package/src/infrastructure/npm-package.ts +73 -0
- package/src/infrastructure/package-resolver.test.ts +313 -0
- package/src/infrastructure/package-resolver.ts +223 -0
- package/src/infrastructure/template.ts +0 -1
- package/src/modules/app/commands/create-app.ts +14 -18
- package/src/modules/app/commands/delete-app.ts +1 -1
- package/src/modules/app/commands/validate-manifest.ts +0 -1
- package/src/modules/app/index.ts +1 -2
- package/src/modules/app/lib/app-template-resolver.ts +56 -0
- package/src/modules/app/lib/manifest-schema.ts +0 -5
- package/src/modules/app/services/app-svc.ts +89 -13
- package/src/modules/app/services/manifest-svc.ts +8 -57
- package/src/modules/app/types/app-types.ts +2 -9
- package/src/modules/catalog/commands/scan.ts +3 -3
- package/src/modules/catalog/services/catalog-svc.ts +4 -4
- package/src/modules/deploy/commands/deploy-init-action.ts +23 -20
- package/src/modules/deploy/commands/deploy-logs-action.ts +19 -13
- package/src/modules/deploy/commands/deploy-status-action.ts +19 -13
- package/src/modules/plugin/lib/plugin-resolver.test.ts +48 -39
- package/src/modules/plugin/lib/plugin-resolver.ts +22 -141
- package/src/modules/plugin/services/plugin-svc.test.ts +12 -6
- package/src/modules/plugin/services/plugin-svc.ts +27 -18
- package/src/utils/validation.ts +10 -38
- package/templates/plugin/package.json.hbs +1 -1
- package/templates/plugin/plugin.json.hbs +1 -3
- package/dist/modules/app/commands/generate-manifest.d.ts +0 -3
- package/dist/modules/app/commands/generate-manifest.d.ts.map +0 -1
- package/dist/modules/app/commands/generate-manifest.js +0 -62
- package/dist/modules/app/commands/generate-manifest.js.map +0 -1
- package/dist/modules/startup/commands/create-startup.d.ts +0 -3
- package/dist/modules/startup/commands/create-startup.d.ts.map +0 -1
- package/dist/modules/startup/commands/create-startup.js +0 -43
- package/dist/modules/startup/commands/create-startup.js.map +0 -1
- package/dist/modules/startup/errors/startup-errors.d.ts +0 -13
- package/dist/modules/startup/errors/startup-errors.d.ts.map +0 -1
- package/dist/modules/startup/errors/startup-errors.js +0 -25
- package/dist/modules/startup/errors/startup-errors.js.map +0 -1
- package/dist/modules/startup/index.d.ts +0 -5
- package/dist/modules/startup/index.d.ts.map +0 -1
- package/dist/modules/startup/index.js +0 -7
- package/dist/modules/startup/index.js.map +0 -1
- package/dist/modules/startup/services/startup-service.d.ts +0 -7
- package/dist/modules/startup/services/startup-service.d.ts.map +0 -1
- package/dist/modules/startup/services/startup-service.js +0 -43
- package/dist/modules/startup/services/startup-service.js.map +0 -1
- package/dist/modules/startup/types/startup-types.d.ts +0 -8
- package/dist/modules/startup/types/startup-types.d.ts.map +0 -1
- package/dist/modules/startup/types/startup-types.js +0 -2
- package/dist/modules/startup/types/startup-types.js.map +0 -1
- package/dist/modules/startup/utils/startup-validators.d.ts +0 -8
- package/dist/modules/startup/utils/startup-validators.d.ts.map +0 -1
- package/dist/modules/startup/utils/startup-validators.js +0 -17
- package/dist/modules/startup/utils/startup-validators.js.map +0 -1
- package/dist/templates/startup/apps/.gitkeep +0 -8
- package/dist/utils/monorepo.d.ts +0 -19
- package/dist/utils/monorepo.d.ts.map +0 -1
- package/dist/utils/monorepo.js +0 -100
- package/dist/utils/monorepo.js.map +0 -1
- package/src/modules/app/commands/generate-manifest.ts +0 -75
- package/src/modules/startup/commands/create-startup.ts +0 -53
- package/src/modules/startup/errors/startup-errors.ts +0 -23
- package/src/modules/startup/index.ts +0 -11
- package/src/modules/startup/services/startup-service.ts +0 -57
- package/src/modules/startup/types/startup-types.ts +0 -8
- package/src/modules/startup/utils/startup-validators.ts +0 -19
- package/src/utils/monorepo.ts +0 -137
- package/templates/startup/apps/.gitkeep +0 -8
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
* deploy:logs action - View deployment runtime logs
|
|
3
3
|
*/
|
|
4
4
|
/* eslint-disable no-console */
|
|
5
|
+
import * as path from 'path';
|
|
5
6
|
import chalk from 'chalk';
|
|
6
|
-
import {
|
|
7
|
+
import { detectLaunch77Context } from '@launch77/plugin-runtime';
|
|
8
|
+
import fs from 'fs-extra';
|
|
7
9
|
import { DeployService } from '../services/deploy-svc.js';
|
|
8
10
|
import { getVercelInstallInstructions, isVercelCliInstalled, runVercelCommand } from '../utils/vercel-extended.js';
|
|
9
11
|
/**
|
|
@@ -11,23 +13,24 @@ import { getVercelInstallInstructions, isVercelCliInstalled, runVercelCommand }
|
|
|
11
13
|
*/
|
|
12
14
|
export async function deployLogs(options) {
|
|
13
15
|
const deployService = new DeployService();
|
|
14
|
-
// Detect
|
|
15
|
-
const context = await
|
|
16
|
-
if (context.
|
|
17
|
-
throw new Error('Must be run from within an app directory (e.g.,
|
|
16
|
+
// Detect Launch77 context
|
|
17
|
+
const context = await detectLaunch77Context(process.cwd());
|
|
18
|
+
if (context.locationType !== 'workspace-app') {
|
|
19
|
+
throw new Error('Must be run from within an app directory (e.g., apps/myapp)');
|
|
18
20
|
}
|
|
19
21
|
const appPath = process.cwd();
|
|
20
22
|
console.log(chalk.blue(`\n📜 Deployment Logs\n`));
|
|
21
23
|
// Load manifest
|
|
22
24
|
const manifest = await deployService.loadManifest();
|
|
23
|
-
// Check
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
console.log(chalk.
|
|
25
|
+
// Check template type from app's package.json
|
|
26
|
+
const appPackageJsonPath = path.join(appPath, 'package.json');
|
|
27
|
+
const appPackageJson = await fs.readJson(appPackageJsonPath);
|
|
28
|
+
const templatePackage = appPackageJson.launch77?.template?.package;
|
|
29
|
+
// Only allow webapp apps to deploy to Vercel
|
|
30
|
+
const isWebapp = templatePackage === 'webapp' || templatePackage === '@launch77-shared/app-template-webapp';
|
|
31
|
+
if (!isWebapp) {
|
|
32
|
+
console.log(chalk.yellow('⚠️ Vercel deployment only supports webapp apps'));
|
|
33
|
+
console.log(chalk.gray('Other app types coming soon'));
|
|
31
34
|
console.log();
|
|
32
35
|
return;
|
|
33
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-logs-action.js","sourceRoot":"","sources":["../../../../src/modules/deploy/commands/deploy-logs-action.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,+BAA+B;AAC/B,OAAO,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"deploy-logs-action.js","sourceRoot":"","sources":["../../../../src/modules/deploy/commands/deploy-logs-action.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-status-action.d.ts","sourceRoot":"","sources":["../../../../src/modules/deploy/commands/deploy-status-action.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"deploy-status-action.d.ts","sourceRoot":"","sources":["../../../../src/modules/deploy/commands/deploy-status-action.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH;;GAEG;AACH,wBAAsB,YAAY,kBAkKjC"}
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
* deploy:status action - Show deployment status for an app
|
|
3
3
|
*/
|
|
4
4
|
/* eslint-disable no-console */
|
|
5
|
+
import * as path from 'path';
|
|
5
6
|
import chalk from 'chalk';
|
|
7
|
+
import { detectLaunch77Context } from '@launch77/plugin-runtime';
|
|
8
|
+
import fs from 'fs-extra';
|
|
6
9
|
import ora from 'ora';
|
|
7
|
-
import { detectMonorepoContext } from '../../../utils/monorepo.js';
|
|
8
10
|
import { DeployService } from '../services/deploy-svc.js';
|
|
9
11
|
import { getVercelInstallInstructions, isVercelCliInstalled, runVercelCommand, verifyVercelProjectExists } from '../utils/vercel-extended.js';
|
|
10
12
|
/**
|
|
@@ -12,23 +14,24 @@ import { getVercelInstallInstructions, isVercelCliInstalled, runVercelCommand, v
|
|
|
12
14
|
*/
|
|
13
15
|
export async function deployStatus() {
|
|
14
16
|
const deployService = new DeployService();
|
|
15
|
-
// Detect
|
|
16
|
-
const context = await
|
|
17
|
-
if (context.
|
|
18
|
-
throw new Error('Must be run from within an app directory (e.g.,
|
|
17
|
+
// Detect Launch77 context
|
|
18
|
+
const context = await detectLaunch77Context(process.cwd());
|
|
19
|
+
if (context.locationType !== 'workspace-app') {
|
|
20
|
+
throw new Error('Must be run from within an app directory (e.g., apps/myapp)');
|
|
19
21
|
}
|
|
20
22
|
const appPath = process.cwd();
|
|
21
23
|
console.log(chalk.blue(`\n📊 Deployment Status\n`));
|
|
22
24
|
// Load manifest
|
|
23
25
|
const manifest = await deployService.loadManifest();
|
|
24
|
-
// Check
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
console.log(chalk.
|
|
26
|
+
// Check template type from app's package.json
|
|
27
|
+
const appPackageJsonPath = path.join(appPath, 'package.json');
|
|
28
|
+
const appPackageJson = await fs.readJson(appPackageJsonPath);
|
|
29
|
+
const templatePackage = appPackageJson.launch77?.template?.package;
|
|
30
|
+
// Only allow webapp apps to deploy to Vercel
|
|
31
|
+
const isWebapp = templatePackage === 'webapp' || templatePackage === '@launch77-shared/app-template-webapp';
|
|
32
|
+
if (!isWebapp) {
|
|
33
|
+
console.log(chalk.yellow('⚠️ Vercel deployment only supports webapp apps'));
|
|
34
|
+
console.log(chalk.gray('Other app types coming soon'));
|
|
32
35
|
console.log();
|
|
33
36
|
return;
|
|
34
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-status-action.js","sourceRoot":"","sources":["../../../../src/modules/deploy/commands/deploy-status-action.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,+BAA+B;AAC/B,OAAO,KAAK,MAAM,
|
|
1
|
+
{"version":3,"file":"deploy-status-action.js","sourceRoot":"","sources":["../../../../src/modules/deploy/commands/deploy-status-action.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,76 +1,14 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { PackageResolver } from '../../../infrastructure/package-resolver.js';
|
|
2
2
|
/**
|
|
3
|
-
* Plugin
|
|
4
|
-
*/
|
|
5
|
-
export interface PluginResolution {
|
|
6
|
-
/** The source of the plugin */
|
|
7
|
-
source: 'local' | 'npm';
|
|
8
|
-
/** The resolved name/package to use */
|
|
9
|
-
resolvedName: string;
|
|
10
|
-
/** The local path if source is 'local' */
|
|
11
|
-
localPath?: string;
|
|
12
|
-
/** The npm package name if source is 'npm' */
|
|
13
|
-
npmPackage?: string;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Validate plugin input name
|
|
17
|
-
*
|
|
18
|
-
* Accepts:
|
|
19
|
-
* - Unscoped names (e.g., "release", "my-plugin")
|
|
20
|
-
* - Scoped npm packages (e.g., "@ibm/plugin-name")
|
|
21
|
-
*
|
|
22
|
-
* Rejects:
|
|
23
|
-
* - Invalid formats
|
|
24
|
-
* - Empty strings
|
|
25
|
-
* - Names with invalid characters
|
|
3
|
+
* Plugin resolver implementation
|
|
26
4
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* @example
|
|
31
|
-
* validatePluginInput('release') // { isValid: true }
|
|
32
|
-
* validatePluginInput('@ibm/analytics') // { isValid: true }
|
|
33
|
-
* validatePluginInput('@invalid') // { isValid: false, error: '...' }
|
|
5
|
+
* Resolves plugins from:
|
|
6
|
+
* - Local workspace plugins/ directory
|
|
7
|
+
* - npm packages with @launch77-shared/plugin- prefix
|
|
34
8
|
*/
|
|
35
|
-
export declare
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
* - Unscoped names: prefix with @launch77-shared/plugin-
|
|
41
|
-
* - Scoped names: use as-is
|
|
42
|
-
*
|
|
43
|
-
* @param name - The plugin name (must be validated first)
|
|
44
|
-
* @returns The npm package name
|
|
45
|
-
*
|
|
46
|
-
* @example
|
|
47
|
-
* toNpmPackageName('release') // '@launch77-shared/plugin-release'
|
|
48
|
-
* toNpmPackageName('@ibm/analytics') // '@ibm/analytics'
|
|
49
|
-
*/
|
|
50
|
-
export declare function toNpmPackageName(name: string): string;
|
|
51
|
-
/**
|
|
52
|
-
* Resolve plugin location from name
|
|
53
|
-
*
|
|
54
|
-
* Resolution order:
|
|
55
|
-
* 1. Check local workspace plugins directory
|
|
56
|
-
* 2. Resolve to npm package name
|
|
57
|
-
*
|
|
58
|
-
* @param name - The plugin name to resolve
|
|
59
|
-
* @param workspaceRoot - The workspace root directory
|
|
60
|
-
* @returns PluginResolution with source and resolved location
|
|
61
|
-
*
|
|
62
|
-
* @example
|
|
63
|
-
* // Local plugin found
|
|
64
|
-
* await resolvePluginLocation('my-plugin', '/workspace')
|
|
65
|
-
* // { source: 'local', resolvedName: 'my-plugin', localPath: '/workspace/plugins/my-plugin' }
|
|
66
|
-
*
|
|
67
|
-
* // Not found locally, resolve to npm
|
|
68
|
-
* await resolvePluginLocation('release', '/workspace')
|
|
69
|
-
* // { source: 'npm', resolvedName: 'release', npmPackage: '@launch77-shared/plugin-release' }
|
|
70
|
-
*
|
|
71
|
-
* // Scoped package always resolves to npm
|
|
72
|
-
* await resolvePluginLocation('@ibm/analytics', '/workspace')
|
|
73
|
-
* // { source: 'npm', resolvedName: '@ibm/analytics', npmPackage: '@ibm/analytics' }
|
|
74
|
-
*/
|
|
75
|
-
export declare function resolvePluginLocation(name: string, workspaceRoot: string): Promise<PluginResolution>;
|
|
9
|
+
export declare class PluginResolver extends PackageResolver {
|
|
10
|
+
protected getFolderName(): string;
|
|
11
|
+
protected getPackagePrefix(): string;
|
|
12
|
+
protected verify(localPath: string): Promise<boolean>;
|
|
13
|
+
}
|
|
76
14
|
//# sourceMappingURL=plugin-resolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-resolver.d.ts","sourceRoot":"","sources":["../../../../src/modules/plugin/lib/plugin-resolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin-resolver.d.ts","sourceRoot":"","sources":["../../../../src/modules/plugin/lib/plugin-resolver.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAA;AAE7E;;;;;;GAMG;AACH,qBAAa,cAAe,SAAQ,eAAe;IACjD,SAAS,CAAC,aAAa,IAAI,MAAM;IAIjC,SAAS,CAAC,gBAAgB,IAAI,MAAM;cAIpB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAkB5D"}
|
|
@@ -1,128 +1,36 @@
|
|
|
1
1
|
import * as path from 'path';
|
|
2
2
|
import fs from 'fs-extra';
|
|
3
|
-
import {
|
|
3
|
+
import { PackageResolver } from '../../../infrastructure/package-resolver.js';
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* Plugin resolver implementation
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
* -
|
|
9
|
-
* -
|
|
10
|
-
*
|
|
11
|
-
* Rejects:
|
|
12
|
-
* - Invalid formats
|
|
13
|
-
* - Empty strings
|
|
14
|
-
* - Names with invalid characters
|
|
15
|
-
*
|
|
16
|
-
* @param name - The plugin name to validate
|
|
17
|
-
* @returns ValidationResult with isValid and optional error message
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* validatePluginInput('release') // { isValid: true }
|
|
21
|
-
* validatePluginInput('@ibm/analytics') // { isValid: true }
|
|
22
|
-
* validatePluginInput('@invalid') // { isValid: false, error: '...' }
|
|
23
|
-
*/
|
|
24
|
-
export function validatePluginInput(name) {
|
|
25
|
-
if (!name || name.trim().length === 0) {
|
|
26
|
-
return {
|
|
27
|
-
isValid: false,
|
|
28
|
-
error: 'Plugin name cannot be empty',
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
const trimmedName = name.trim();
|
|
32
|
-
// Parse the name to determine type and validate
|
|
33
|
-
const parsed = parsePluginName(trimmedName);
|
|
34
|
-
if (!parsed.isValid) {
|
|
35
|
-
return {
|
|
36
|
-
isValid: false,
|
|
37
|
-
error: parsed.error,
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
// If it's scoped, it must be a valid npm package name
|
|
41
|
-
if (parsed.type === 'scoped') {
|
|
42
|
-
return isValidNpmPackageName(trimmedName);
|
|
43
|
-
}
|
|
44
|
-
// Unscoped names are valid for both local and npm
|
|
45
|
-
return { isValid: true };
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Convert an unscoped plugin name to an npm package name
|
|
49
|
-
*
|
|
50
|
-
* Rules:
|
|
51
|
-
* - Unscoped names: prefix with @launch77-shared/plugin-
|
|
52
|
-
* - Scoped names: use as-is
|
|
53
|
-
*
|
|
54
|
-
* @param name - The plugin name (must be validated first)
|
|
55
|
-
* @returns The npm package name
|
|
56
|
-
*
|
|
57
|
-
* @example
|
|
58
|
-
* toNpmPackageName('release') // '@launch77-shared/plugin-release'
|
|
59
|
-
* toNpmPackageName('@ibm/analytics') // '@ibm/analytics'
|
|
7
|
+
* Resolves plugins from:
|
|
8
|
+
* - Local workspace plugins/ directory
|
|
9
|
+
* - npm packages with @launch77-shared/plugin- prefix
|
|
60
10
|
*/
|
|
61
|
-
export
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
if (trimmedName.startsWith('@')) {
|
|
65
|
-
return trimmedName;
|
|
11
|
+
export class PluginResolver extends PackageResolver {
|
|
12
|
+
getFolderName() {
|
|
13
|
+
return 'plugins';
|
|
66
14
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Resolve plugin location from name
|
|
72
|
-
*
|
|
73
|
-
* Resolution order:
|
|
74
|
-
* 1. Check local workspace plugins directory
|
|
75
|
-
* 2. Resolve to npm package name
|
|
76
|
-
*
|
|
77
|
-
* @param name - The plugin name to resolve
|
|
78
|
-
* @param workspaceRoot - The workspace root directory
|
|
79
|
-
* @returns PluginResolution with source and resolved location
|
|
80
|
-
*
|
|
81
|
-
* @example
|
|
82
|
-
* // Local plugin found
|
|
83
|
-
* await resolvePluginLocation('my-plugin', '/workspace')
|
|
84
|
-
* // { source: 'local', resolvedName: 'my-plugin', localPath: '/workspace/plugins/my-plugin' }
|
|
85
|
-
*
|
|
86
|
-
* // Not found locally, resolve to npm
|
|
87
|
-
* await resolvePluginLocation('release', '/workspace')
|
|
88
|
-
* // { source: 'npm', resolvedName: 'release', npmPackage: '@launch77-shared/plugin-release' }
|
|
89
|
-
*
|
|
90
|
-
* // Scoped package always resolves to npm
|
|
91
|
-
* await resolvePluginLocation('@ibm/analytics', '/workspace')
|
|
92
|
-
* // { source: 'npm', resolvedName: '@ibm/analytics', npmPackage: '@ibm/analytics' }
|
|
93
|
-
*/
|
|
94
|
-
export async function resolvePluginLocation(name, workspaceRoot) {
|
|
95
|
-
const trimmedName = name.trim();
|
|
96
|
-
const parsed = parsePluginName(trimmedName);
|
|
97
|
-
// If scoped, always use npm (local plugins are never scoped)
|
|
98
|
-
if (parsed.type === 'scoped') {
|
|
99
|
-
return {
|
|
100
|
-
source: 'npm',
|
|
101
|
-
resolvedName: trimmedName,
|
|
102
|
-
npmPackage: trimmedName,
|
|
103
|
-
};
|
|
15
|
+
getPackagePrefix() {
|
|
16
|
+
return '@launch77-shared/plugin-';
|
|
104
17
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const localExists = await fs.pathExists(localPath);
|
|
108
|
-
if (localExists) {
|
|
109
|
-
// Verify it's a valid plugin (has plugin.json and dist/generator.js)
|
|
18
|
+
async verify(localPath) {
|
|
19
|
+
// Verify it's a valid plugin (has plugin.json, dist/generator.js, and package.json with version)
|
|
110
20
|
const hasPluginJson = await fs.pathExists(path.join(localPath, 'plugin.json'));
|
|
111
21
|
const hasGenerator = await fs.pathExists(path.join(localPath, 'dist/generator.js'));
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
22
|
+
const hasPackageJson = await fs.pathExists(path.join(localPath, 'package.json'));
|
|
23
|
+
if (!hasPluginJson || !hasGenerator || !hasPackageJson) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
// Verify package.json has a version field
|
|
27
|
+
try {
|
|
28
|
+
const packageJson = await fs.readJson(path.join(localPath, 'package.json'));
|
|
29
|
+
return !!packageJson.version;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return false;
|
|
118
33
|
}
|
|
119
34
|
}
|
|
120
|
-
// Not found locally, resolve to npm package
|
|
121
|
-
const npmPackage = toNpmPackageName(trimmedName);
|
|
122
|
-
return {
|
|
123
|
-
source: 'npm',
|
|
124
|
-
resolvedName: trimmedName,
|
|
125
|
-
npmPackage,
|
|
126
|
-
};
|
|
127
35
|
}
|
|
128
36
|
//# sourceMappingURL=plugin-resolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-resolver.js","sourceRoot":"","sources":["../../../../src/modules/plugin/lib/plugin-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,OAAO,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"plugin-resolver.js","sourceRoot":"","sources":["../../../../src/modules/plugin/lib/plugin-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,OAAO,EAAE,MAAM,UAAU,CAAA;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAA;AAE7E;;;;;;GAMG;AACH,MAAM,OAAO,cAAe,SAAQ,eAAe;IACvC,aAAa;QACrB,OAAO,SAAS,CAAA;IAClB,CAAC;IAES,gBAAgB;QACxB,OAAO,0BAA0B,CAAA;IACnC,CAAC;IAES,KAAK,CAAC,MAAM,CAAC,SAAiB;QACtC,iGAAiG;QACjG,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAA;QAC9E,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAA;QACnF,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAA;QAEhF,IAAI,CAAC,aAAa,IAAI,CAAC,YAAY,IAAI,CAAC,cAAc,EAAE,CAAC;YACvD,OAAO,KAAK,CAAA;QACd,CAAC;QAED,0CAA0C;QAC1C,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAA;YAC3E,OAAO,CAAC,CAAC,WAAW,CAAC,OAAO,CAAA;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;CACF"}
|
|
@@ -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
|
|
@@ -92,16 +96,18 @@ describe('Plugin Resolver', () => {
|
|
|
92
96
|
await fs.ensureDir(pluginPath);
|
|
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' }));
|
|
99
|
+
await fs.writeFile(path.join(pluginPath, 'package.json'), JSON.stringify({ name: 'my-plugin', version: '0.0.1' }));
|
|
95
100
|
await fs.writeFile(path.join(pluginPath, 'dist/generator.js'), 'console.log("test")');
|
|
96
|
-
const result = await
|
|
101
|
+
const result = await resolver.resolveLocation('my-plugin', tempDir);
|
|
97
102
|
expect(result).toEqual({
|
|
98
103
|
source: 'local',
|
|
99
104
|
resolvedName: 'my-plugin',
|
|
100
105
|
localPath: pluginPath,
|
|
106
|
+
version: '0.0.1',
|
|
101
107
|
});
|
|
102
108
|
});
|
|
103
109
|
it('should resolve to npm if local plugin does not exist', async () => {
|
|
104
|
-
const result = await
|
|
110
|
+
const result = await resolver.resolveLocation('release', tempDir);
|
|
105
111
|
expect(result).toEqual({
|
|
106
112
|
source: 'npm',
|
|
107
113
|
resolvedName: 'release',
|
|
@@ -114,7 +120,7 @@ describe('Plugin Resolver', () => {
|
|
|
114
120
|
await fs.ensureDir(pluginPath);
|
|
115
121
|
await fs.ensureDir(path.join(pluginPath, 'dist'));
|
|
116
122
|
await fs.writeFile(path.join(pluginPath, 'dist/generator.js'), 'console.log("test")');
|
|
117
|
-
const result = await
|
|
123
|
+
const result = await resolver.resolveLocation('incomplete', tempDir);
|
|
118
124
|
expect(result).toEqual({
|
|
119
125
|
source: 'npm',
|
|
120
126
|
resolvedName: 'incomplete',
|
|
@@ -126,7 +132,7 @@ describe('Plugin Resolver', () => {
|
|
|
126
132
|
const pluginPath = path.join(tempDir, 'plugins', 'incomplete');
|
|
127
133
|
await fs.ensureDir(pluginPath);
|
|
128
134
|
await fs.writeFile(path.join(pluginPath, 'plugin.json'), JSON.stringify({ name: 'incomplete', version: '1.0.0' }));
|
|
129
|
-
const result = await
|
|
135
|
+
const result = await resolver.resolveLocation('incomplete', tempDir);
|
|
130
136
|
expect(result).toEqual({
|
|
131
137
|
source: 'npm',
|
|
132
138
|
resolvedName: 'incomplete',
|
|
@@ -137,7 +143,7 @@ describe('Plugin Resolver', () => {
|
|
|
137
143
|
// Even if a directory exists locally, scoped names go to npm
|
|
138
144
|
const pluginPath = path.join(tempDir, 'plugins', '@ibm');
|
|
139
145
|
await fs.ensureDir(pluginPath);
|
|
140
|
-
const result = await
|
|
146
|
+
const result = await resolver.resolveLocation('@ibm/analytics', tempDir);
|
|
141
147
|
expect(result).toEqual({
|
|
142
148
|
source: 'npm',
|
|
143
149
|
resolvedName: '@ibm/analytics',
|
|
@@ -145,7 +151,7 @@ describe('Plugin Resolver', () => {
|
|
|
145
151
|
});
|
|
146
152
|
});
|
|
147
153
|
it('should resolve scoped @launch77-shared packages to npm', async () => {
|
|
148
|
-
const result = await
|
|
154
|
+
const result = await resolver.resolveLocation('@launch77-shared/plugin-release', tempDir);
|
|
149
155
|
expect(result).toEqual({
|
|
150
156
|
source: 'npm',
|
|
151
157
|
resolvedName: '@launch77-shared/plugin-release',
|
|
@@ -155,7 +161,7 @@ describe('Plugin Resolver', () => {
|
|
|
155
161
|
it('should handle plugins directory not existing', async () => {
|
|
156
162
|
// Remove plugins directory
|
|
157
163
|
await fs.remove(path.join(tempDir, 'plugins'));
|
|
158
|
-
const result = await
|
|
164
|
+
const result = await resolver.resolveLocation('release', tempDir);
|
|
159
165
|
expect(result).toEqual({
|
|
160
166
|
source: 'npm',
|
|
161
167
|
resolvedName: 'release',
|
|
@@ -163,7 +169,7 @@ describe('Plugin Resolver', () => {
|
|
|
163
169
|
});
|
|
164
170
|
});
|
|
165
171
|
it('should trim whitespace from plugin names', async () => {
|
|
166
|
-
const result = await
|
|
172
|
+
const result = await resolver.resolveLocation(' release ', tempDir);
|
|
167
173
|
expect(result).toEqual({
|
|
168
174
|
source: 'npm',
|
|
169
175
|
resolvedName: 'release',
|