@oxlayer/cli 0.0.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.
package/README.md ADDED
@@ -0,0 +1,152 @@
1
+ # OxLayer SDK Installer
2
+
3
+ A command-line tool for downloading and installing OxLayer SDK packages.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g @oxlayer/sdk-installer
9
+ ```
10
+
11
+ Or use without installing:
12
+
13
+ ```bash
14
+ npx @oxlayer/sdk-installer <command>
15
+ ```
16
+
17
+ ## Commands
18
+
19
+ ### `oxlayer login`
20
+
21
+ Authenticate with the OxLayer Control Panel using your API key.
22
+
23
+ ```bash
24
+ oxlayer login
25
+ ```
26
+
27
+ You can also provide the key directly:
28
+
29
+ ```bash
30
+ oxlayer login --key oxl_your_api_key_here
31
+ ```
32
+
33
+ ### `oxlayer status`
34
+
35
+ Show your current authentication status and SDK installation.
36
+
37
+ ```bash
38
+ oxlayer status
39
+ ```
40
+
41
+ With verbose output:
42
+
43
+ ```bash
44
+ oxlayer status --verbose
45
+ ```
46
+
47
+ ### `oxlayer install`
48
+
49
+ Download and install SDK packages.
50
+
51
+ ```bash
52
+ # Install latest version
53
+ oxlayer install
54
+
55
+ # Install specific version
56
+ oxlayer install 2025_02_08_001
57
+
58
+ # Install specific packages
59
+ oxlayer install --packages backend-sdk frontend-sdk
60
+
61
+ # Install with options
62
+ oxlayer install --save --environment production
63
+ ```
64
+
65
+ Options:
66
+ - `[version]` - Specific version to install (default: latest)
67
+ - `-p, --packages <packages...>` - Specific packages to install
68
+ - `-e, --environment <env>` - Environment (development|staging|production)
69
+ - `--dry-run` - Show what would be installed without installing
70
+ - `-f, --force` - Force reinstall even if already installed
71
+ - `--save` - Add to dependencies in package.json
72
+ - `--save-dev` - Add to devDependencies in package.json
73
+
74
+ ### `oxlayer resolve`
75
+
76
+ Resolve and display capability configuration for the current project.
77
+
78
+ ```bash
79
+ oxlayer resolve
80
+ ```
81
+
82
+ With usage examples:
83
+
84
+ ```bash
85
+ oxlayer resolve --verbose
86
+ ```
87
+
88
+ ### `oxlayer logout`
89
+
90
+ Remove stored API key and configuration.
91
+
92
+ ```bash
93
+ oxlayer logout
94
+ ```
95
+
96
+ ## Usage Example
97
+
98
+ ```bash
99
+ # 1. Authenticate
100
+ oxlayer login
101
+
102
+ # 2. Check your project's capabilities
103
+ oxlayer resolve
104
+
105
+ # 3. Install the SDK
106
+ oxlayer install
107
+
108
+ # 4. Install dependencies
109
+ pnpm install
110
+ ```
111
+
112
+ ## Configuration
113
+
114
+ The installer stores its configuration in `~/.oxlayer/config.json`:
115
+
116
+ ```json
117
+ {
118
+ "apiKey": "oxl_...",
119
+ "environment": "development",
120
+ "vendorDir": ".capabilities-vendor"
121
+ }
122
+ ```
123
+
124
+ You can also use environment variables:
125
+
126
+ - `OXLAYER_API_KEY` - Your API key
127
+ - `OXLAYER_API_ENDPOINT` - Custom API endpoint (default: https://api.oxlayer.dev)
128
+
129
+ ## Vendor Directory
130
+
131
+ Installed packages are stored in `.capabilities-vendor/<version>/` in your project:
132
+
133
+ ```
134
+ .my-project/
135
+ ├── .capabilities-vendor/
136
+ │ └── 2025_02_08_001/
137
+ │ ├── foundation/
138
+ │ ├── capabilities/
139
+ │ └── frontend/
140
+ ├── package.json
141
+ └── src/
142
+ ```
143
+
144
+ ## Security Notes
145
+
146
+ - Your API key is stored locally in `~/.oxlayer/config.json`
147
+ - Never commit `.capabilities-vendor/` to version control
148
+ - Add `.capabilities-vendor/` to your `.gitignore`
149
+
150
+ ## License
151
+
152
+ MIT © OxLayer
@@ -0,0 +1,17 @@
1
+ import {
2
+ api_service_default,
3
+ getLatestVersion,
4
+ healthCheck,
5
+ requestPackageDownload,
6
+ resolveCapabilities
7
+ } from "./chunk-DOYXC6AO.js";
8
+ import "./chunk-QERPYPW4.js";
9
+ import "./chunk-HQST7GVM.js";
10
+ export {
11
+ api_service_default as default,
12
+ getLatestVersion,
13
+ healthCheck,
14
+ requestPackageDownload,
15
+ resolveCapabilities
16
+ };
17
+ //# sourceMappingURL=api.service-CDPTVMJM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,93 @@
1
+ import {
2
+ getAccessToken,
3
+ init_device_auth_service,
4
+ validateToken
5
+ } from "./chunk-QERPYPW4.js";
6
+ import {
7
+ init_esm_shims
8
+ } from "./chunk-HQST7GVM.js";
9
+
10
+ // src/services/api.service.ts
11
+ init_esm_shims();
12
+ init_device_auth_service();
13
+ function getApiEndpoint() {
14
+ return "http://localhost:3001";
15
+ }
16
+ async function apiRequest(endpoint, options = {}) {
17
+ const token = process.env.OXLAYER_TOKEN || await getAccessToken();
18
+ if (!token || !validateToken(token)) {
19
+ throw new Error(
20
+ "Invalid or missing access token. Please run: oxlayer login"
21
+ );
22
+ }
23
+ const url = `${getApiEndpoint()}${endpoint}`;
24
+ const response = await fetch(url, {
25
+ ...options,
26
+ headers: {
27
+ "Content-Type": "application/json",
28
+ "Authorization": `Bearer ${token}`,
29
+ ...options.headers
30
+ }
31
+ });
32
+ if (!response.ok) {
33
+ const error = await response.text();
34
+ throw new Error(`API request failed (${response.status}): ${error}`);
35
+ }
36
+ return response.json();
37
+ }
38
+ async function resolveCapabilities(requested, environment = "development", projectId) {
39
+ const result = await apiRequest(
40
+ "/v1/capabilities/resolve",
41
+ {
42
+ method: "POST",
43
+ body: JSON.stringify({
44
+ projectId,
45
+ environment,
46
+ requested
47
+ })
48
+ }
49
+ );
50
+ return result.data;
51
+ }
52
+ async function requestPackageDownload(packageType, version) {
53
+ const result = await apiRequest(
54
+ "/v1/packages/download",
55
+ {
56
+ method: "POST",
57
+ body: JSON.stringify({
58
+ packageType,
59
+ version
60
+ })
61
+ }
62
+ );
63
+ return result.data;
64
+ }
65
+ async function getLatestVersion() {
66
+ const result = await apiRequest(
67
+ "/v1/latest-version"
68
+ );
69
+ return result.data.version;
70
+ }
71
+ async function healthCheck() {
72
+ try {
73
+ await apiRequest("/v1/health");
74
+ return true;
75
+ } catch {
76
+ return false;
77
+ }
78
+ }
79
+ var api_service_default = {
80
+ resolveCapabilities,
81
+ requestPackageDownload,
82
+ getLatestVersion,
83
+ healthCheck
84
+ };
85
+
86
+ export {
87
+ resolveCapabilities,
88
+ requestPackageDownload,
89
+ getLatestVersion,
90
+ healthCheck,
91
+ api_service_default
92
+ };
93
+ //# sourceMappingURL=chunk-DOYXC6AO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/services/api.service.ts"],"sourcesContent":["/**\n * API Service\n *\n * Handles communication with the OxLayer Control Panel API using scoped tokens.\n *\n * @deprecated This service will be refactored to use capability manifests.\n * New code should work with manifests directly via device-auth.service.ts.\n */\n\nimport type {\n CapabilityResolutionResponse,\n PackageDownloadResponse,\n} from '../types/capabilities.js';\nimport type {\n CapabilityName,\n Environment,\n SdkPackageType,\n} from '../types/index.js';\nimport { getAccessToken, validateToken } from './device-auth.service.js';\n\nconst DEFAULT_API_ENDPOINT = 'https://api.oxlayer.dev';\n\n/**\n * Get API endpoint from config or default\n */\nfunction getApiEndpoint(): string {\n return process.env.OXLAYER_API_ENDPOINT || DEFAULT_API_ENDPOINT;\n}\n\n/**\n * Make an authenticated API request using scoped token\n */\nasync function apiRequest<T>(\n endpoint: string,\n options: RequestInit = {}\n): Promise<T> {\n const token = process.env.OXLAYER_TOKEN || await getAccessToken();\n\n if (!token || !validateToken(token)) {\n throw new Error(\n 'Invalid or missing access token. Please run: oxlayer login'\n );\n }\n\n const url = `${getApiEndpoint()}${endpoint}`;\n\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${token}`,\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`API request failed (${response.status}): ${error}`);\n }\n\n return response.json();\n}\n\n/**\n * Resolve capabilities for the current project\n *\n * This is the main method that SDKs call to get their configuration.\n *\n * @deprecated Use getManifest from device-auth.service.ts instead\n */\nexport async function resolveCapabilities(\n requested: CapabilityName[],\n environment: Environment = 'development',\n projectId?: string\n): Promise<CapabilityResolutionResponse> {\n const result = await apiRequest<{ data: CapabilityResolutionResponse }>(\n '/v1/capabilities/resolve',\n {\n method: 'POST',\n body: JSON.stringify({\n projectId,\n environment,\n requested,\n }),\n }\n );\n\n return result.data;\n}\n\n/**\n * Request a package download URL\n *\n * Returns a signed URL for downloading a package from R2/S3\n *\n * @deprecated Use getManifest from device-auth.service.ts to get package URLs\n */\nexport async function requestPackageDownload(\n packageType: SdkPackageType,\n version?: string\n): Promise<PackageDownloadResponse> {\n const result = await apiRequest<{ data: PackageDownloadResponse }>(\n '/v1/packages/download',\n {\n method: 'POST',\n body: JSON.stringify({\n packageType,\n version,\n }),\n }\n );\n\n return result.data;\n}\n\n/**\n * Get latest release version\n */\nexport async function getLatestVersion(): Promise<string> {\n const result = await apiRequest<{ data: { version: string } }>(\n '/v1/latest-version'\n );\n return result.data.version;\n}\n\n/**\n * Check API health\n */\nexport async function healthCheck(): Promise<boolean> {\n try {\n await apiRequest<{ status: string }>('/v1/health');\n return true;\n } catch {\n return false;\n }\n}\n\nexport default {\n resolveCapabilities,\n requestPackageDownload,\n getLatestVersion,\n healthCheck,\n};\n"],"mappings":";;;;;;;;;;AAAA;AAkBA;AAOA,SAAS,iBAAyB;AAChC,SAAO;AACT;AAKA,eAAe,WACb,UACA,UAAuB,CAAC,GACZ;AACZ,QAAM,QAAQ,QAAQ,IAAI,iBAAiB,MAAM,eAAe;AAEhE,MAAI,CAAC,SAAS,CAAC,cAAc,KAAK,GAAG;AACnC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,MAAM,GAAG,eAAe,CAAC,GAAG,QAAQ;AAE1C,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,GAAG;AAAA,IACH,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,iBAAiB,UAAU,KAAK;AAAA,MAChC,GAAG,QAAQ;AAAA,IACb;AAAA,EACF,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,MAAM,KAAK,EAAE;AAAA,EACrE;AAEA,SAAO,SAAS,KAAK;AACvB;AASA,eAAsB,oBACpB,WACA,cAA2B,eAC3B,WACuC;AACvC,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,OAAO;AAChB;AASA,eAAsB,uBACpB,aACA,SACkC;AAClC,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QACnB;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,OAAO;AAChB;AAKA,eAAsB,mBAAoC;AACxD,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,EACF;AACA,SAAO,OAAO,KAAK;AACrB;AAKA,eAAsB,cAAgC;AACpD,MAAI;AACF,UAAM,WAA+B,YAAY;AACjD,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAO,sBAAQ;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":[]}
@@ -0,0 +1,108 @@
1
+ import {
2
+ init_esm_shims
3
+ } from "./chunk-HQST7GVM.js";
4
+
5
+ // src/utils/cli.ts
6
+ init_esm_shims();
7
+ import chalk from "chalk";
8
+ import Table from "cli-table3";
9
+ import ora from "ora";
10
+ function info(message) {
11
+ console.log(chalk.blue("\u2139"), message);
12
+ }
13
+ function success(message) {
14
+ console.log(chalk.green("\u2713"), message);
15
+ }
16
+ function warning(message) {
17
+ console.log(chalk.yellow("\u26A0"), message);
18
+ }
19
+ function error(message) {
20
+ console.error(chalk.red("\u2717"), message);
21
+ }
22
+ function header(title) {
23
+ console.log();
24
+ console.log(chalk.bold.white(title));
25
+ console.log(chalk.gray("\u2500".repeat(title.length)));
26
+ }
27
+ function printCapabilities(capabilities) {
28
+ if (Object.keys(capabilities).length === 0) {
29
+ info("No capabilities available");
30
+ return;
31
+ }
32
+ const table = new Table({
33
+ head: [chalk.cyan("Capability"), chalk.cyan("Limits")],
34
+ colWidths: [20, 60]
35
+ });
36
+ for (const [name, limits] of Object.entries(capabilities)) {
37
+ const limitStr = Object.entries(limits).filter(([_, value]) => value !== void 0).map(([key, value]) => {
38
+ if (typeof value === "boolean") {
39
+ return value ? chalk.green(key) : chalk.red(key);
40
+ }
41
+ return `${key}: ${chalk.yellow(String(value))}`;
42
+ }).join(", ");
43
+ table.push([chalk.white(name), limitStr || "No limits configured"]);
44
+ }
45
+ console.log(table.toString());
46
+ }
47
+ function printList(items) {
48
+ items.forEach((item) => console.log(` ${chalk.gray("\u2022")} ${item}`));
49
+ }
50
+ function createSpinner(text) {
51
+ return ora({
52
+ text,
53
+ color: "blue"
54
+ });
55
+ }
56
+ async function confirm(message) {
57
+ const { default: prompts } = await import("prompts");
58
+ const result = await prompts({
59
+ type: "confirm",
60
+ name: "value",
61
+ message,
62
+ initial: false
63
+ });
64
+ return result.value;
65
+ }
66
+ function formatSize(bytes) {
67
+ const units = ["B", "KB", "MB", "GB"];
68
+ let size = bytes;
69
+ let unitIndex = 0;
70
+ while (size >= 1024 && unitIndex < units.length - 1) {
71
+ size /= 1024;
72
+ unitIndex++;
73
+ }
74
+ return `${size.toFixed(2)} ${units[unitIndex]}`;
75
+ }
76
+ function formatDuration(ms) {
77
+ const seconds = Math.floor(ms / 1e3);
78
+ const minutes = Math.floor(seconds / 60);
79
+ const hours = Math.floor(minutes / 60);
80
+ if (hours > 0) {
81
+ return `${hours}h ${minutes % 60}m`;
82
+ }
83
+ if (minutes > 0) {
84
+ return `${minutes}m ${seconds % 60}s`;
85
+ }
86
+ return `${seconds}s`;
87
+ }
88
+ function getBanner() {
89
+ return `
90
+ ${chalk.gray("OxLayer CLI")}
91
+ `;
92
+ }
93
+
94
+ export {
95
+ info,
96
+ success,
97
+ warning,
98
+ error,
99
+ header,
100
+ printCapabilities,
101
+ printList,
102
+ createSpinner,
103
+ confirm,
104
+ formatSize,
105
+ formatDuration,
106
+ getBanner
107
+ };
108
+ //# sourceMappingURL=chunk-HOFSFUN5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/cli.ts"],"sourcesContent":["/**\n * CLI Utilities\n *\n * Shared utilities for CLI output and formatting\n */\n\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\nimport type { CapabilityLimits } from '../types/index.js';\nimport ora from 'ora';\n\n/**\n * Print an info message\n */\nexport function info(message: string): void {\n console.log(chalk.blue('ℹ'), message);\n}\n\n/**\n * Print a success message\n */\nexport function success(message: string): void {\n console.log(chalk.green('✓'), message);\n}\n\n/**\n * Print a warning message\n */\nexport function warning(message: string): void {\n console.log(chalk.yellow('⚠'), message);\n}\n\n/**\n * Print an error message\n */\nexport function error(message: string): void {\n console.error(chalk.red('✗'), message);\n}\n\n/**\n * Print a header/section title\n */\nexport function header(title: string): void {\n console.log();\n console.log(chalk.bold.white(title));\n console.log(chalk.gray('─'.repeat(title.length)));\n}\n\n/**\n * Print capability limits as a table\n */\nexport function printCapabilities(capabilities: Record<string, CapabilityLimits>): void {\n if (Object.keys(capabilities).length === 0) {\n info('No capabilities available');\n return;\n }\n\n const table = new Table({\n head: [chalk.cyan('Capability'), chalk.cyan('Limits')],\n colWidths: [20, 60],\n });\n\n for (const [name, limits] of Object.entries(capabilities)) {\n const limitStr = Object.entries(limits)\n .filter(([_, value]) => value !== undefined)\n .map(([key, value]) => {\n if (typeof value === 'boolean') {\n return value ? chalk.green(key) : chalk.red(key);\n }\n return `${key}: ${chalk.yellow(String(value))}`;\n })\n .join(', ');\n\n table.push([chalk.white(name), limitStr || 'No limits configured']);\n }\n\n console.log(table.toString());\n}\n\n/**\n * Print a list of items\n */\nexport function printList(items: string[]): void {\n items.forEach((item) => console.log(` ${chalk.gray('•')} ${item}`));\n}\n\n/**\n * Create a spinner for long-running operations\n */\nexport function createSpinner(text: string) {\n return ora({\n text,\n color: 'blue',\n });\n}\n\n/**\n * Ask for confirmation\n */\nexport async function confirm(message: string): Promise<boolean> {\n const { default: prompts } = await import('prompts');\n const result = await prompts({\n type: 'confirm',\n name: 'value',\n message,\n initial: false,\n });\n return result.value;\n}\n\n/**\n * Format a file size\n */\nexport function formatSize(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB'];\n let size = bytes;\n let unitIndex = 0;\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n\n return `${size.toFixed(2)} ${units[unitIndex]}`;\n}\n\n/**\n * Format a duration\n */\nexport function formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m`;\n }\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n return `${seconds}s`;\n}\n\n/**\n * Get the OxLayer banner\n */\nexport function getBanner(): string {\n return `\\n${chalk.gray('OxLayer CLI')}\\n`;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,26 @@
1
+ var __getOwnPropNames = Object.getOwnPropertyNames;
2
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
3
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
4
+ }) : x)(function(x) {
5
+ if (typeof require !== "undefined") return require.apply(this, arguments);
6
+ throw Error('Dynamic require of "' + x + '" is not supported');
7
+ });
8
+ var __esm = (fn, res) => function __init() {
9
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
10
+ };
11
+
12
+ // ../../node_modules/tsup/assets/esm_shims.js
13
+ import path from "path";
14
+ import { fileURLToPath } from "url";
15
+ var init_esm_shims = __esm({
16
+ "../../node_modules/tsup/assets/esm_shims.js"() {
17
+ "use strict";
18
+ }
19
+ });
20
+
21
+ export {
22
+ __require,
23
+ __esm,
24
+ init_esm_shims
25
+ };
26
+ //# sourceMappingURL=chunk-HQST7GVM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../node_modules/tsup/assets/esm_shims.js"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n"],"mappings":";;;;;;;;;;;;AACA,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAF9B;AAAA;AAAA;AAAA;AAAA;","names":[]}
@@ -0,0 +1,105 @@
1
+ import {
2
+ init_esm_shims
3
+ } from "./chunk-HQST7GVM.js";
4
+
5
+ // src/services/package.service.ts
6
+ init_esm_shims();
7
+ import { promises as fs } from "fs";
8
+ import { join } from "path";
9
+ async function readPackageJson(cwd = process.cwd()) {
10
+ const packageJsonPath = join(cwd, "package.json");
11
+ try {
12
+ const content = await fs.readFile(packageJsonPath, "utf-8");
13
+ return JSON.parse(content);
14
+ } catch (error) {
15
+ throw new Error(`No package.json found in ${cwd}`);
16
+ }
17
+ }
18
+ async function writePackageJson(packageJson, cwd = process.cwd()) {
19
+ const packageJsonPath = join(cwd, "package.json");
20
+ await fs.writeFile(
21
+ packageJsonPath,
22
+ JSON.stringify(packageJson, null, 2) + "\n"
23
+ );
24
+ }
25
+ async function addSdkDependencies(manifest, options = {}, cwd = process.cwd()) {
26
+ const packageJson = await readPackageJson(cwd);
27
+ if (!packageJson.dependencies) {
28
+ packageJson.dependencies = {};
29
+ }
30
+ if (!packageJson.devDependencies) {
31
+ packageJson.devDependencies = {};
32
+ }
33
+ for (const [packageName, packageInfo] of Object.entries(manifest.packages)) {
34
+ const target = options.saveDev ? packageJson.devDependencies : packageJson.dependencies;
35
+ if (options.save || options.saveDev) {
36
+ target[packageName] = manifest.version;
37
+ }
38
+ }
39
+ await writePackageJson(packageJson, cwd);
40
+ }
41
+ async function freezeWorkspaceVersions(cwd = process.cwd()) {
42
+ const packageJson = await readPackageJson(cwd);
43
+ const replaceWorkspaceVersion = (deps) => {
44
+ if (!deps) return;
45
+ for (const [name, version] of Object.entries(deps)) {
46
+ if (version === "workspace:*" || version === "workspace:^") {
47
+ }
48
+ }
49
+ };
50
+ replaceWorkspaceVersion(packageJson.dependencies);
51
+ replaceWorkspaceVersion(packageJson.devDependencies);
52
+ await writePackageJson(packageJson, cwd);
53
+ }
54
+ async function hasPackageJson(cwd = process.cwd()) {
55
+ try {
56
+ await fs.access(join(cwd, "package.json"));
57
+ return true;
58
+ } catch {
59
+ return false;
60
+ }
61
+ }
62
+ function getVendorDir(version, cwd = process.cwd()) {
63
+ return join(cwd, ".capabilities-vendor", version);
64
+ }
65
+ async function isVersionInstalled(version, cwd = process.cwd()) {
66
+ const vendorDir = getVendorDir(version, cwd);
67
+ try {
68
+ await fs.access(vendorDir);
69
+ return true;
70
+ } catch {
71
+ return false;
72
+ }
73
+ }
74
+ async function getInstalledVersion(cwd = process.cwd()) {
75
+ const vendorDir = join(cwd, ".capabilities-vendor");
76
+ try {
77
+ const versions = await fs.readdir(vendorDir);
78
+ return versions.sort().reverse()[0] || null;
79
+ } catch {
80
+ return null;
81
+ }
82
+ }
83
+ var package_service_default = {
84
+ readPackageJson,
85
+ writePackageJson,
86
+ addSdkDependencies,
87
+ freezeWorkspaceVersions,
88
+ hasPackageJson,
89
+ getVendorDir,
90
+ isVersionInstalled,
91
+ getInstalledVersion
92
+ };
93
+
94
+ export {
95
+ readPackageJson,
96
+ writePackageJson,
97
+ addSdkDependencies,
98
+ freezeWorkspaceVersions,
99
+ hasPackageJson,
100
+ getVendorDir,
101
+ isVersionInstalled,
102
+ getInstalledVersion,
103
+ package_service_default
104
+ };
105
+ //# sourceMappingURL=chunk-M3AAB53U.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/services/package.service.ts"],"sourcesContent":["/**\n * Package Service\n *\n * Handles modifying package.json and managing dependencies\n */\n\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\n\n/**\n * Package.json structure (subset)\n */\ninterface PackageJson {\n name?: string;\n version?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n [key: string]: unknown;\n}\n\n/**\n * Read package.json from a directory\n */\nexport async function readPackageJson(cwd: string = process.cwd()): Promise<PackageJson> {\n const packageJsonPath = join(cwd, 'package.json');\n\n try {\n const content = await fs.readFile(packageJsonPath, 'utf-8');\n return JSON.parse(content);\n } catch (error) {\n throw new Error(`No package.json found in ${cwd}`);\n }\n}\n\n/**\n * Write package.json to a directory\n */\nexport async function writePackageJson(\n packageJson: PackageJson,\n cwd: string = process.cwd()\n): Promise<void> {\n const packageJsonPath = join(cwd, 'package.json');\n\n await fs.writeFile(\n packageJsonPath,\n JSON.stringify(packageJson, null, 2) + '\\n'\n );\n}\n\n/**\n * Add SDK dependencies to package.json\n *\n * This injects exact versions into dependencies or devDependencies\n * based on the manifest and install options\n */\nexport async function addSdkDependencies(\n manifest: import('../types/index.js').ReleaseManifest,\n options: {\n save?: boolean;\n saveDev?: boolean;\n } = {},\n cwd: string = process.cwd()\n): Promise<void> {\n const packageJson = await readPackageJson(cwd);\n\n // Initialize dependencies if needed\n if (!packageJson.dependencies) {\n packageJson.dependencies = {};\n }\n if (!packageJson.devDependencies) {\n packageJson.devDependencies = {};\n }\n\n // Add each package from the manifest with exact version\n for (const [packageName, packageInfo] of Object.entries(manifest.packages)) {\n const target = options.saveDev ? packageJson.devDependencies : packageJson.dependencies;\n\n if (options.save || options.saveDev) {\n // Use exact version from manifest\n target[packageName] = manifest.version;\n }\n }\n\n await writePackageJson(packageJson, cwd);\n}\n\n/**\n * Remove workspace:* references and replace with exact versions\n */\nexport async function freezeWorkspaceVersions(\n cwd: string = process.cwd()\n): Promise<void> {\n const packageJson = await readPackageJson(cwd);\n\n const replaceWorkspaceVersion = (deps: Record<string, string> | undefined) => {\n if (!deps) return;\n\n for (const [name, version] of Object.entries(deps)) {\n if (version === 'workspace:*' || version === 'workspace:^') {\n // Keep as is for local development\n // In production, this would be replaced with actual version\n }\n }\n };\n\n replaceWorkspaceVersion(packageJson.dependencies);\n replaceWorkspaceVersion(packageJson.devDependencies);\n\n await writePackageJson(packageJson, cwd);\n}\n\n/**\n * Check if package.json exists\n */\nexport async function hasPackageJson(cwd: string = process.cwd()): Promise<boolean> {\n try {\n await fs.access(join(cwd, 'package.json'));\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the vendor directory path for a specific version\n */\nexport function getVendorDir(version: string, cwd: string = process.cwd()): string {\n return join(cwd, '.capabilities-vendor', version);\n}\n\n/**\n * Check if a version is already installed\n */\nexport async function isVersionInstalled(\n version: string,\n cwd: string = process.cwd()\n): Promise<boolean> {\n const vendorDir = getVendorDir(version, cwd);\n\n try {\n await fs.access(vendorDir);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the currently installed version (if any)\n */\nexport async function getInstalledVersion(cwd: string = process.cwd()): Promise<string | null> {\n const vendorDir = join(cwd, '.capabilities-vendor');\n\n try {\n const versions = await fs.readdir(vendorDir);\n // Return the most recent version (assuming semantic naming)\n return versions.sort().reverse()[0] || null;\n } catch {\n return null;\n }\n}\n\nexport default {\n readPackageJson,\n writePackageJson,\n addSdkDependencies,\n freezeWorkspaceVersions,\n hasPackageJson,\n getVendorDir,\n isVersionInstalled,\n getInstalledVersion,\n};\n"],"mappings":";;;;;AAAA;AAMA,SAAS,YAAY,UAAU;AAC/B,SAAS,YAAY;AAgBrB,eAAsB,gBAAgB,MAAc,QAAQ,IAAI,GAAyB;AACvF,QAAM,kBAAkB,KAAK,KAAK,cAAc;AAEhD,MAAI;AACF,UAAM,UAAU,MAAM,GAAG,SAAS,iBAAiB,OAAO;AAC1D,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,4BAA4B,GAAG,EAAE;AAAA,EACnD;AACF;AAKA,eAAsB,iBACpB,aACA,MAAc,QAAQ,IAAI,GACX;AACf,QAAM,kBAAkB,KAAK,KAAK,cAAc;AAEhD,QAAM,GAAG;AAAA,IACP;AAAA,IACA,KAAK,UAAU,aAAa,MAAM,CAAC,IAAI;AAAA,EACzC;AACF;AAQA,eAAsB,mBACpB,UACA,UAGI,CAAC,GACL,MAAc,QAAQ,IAAI,GACX;AACf,QAAM,cAAc,MAAM,gBAAgB,GAAG;AAG7C,MAAI,CAAC,YAAY,cAAc;AAC7B,gBAAY,eAAe,CAAC;AAAA,EAC9B;AACA,MAAI,CAAC,YAAY,iBAAiB;AAChC,gBAAY,kBAAkB,CAAC;AAAA,EACjC;AAGA,aAAW,CAAC,aAAa,WAAW,KAAK,OAAO,QAAQ,SAAS,QAAQ,GAAG;AAC1E,UAAM,SAAS,QAAQ,UAAU,YAAY,kBAAkB,YAAY;AAE3E,QAAI,QAAQ,QAAQ,QAAQ,SAAS;AAEnC,aAAO,WAAW,IAAI,SAAS;AAAA,IACjC;AAAA,EACF;AAEA,QAAM,iBAAiB,aAAa,GAAG;AACzC;AAKA,eAAsB,wBACpB,MAAc,QAAQ,IAAI,GACX;AACf,QAAM,cAAc,MAAM,gBAAgB,GAAG;AAE7C,QAAM,0BAA0B,CAAC,SAA6C;AAC5E,QAAI,CAAC,KAAM;AAEX,eAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,IAAI,GAAG;AAClD,UAAI,YAAY,iBAAiB,YAAY,eAAe;AAAA,MAG5D;AAAA,IACF;AAAA,EACF;AAEA,0BAAwB,YAAY,YAAY;AAChD,0BAAwB,YAAY,eAAe;AAEnD,QAAM,iBAAiB,aAAa,GAAG;AACzC;AAKA,eAAsB,eAAe,MAAc,QAAQ,IAAI,GAAqB;AAClF,MAAI;AACF,UAAM,GAAG,OAAO,KAAK,KAAK,cAAc,CAAC;AACzC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,aAAa,SAAiB,MAAc,QAAQ,IAAI,GAAW;AACjF,SAAO,KAAK,KAAK,wBAAwB,OAAO;AAClD;AAKA,eAAsB,mBACpB,SACA,MAAc,QAAQ,IAAI,GACR;AAClB,QAAM,YAAY,aAAa,SAAS,GAAG;AAE3C,MAAI;AACF,UAAM,GAAG,OAAO,SAAS;AACzB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,eAAsB,oBAAoB,MAAc,QAAQ,IAAI,GAA2B;AAC7F,QAAM,YAAY,KAAK,KAAK,sBAAsB;AAElD,MAAI;AACF,UAAM,WAAW,MAAM,GAAG,QAAQ,SAAS;AAE3C,WAAO,SAAS,KAAK,EAAE,QAAQ,EAAE,CAAC,KAAK;AAAA,EACzC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAO,0BAAQ;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":[]}