everything-dev 1.3.7 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/init.cjs +34 -5
- package/dist/cli/init.cjs.map +1 -1
- package/dist/cli/init.d.cts +10 -7
- package/dist/cli/init.d.cts.map +1 -1
- package/dist/cli/init.d.mts +10 -7
- package/dist/cli/init.d.mts.map +1 -1
- package/dist/cli/init.mjs +34 -6
- package/dist/cli/init.mjs.map +1 -1
- package/dist/cli/prompts.cjs +19 -9
- package/dist/cli/prompts.cjs.map +1 -1
- package/dist/cli/prompts.mjs +19 -9
- package/dist/cli/prompts.mjs.map +1 -1
- package/dist/cli/snapshot.cjs +35 -0
- package/dist/cli/snapshot.cjs.map +1 -0
- package/dist/cli/snapshot.mjs +33 -0
- package/dist/cli/snapshot.mjs.map +1 -0
- package/dist/cli/status.cjs +80 -0
- package/dist/cli/status.cjs.map +1 -0
- package/dist/cli/status.mjs +79 -0
- package/dist/cli/status.mjs.map +1 -0
- package/dist/cli/sync.cjs +170 -0
- package/dist/cli/sync.cjs.map +1 -0
- package/dist/cli/sync.mjs +169 -0
- package/dist/cli/sync.mjs.map +1 -0
- package/dist/cli/upgrade.cjs +123 -0
- package/dist/cli/upgrade.cjs.map +1 -0
- package/dist/cli/upgrade.mjs +122 -0
- package/dist/cli/upgrade.mjs.map +1 -0
- package/dist/cli.cjs +101 -5
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.mjs +101 -5
- package/dist/cli.mjs.map +1 -1
- package/dist/contract.cjs +81 -8
- package/dist/contract.cjs.map +1 -1
- package/dist/contract.d.cts +162 -21
- package/dist/contract.d.cts.map +1 -1
- package/dist/contract.d.mts +162 -21
- package/dist/contract.d.mts.map +1 -1
- package/dist/contract.meta.cjs +32 -9
- package/dist/contract.meta.cjs.map +1 -1
- package/dist/contract.meta.d.cts +50 -11
- package/dist/contract.meta.d.mts +50 -11
- package/dist/contract.meta.mjs +32 -9
- package/dist/contract.meta.mjs.map +1 -1
- package/dist/contract.mjs +77 -9
- package/dist/contract.mjs.map +1 -1
- package/dist/index.cjs +5 -0
- package/dist/index.d.cts +2 -2
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/plugin.cjs +123 -43
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.cts +78 -11
- package/dist/plugin.d.cts.map +1 -1
- package/dist/plugin.d.mts +78 -11
- package/dist/plugin.d.mts.map +1 -1
- package/dist/plugin.mjs +126 -46
- package/dist/plugin.mjs.map +1 -1
- package/dist/types.d.cts +2 -2
- package/dist/types.d.mts +2 -2
- package/dist/utils/theme.cjs +1 -0
- package/dist/utils/theme.cjs.map +1 -1
- package/dist/utils/theme.mjs +1 -0
- package/dist/utils/theme.mjs.map +1 -1
- package/package.json +1 -1
- package/src/cli/init.ts +60 -11
- package/src/cli/prompts.ts +34 -16
- package/src/cli/snapshot.ts +46 -0
- package/src/cli/status.ts +85 -0
- package/src/cli/sync.ts +239 -0
- package/src/cli/upgrade.ts +165 -0
- package/src/cli.ts +152 -5
- package/src/contract.meta.ts +36 -6
- package/src/contract.ts +74 -7
- package/src/plugin.ts +156 -45
- package/src/utils/theme.ts +1 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
const require_cli_init = require('./init.cjs');
|
|
3
|
+
const require_sync = require('./sync.cjs');
|
|
4
|
+
let node_fs = require("node:fs");
|
|
5
|
+
let node_path = require("node:path");
|
|
6
|
+
|
|
7
|
+
//#region src/cli/upgrade.ts
|
|
8
|
+
const FRAMEWORK_PACKAGES = ["everything-dev", "every-plugin"];
|
|
9
|
+
async function fetchLatestNpmVersion(packageName) {
|
|
10
|
+
try {
|
|
11
|
+
const response = await fetch(`https://registry.npmjs.org/${packageName}/latest`, {
|
|
12
|
+
headers: { Accept: "application/json" },
|
|
13
|
+
signal: AbortSignal.timeout(1e4)
|
|
14
|
+
});
|
|
15
|
+
if (!response.ok) return null;
|
|
16
|
+
return (await response.json()).version;
|
|
17
|
+
} catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function readInstalledVersion(projectDir, packageName) {
|
|
22
|
+
const pkgPath = (0, node_path.join)(projectDir, "package.json");
|
|
23
|
+
if (!(0, node_fs.existsSync)(pkgPath)) return void 0;
|
|
24
|
+
const pkg = JSON.parse((0, node_fs.readFileSync)(pkgPath, "utf-8"));
|
|
25
|
+
const deps = pkg.dependencies ?? {};
|
|
26
|
+
const devDeps = pkg.devDependencies ?? {};
|
|
27
|
+
const version = deps[packageName] || devDeps[packageName];
|
|
28
|
+
if (!version) return void 0;
|
|
29
|
+
return version.replace(/^[\^~>=]+/, "");
|
|
30
|
+
}
|
|
31
|
+
function updatePackageVersion(projectDir, packageName, newVersion) {
|
|
32
|
+
const pkgPath = (0, node_path.join)(projectDir, "package.json");
|
|
33
|
+
const pkg = JSON.parse((0, node_fs.readFileSync)(pkgPath, "utf-8"));
|
|
34
|
+
if (pkg.dependencies && typeof pkg.dependencies === "object") {
|
|
35
|
+
const deps = pkg.dependencies;
|
|
36
|
+
if (deps[packageName] !== void 0) deps[packageName] = `^${newVersion}`;
|
|
37
|
+
}
|
|
38
|
+
if (pkg.devDependencies && typeof pkg.devDependencies === "object") {
|
|
39
|
+
const deps = pkg.devDependencies;
|
|
40
|
+
if (deps[packageName] !== void 0) deps[packageName] = `^${newVersion}`;
|
|
41
|
+
}
|
|
42
|
+
(0, node_fs.writeFileSync)(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`);
|
|
43
|
+
}
|
|
44
|
+
function buildChangelogUrl(oldVersion, newVersion, parentConfig) {
|
|
45
|
+
if (!oldVersion || oldVersion === newVersion) return void 0;
|
|
46
|
+
const repoUrl = parentConfig?.repository;
|
|
47
|
+
if (!repoUrl) return void 0;
|
|
48
|
+
const githubMatch = repoUrl.match(/^https?:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/);
|
|
49
|
+
if (!githubMatch) return void 0;
|
|
50
|
+
const [, owner, repo] = githubMatch;
|
|
51
|
+
return `https://github.com/${owner}/${repo}/compare/v${oldVersion}...v${newVersion}`;
|
|
52
|
+
}
|
|
53
|
+
async function upgradeTemplate(projectDir, options) {
|
|
54
|
+
if (!(0, node_fs.existsSync)((0, node_path.join)(projectDir, "package.json"))) return {
|
|
55
|
+
status: "error",
|
|
56
|
+
packages: [],
|
|
57
|
+
error: "No package.json found in current directory"
|
|
58
|
+
};
|
|
59
|
+
const packages = [];
|
|
60
|
+
for (const name of FRAMEWORK_PACKAGES) {
|
|
61
|
+
const installed = readInstalledVersion(projectDir, name);
|
|
62
|
+
const latest = await fetchLatestNpmVersion(name);
|
|
63
|
+
if (!latest) {
|
|
64
|
+
packages.push({
|
|
65
|
+
name,
|
|
66
|
+
from: installed,
|
|
67
|
+
to: installed ?? "unknown"
|
|
68
|
+
});
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
packages.push({
|
|
72
|
+
name,
|
|
73
|
+
from: installed,
|
|
74
|
+
to: latest
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
const hasUpdates = packages.some((p) => p.from !== p.to && p.from !== void 0);
|
|
78
|
+
if (options.dryRun) {
|
|
79
|
+
let changelogUrl;
|
|
80
|
+
if (hasUpdates) {
|
|
81
|
+
const configPath = (0, node_path.join)(projectDir, "bos.config.json");
|
|
82
|
+
let parentConfig = null;
|
|
83
|
+
if ((0, node_fs.existsSync)(configPath)) try {
|
|
84
|
+
parentConfig = JSON.parse((0, node_fs.readFileSync)(configPath, "utf-8"));
|
|
85
|
+
} catch {}
|
|
86
|
+
const mainPkg = packages.find((p) => p.name === "everything-dev");
|
|
87
|
+
if (mainPkg?.from && mainPkg.from !== mainPkg.to) changelogUrl = buildChangelogUrl(mainPkg.from, mainPkg.to, parentConfig);
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
status: "dry-run",
|
|
91
|
+
packages,
|
|
92
|
+
changelogUrl
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
for (const pkg of packages) if (pkg.from !== void 0 && pkg.from !== pkg.to) updatePackageVersion(projectDir, pkg.name, pkg.to);
|
|
96
|
+
if (hasUpdates && !options.noInstall) await require_cli_init.runBunInstall(projectDir);
|
|
97
|
+
let syncResult;
|
|
98
|
+
if (!options.noSync) syncResult = await require_sync.syncTemplate(projectDir, {
|
|
99
|
+
dryRun: false,
|
|
100
|
+
force: options.force,
|
|
101
|
+
noInstall: true
|
|
102
|
+
});
|
|
103
|
+
let changelogUrl;
|
|
104
|
+
const mainPkg = packages.find((p) => p.name === "everything-dev");
|
|
105
|
+
if (mainPkg?.from && mainPkg.from !== mainPkg.to) {
|
|
106
|
+
const configPath = (0, node_path.join)(projectDir, "bos.config.json");
|
|
107
|
+
let parentConfig = null;
|
|
108
|
+
if ((0, node_fs.existsSync)(configPath)) try {
|
|
109
|
+
parentConfig = JSON.parse((0, node_fs.readFileSync)(configPath, "utf-8"));
|
|
110
|
+
} catch {}
|
|
111
|
+
changelogUrl = buildChangelogUrl(mainPkg.from, mainPkg.to, parentConfig);
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
status: "upgraded",
|
|
115
|
+
packages,
|
|
116
|
+
sync: syncResult,
|
|
117
|
+
changelogUrl
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
//#endregion
|
|
122
|
+
exports.upgradeTemplate = upgradeTemplate;
|
|
123
|
+
//# sourceMappingURL=upgrade.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade.cjs","names":["runBunInstall","syncTemplate"],"sources":["../../src/cli/upgrade.ts"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { UpgradeOptions, UpgradeResult } from \"../contract\";\nimport { runBunInstall } from \"./init\";\nimport { syncTemplate } from \"./sync\";\n\nconst FRAMEWORK_PACKAGES = [\"everything-dev\", \"every-plugin\"];\n\ninterface NpmPackageInfo {\n version: string;\n}\n\nasync function fetchLatestNpmVersion(packageName: string): Promise<string | null> {\n try {\n const response = await fetch(`https://registry.npmjs.org/${packageName}/latest`, {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(10_000),\n });\n if (!response.ok) return null;\n const data = (await response.json()) as NpmPackageInfo;\n return data.version;\n } catch {\n return null;\n }\n}\n\nfunction readInstalledVersion(projectDir: string, packageName: string): string | undefined {\n const pkgPath = join(projectDir, \"package.json\");\n if (!existsSync(pkgPath)) return undefined;\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as Record<string, unknown>;\n const deps = (pkg.dependencies ?? {}) as Record<string, string>;\n const devDeps = (pkg.devDependencies ?? {}) as Record<string, string>;\n const version = deps[packageName] || devDeps[packageName];\n if (!version) return undefined;\n return version.replace(/^[\\^~>=]+/, \"\");\n}\n\nfunction updatePackageVersion(projectDir: string, packageName: string, newVersion: string): void {\n const pkgPath = join(projectDir, \"package.json\");\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as Record<string, unknown>;\n\n if (pkg.dependencies && typeof pkg.dependencies === \"object\") {\n const deps = pkg.dependencies as Record<string, string>;\n if (deps[packageName] !== undefined) {\n deps[packageName] = `^${newVersion}`;\n }\n }\n\n if (pkg.devDependencies && typeof pkg.devDependencies === \"object\") {\n const deps = pkg.devDependencies as Record<string, string>;\n if (deps[packageName] !== undefined) {\n deps[packageName] = `^${newVersion}`;\n }\n }\n\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n}\n\nfunction buildChangelogUrl(\n oldVersion: string | undefined,\n newVersion: string,\n parentConfig: Record<string, unknown> | null,\n): string | undefined {\n if (!oldVersion || oldVersion === newVersion) return undefined;\n const repoUrl = parentConfig?.repository as string | undefined;\n if (!repoUrl) return undefined;\n\n const githubMatch = repoUrl.match(/^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (!githubMatch) return undefined;\n\n const [, owner, repo] = githubMatch;\n return `https://github.com/${owner}/${repo}/compare/v${oldVersion}...v${newVersion}`;\n}\n\nexport async function upgradeTemplate(\n projectDir: string,\n options: UpgradeOptions,\n): Promise<UpgradeResult> {\n const pkgPath = join(projectDir, \"package.json\");\n if (!existsSync(pkgPath)) {\n return {\n status: \"error\",\n packages: [],\n error: \"No package.json found in current directory\",\n };\n }\n\n const packages: UpgradeResult[\"packages\"] = [];\n\n for (const name of FRAMEWORK_PACKAGES) {\n const installed = readInstalledVersion(projectDir, name);\n const latest = await fetchLatestNpmVersion(name);\n\n if (!latest) {\n packages.push({ name, from: installed, to: installed ?? \"unknown\" });\n continue;\n }\n\n packages.push({ name, from: installed, to: latest });\n }\n\n const hasUpdates = packages.some((p) => p.from !== p.to && p.from !== undefined);\n\n if (options.dryRun) {\n let changelogUrl: string | undefined;\n if (hasUpdates) {\n const configPath = join(projectDir, \"bos.config.json\");\n let parentConfig: Record<string, unknown> | null = null;\n if (existsSync(configPath)) {\n try {\n parentConfig = JSON.parse(readFileSync(configPath, \"utf-8\"));\n } catch {}\n }\n const mainPkg = packages.find((p) => p.name === \"everything-dev\");\n if (mainPkg?.from && mainPkg.from !== mainPkg.to) {\n changelogUrl = buildChangelogUrl(mainPkg.from, mainPkg.to, parentConfig);\n }\n }\n\n return {\n status: \"dry-run\",\n packages,\n changelogUrl,\n };\n }\n\n for (const pkg of packages) {\n if (pkg.from !== undefined && pkg.from !== pkg.to) {\n updatePackageVersion(projectDir, pkg.name, pkg.to);\n }\n }\n\n if (hasUpdates && !options.noInstall) {\n await runBunInstall(projectDir);\n }\n\n let syncResult: UpgradeResult[\"sync\"];\n if (!options.noSync) {\n syncResult = await syncTemplate(projectDir, {\n dryRun: false,\n force: options.force,\n noInstall: true,\n });\n }\n\n let changelogUrl: string | undefined;\n const mainPkg = packages.find((p) => p.name === \"everything-dev\");\n if (mainPkg?.from && mainPkg.from !== mainPkg.to) {\n const configPath = join(projectDir, \"bos.config.json\");\n let parentConfig: Record<string, unknown> | null = null;\n if (existsSync(configPath)) {\n try {\n parentConfig = JSON.parse(readFileSync(configPath, \"utf-8\"));\n } catch {}\n }\n changelogUrl = buildChangelogUrl(mainPkg.from, mainPkg.to, parentConfig);\n }\n\n return {\n status: \"upgraded\",\n packages,\n sync: syncResult,\n changelogUrl,\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { runBunInstall } from "./init.mjs";
|
|
2
|
+
import { syncTemplate } from "./sync.mjs";
|
|
3
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
|
|
6
|
+
//#region src/cli/upgrade.ts
|
|
7
|
+
const FRAMEWORK_PACKAGES = ["everything-dev", "every-plugin"];
|
|
8
|
+
async function fetchLatestNpmVersion(packageName) {
|
|
9
|
+
try {
|
|
10
|
+
const response = await fetch(`https://registry.npmjs.org/${packageName}/latest`, {
|
|
11
|
+
headers: { Accept: "application/json" },
|
|
12
|
+
signal: AbortSignal.timeout(1e4)
|
|
13
|
+
});
|
|
14
|
+
if (!response.ok) return null;
|
|
15
|
+
return (await response.json()).version;
|
|
16
|
+
} catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function readInstalledVersion(projectDir, packageName) {
|
|
21
|
+
const pkgPath = join(projectDir, "package.json");
|
|
22
|
+
if (!existsSync(pkgPath)) return void 0;
|
|
23
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
24
|
+
const deps = pkg.dependencies ?? {};
|
|
25
|
+
const devDeps = pkg.devDependencies ?? {};
|
|
26
|
+
const version = deps[packageName] || devDeps[packageName];
|
|
27
|
+
if (!version) return void 0;
|
|
28
|
+
return version.replace(/^[\^~>=]+/, "");
|
|
29
|
+
}
|
|
30
|
+
function updatePackageVersion(projectDir, packageName, newVersion) {
|
|
31
|
+
const pkgPath = join(projectDir, "package.json");
|
|
32
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
33
|
+
if (pkg.dependencies && typeof pkg.dependencies === "object") {
|
|
34
|
+
const deps = pkg.dependencies;
|
|
35
|
+
if (deps[packageName] !== void 0) deps[packageName] = `^${newVersion}`;
|
|
36
|
+
}
|
|
37
|
+
if (pkg.devDependencies && typeof pkg.devDependencies === "object") {
|
|
38
|
+
const deps = pkg.devDependencies;
|
|
39
|
+
if (deps[packageName] !== void 0) deps[packageName] = `^${newVersion}`;
|
|
40
|
+
}
|
|
41
|
+
writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`);
|
|
42
|
+
}
|
|
43
|
+
function buildChangelogUrl(oldVersion, newVersion, parentConfig) {
|
|
44
|
+
if (!oldVersion || oldVersion === newVersion) return void 0;
|
|
45
|
+
const repoUrl = parentConfig?.repository;
|
|
46
|
+
if (!repoUrl) return void 0;
|
|
47
|
+
const githubMatch = repoUrl.match(/^https?:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/);
|
|
48
|
+
if (!githubMatch) return void 0;
|
|
49
|
+
const [, owner, repo] = githubMatch;
|
|
50
|
+
return `https://github.com/${owner}/${repo}/compare/v${oldVersion}...v${newVersion}`;
|
|
51
|
+
}
|
|
52
|
+
async function upgradeTemplate(projectDir, options) {
|
|
53
|
+
if (!existsSync(join(projectDir, "package.json"))) return {
|
|
54
|
+
status: "error",
|
|
55
|
+
packages: [],
|
|
56
|
+
error: "No package.json found in current directory"
|
|
57
|
+
};
|
|
58
|
+
const packages = [];
|
|
59
|
+
for (const name of FRAMEWORK_PACKAGES) {
|
|
60
|
+
const installed = readInstalledVersion(projectDir, name);
|
|
61
|
+
const latest = await fetchLatestNpmVersion(name);
|
|
62
|
+
if (!latest) {
|
|
63
|
+
packages.push({
|
|
64
|
+
name,
|
|
65
|
+
from: installed,
|
|
66
|
+
to: installed ?? "unknown"
|
|
67
|
+
});
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
packages.push({
|
|
71
|
+
name,
|
|
72
|
+
from: installed,
|
|
73
|
+
to: latest
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const hasUpdates = packages.some((p) => p.from !== p.to && p.from !== void 0);
|
|
77
|
+
if (options.dryRun) {
|
|
78
|
+
let changelogUrl;
|
|
79
|
+
if (hasUpdates) {
|
|
80
|
+
const configPath = join(projectDir, "bos.config.json");
|
|
81
|
+
let parentConfig = null;
|
|
82
|
+
if (existsSync(configPath)) try {
|
|
83
|
+
parentConfig = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
84
|
+
} catch {}
|
|
85
|
+
const mainPkg = packages.find((p) => p.name === "everything-dev");
|
|
86
|
+
if (mainPkg?.from && mainPkg.from !== mainPkg.to) changelogUrl = buildChangelogUrl(mainPkg.from, mainPkg.to, parentConfig);
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
status: "dry-run",
|
|
90
|
+
packages,
|
|
91
|
+
changelogUrl
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
for (const pkg of packages) if (pkg.from !== void 0 && pkg.from !== pkg.to) updatePackageVersion(projectDir, pkg.name, pkg.to);
|
|
95
|
+
if (hasUpdates && !options.noInstall) await runBunInstall(projectDir);
|
|
96
|
+
let syncResult;
|
|
97
|
+
if (!options.noSync) syncResult = await syncTemplate(projectDir, {
|
|
98
|
+
dryRun: false,
|
|
99
|
+
force: options.force,
|
|
100
|
+
noInstall: true
|
|
101
|
+
});
|
|
102
|
+
let changelogUrl;
|
|
103
|
+
const mainPkg = packages.find((p) => p.name === "everything-dev");
|
|
104
|
+
if (mainPkg?.from && mainPkg.from !== mainPkg.to) {
|
|
105
|
+
const configPath = join(projectDir, "bos.config.json");
|
|
106
|
+
let parentConfig = null;
|
|
107
|
+
if (existsSync(configPath)) try {
|
|
108
|
+
parentConfig = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
109
|
+
} catch {}
|
|
110
|
+
changelogUrl = buildChangelogUrl(mainPkg.from, mainPkg.to, parentConfig);
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
status: "upgraded",
|
|
114
|
+
packages,
|
|
115
|
+
sync: syncResult,
|
|
116
|
+
changelogUrl
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
//#endregion
|
|
121
|
+
export { upgradeTemplate };
|
|
122
|
+
//# sourceMappingURL=upgrade.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade.mjs","names":[],"sources":["../../src/cli/upgrade.ts"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { UpgradeOptions, UpgradeResult } from \"../contract\";\nimport { runBunInstall } from \"./init\";\nimport { syncTemplate } from \"./sync\";\n\nconst FRAMEWORK_PACKAGES = [\"everything-dev\", \"every-plugin\"];\n\ninterface NpmPackageInfo {\n version: string;\n}\n\nasync function fetchLatestNpmVersion(packageName: string): Promise<string | null> {\n try {\n const response = await fetch(`https://registry.npmjs.org/${packageName}/latest`, {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(10_000),\n });\n if (!response.ok) return null;\n const data = (await response.json()) as NpmPackageInfo;\n return data.version;\n } catch {\n return null;\n }\n}\n\nfunction readInstalledVersion(projectDir: string, packageName: string): string | undefined {\n const pkgPath = join(projectDir, \"package.json\");\n if (!existsSync(pkgPath)) return undefined;\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as Record<string, unknown>;\n const deps = (pkg.dependencies ?? {}) as Record<string, string>;\n const devDeps = (pkg.devDependencies ?? {}) as Record<string, string>;\n const version = deps[packageName] || devDeps[packageName];\n if (!version) return undefined;\n return version.replace(/^[\\^~>=]+/, \"\");\n}\n\nfunction updatePackageVersion(projectDir: string, packageName: string, newVersion: string): void {\n const pkgPath = join(projectDir, \"package.json\");\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as Record<string, unknown>;\n\n if (pkg.dependencies && typeof pkg.dependencies === \"object\") {\n const deps = pkg.dependencies as Record<string, string>;\n if (deps[packageName] !== undefined) {\n deps[packageName] = `^${newVersion}`;\n }\n }\n\n if (pkg.devDependencies && typeof pkg.devDependencies === \"object\") {\n const deps = pkg.devDependencies as Record<string, string>;\n if (deps[packageName] !== undefined) {\n deps[packageName] = `^${newVersion}`;\n }\n }\n\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n}\n\nfunction buildChangelogUrl(\n oldVersion: string | undefined,\n newVersion: string,\n parentConfig: Record<string, unknown> | null,\n): string | undefined {\n if (!oldVersion || oldVersion === newVersion) return undefined;\n const repoUrl = parentConfig?.repository as string | undefined;\n if (!repoUrl) return undefined;\n\n const githubMatch = repoUrl.match(/^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (!githubMatch) return undefined;\n\n const [, owner, repo] = githubMatch;\n return `https://github.com/${owner}/${repo}/compare/v${oldVersion}...v${newVersion}`;\n}\n\nexport async function upgradeTemplate(\n projectDir: string,\n options: UpgradeOptions,\n): Promise<UpgradeResult> {\n const pkgPath = join(projectDir, \"package.json\");\n if (!existsSync(pkgPath)) {\n return {\n status: \"error\",\n packages: [],\n error: \"No package.json found in current directory\",\n };\n }\n\n const packages: UpgradeResult[\"packages\"] = [];\n\n for (const name of FRAMEWORK_PACKAGES) {\n const installed = readInstalledVersion(projectDir, name);\n const latest = await fetchLatestNpmVersion(name);\n\n if (!latest) {\n packages.push({ name, from: installed, to: installed ?? \"unknown\" });\n continue;\n }\n\n packages.push({ name, from: installed, to: latest });\n }\n\n const hasUpdates = packages.some((p) => p.from !== p.to && p.from !== undefined);\n\n if (options.dryRun) {\n let changelogUrl: string | undefined;\n if (hasUpdates) {\n const configPath = join(projectDir, \"bos.config.json\");\n let parentConfig: Record<string, unknown> | null = null;\n if (existsSync(configPath)) {\n try {\n parentConfig = JSON.parse(readFileSync(configPath, \"utf-8\"));\n } catch {}\n }\n const mainPkg = packages.find((p) => p.name === \"everything-dev\");\n if (mainPkg?.from && mainPkg.from !== mainPkg.to) {\n changelogUrl = buildChangelogUrl(mainPkg.from, mainPkg.to, parentConfig);\n }\n }\n\n return {\n status: \"dry-run\",\n packages,\n changelogUrl,\n };\n }\n\n for (const pkg of packages) {\n if (pkg.from !== undefined && pkg.from !== pkg.to) {\n updatePackageVersion(projectDir, pkg.name, pkg.to);\n }\n }\n\n if (hasUpdates && !options.noInstall) {\n await runBunInstall(projectDir);\n }\n\n let syncResult: UpgradeResult[\"sync\"];\n if (!options.noSync) {\n syncResult = await syncTemplate(projectDir, {\n dryRun: false,\n force: options.force,\n noInstall: true,\n });\n }\n\n let changelogUrl: string | undefined;\n const mainPkg = packages.find((p) => p.name === \"everything-dev\");\n if (mainPkg?.from && mainPkg.from !== mainPkg.to) {\n const configPath = join(projectDir, \"bos.config.json\");\n let parentConfig: Record<string, unknown> | null = null;\n if (existsSync(configPath)) {\n try {\n parentConfig = JSON.parse(readFileSync(configPath, \"utf-8\"));\n } catch {}\n }\n changelogUrl = buildChangelogUrl(mainPkg.from, mainPkg.to, parentConfig);\n }\n\n return {\n status: \"upgraded\",\n packages,\n sync: syncResult,\n changelogUrl,\n };\n}\n"],"mappings":"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"}
|
package/dist/cli.cjs
CHANGED
|
@@ -22,6 +22,17 @@ function printConfigView(result) {
|
|
|
22
22
|
if (result.staging) console.log(` ${require_theme.colors.dim("Staging")} ${require_theme.colors.magenta(result.staging.domain)}`);
|
|
23
23
|
console.log();
|
|
24
24
|
}
|
|
25
|
+
function formatTimeAgo(isoTimestamp) {
|
|
26
|
+
const diffMs = Date.now() - new Date(isoTimestamp).getTime();
|
|
27
|
+
const diffMins = Math.floor(diffMs / 6e4);
|
|
28
|
+
if (diffMins < 1) return "just now";
|
|
29
|
+
if (diffMins < 60) return `${diffMins} minute${diffMins > 1 ? "s" : ""} ago`;
|
|
30
|
+
const diffHours = Math.floor(diffMins / 60);
|
|
31
|
+
if (diffHours < 24) return `${diffHours} hour${diffHours > 1 ? "s" : ""} ago`;
|
|
32
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
33
|
+
if (diffDays < 30) return `${diffDays} day${diffDays > 1 ? "s" : ""} ago`;
|
|
34
|
+
return isoTimestamp.split("T")[0] ?? isoTimestamp;
|
|
35
|
+
}
|
|
25
36
|
async function main() {
|
|
26
37
|
const args = process.argv.slice(2);
|
|
27
38
|
if (args.includes("--help") || args.includes("-h")) {
|
|
@@ -67,17 +78,102 @@ async function main() {
|
|
|
67
78
|
}
|
|
68
79
|
console.log(require_theme.colors.green(`${require_theme.icons.ok} Project initialized`));
|
|
69
80
|
console.log(` ${require_theme.colors.dim("Extends:")} ${result.extends}`);
|
|
70
|
-
console.log(` ${require_theme.colors.dim("
|
|
71
|
-
if (result.
|
|
81
|
+
console.log(` ${require_theme.colors.dim("Directory:")} ${result.directory}`);
|
|
82
|
+
if (result.account) console.log(` ${require_theme.colors.dim("Account:")} ${result.account}`);
|
|
72
83
|
if (result.domain) console.log(` ${require_theme.colors.dim("Domain:")} ${result.domain}`);
|
|
73
84
|
console.log(` ${require_theme.colors.dim("Files copied:")} ${result.filesCopied}`);
|
|
74
85
|
console.log();
|
|
75
86
|
console.log(require_theme.colors.dim(" Next steps:"));
|
|
76
|
-
console.log(require_theme.colors.dim(` cd ${result.
|
|
77
|
-
|
|
87
|
+
console.log(require_theme.colors.dim(` cd ${result.directory}`));
|
|
88
|
+
console.log(require_theme.colors.dim(" cp .env.example .env # then fill in your values"));
|
|
89
|
+
if (result.status === "initialized" && !input?.noInstall) console.log(require_theme.colors.dim(" bun run dev"));
|
|
78
90
|
else {
|
|
79
91
|
console.log(require_theme.colors.dim(" bun install"));
|
|
80
|
-
console.log(require_theme.colors.dim("
|
|
92
|
+
console.log(require_theme.colors.dim(" bun run dev"));
|
|
93
|
+
}
|
|
94
|
+
console.log();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (descriptor.key === "sync") {
|
|
98
|
+
console.log();
|
|
99
|
+
if (result.status === "error") {
|
|
100
|
+
console.error(`[CLI] ${result.error || "Unknown error"}`);
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
if (result.status === "dry-run") console.log(require_theme.colors.cyan(`${require_theme.icons.ok} Dry run — no files written`));
|
|
104
|
+
else console.log(require_theme.colors.green(`${require_theme.icons.ok} Template synced`));
|
|
105
|
+
if (result.updated.length > 0) {
|
|
106
|
+
console.log(` ${require_theme.colors.dim("Updated:")} ${result.updated.length} file(s)`);
|
|
107
|
+
for (const f of result.updated) console.log(` ${require_theme.colors.dim(f)}`);
|
|
108
|
+
}
|
|
109
|
+
if (result.added.length > 0) {
|
|
110
|
+
console.log(` ${require_theme.colors.dim("Added:")} ${result.added.length} file(s)`);
|
|
111
|
+
for (const f of result.added) console.log(` ${require_theme.colors.dim(f)}`);
|
|
112
|
+
}
|
|
113
|
+
if (result.skipped.length > 0) {
|
|
114
|
+
console.log(` ${require_theme.colors.yellow("Skipped:")} ${result.skipped.length} file(s) (locally modified, use --force to overwrite)`);
|
|
115
|
+
for (const f of result.skipped) console.log(` ${require_theme.colors.dim(f)}`);
|
|
116
|
+
}
|
|
117
|
+
if (result.updated.length === 0 && result.added.length === 0 && result.skipped.length === 0) console.log(` ${require_theme.colors.dim("Already up to date")}`);
|
|
118
|
+
console.log();
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (descriptor.key === "upgrade") {
|
|
122
|
+
console.log();
|
|
123
|
+
if (result.status === "error") {
|
|
124
|
+
console.error(`[CLI] ${result.error || "Unknown error"}`);
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
if (result.status === "dry-run") console.log(require_theme.colors.cyan(`${require_theme.icons.ok} Dry run — no changes applied`));
|
|
128
|
+
else console.log(require_theme.colors.green(`${require_theme.icons.ok} Framework upgraded`));
|
|
129
|
+
for (const pkg of result.packages) if (pkg.from && pkg.from !== pkg.to) console.log(` ${require_theme.colors.dim(`${pkg.name}:`)} ${pkg.from} → ${pkg.to}`);
|
|
130
|
+
else if (!pkg.from) console.log(` ${require_theme.colors.dim(`${pkg.name}:`)} ${pkg.to} (new)`);
|
|
131
|
+
else console.log(` ${require_theme.colors.dim(`${pkg.name}:`)} ${pkg.to} (up to date)`);
|
|
132
|
+
if (result.changelogUrl) console.log(` ${require_theme.colors.dim("Changelog:")} ${result.changelogUrl}`);
|
|
133
|
+
if (result.sync) {
|
|
134
|
+
const sync = result.sync;
|
|
135
|
+
if (sync.updated.length > 0) console.log(` ${require_theme.colors.dim("Synced updated:")} ${sync.updated.length} file(s)`);
|
|
136
|
+
if (sync.added.length > 0) console.log(` ${require_theme.colors.dim("Synced added:")} ${sync.added.length} file(s)`);
|
|
137
|
+
if (sync.skipped.length > 0) console.log(` ${require_theme.colors.yellow("Synced skipped:")} ${sync.skipped.length} file(s) (locally modified, use --force to overwrite)`);
|
|
138
|
+
}
|
|
139
|
+
console.log();
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (descriptor.key === "status") {
|
|
143
|
+
console.log();
|
|
144
|
+
if (result.status === "error") {
|
|
145
|
+
console.error(`[CLI] ${result.error || "Unknown error"}`);
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
console.log(require_theme.colors.cyan(require_theme.frames.top(52)));
|
|
149
|
+
console.log(` ${require_theme.icons.app} ${require_theme.gradients.cyber("STATUS")}`);
|
|
150
|
+
console.log(require_theme.colors.cyan(require_theme.frames.bottom(52)));
|
|
151
|
+
console.log();
|
|
152
|
+
if (result.extends) console.log(` ${require_theme.colors.dim("Extends:")} ${result.extends}`);
|
|
153
|
+
if (result.account) console.log(` ${require_theme.colors.dim("Account:")} ${result.account}`);
|
|
154
|
+
if (result.domain) console.log(` ${require_theme.colors.dim("Domain:")} ${result.domain}`);
|
|
155
|
+
console.log();
|
|
156
|
+
console.log(` ${require_theme.colors.dim("Packages:")}`);
|
|
157
|
+
for (const pkg of result.packages) {
|
|
158
|
+
const hasUpdate = pkg.installed && pkg.latest && pkg.installed !== pkg.latest;
|
|
159
|
+
const versionStr = hasUpdate ? `${pkg.installed} → ${pkg.latest}` : pkg.installed || "not installed";
|
|
160
|
+
const label = hasUpdate ? require_theme.colors.yellow(versionStr) : require_theme.colors.dim(versionStr);
|
|
161
|
+
console.log(` ${require_theme.colors.dim(`${pkg.name}`)} ${label}`);
|
|
162
|
+
}
|
|
163
|
+
console.log();
|
|
164
|
+
if (result.lastSync) {
|
|
165
|
+
const ago = formatTimeAgo(result.lastSync);
|
|
166
|
+
console.log(` ${require_theme.colors.dim("Last sync:")} ${ago}`);
|
|
167
|
+
} else console.log(` ${require_theme.colors.dim("Last sync:")} never`);
|
|
168
|
+
const envLabel = result.envFile === "found" ? require_theme.colors.green("found") : result.envFile === "example-only" ? require_theme.colors.yellow("missing (only .env.example found)") : require_theme.colors.error("missing");
|
|
169
|
+
console.log(` ${require_theme.colors.dim(".env:")} ${envLabel}`);
|
|
170
|
+
if (result.parentReachable !== void 0) {
|
|
171
|
+
const parentLabel = result.parentReachable ? require_theme.colors.green("reachable") : require_theme.colors.error("unreachable");
|
|
172
|
+
console.log(` ${require_theme.colors.dim("Parent:")} ${parentLabel}`);
|
|
173
|
+
}
|
|
174
|
+
if (result.packages.some((p) => p.installed && p.latest && p.installed !== p.latest)) {
|
|
175
|
+
console.log();
|
|
176
|
+
console.log(require_theme.colors.dim(` Run ${require_theme.colors.cyan("bos upgrade")} to update packages and sync template files.`));
|
|
81
177
|
}
|
|
82
178
|
console.log();
|
|
83
179
|
return;
|
package/dist/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.cjs","names":["colors","frames","icons","gradients","findConfigPath","findCommandDescriptor","bosPlugin","parseCommandInput"],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env bun\nimport { findCommandDescriptor } from \"./cli/catalog\";\nimport { printHelp } from \"./cli/help\";\nimport { parseCommandInput } from \"./cli/parse\";\nimport { findConfigPath } from \"./config\";\nimport bosPlugin from \"./plugin\";\nimport { createPluginRuntime } from \"./sdk\";\nimport { printBanner } from \"./utils/banner\";\nimport { colors, frames, gradients, icons } from \"./utils/theme\";\n\nfunction printConfigView(result: {\n account: string;\n domain?: string;\n staging?: { domain: string };\n app: {\n host: { name?: string; development: string; production?: string };\n ui: { name?: string; development?: string; production?: string; ssr?: string };\n api: { name?: string; development?: string; production?: string; proxy?: string };\n };\n}) {\n console.log();\n console.log(colors.cyan(frames.top(52)));\n console.log(` ${icons.app} ${gradients.cyber(\"CONFIG\")}`);\n console.log(colors.cyan(frames.bottom(52)));\n console.log();\n\n console.log(` ${colors.dim(\"Account\")} ${colors.cyan(result.account)}`);\n console.log(` ${colors.dim(\"Domain\")} ${colors.white(result.domain ?? \"not configured\")}`);\n if (result.staging) {\n console.log(` ${colors.dim(\"Staging\")} ${colors.magenta(result.staging.domain)}`);\n }\n console.log();\n}\n\nasync function main() {\n const args = process.argv.slice(2);\n\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n printHelp();\n return;\n }\n\n const invocationArgs = args.length > 0 ? args : [\"dev\"];\n const command = invocationArgs[0] ?? \"dev\";\n const configPath = findConfigPath();\n\n const commandMatch = findCommandDescriptor(invocationArgs);\n if (!commandMatch) {\n console.error(`Unknown command: ${command}`);\n process.exit(1);\n }\n\n const { descriptor, consumed } = commandMatch;\n const commandArgs = invocationArgs.slice(consumed);\n\n printBanner();\n\n const runtime = createPluginRuntime({\n registry: {\n bos: { module: bosPlugin },\n },\n secrets: {},\n });\n\n const pluginRuntime: any = runtime;\n const loadPlugin = pluginRuntime.usePlugin.bind(pluginRuntime);\n const plugin = await loadPlugin(\"bos\", {\n variables: {\n configPath: configPath ?? undefined,\n },\n secrets: {},\n });\n\n const client = plugin.createClient();\n\n try {\n const input = parseCommandInput(descriptor, commandArgs);\n const result = await (client as any)[descriptor.key](input);\n\n if (descriptor.key === \"config\") {\n if (!result.config) {\n console.error(\"No bos.config.json found\");\n process.exit(1);\n }\n\n printConfigView(result.config);\n process.stdout.write(`${JSON.stringify(result.config, null, 2)}\\n`);\n return;\n }\n\n if (descriptor.key === \"init\") {\n console.log();\n if (result.status === \"error\") {\n console.error(`[CLI] ${result.error || \"Unknown error\"}`);\n process.exit(1);\n }\n console.log(colors.green(`${icons.ok} Project initialized`));\n console.log(` ${colors.dim(\"Extends:\")} ${result.extends}`);\n console.log(` ${colors.dim(\"Destination:\")} ${result.destination}`);\n if (result.name) console.log(` ${colors.dim(\"Account:\")} ${result.name}`);\n if (result.domain) console.log(` ${colors.dim(\"Domain:\")} ${result.domain}`);\n console.log(` ${colors.dim(\"Files copied:\")} ${result.filesCopied}`);\n console.log();\n console.log(colors.dim(\" Next steps:\"));\n console.log(colors.dim(` cd ${result.destination}`));\n if (result.status === \"initialized\" && !(input as any)?.noInstall) {\n console.log(colors.dim(\" bos dev --host remote\"));\n } else {\n console.log(colors.dim(\" bun install\"));\n console.log(colors.dim(\" bos dev --host remote\"));\n }\n console.log();\n return;\n }\n\n if (result?.status === \"error\") {\n console.error(`[CLI] ${result.error || \"Unknown error\"}`);\n process.exit(1);\n }\n\n if (descriptor.key === \"keyPublish\") {\n process.stdout.write(`Generated publish key for ${result.account}\\n`);\n process.stdout.write(` Network: ${result.network}\\n`);\n process.stdout.write(` Contract: ${result.contract}\\n`);\n process.stdout.write(` Allowance: ${result.allowance}\\n`);\n process.stdout.write(` Functions: ${result.functionNames.join(\", \")}\\n`);\n process.stdout.write(` Public key: ${result.publicKey}\\n`);\n process.stdout.write(` Private key: ${result.privateKey}\\n`);\n process.stdout.write(` Copy: NEAR_PRIVATE_KEY=${result.privateKey}\\n`);\n }\n\n if (descriptor.key === \"pluginAdd\") {\n console.log();\n console.log(colors.green(`${icons.ok} Added plugin ${result.key}`));\n if (result.development) console.log(` ${colors.dim(\"Development:\")} ${result.development}`);\n if (result.production) console.log(` ${colors.dim(\"Production:\")} ${result.production}`);\n console.log();\n return;\n }\n\n if (descriptor.key === \"pluginRemove\") {\n console.log();\n console.log(colors.green(`${icons.ok} Removed plugin ${result.key}`));\n console.log();\n return;\n }\n\n if (descriptor.key === \"pluginList\") {\n console.log();\n console.log(colors.cyan(frames.top(52)));\n console.log(` ${icons.config} ${gradients.cyber(\"PLUGINS\")}`);\n console.log(colors.cyan(frames.bottom(52)));\n console.log();\n if (result.plugins.length === 0) {\n console.log(colors.dim(\" No plugins configured\"));\n } else {\n for (const pluginItem of result.plugins) {\n console.log(` ${colors.cyan(pluginItem.key)}`);\n if (pluginItem.development)\n console.log(` ${colors.dim(\"Development:\")} ${pluginItem.development}`);\n if (pluginItem.production)\n console.log(` ${colors.dim(\"Production:\")} ${pluginItem.production}`);\n }\n }\n console.log();\n return;\n }\n\n if (descriptor.key === \"pluginPublish\") {\n console.log();\n console.log(colors.green(`${icons.ok} Published plugin ${result.key}`));\n if (result.path) console.log(` ${colors.dim(\"Path:\")} ${result.path}`);\n if (result.script) console.log(` ${colors.dim(\"Script:\")} bun run ${result.script}`);\n if (result.production) console.log(` ${colors.dim(\"Production:\")} ${result.production}`);\n console.log();\n return;\n }\n\n if (descriptor.key === \"publish\") {\n if (result.status === \"dry-run\") {\n console.log();\n console.log(colors.cyan(`${icons.ok} Dry run complete`));\n console.log(` ${colors.dim(\"Registry URL:\")} ${result.registryUrl}`);\n console.log();\n return;\n }\n\n if (result.status === \"published\") {\n console.log();\n console.log(colors.green(`${icons.ok} Published successfully`));\n console.log(` ${colors.dim(\"Registry URL:\")} ${result.registryUrl}`);\n if (result.txHash) {\n console.log(` ${colors.dim(\"Transaction:\")} ${result.txHash}`);\n }\n if (result.built && result.built.length > 0) {\n console.log(` ${colors.dim(\"Built:\")} ${result.built.join(\", \")}`);\n }\n if (result.skipped && result.skipped.length > 0) {\n console.log(` ${colors.dim(\"Skipped:\")} ${result.skipped.join(\", \")}`);\n }\n console.log();\n return;\n }\n }\n } catch (error) {\n console.error(`[CLI] ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n }\n}\n\nmain().catch((error) => {\n console.error(\"[CLI] Fatal error:\", error);\n process.exit(1);\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.cjs","names":["colors","frames","icons","gradients","findConfigPath","findCommandDescriptor","bosPlugin","parseCommandInput"],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env bun\nimport { findCommandDescriptor } from \"./cli/catalog\";\nimport { printHelp } from \"./cli/help\";\nimport { parseCommandInput } from \"./cli/parse\";\nimport { findConfigPath } from \"./config\";\nimport bosPlugin from \"./plugin\";\nimport { createPluginRuntime } from \"./sdk\";\nimport { printBanner } from \"./utils/banner\";\nimport { colors, frames, gradients, icons } from \"./utils/theme\";\n\nfunction printConfigView(result: {\n account: string;\n domain?: string;\n staging?: { domain: string };\n app: {\n host: { name?: string; development: string; production?: string };\n ui: { name?: string; development?: string; production?: string; ssr?: string };\n api: { name?: string; development?: string; production?: string; proxy?: string };\n };\n}) {\n console.log();\n console.log(colors.cyan(frames.top(52)));\n console.log(` ${icons.app} ${gradients.cyber(\"CONFIG\")}`);\n console.log(colors.cyan(frames.bottom(52)));\n console.log();\n\n console.log(` ${colors.dim(\"Account\")} ${colors.cyan(result.account)}`);\n console.log(` ${colors.dim(\"Domain\")} ${colors.white(result.domain ?? \"not configured\")}`);\n if (result.staging) {\n console.log(` ${colors.dim(\"Staging\")} ${colors.magenta(result.staging.domain)}`);\n }\n console.log();\n}\n\nfunction formatTimeAgo(isoTimestamp: string): string {\n const now = Date.now();\n const then = new Date(isoTimestamp).getTime();\n const diffMs = now - then;\n const diffMins = Math.floor(diffMs / 60_000);\n if (diffMins < 1) return \"just now\";\n if (diffMins < 60) return `${diffMins} minute${diffMins > 1 ? \"s\" : \"\"} ago`;\n const diffHours = Math.floor(diffMins / 60);\n if (diffHours < 24) return `${diffHours} hour${diffHours > 1 ? \"s\" : \"\"} ago`;\n const diffDays = Math.floor(diffHours / 24);\n if (diffDays < 30) return `${diffDays} day${diffDays > 1 ? \"s\" : \"\"} ago`;\n return isoTimestamp.split(\"T\")[0] ?? isoTimestamp;\n}\n\nasync function main() {\n const args = process.argv.slice(2);\n\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n printHelp();\n return;\n }\n\n const invocationArgs = args.length > 0 ? args : [\"dev\"];\n const command = invocationArgs[0] ?? \"dev\";\n const configPath = findConfigPath();\n\n const commandMatch = findCommandDescriptor(invocationArgs);\n if (!commandMatch) {\n console.error(`Unknown command: ${command}`);\n process.exit(1);\n }\n\n const { descriptor, consumed } = commandMatch;\n const commandArgs = invocationArgs.slice(consumed);\n\n printBanner();\n\n const runtime = createPluginRuntime({\n registry: {\n bos: { module: bosPlugin },\n },\n secrets: {},\n });\n\n const pluginRuntime: any = runtime;\n const loadPlugin = pluginRuntime.usePlugin.bind(pluginRuntime);\n const plugin = await loadPlugin(\"bos\", {\n variables: {\n configPath: configPath ?? undefined,\n },\n secrets: {},\n });\n\n const client = plugin.createClient();\n\n try {\n const input = parseCommandInput(descriptor, commandArgs);\n const result = await (client as any)[descriptor.key](input);\n\n if (descriptor.key === \"config\") {\n if (!result.config) {\n console.error(\"No bos.config.json found\");\n process.exit(1);\n }\n\n printConfigView(result.config);\n process.stdout.write(`${JSON.stringify(result.config, null, 2)}\\n`);\n return;\n }\n\n if (descriptor.key === \"init\") {\n console.log();\n if (result.status === \"error\") {\n console.error(`[CLI] ${result.error || \"Unknown error\"}`);\n process.exit(1);\n }\n console.log(colors.green(`${icons.ok} Project initialized`));\n console.log(` ${colors.dim(\"Extends:\")} ${result.extends}`);\n console.log(` ${colors.dim(\"Directory:\")} ${result.directory}`);\n if (result.account) console.log(` ${colors.dim(\"Account:\")} ${result.account}`);\n if (result.domain) console.log(` ${colors.dim(\"Domain:\")} ${result.domain}`);\n console.log(` ${colors.dim(\"Files copied:\")} ${result.filesCopied}`);\n console.log();\n console.log(colors.dim(\" Next steps:\"));\n console.log(colors.dim(` cd ${result.directory}`));\n console.log(colors.dim(\" cp .env.example .env # then fill in your values\"));\n if (result.status === \"initialized\" && !(input as any)?.noInstall) {\n console.log(colors.dim(\" bun run dev\"));\n } else {\n console.log(colors.dim(\" bun install\"));\n console.log(colors.dim(\" bun run dev\"));\n }\n console.log();\n return;\n }\n\n if (descriptor.key === \"sync\") {\n console.log();\n if (result.status === \"error\") {\n console.error(`[CLI] ${result.error || \"Unknown error\"}`);\n process.exit(1);\n }\n if (result.status === \"dry-run\") {\n console.log(colors.cyan(`${icons.ok} Dry run — no files written`));\n } else {\n console.log(colors.green(`${icons.ok} Template synced`));\n }\n if (result.updated.length > 0) {\n console.log(` ${colors.dim(\"Updated:\")} ${result.updated.length} file(s)`);\n for (const f of result.updated) console.log(` ${colors.dim(f)}`);\n }\n if (result.added.length > 0) {\n console.log(` ${colors.dim(\"Added:\")} ${result.added.length} file(s)`);\n for (const f of result.added) console.log(` ${colors.dim(f)}`);\n }\n if (result.skipped.length > 0) {\n console.log(\n ` ${colors.yellow(\"Skipped:\")} ${result.skipped.length} file(s) (locally modified, use --force to overwrite)`,\n );\n for (const f of result.skipped) console.log(` ${colors.dim(f)}`);\n }\n if (result.updated.length === 0 && result.added.length === 0 && result.skipped.length === 0) {\n console.log(` ${colors.dim(\"Already up to date\")}`);\n }\n console.log();\n return;\n }\n\n if (descriptor.key === \"upgrade\") {\n console.log();\n if (result.status === \"error\") {\n console.error(`[CLI] ${result.error || \"Unknown error\"}`);\n process.exit(1);\n }\n if (result.status === \"dry-run\") {\n console.log(colors.cyan(`${icons.ok} Dry run — no changes applied`));\n } else {\n console.log(colors.green(`${icons.ok} Framework upgraded`));\n }\n for (const pkg of result.packages) {\n if (pkg.from && pkg.from !== pkg.to) {\n console.log(` ${colors.dim(`${pkg.name}:`)} ${pkg.from} → ${pkg.to}`);\n } else if (!pkg.from) {\n console.log(` ${colors.dim(`${pkg.name}:`)} ${pkg.to} (new)`);\n } else {\n console.log(` ${colors.dim(`${pkg.name}:`)} ${pkg.to} (up to date)`);\n }\n }\n if (result.changelogUrl) {\n console.log(` ${colors.dim(\"Changelog:\")} ${result.changelogUrl}`);\n }\n if (result.sync) {\n const sync = result.sync;\n if (sync.updated.length > 0) {\n console.log(` ${colors.dim(\"Synced updated:\")} ${sync.updated.length} file(s)`);\n }\n if (sync.added.length > 0) {\n console.log(` ${colors.dim(\"Synced added:\")} ${sync.added.length} file(s)`);\n }\n if (sync.skipped.length > 0) {\n console.log(\n ` ${colors.yellow(\"Synced skipped:\")} ${sync.skipped.length} file(s) (locally modified, use --force to overwrite)`,\n );\n }\n }\n console.log();\n return;\n }\n\n if (descriptor.key === \"status\") {\n console.log();\n if (result.status === \"error\") {\n console.error(`[CLI] ${result.error || \"Unknown error\"}`);\n process.exit(1);\n }\n console.log(colors.cyan(frames.top(52)));\n console.log(` ${icons.app} ${gradients.cyber(\"STATUS\")}`);\n console.log(colors.cyan(frames.bottom(52)));\n console.log();\n if (result.extends) console.log(` ${colors.dim(\"Extends:\")} ${result.extends}`);\n if (result.account) console.log(` ${colors.dim(\"Account:\")} ${result.account}`);\n if (result.domain) console.log(` ${colors.dim(\"Domain:\")} ${result.domain}`);\n console.log();\n console.log(` ${colors.dim(\"Packages:\")}`);\n for (const pkg of result.packages) {\n const hasUpdate = pkg.installed && pkg.latest && pkg.installed !== pkg.latest;\n const versionStr = hasUpdate\n ? `${pkg.installed} → ${pkg.latest}`\n : pkg.installed || \"not installed\";\n const label = hasUpdate ? colors.yellow(versionStr) : colors.dim(versionStr);\n console.log(` ${colors.dim(`${pkg.name}`)} ${label}`);\n }\n console.log();\n if (result.lastSync) {\n const ago = formatTimeAgo(result.lastSync);\n console.log(` ${colors.dim(\"Last sync:\")} ${ago}`);\n } else {\n console.log(` ${colors.dim(\"Last sync:\")} never`);\n }\n const envLabel =\n result.envFile === \"found\"\n ? colors.green(\"found\")\n : result.envFile === \"example-only\"\n ? colors.yellow(\"missing (only .env.example found)\")\n : colors.error(\"missing\");\n console.log(` ${colors.dim(\".env:\")} ${envLabel}`);\n if (result.parentReachable !== undefined) {\n const parentLabel = result.parentReachable\n ? colors.green(\"reachable\")\n : colors.error(\"unreachable\");\n console.log(` ${colors.dim(\"Parent:\")} ${parentLabel}`);\n }\n const hasUpdates = result.packages.some(\n (p: { installed?: string; latest?: string }) =>\n p.installed && p.latest && p.installed !== p.latest,\n );\n if (hasUpdates) {\n console.log();\n console.log(\n colors.dim(\n ` Run ${colors.cyan(\"bos upgrade\")} to update packages and sync template files.`,\n ),\n );\n }\n console.log();\n return;\n }\n\n if (result?.status === \"error\") {\n console.error(`[CLI] ${result.error || \"Unknown error\"}`);\n process.exit(1);\n }\n\n if (descriptor.key === \"keyPublish\") {\n process.stdout.write(`Generated publish key for ${result.account}\\n`);\n process.stdout.write(` Network: ${result.network}\\n`);\n process.stdout.write(` Contract: ${result.contract}\\n`);\n process.stdout.write(` Allowance: ${result.allowance}\\n`);\n process.stdout.write(` Functions: ${result.functionNames.join(\", \")}\\n`);\n process.stdout.write(` Public key: ${result.publicKey}\\n`);\n process.stdout.write(` Private key: ${result.privateKey}\\n`);\n process.stdout.write(` Copy: NEAR_PRIVATE_KEY=${result.privateKey}\\n`);\n }\n\n if (descriptor.key === \"pluginAdd\") {\n console.log();\n console.log(colors.green(`${icons.ok} Added plugin ${result.key}`));\n if (result.development) console.log(` ${colors.dim(\"Development:\")} ${result.development}`);\n if (result.production) console.log(` ${colors.dim(\"Production:\")} ${result.production}`);\n console.log();\n return;\n }\n\n if (descriptor.key === \"pluginRemove\") {\n console.log();\n console.log(colors.green(`${icons.ok} Removed plugin ${result.key}`));\n console.log();\n return;\n }\n\n if (descriptor.key === \"pluginList\") {\n console.log();\n console.log(colors.cyan(frames.top(52)));\n console.log(` ${icons.config} ${gradients.cyber(\"PLUGINS\")}`);\n console.log(colors.cyan(frames.bottom(52)));\n console.log();\n if (result.plugins.length === 0) {\n console.log(colors.dim(\" No plugins configured\"));\n } else {\n for (const pluginItem of result.plugins) {\n console.log(` ${colors.cyan(pluginItem.key)}`);\n if (pluginItem.development)\n console.log(` ${colors.dim(\"Development:\")} ${pluginItem.development}`);\n if (pluginItem.production)\n console.log(` ${colors.dim(\"Production:\")} ${pluginItem.production}`);\n }\n }\n console.log();\n return;\n }\n\n if (descriptor.key === \"pluginPublish\") {\n console.log();\n console.log(colors.green(`${icons.ok} Published plugin ${result.key}`));\n if (result.path) console.log(` ${colors.dim(\"Path:\")} ${result.path}`);\n if (result.script) console.log(` ${colors.dim(\"Script:\")} bun run ${result.script}`);\n if (result.production) console.log(` ${colors.dim(\"Production:\")} ${result.production}`);\n console.log();\n return;\n }\n\n if (descriptor.key === \"publish\") {\n if (result.status === \"dry-run\") {\n console.log();\n console.log(colors.cyan(`${icons.ok} Dry run complete`));\n console.log(` ${colors.dim(\"Registry URL:\")} ${result.registryUrl}`);\n console.log();\n return;\n }\n\n if (result.status === \"published\") {\n console.log();\n console.log(colors.green(`${icons.ok} Published successfully`));\n console.log(` ${colors.dim(\"Registry URL:\")} ${result.registryUrl}`);\n if (result.txHash) {\n console.log(` ${colors.dim(\"Transaction:\")} ${result.txHash}`);\n }\n if (result.built && result.built.length > 0) {\n console.log(` ${colors.dim(\"Built:\")} ${result.built.join(\", \")}`);\n }\n if (result.skipped && result.skipped.length > 0) {\n console.log(` ${colors.dim(\"Skipped:\")} ${result.skipped.join(\", \")}`);\n }\n console.log();\n return;\n }\n }\n } catch (error) {\n console.error(`[CLI] ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n }\n}\n\nmain().catch((error) => {\n console.error(\"[CLI] Fatal error:\", error);\n process.exit(1);\n});\n"],"mappings":"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"}
|
package/dist/cli.mjs
CHANGED
|
@@ -20,6 +20,17 @@ function printConfigView(result) {
|
|
|
20
20
|
if (result.staging) console.log(` ${colors.dim("Staging")} ${colors.magenta(result.staging.domain)}`);
|
|
21
21
|
console.log();
|
|
22
22
|
}
|
|
23
|
+
function formatTimeAgo(isoTimestamp) {
|
|
24
|
+
const diffMs = Date.now() - new Date(isoTimestamp).getTime();
|
|
25
|
+
const diffMins = Math.floor(diffMs / 6e4);
|
|
26
|
+
if (diffMins < 1) return "just now";
|
|
27
|
+
if (diffMins < 60) return `${diffMins} minute${diffMins > 1 ? "s" : ""} ago`;
|
|
28
|
+
const diffHours = Math.floor(diffMins / 60);
|
|
29
|
+
if (diffHours < 24) return `${diffHours} hour${diffHours > 1 ? "s" : ""} ago`;
|
|
30
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
31
|
+
if (diffDays < 30) return `${diffDays} day${diffDays > 1 ? "s" : ""} ago`;
|
|
32
|
+
return isoTimestamp.split("T")[0] ?? isoTimestamp;
|
|
33
|
+
}
|
|
23
34
|
async function main() {
|
|
24
35
|
const args = process.argv.slice(2);
|
|
25
36
|
if (args.includes("--help") || args.includes("-h")) {
|
|
@@ -65,17 +76,102 @@ async function main() {
|
|
|
65
76
|
}
|
|
66
77
|
console.log(colors.green(`${icons.ok} Project initialized`));
|
|
67
78
|
console.log(` ${colors.dim("Extends:")} ${result.extends}`);
|
|
68
|
-
console.log(` ${colors.dim("
|
|
69
|
-
if (result.
|
|
79
|
+
console.log(` ${colors.dim("Directory:")} ${result.directory}`);
|
|
80
|
+
if (result.account) console.log(` ${colors.dim("Account:")} ${result.account}`);
|
|
70
81
|
if (result.domain) console.log(` ${colors.dim("Domain:")} ${result.domain}`);
|
|
71
82
|
console.log(` ${colors.dim("Files copied:")} ${result.filesCopied}`);
|
|
72
83
|
console.log();
|
|
73
84
|
console.log(colors.dim(" Next steps:"));
|
|
74
|
-
console.log(colors.dim(` cd ${result.
|
|
75
|
-
|
|
85
|
+
console.log(colors.dim(` cd ${result.directory}`));
|
|
86
|
+
console.log(colors.dim(" cp .env.example .env # then fill in your values"));
|
|
87
|
+
if (result.status === "initialized" && !input?.noInstall) console.log(colors.dim(" bun run dev"));
|
|
76
88
|
else {
|
|
77
89
|
console.log(colors.dim(" bun install"));
|
|
78
|
-
console.log(colors.dim("
|
|
90
|
+
console.log(colors.dim(" bun run dev"));
|
|
91
|
+
}
|
|
92
|
+
console.log();
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (descriptor.key === "sync") {
|
|
96
|
+
console.log();
|
|
97
|
+
if (result.status === "error") {
|
|
98
|
+
console.error(`[CLI] ${result.error || "Unknown error"}`);
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
if (result.status === "dry-run") console.log(colors.cyan(`${icons.ok} Dry run — no files written`));
|
|
102
|
+
else console.log(colors.green(`${icons.ok} Template synced`));
|
|
103
|
+
if (result.updated.length > 0) {
|
|
104
|
+
console.log(` ${colors.dim("Updated:")} ${result.updated.length} file(s)`);
|
|
105
|
+
for (const f of result.updated) console.log(` ${colors.dim(f)}`);
|
|
106
|
+
}
|
|
107
|
+
if (result.added.length > 0) {
|
|
108
|
+
console.log(` ${colors.dim("Added:")} ${result.added.length} file(s)`);
|
|
109
|
+
for (const f of result.added) console.log(` ${colors.dim(f)}`);
|
|
110
|
+
}
|
|
111
|
+
if (result.skipped.length > 0) {
|
|
112
|
+
console.log(` ${colors.yellow("Skipped:")} ${result.skipped.length} file(s) (locally modified, use --force to overwrite)`);
|
|
113
|
+
for (const f of result.skipped) console.log(` ${colors.dim(f)}`);
|
|
114
|
+
}
|
|
115
|
+
if (result.updated.length === 0 && result.added.length === 0 && result.skipped.length === 0) console.log(` ${colors.dim("Already up to date")}`);
|
|
116
|
+
console.log();
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (descriptor.key === "upgrade") {
|
|
120
|
+
console.log();
|
|
121
|
+
if (result.status === "error") {
|
|
122
|
+
console.error(`[CLI] ${result.error || "Unknown error"}`);
|
|
123
|
+
process.exit(1);
|
|
124
|
+
}
|
|
125
|
+
if (result.status === "dry-run") console.log(colors.cyan(`${icons.ok} Dry run — no changes applied`));
|
|
126
|
+
else console.log(colors.green(`${icons.ok} Framework upgraded`));
|
|
127
|
+
for (const pkg of result.packages) if (pkg.from && pkg.from !== pkg.to) console.log(` ${colors.dim(`${pkg.name}:`)} ${pkg.from} → ${pkg.to}`);
|
|
128
|
+
else if (!pkg.from) console.log(` ${colors.dim(`${pkg.name}:`)} ${pkg.to} (new)`);
|
|
129
|
+
else console.log(` ${colors.dim(`${pkg.name}:`)} ${pkg.to} (up to date)`);
|
|
130
|
+
if (result.changelogUrl) console.log(` ${colors.dim("Changelog:")} ${result.changelogUrl}`);
|
|
131
|
+
if (result.sync) {
|
|
132
|
+
const sync = result.sync;
|
|
133
|
+
if (sync.updated.length > 0) console.log(` ${colors.dim("Synced updated:")} ${sync.updated.length} file(s)`);
|
|
134
|
+
if (sync.added.length > 0) console.log(` ${colors.dim("Synced added:")} ${sync.added.length} file(s)`);
|
|
135
|
+
if (sync.skipped.length > 0) console.log(` ${colors.yellow("Synced skipped:")} ${sync.skipped.length} file(s) (locally modified, use --force to overwrite)`);
|
|
136
|
+
}
|
|
137
|
+
console.log();
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
if (descriptor.key === "status") {
|
|
141
|
+
console.log();
|
|
142
|
+
if (result.status === "error") {
|
|
143
|
+
console.error(`[CLI] ${result.error || "Unknown error"}`);
|
|
144
|
+
process.exit(1);
|
|
145
|
+
}
|
|
146
|
+
console.log(colors.cyan(frames.top(52)));
|
|
147
|
+
console.log(` ${icons.app} ${gradients.cyber("STATUS")}`);
|
|
148
|
+
console.log(colors.cyan(frames.bottom(52)));
|
|
149
|
+
console.log();
|
|
150
|
+
if (result.extends) console.log(` ${colors.dim("Extends:")} ${result.extends}`);
|
|
151
|
+
if (result.account) console.log(` ${colors.dim("Account:")} ${result.account}`);
|
|
152
|
+
if (result.domain) console.log(` ${colors.dim("Domain:")} ${result.domain}`);
|
|
153
|
+
console.log();
|
|
154
|
+
console.log(` ${colors.dim("Packages:")}`);
|
|
155
|
+
for (const pkg of result.packages) {
|
|
156
|
+
const hasUpdate = pkg.installed && pkg.latest && pkg.installed !== pkg.latest;
|
|
157
|
+
const versionStr = hasUpdate ? `${pkg.installed} → ${pkg.latest}` : pkg.installed || "not installed";
|
|
158
|
+
const label = hasUpdate ? colors.yellow(versionStr) : colors.dim(versionStr);
|
|
159
|
+
console.log(` ${colors.dim(`${pkg.name}`)} ${label}`);
|
|
160
|
+
}
|
|
161
|
+
console.log();
|
|
162
|
+
if (result.lastSync) {
|
|
163
|
+
const ago = formatTimeAgo(result.lastSync);
|
|
164
|
+
console.log(` ${colors.dim("Last sync:")} ${ago}`);
|
|
165
|
+
} else console.log(` ${colors.dim("Last sync:")} never`);
|
|
166
|
+
const envLabel = result.envFile === "found" ? colors.green("found") : result.envFile === "example-only" ? colors.yellow("missing (only .env.example found)") : colors.error("missing");
|
|
167
|
+
console.log(` ${colors.dim(".env:")} ${envLabel}`);
|
|
168
|
+
if (result.parentReachable !== void 0) {
|
|
169
|
+
const parentLabel = result.parentReachable ? colors.green("reachable") : colors.error("unreachable");
|
|
170
|
+
console.log(` ${colors.dim("Parent:")} ${parentLabel}`);
|
|
171
|
+
}
|
|
172
|
+
if (result.packages.some((p) => p.installed && p.latest && p.installed !== p.latest)) {
|
|
173
|
+
console.log();
|
|
174
|
+
console.log(colors.dim(` Run ${colors.cyan("bos upgrade")} to update packages and sync template files.`));
|
|
79
175
|
}
|
|
80
176
|
console.log();
|
|
81
177
|
return;
|