@combric/cli 1.0.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/LICENSE +21 -0
- package/README.md +98 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +4 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +192 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +87 -0
- package/dist/config.js.map +1 -0
- package/dist/doctor.d.ts +3 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +79 -0
- package/dist/doctor.js.map +1 -0
- package/dist/execute.d.ts +3 -0
- package/dist/execute.d.ts.map +1 -0
- package/dist/execute.js +87 -0
- package/dist/execute.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/inspect.d.ts +9 -0
- package/dist/inspect.d.ts.map +1 -0
- package/dist/inspect.js +236 -0
- package/dist/inspect.js.map +1 -0
- package/dist/model.d.ts +54 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +10 -0
- package/dist/model.js.map +1 -0
- package/dist/plan.d.ts +8 -0
- package/dist/plan.d.ts.map +1 -0
- package/dist/plan.js +128 -0
- package/dist/plan.js.map +1 -0
- package/dist/requirements.d.ts +4 -0
- package/dist/requirements.d.ts.map +1 -0
- package/dist/requirements.js +19 -0
- package/dist/requirements.js.map +1 -0
- package/package.json +36 -0
package/dist/execute.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
4
|
+
import { basename, dirname, join } from "node:path";
|
|
5
|
+
import { resolveCssFile } from "./inspect.js";
|
|
6
|
+
import { CliError } from "./model.js";
|
|
7
|
+
function installPackages(manager, packages, cwd) {
|
|
8
|
+
let executable = manager;
|
|
9
|
+
let args = ["add", ...packages];
|
|
10
|
+
const activeCli = process.env.npm_execpath;
|
|
11
|
+
if (activeCli && basename(activeCli).toLowerCase().includes(manager)) {
|
|
12
|
+
executable = process.execPath;
|
|
13
|
+
args = [activeCli, ...args];
|
|
14
|
+
}
|
|
15
|
+
else if (process.platform === "win32") {
|
|
16
|
+
// Node cannot spawn .cmd shims without a shell. Require the manager's own
|
|
17
|
+
// JavaScript entry rather than interpolating a consumer project into cmd.exe.
|
|
18
|
+
throw new CliError(`On Windows, run Combric through ${manager} exec so npm_execpath identifies the selected package manager. No files were changed.`, "MANAGER_ENTRY_REQUIRED", 2);
|
|
19
|
+
}
|
|
20
|
+
const result = spawnSync(executable, args, {
|
|
21
|
+
cwd,
|
|
22
|
+
encoding: "utf8",
|
|
23
|
+
stdio: "pipe",
|
|
24
|
+
});
|
|
25
|
+
if (result.error || result.status !== 0) {
|
|
26
|
+
throw new CliError(`${manager} could not install ${packages.join(", ")}. These packages may still be unreleased; use a local tarball/workspace or wait for publication. Package-manager files may have changed, but Combric CSS/config was not written. ${result.error?.message ?? (result.stderr || result.stdout).trim()}`, "INSTALL_FAILED", 2);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async function writeCssAtomically(path, content) {
|
|
30
|
+
const temporary = join(dirname(path), `.${basename(path)}.combric-${randomUUID()}.tmp`);
|
|
31
|
+
try {
|
|
32
|
+
await writeFile(temporary, content, { encoding: "utf8", flag: "wx" });
|
|
33
|
+
await rename(temporary, path);
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
await rm(temporary, { force: true });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export async function executePlan(plan) {
|
|
40
|
+
const changed = [];
|
|
41
|
+
const cssAction = plan.actions.find((action) => action.type === "update-css");
|
|
42
|
+
const configAction = plan.actions.find((action) => action.type === "create-config");
|
|
43
|
+
const cssPath = await resolveCssFile(plan.projectRoot, plan.cssFile);
|
|
44
|
+
if (cssAction && (await readFile(cssPath, "utf8")) !== cssAction.before) {
|
|
45
|
+
throw new CliError("CSS file changed since the plan was created. Run init again.", "STALE_PLAN");
|
|
46
|
+
}
|
|
47
|
+
const configPath = join(plan.projectRoot, "combric.config.json");
|
|
48
|
+
if (configAction) {
|
|
49
|
+
try {
|
|
50
|
+
await readFile(configPath, "utf8");
|
|
51
|
+
throw new CliError("Combric config appeared since planning. Run init again.", "STALE_PLAN");
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (error.code !== "ENOENT")
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
const install = plan.actions.find((action) => action.type === "install");
|
|
60
|
+
if (install?.packages?.length) {
|
|
61
|
+
installPackages(plan.packageManager, install.packages, plan.projectRoot);
|
|
62
|
+
changed.push(`installed ${install.packages.join(", ")}`);
|
|
63
|
+
}
|
|
64
|
+
if (cssAction?.content !== undefined) {
|
|
65
|
+
const currentPath = await resolveCssFile(plan.projectRoot, plan.cssFile);
|
|
66
|
+
if ((await readFile(currentPath, "utf8")) !== cssAction.before) {
|
|
67
|
+
throw new CliError("CSS file changed during installation. Review package-manager changes and run init again.", "STALE_PLAN", 2);
|
|
68
|
+
}
|
|
69
|
+
await writeCssAtomically(currentPath, cssAction.content);
|
|
70
|
+
changed.push(`updated ${plan.cssFile}`);
|
|
71
|
+
}
|
|
72
|
+
if (configAction?.content !== undefined) {
|
|
73
|
+
await writeFile(configPath, configAction.content, {
|
|
74
|
+
encoding: "utf8",
|
|
75
|
+
flag: "wx",
|
|
76
|
+
});
|
|
77
|
+
changed.push("created combric.config.json");
|
|
78
|
+
}
|
|
79
|
+
return changed;
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
if (error instanceof CliError && !changed.length)
|
|
83
|
+
throw error;
|
|
84
|
+
throw new CliError(`Init stopped after: ${changed.length ? changed.join("; ") : "no completed operations"}. ${error instanceof Error ? error.message : String(error)} Review the project before retrying.`, "PARTIAL_INIT", 2);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../src/execute.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ProjectInfo } from "./model.js";
|
|
2
|
+
export declare function findProjectRoot(start: string, explicit: boolean): Promise<string>;
|
|
3
|
+
export declare function validateRelativeFile(root: string, requested: string): string;
|
|
4
|
+
export declare function resolveCssFile(root: string, requested: string): Promise<string>;
|
|
5
|
+
export declare function cssImports(contents: string): string[];
|
|
6
|
+
export declare function inspectProject(start: string, explicit?: boolean): Promise<ProjectInfo>;
|
|
7
|
+
export declare function supportsReact19(version: string): boolean;
|
|
8
|
+
export declare function supportsTailwind4(version: string): boolean;
|
|
9
|
+
//# sourceMappingURL=inspect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../src/inspect.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiC,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAuD7E,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAwB5E;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CA2BjB;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAOrD;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,QAAQ,UAAQ,GACf,OAAO,CAAC,WAAW,CAAC,CA0ItB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAKxD;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAM1D"}
|
package/dist/inspect.js
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { access, readFile, realpath } from "node:fs/promises";
|
|
2
|
+
import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
3
|
+
import { MANAGERS, readConfig } from "./config.js";
|
|
4
|
+
import { CliError } from "./model.js";
|
|
5
|
+
const lockfiles = {
|
|
6
|
+
pnpm: ["pnpm-lock.yaml"],
|
|
7
|
+
npm: ["package-lock.json", "npm-shrinkwrap.json"],
|
|
8
|
+
yarn: ["yarn.lock"],
|
|
9
|
+
bun: ["bun.lock", "bun.lockb"],
|
|
10
|
+
};
|
|
11
|
+
async function exists(path) {
|
|
12
|
+
try {
|
|
13
|
+
await access(path);
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (error.code === "ENOENT")
|
|
18
|
+
return false;
|
|
19
|
+
throw error;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async function findWorkspaceRoot(start) {
|
|
23
|
+
let current = start;
|
|
24
|
+
while (true) {
|
|
25
|
+
if (await exists(join(current, "pnpm-workspace.yaml")))
|
|
26
|
+
return current;
|
|
27
|
+
try {
|
|
28
|
+
const manifest = JSON.parse(await readFile(join(current, "package.json"), "utf8"));
|
|
29
|
+
if (manifest && typeof manifest === "object" && "workspaces" in manifest)
|
|
30
|
+
return current;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// Workspace evidence is optional; malformed ancestors do not authorize edits.
|
|
34
|
+
}
|
|
35
|
+
if (dirname(current) === current)
|
|
36
|
+
return null;
|
|
37
|
+
current = dirname(current);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function readDependencies(manifest) {
|
|
41
|
+
const result = {};
|
|
42
|
+
for (const field of [
|
|
43
|
+
"dependencies",
|
|
44
|
+
"devDependencies",
|
|
45
|
+
"optionalDependencies",
|
|
46
|
+
]) {
|
|
47
|
+
const value = manifest[field];
|
|
48
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
49
|
+
continue;
|
|
50
|
+
for (const [name, version] of Object.entries(value)) {
|
|
51
|
+
if (typeof version === "string")
|
|
52
|
+
result[name] = version;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
export async function findProjectRoot(start, explicit) {
|
|
58
|
+
let current = await realpath(resolve(start));
|
|
59
|
+
while (true) {
|
|
60
|
+
if (await exists(join(current, "package.json")))
|
|
61
|
+
return current;
|
|
62
|
+
if (explicit || dirname(current) === current) {
|
|
63
|
+
throw new CliError(`No package.json found at ${current}. Run this in an existing package project or pass --project.`, "NO_PROJECT");
|
|
64
|
+
}
|
|
65
|
+
current = dirname(current);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function validateRelativeFile(root, requested) {
|
|
69
|
+
if (!requested || isAbsolute(requested) || /^[A-Za-z]:/.test(requested)) {
|
|
70
|
+
throw new CliError("--css-file must be a project-relative CSS path.", "UNSAFE_PATH");
|
|
71
|
+
}
|
|
72
|
+
const target = resolve(root, requested);
|
|
73
|
+
const inside = relative(root, target);
|
|
74
|
+
if (!inside ||
|
|
75
|
+
inside === ".." ||
|
|
76
|
+
inside.startsWith(`..${sep}`) ||
|
|
77
|
+
isAbsolute(inside)) {
|
|
78
|
+
throw new CliError("CSS target must stay inside the project root.", "UNSAFE_PATH");
|
|
79
|
+
}
|
|
80
|
+
if (!target.endsWith(".css")) {
|
|
81
|
+
throw new CliError("CSS target must be a .css file.", "UNSAFE_PATH");
|
|
82
|
+
}
|
|
83
|
+
return target;
|
|
84
|
+
}
|
|
85
|
+
export async function resolveCssFile(root, requested) {
|
|
86
|
+
const target = validateRelativeFile(root, requested);
|
|
87
|
+
let resolved;
|
|
88
|
+
try {
|
|
89
|
+
resolved = await realpath(target);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
if (error.code === "ENOENT") {
|
|
93
|
+
throw new CliError(`CSS file ${requested} does not exist. Create it and pass --css-file.`, "MISSING_CSS");
|
|
94
|
+
}
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
const inside = relative(root, resolved);
|
|
98
|
+
if (!inside ||
|
|
99
|
+
inside === ".." ||
|
|
100
|
+
inside.startsWith(`..${sep}`) ||
|
|
101
|
+
isAbsolute(inside)) {
|
|
102
|
+
throw new CliError("CSS target resolves outside the project root.", "UNSAFE_PATH");
|
|
103
|
+
}
|
|
104
|
+
return resolved;
|
|
105
|
+
}
|
|
106
|
+
export function cssImports(contents) {
|
|
107
|
+
const withoutComments = contents.replace(/\/\*[\s\S]*?\*\//g, "");
|
|
108
|
+
return [
|
|
109
|
+
...withoutComments.matchAll(/^\s*@import\s+(?:url\(\s*)?["']([^"']+)["']/gm),
|
|
110
|
+
].map((match) => match[1]);
|
|
111
|
+
}
|
|
112
|
+
export async function inspectProject(start, explicit = false) {
|
|
113
|
+
const projectRoot = await findProjectRoot(start, explicit);
|
|
114
|
+
let manifest;
|
|
115
|
+
try {
|
|
116
|
+
const parsed = JSON.parse(await readFile(join(projectRoot, "package.json"), "utf8"));
|
|
117
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
|
|
118
|
+
throw new Error("not an object");
|
|
119
|
+
manifest = parsed;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
throw new CliError("package.json is invalid JSON or is not an object.", "INVALID_MANIFEST");
|
|
123
|
+
}
|
|
124
|
+
const dependencies = readDependencies(manifest);
|
|
125
|
+
const workspaceRoot = await findWorkspaceRoot(projectRoot);
|
|
126
|
+
const configState = await readConfig(projectRoot);
|
|
127
|
+
const evidence = [];
|
|
128
|
+
if (workspaceRoot &&
|
|
129
|
+
(await exists(join(workspaceRoot, "pnpm-workspace.yaml")))) {
|
|
130
|
+
evidence.push("pnpm-workspace.yaml:pnpm");
|
|
131
|
+
}
|
|
132
|
+
const managerField = manifest.packageManager;
|
|
133
|
+
if (typeof managerField === "string") {
|
|
134
|
+
const manager = managerField.split("@")[0];
|
|
135
|
+
if (MANAGERS.includes(manager))
|
|
136
|
+
evidence.push(`packageManager:${manager}`);
|
|
137
|
+
else
|
|
138
|
+
evidence.push(`packageManager:unsupported(${manager})`);
|
|
139
|
+
}
|
|
140
|
+
for (const [manager, names] of Object.entries(lockfiles)) {
|
|
141
|
+
for (const name of names) {
|
|
142
|
+
if (await exists(join(projectRoot, name)))
|
|
143
|
+
evidence.push(`${name}:${manager}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (workspaceRoot && workspaceRoot !== projectRoot) {
|
|
147
|
+
try {
|
|
148
|
+
const workspaceManifest = JSON.parse(await readFile(join(workspaceRoot, "package.json"), "utf8"));
|
|
149
|
+
if (workspaceManifest &&
|
|
150
|
+
typeof workspaceManifest === "object" &&
|
|
151
|
+
"packageManager" in workspaceManifest) {
|
|
152
|
+
const field = workspaceManifest
|
|
153
|
+
.packageManager;
|
|
154
|
+
if (typeof field === "string")
|
|
155
|
+
evidence.push(`workspace-packageManager:${field.split("@")[0]}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// The nearest package manifest remains authoritative for project facts.
|
|
160
|
+
}
|
|
161
|
+
for (const [manager, names] of Object.entries(lockfiles)) {
|
|
162
|
+
for (const name of names) {
|
|
163
|
+
if (await exists(join(workspaceRoot, name)))
|
|
164
|
+
evidence.push(`workspace-${name}:${manager}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (configState.config)
|
|
169
|
+
evidence.push(`config:${configState.config.packageManager}`);
|
|
170
|
+
const managers = [
|
|
171
|
+
...new Set(evidence
|
|
172
|
+
.map((item) => item.split(":")[1])
|
|
173
|
+
.filter((item) => MANAGERS.includes(item))),
|
|
174
|
+
];
|
|
175
|
+
const packageManagerConflict = managers.length > 1 ||
|
|
176
|
+
evidence.some((item) => item.includes("unsupported"));
|
|
177
|
+
const packageManager = !packageManagerConflict && managers.length === 1
|
|
178
|
+
? managers[0]
|
|
179
|
+
: null;
|
|
180
|
+
const installed = {};
|
|
181
|
+
for (const name of Object.keys(dependencies).filter((item) => item.startsWith("@combric/") ||
|
|
182
|
+
["react", "react-dom", "tailwindcss"].includes(item))) {
|
|
183
|
+
try {
|
|
184
|
+
const contents = await readFile(join(projectRoot, "node_modules", ...name.split("/"), "package.json"), "utf8");
|
|
185
|
+
const parsed = JSON.parse(contents);
|
|
186
|
+
if (parsed &&
|
|
187
|
+
typeof parsed === "object" &&
|
|
188
|
+
typeof parsed.version === "string") {
|
|
189
|
+
installed[name] = parsed.version;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
// A declared dependency need not be installed in the inspected project.
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
let imports = null;
|
|
197
|
+
if (configState.config && !configState.error) {
|
|
198
|
+
try {
|
|
199
|
+
const cssPath = await resolveCssFile(projectRoot, configState.config.cssFile);
|
|
200
|
+
imports = cssImports(await readFile(cssPath, "utf8"));
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
// Doctor reports the missing or unsafe CSS target separately.
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
projectRoot,
|
|
208
|
+
nodeVersion: process.versions.node,
|
|
209
|
+
packageManager,
|
|
210
|
+
packageManagerEvidence: evidence,
|
|
211
|
+
packageManagerConflict,
|
|
212
|
+
manifest,
|
|
213
|
+
dependencies,
|
|
214
|
+
installed,
|
|
215
|
+
react: dependencies.react ?? null,
|
|
216
|
+
tailwind: dependencies.tailwindcss ?? null,
|
|
217
|
+
combricPackages: Object.fromEntries(Object.entries(dependencies).filter(([name]) => name.startsWith("@combric/"))),
|
|
218
|
+
config: configState.config,
|
|
219
|
+
configError: configState.error,
|
|
220
|
+
configUnknownFields: configState.unknownFields,
|
|
221
|
+
cssImports: imports,
|
|
222
|
+
workspace: workspaceRoot !== null,
|
|
223
|
+
workspaceRoot,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
export function supportsReact19(version) {
|
|
227
|
+
return (/^(?:\^|~)?19(?:\.\d+){0,2}$/.test(version.trim()) ||
|
|
228
|
+
/^>=\s*19(?:\.\d+){0,2}\s+<\s*20(?:\.0){0,2}$/.test(version.trim()));
|
|
229
|
+
}
|
|
230
|
+
export function supportsTailwind4(version) {
|
|
231
|
+
const value = version.trim();
|
|
232
|
+
const match = value.match(/^(?:\^|~)?4\.(\d+)(?:\.\d+)?$/) ??
|
|
233
|
+
value.match(/^>=\s*4\.(\d+)(?:\.\d+)?\s+<\s*5(?:\.0){0,2}$/);
|
|
234
|
+
return Boolean(match && Number(match[1]) >= 3);
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../src/inspect.ts"],"names":[],"mappings":"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"}
|
package/dist/model.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export type PackageManager = "pnpm" | "npm" | "yarn" | "bun";
|
|
2
|
+
export type Mode = "css" | "react" | "tailwind" | "react-tailwind";
|
|
3
|
+
export interface CliConfig {
|
|
4
|
+
schemaVersion: 1;
|
|
5
|
+
packageManager: PackageManager;
|
|
6
|
+
mode: Mode;
|
|
7
|
+
cssFile: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ProjectInfo {
|
|
10
|
+
projectRoot: string;
|
|
11
|
+
nodeVersion: string;
|
|
12
|
+
packageManager: PackageManager | null;
|
|
13
|
+
packageManagerEvidence: string[];
|
|
14
|
+
packageManagerConflict: boolean;
|
|
15
|
+
manifest: Record<string, unknown>;
|
|
16
|
+
dependencies: Record<string, string>;
|
|
17
|
+
installed: Record<string, string>;
|
|
18
|
+
react: string | null;
|
|
19
|
+
tailwind: string | null;
|
|
20
|
+
combricPackages: Record<string, string>;
|
|
21
|
+
config: CliConfig | null;
|
|
22
|
+
configError: string | null;
|
|
23
|
+
configUnknownFields: string[];
|
|
24
|
+
cssImports: string[] | null;
|
|
25
|
+
workspace: boolean;
|
|
26
|
+
workspaceRoot: string | null;
|
|
27
|
+
}
|
|
28
|
+
export interface Diagnostic {
|
|
29
|
+
severity: "pass" | "warning" | "error";
|
|
30
|
+
code: string;
|
|
31
|
+
message: string;
|
|
32
|
+
}
|
|
33
|
+
export interface PlannedAction {
|
|
34
|
+
type: "install" | "update-css" | "create-config";
|
|
35
|
+
target: string;
|
|
36
|
+
reason: string;
|
|
37
|
+
changesState: true;
|
|
38
|
+
packages?: string[];
|
|
39
|
+
content?: string;
|
|
40
|
+
before?: string | null;
|
|
41
|
+
}
|
|
42
|
+
export interface InitPlan {
|
|
43
|
+
projectRoot: string;
|
|
44
|
+
packageManager: PackageManager;
|
|
45
|
+
mode: Mode;
|
|
46
|
+
cssFile: string;
|
|
47
|
+
actions: PlannedAction[];
|
|
48
|
+
}
|
|
49
|
+
export declare class CliError extends Error {
|
|
50
|
+
readonly code: string;
|
|
51
|
+
readonly exitCode: 1 | 2;
|
|
52
|
+
constructor(message: string, code: string, exitCode?: 1 | 2);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;AAC7D,MAAM,MAAM,IAAI,GAAG,KAAK,GAAG,OAAO,GAAG,UAAU,GAAG,gBAAgB,CAAC;AAEnE,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,CAAC,CAAC;IACjB,cAAc,EAAE,cAAc,CAAC;IAC/B,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IACtC,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,sBAAsB,EAAE,OAAO,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,eAAe,CAAC;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,cAAc,CAAC;IAC/B,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,qBAAa,QAAS,SAAQ,KAAK;IAG/B,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC;gBAFxB,OAAO,EAAE,MAAM,EACN,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,CAAC,GAAG,CAAK;CAI/B"}
|
package/dist/model.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAsDA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGtB;IACA;IAHX,YACE,OAAe,EACN,IAAY,EACZ,WAAkB,CAAC;QAE5B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,SAAI,GAAJ,IAAI,CAAQ;QACZ,aAAQ,GAAR,QAAQ,CAAW;IAG9B,CAAC;CACF"}
|
package/dist/plan.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type InitPlan, type ProjectInfo } from "./model.js";
|
|
2
|
+
export interface InitOptions {
|
|
3
|
+
mode?: string | undefined;
|
|
4
|
+
cssFile?: string | undefined;
|
|
5
|
+
packageManager?: string | undefined;
|
|
6
|
+
}
|
|
7
|
+
export declare function planInit(project: ProjectInfo, options: InitOptions): Promise<InitPlan>;
|
|
8
|
+
//# sourceMappingURL=plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"AAUA,OAAO,EAGL,KAAK,QAAQ,EAGb,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAYD,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,QAAQ,CAAC,CAsKnB"}
|
package/dist/plan.js
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { relative } from "node:path";
|
|
3
|
+
import { CONFIG_FILE, MANAGERS, MODES, serializeConfig } from "./config.js";
|
|
4
|
+
import { cssImports, resolveCssFile, supportsReact19, supportsTailwind4, } from "./inspect.js";
|
|
5
|
+
import { CliError, } from "./model.js";
|
|
6
|
+
import { requiredImports, requiredPackages } from "./requirements.js";
|
|
7
|
+
function addImports(contents, missing) {
|
|
8
|
+
if (!missing.length)
|
|
9
|
+
return contents;
|
|
10
|
+
const newline = contents.includes("\r\n") ? "\r\n" : "\n";
|
|
11
|
+
const lines = missing.map((name) => `@import "${name}";`).join(newline) + newline;
|
|
12
|
+
const charset = contents.match(/^(@charset\s+["'][^"']+["'];\s*(?:\r?\n))/);
|
|
13
|
+
if (charset)
|
|
14
|
+
return charset[0] + lines + contents.slice(charset[0].length);
|
|
15
|
+
return lines + contents;
|
|
16
|
+
}
|
|
17
|
+
export async function planInit(project, options) {
|
|
18
|
+
if (project.configError)
|
|
19
|
+
throw new CliError(project.configError, "INVALID_CONFIG");
|
|
20
|
+
if (project.configUnknownFields.length) {
|
|
21
|
+
throw new CliError("Existing config has unknown fields. Review it manually before running init.", "CONFIG_CONFLICT");
|
|
22
|
+
}
|
|
23
|
+
if (project.packageManagerConflict) {
|
|
24
|
+
throw new CliError(`Conflicting package-manager evidence: ${project.packageManagerEvidence.join(", ")}. Resolve the project metadata or lockfiles first.`, "PACKAGE_MANAGER_CONFLICT");
|
|
25
|
+
}
|
|
26
|
+
const mode = options.mode ?? project.config?.mode;
|
|
27
|
+
if (!mode || !MODES.includes(mode)) {
|
|
28
|
+
throw new CliError("Choose --mode css|react|tailwind|react-tailwind.", "MODE_REQUIRED");
|
|
29
|
+
}
|
|
30
|
+
const manager = options.packageManager ??
|
|
31
|
+
project.packageManager ??
|
|
32
|
+
project.config?.packageManager;
|
|
33
|
+
if (!manager || !MANAGERS.includes(manager)) {
|
|
34
|
+
throw new CliError("Choose --package-manager pnpm|npm|yarn|bun; no reliable project evidence was found.", "PACKAGE_MANAGER_REQUIRED");
|
|
35
|
+
}
|
|
36
|
+
if (project.packageManager &&
|
|
37
|
+
options.packageManager &&
|
|
38
|
+
options.packageManager !== project.packageManager) {
|
|
39
|
+
throw new CliError(`Selected ${options.packageManager} conflicts with detected ${project.packageManager}.`, "PACKAGE_MANAGER_CONFLICT");
|
|
40
|
+
}
|
|
41
|
+
const cssFile = options.cssFile ?? project.config?.cssFile;
|
|
42
|
+
if (!cssFile)
|
|
43
|
+
throw new CliError("Pass --css-file with an existing project-relative CSS entry.", "CSS_FILE_REQUIRED");
|
|
44
|
+
const cssPath = await resolveCssFile(project.projectRoot, cssFile);
|
|
45
|
+
const relativeCss = relative(project.projectRoot, cssPath).replaceAll("\\", "/");
|
|
46
|
+
const requested = {
|
|
47
|
+
schemaVersion: 1,
|
|
48
|
+
packageManager: manager,
|
|
49
|
+
mode: mode,
|
|
50
|
+
cssFile: relativeCss,
|
|
51
|
+
};
|
|
52
|
+
if (project.config &&
|
|
53
|
+
JSON.stringify(project.config) !== JSON.stringify(requested)) {
|
|
54
|
+
throw new CliError("Requested setup conflicts with existing combric.config.json. Review the config manually; init will not overwrite it.", "CONFIG_CONFLICT");
|
|
55
|
+
}
|
|
56
|
+
const selectedMode = mode;
|
|
57
|
+
if (selectedMode.includes("tailwind") &&
|
|
58
|
+
(!project.tailwind || !supportsTailwind4(project.tailwind))) {
|
|
59
|
+
throw new CliError("Tailwind mode requires an existing Tailwind CSS >=4.3 <5 project. Install or upgrade Tailwind first.", "TAILWIND_UNSUPPORTED");
|
|
60
|
+
}
|
|
61
|
+
if (selectedMode.includes("react")) {
|
|
62
|
+
for (const name of ["react", "react-dom"]) {
|
|
63
|
+
if (project.dependencies[name] &&
|
|
64
|
+
!supportsReact19(project.dependencies[name])) {
|
|
65
|
+
throw new CliError(`${name} must satisfy React 19 before selecting React mode.`, "REACT_UNSUPPORTED");
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const originalCss = await readFile(cssPath, "utf8");
|
|
70
|
+
const imports = cssImports(originalCss);
|
|
71
|
+
const needed = requiredImports(selectedMode);
|
|
72
|
+
const conflicting = imports.filter((name) => name.startsWith("@combric/") && !needed.includes(name));
|
|
73
|
+
if (conflicting.length) {
|
|
74
|
+
throw new CliError(`Existing Combric CSS imports conflict with ${selectedMode} mode: ${conflicting.join(", ")}. Edit the CSS manually.`, "CSS_CONFLICT");
|
|
75
|
+
}
|
|
76
|
+
if (imports
|
|
77
|
+
.filter((name) => needed.includes(name))
|
|
78
|
+
.some((name, index, all) => all.indexOf(name) !== index)) {
|
|
79
|
+
throw new CliError("CSS contains duplicate Combric imports. Resolve them manually.", "CSS_CONFLICT");
|
|
80
|
+
}
|
|
81
|
+
const actions = [];
|
|
82
|
+
const packages = requiredPackages(selectedMode).filter((name) => !project.dependencies[name]);
|
|
83
|
+
if (selectedMode.includes("react")) {
|
|
84
|
+
for (const name of ["react", "react-dom"])
|
|
85
|
+
if (!project.dependencies[name])
|
|
86
|
+
packages.push(`${name}@19`);
|
|
87
|
+
}
|
|
88
|
+
if (project.workspaceRoot === project.projectRoot && packages.length) {
|
|
89
|
+
throw new CliError("This is a workspace root. Select a member package with --project, or install the packages manually at the intended workspace scope.", "WORKSPACE_SCOPE_REQUIRED");
|
|
90
|
+
}
|
|
91
|
+
if (packages.length)
|
|
92
|
+
actions.push({
|
|
93
|
+
type: "install",
|
|
94
|
+
target: "package.json and lockfile",
|
|
95
|
+
reason: `Install packages required for ${selectedMode} mode.`,
|
|
96
|
+
changesState: true,
|
|
97
|
+
packages,
|
|
98
|
+
});
|
|
99
|
+
const updatedCss = addImports(originalCss, needed.filter((name) => !imports.includes(name)));
|
|
100
|
+
if (updatedCss !== originalCss) {
|
|
101
|
+
actions.push({
|
|
102
|
+
type: "update-css",
|
|
103
|
+
target: relativeCss,
|
|
104
|
+
reason: "Add public Combric CSS imports.",
|
|
105
|
+
changesState: true,
|
|
106
|
+
content: updatedCss,
|
|
107
|
+
before: originalCss,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
if (!project.config) {
|
|
111
|
+
actions.push({
|
|
112
|
+
type: "create-config",
|
|
113
|
+
target: CONFIG_FILE,
|
|
114
|
+
reason: "Record the selected setup for repeatable checks.",
|
|
115
|
+
changesState: true,
|
|
116
|
+
content: serializeConfig(requested),
|
|
117
|
+
before: null,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
projectRoot: project.projectRoot,
|
|
122
|
+
packageManager: manager,
|
|
123
|
+
mode: selectedMode,
|
|
124
|
+
cssFile: relativeCss,
|
|
125
|
+
actions,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=plan.js.map
|
package/dist/plan.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requirements.d.ts","sourceRoot":"","sources":["../src/requirements.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,CAKrD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,CAKpD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function requiredPackages(mode) {
|
|
2
|
+
if (mode === "css")
|
|
3
|
+
return ["@combric/tokens"];
|
|
4
|
+
if (mode === "react")
|
|
5
|
+
return ["@combric/react"];
|
|
6
|
+
if (mode === "tailwind")
|
|
7
|
+
return ["@combric/tailwind"];
|
|
8
|
+
return ["@combric/react", "@combric/tailwind"];
|
|
9
|
+
}
|
|
10
|
+
export function requiredImports(mode) {
|
|
11
|
+
if (mode === "css")
|
|
12
|
+
return ["@combric/tokens/css"];
|
|
13
|
+
if (mode === "react")
|
|
14
|
+
return ["@combric/react/css"];
|
|
15
|
+
if (mode === "tailwind")
|
|
16
|
+
return ["tailwindcss", "@combric/tailwind"];
|
|
17
|
+
return ["tailwindcss", "@combric/tailwind", "@combric/react/css"];
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=requirements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requirements.js","sourceRoot":"","sources":["../src/requirements.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,IAAU;IACzC,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/C,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAChD,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACtD,OAAO,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAU;IACxC,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACnD,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACpD,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;IACrE,OAAO,CAAC,aAAa,EAAE,mBAAmB,EAAE,oBAAoB,CAAC,CAAC;AACpE,CAAC"}
|