@cmssy/cli 0.14.0 → 0.17.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/dist/cli.js +46 -18
- package/dist/cli.js.map +1 -1
- package/dist/commands/lib.d.ts +17 -0
- package/dist/commands/lib.d.ts.map +1 -0
- package/dist/commands/lib.js +132 -0
- package/dist/commands/lib.js.map +1 -0
- package/dist/commands/publish-block-buildtime.d.ts +8 -0
- package/dist/commands/publish-block-buildtime.d.ts.map +1 -0
- package/dist/commands/publish-block-buildtime.js +235 -0
- package/dist/commands/publish-block-buildtime.js.map +1 -0
- package/dist/commands/publish.d.ts +0 -1
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +2 -146
- package/dist/commands/publish.js.map +1 -1
- package/dist/types/publish-job.d.ts +61 -0
- package/dist/types/publish-job.d.ts.map +1 -0
- package/dist/types/publish-job.js +13 -0
- package/dist/types/publish-job.js.map +1 -0
- package/dist/utils/graphql.d.ts +4 -1
- package/dist/utils/graphql.d.ts.map +1 -1
- package/dist/utils/graphql.js +78 -13
- package/dist/utils/graphql.js.map +1 -1
- package/dist/utils/lib-manifest.d.ts +7 -0
- package/dist/utils/lib-manifest.d.ts.map +1 -0
- package/dist/utils/lib-manifest.js +59 -0
- package/dist/utils/lib-manifest.js.map +1 -0
- package/dist/utils/resolve-workspace.d.ts +6 -0
- package/dist/utils/resolve-workspace.d.ts.map +1 -0
- package/dist/utils/resolve-workspace.js +32 -0
- package/dist/utils/resolve-workspace.js.map +1 -0
- package/dist/utils/source-collector.d.ts +19 -0
- package/dist/utils/source-collector.d.ts.map +1 -0
- package/dist/utils/source-collector.js +135 -0
- package/dist/utils/source-collector.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import fs from "fs-extra";
|
|
2
|
+
import path from "path";
|
|
3
|
+
const NPM_PACKAGE_NAME_REGEX = /^(@[a-z0-9][a-z0-9_.-]*\/)?[a-z0-9][a-z0-9_.-]*$/;
|
|
4
|
+
const VALID_VERSION_SPEC = /^[a-zA-Z0-9.\-+_^~<>=*| ]+$/;
|
|
5
|
+
export const RESERVED_PEERS = new Set(["react", "react-dom", "esbuild"]);
|
|
6
|
+
async function readPackageJsonDeps(cwd = process.cwd()) {
|
|
7
|
+
const pkgPath = path.join(cwd, "package.json");
|
|
8
|
+
if (!(await fs.pathExists(pkgPath))) {
|
|
9
|
+
throw new Error(`package.json not found at ${pkgPath}`);
|
|
10
|
+
}
|
|
11
|
+
const pkg = (await fs.readJson(pkgPath));
|
|
12
|
+
return pkg.dependencies ?? {};
|
|
13
|
+
}
|
|
14
|
+
export function buildLibManifest(deps) {
|
|
15
|
+
const out = {};
|
|
16
|
+
const errors = [];
|
|
17
|
+
for (const [name, spec] of Object.entries(deps)) {
|
|
18
|
+
if (RESERVED_PEERS.has(name))
|
|
19
|
+
continue;
|
|
20
|
+
if (!NPM_PACKAGE_NAME_REGEX.test(name)) {
|
|
21
|
+
errors.push(`invalid npm package name: "${name}"`);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (typeof spec !== "string" || spec.trim().length === 0) {
|
|
25
|
+
errors.push(`empty version spec for "${name}"`);
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
const normalizedSpec = spec.trim();
|
|
29
|
+
if (normalizedSpec.length > 100) {
|
|
30
|
+
errors.push(`version spec too long for "${name}" (max 100 chars)`);
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const lowerSpec = normalizedSpec.toLowerCase();
|
|
34
|
+
if (lowerSpec.startsWith("npm:") ||
|
|
35
|
+
lowerSpec.startsWith("git") ||
|
|
36
|
+
lowerSpec.startsWith("file:") ||
|
|
37
|
+
lowerSpec.startsWith("workspace:") ||
|
|
38
|
+
lowerSpec.startsWith("link:") ||
|
|
39
|
+
lowerSpec.startsWith("http:") ||
|
|
40
|
+
lowerSpec.startsWith("https:")) {
|
|
41
|
+
errors.push(`unsupported version source for "${name}": "${spec}" (aliases, git, file:, workspace:, link:, http(s) all rejected)`);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (!VALID_VERSION_SPEC.test(normalizedSpec)) {
|
|
45
|
+
errors.push(`version spec for "${name}" contains illegal characters: "${spec}"`);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
out[name] = normalizedSpec;
|
|
49
|
+
}
|
|
50
|
+
if (errors.length > 0) {
|
|
51
|
+
throw new Error(`lib manifest validation failed:\n - ${errors.join("\n - ")}`);
|
|
52
|
+
}
|
|
53
|
+
return { dependencies: out };
|
|
54
|
+
}
|
|
55
|
+
export async function loadLibManifestFromProject(cwd = process.cwd()) {
|
|
56
|
+
const deps = await readPackageJsonDeps(cwd);
|
|
57
|
+
return buildLibManifest(deps);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=lib-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lib-manifest.js","sourceRoot":"","sources":["../../src/utils/lib-manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export interface WorkspaceResolveSource {
|
|
2
|
+
workspaceId?: string | null;
|
|
3
|
+
}
|
|
4
|
+
export declare function resolveWorkspaceId(optsValue: string | boolean | undefined, config: WorkspaceResolveSource): Promise<string>;
|
|
5
|
+
export declare function warnIfWorkspaceIdLooksWrong(workspaceId: string): void;
|
|
6
|
+
//# sourceMappingURL=resolve-workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-workspace.d.ts","sourceRoot":"","sources":["../../src/utils/resolve-workspace.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,EACvC,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAsBjB;AAED,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAQrE"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import inquirer from "inquirer";
|
|
3
|
+
const OBJECT_ID_REGEX = /^[a-f0-9]{24}$/;
|
|
4
|
+
export async function resolveWorkspaceId(optsValue, config) {
|
|
5
|
+
if (typeof optsValue === "string") {
|
|
6
|
+
const trimmed = optsValue.trim();
|
|
7
|
+
if (trimmed.length > 0)
|
|
8
|
+
return trimmed;
|
|
9
|
+
}
|
|
10
|
+
const fromEnv = config.workspaceId?.trim();
|
|
11
|
+
if (fromEnv) {
|
|
12
|
+
console.log(chalk.gray(`Using workspace ID from .env: ${fromEnv}`));
|
|
13
|
+
return fromEnv;
|
|
14
|
+
}
|
|
15
|
+
const answer = await inquirer.prompt([
|
|
16
|
+
{
|
|
17
|
+
type: "input",
|
|
18
|
+
name: "workspaceId",
|
|
19
|
+
message: "Enter Workspace ID:",
|
|
20
|
+
validate: (v) => v.trim().length > 0
|
|
21
|
+
? true
|
|
22
|
+
: "Workspace ID is required (or set CMSSY_WORKSPACE_ID)",
|
|
23
|
+
},
|
|
24
|
+
]);
|
|
25
|
+
return answer.workspaceId.trim();
|
|
26
|
+
}
|
|
27
|
+
export function warnIfWorkspaceIdLooksWrong(workspaceId) {
|
|
28
|
+
if (!OBJECT_ID_REGEX.test(workspaceId)) {
|
|
29
|
+
console.log(chalk.yellow(`⚠ workspace id "${workspaceId}" does not look like a 24-char hex ObjectId; backend will reject it.`));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=resolve-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-workspace.js","sourceRoot":"","sources":["../../src/utils/resolve-workspace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAMzC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAAuC,EACvC,MAA8B;IAE9B,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC;IACzC,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;IAC3C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAC,CAAC;QACpE,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAA0B;QAC5D;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,qBAAqB;YAC9B,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CACd,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gBACjB,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,sDAAsD;SAC7D;KACF,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,WAAmB;IAC7D,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,mBAAmB,WAAW,sEAAsE,CACrG,CACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface CollectedFile {
|
|
2
|
+
relPath: string;
|
|
3
|
+
contentBase64: string;
|
|
4
|
+
}
|
|
5
|
+
export interface CollectResult {
|
|
6
|
+
files: CollectedFile[];
|
|
7
|
+
entryPath: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const MAX_FILES = 200;
|
|
10
|
+
export declare const MAX_TOTAL_BYTES: number;
|
|
11
|
+
export interface CollectOptions {
|
|
12
|
+
blockDir: string;
|
|
13
|
+
entryRel?: string;
|
|
14
|
+
includeExt?: Set<string>;
|
|
15
|
+
ignoreDirs?: Set<string>;
|
|
16
|
+
}
|
|
17
|
+
export declare function collectBlockSources(options: CollectOptions): Promise<CollectResult>;
|
|
18
|
+
export declare function normalizeEntryPath(input: string): string;
|
|
19
|
+
//# sourceMappingURL=source-collector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-collector.d.ts","sourceRoot":"","sources":["../../src/utils/source-collector.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAwCD,eAAO,MAAM,SAAS,MAAM,CAAC;AAC7B,eAAO,MAAM,eAAe,QAAmB,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC1B;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAsFxB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAsBxD"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import fs from "fs-extra";
|
|
2
|
+
import path from "path";
|
|
3
|
+
const SEGMENT_REGEX = /^[a-zA-Z0-9_.-][a-zA-Z0-9._-]*$/;
|
|
4
|
+
const DEFAULT_INCLUDE_EXT = new Set([
|
|
5
|
+
".ts",
|
|
6
|
+
".tsx",
|
|
7
|
+
".js",
|
|
8
|
+
".jsx",
|
|
9
|
+
".mjs",
|
|
10
|
+
".cjs",
|
|
11
|
+
".css",
|
|
12
|
+
".json",
|
|
13
|
+
".md",
|
|
14
|
+
".svg",
|
|
15
|
+
]);
|
|
16
|
+
const DEFAULT_IGNORE_DIRS = new Set([
|
|
17
|
+
"node_modules",
|
|
18
|
+
"dist",
|
|
19
|
+
"build",
|
|
20
|
+
".next",
|
|
21
|
+
".turbo",
|
|
22
|
+
"coverage",
|
|
23
|
+
".git",
|
|
24
|
+
".cache",
|
|
25
|
+
".vercel",
|
|
26
|
+
"__snapshots__",
|
|
27
|
+
"__tests__",
|
|
28
|
+
]);
|
|
29
|
+
const DEFAULT_IGNORE_FILES = new Set([
|
|
30
|
+
".DS_Store",
|
|
31
|
+
"Thumbs.db",
|
|
32
|
+
"tsconfig.tsbuildinfo",
|
|
33
|
+
]);
|
|
34
|
+
const TEST_FILE_REGEX = /\.(test|spec|stories|story)\.(ts|tsx|js|jsx|mjs|cjs)$/i;
|
|
35
|
+
export const MAX_FILES = 200;
|
|
36
|
+
export const MAX_TOTAL_BYTES = 10 * 1024 * 1024;
|
|
37
|
+
export async function collectBlockSources(options) {
|
|
38
|
+
const { blockDir } = options;
|
|
39
|
+
const includeExt = options.includeExt ?? DEFAULT_INCLUDE_EXT;
|
|
40
|
+
const ignoreDirs = options.ignoreDirs ?? DEFAULT_IGNORE_DIRS;
|
|
41
|
+
const entryRel = normalizeEntryPath(options.entryRel ?? "src/index.tsx");
|
|
42
|
+
if (!(await fs.pathExists(blockDir))) {
|
|
43
|
+
throw new Error(`block directory not found: ${blockDir}`);
|
|
44
|
+
}
|
|
45
|
+
const stat = await fs.stat(blockDir);
|
|
46
|
+
if (!stat.isDirectory()) {
|
|
47
|
+
throw new Error(`block path is not a directory: ${blockDir}`);
|
|
48
|
+
}
|
|
49
|
+
const files = [];
|
|
50
|
+
const seenLowercased = new Set();
|
|
51
|
+
let totalBytes = 0;
|
|
52
|
+
async function walk(dir, relParent) {
|
|
53
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
54
|
+
for (const entry of entries) {
|
|
55
|
+
const name = entry.name;
|
|
56
|
+
if (entry.isSymbolicLink())
|
|
57
|
+
continue;
|
|
58
|
+
if (entry.isDirectory()) {
|
|
59
|
+
if (ignoreDirs.has(name))
|
|
60
|
+
continue;
|
|
61
|
+
if (name.startsWith("."))
|
|
62
|
+
continue;
|
|
63
|
+
if (!SEGMENT_REGEX.test(name))
|
|
64
|
+
continue;
|
|
65
|
+
const nextRel = relParent ? `${relParent}/${name}` : name;
|
|
66
|
+
await walk(path.join(dir, name), nextRel);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (!entry.isFile())
|
|
70
|
+
continue;
|
|
71
|
+
if (DEFAULT_IGNORE_FILES.has(name))
|
|
72
|
+
continue;
|
|
73
|
+
if (name.startsWith("."))
|
|
74
|
+
continue;
|
|
75
|
+
if (TEST_FILE_REGEX.test(name))
|
|
76
|
+
continue;
|
|
77
|
+
if (!SEGMENT_REGEX.test(name))
|
|
78
|
+
continue;
|
|
79
|
+
const ext = path.extname(name).toLowerCase();
|
|
80
|
+
const baseName = path.basename(name);
|
|
81
|
+
const isPkg = baseName === "package.json";
|
|
82
|
+
const isCfg = baseName === "config.ts" || baseName === "config.js";
|
|
83
|
+
const isPreview = baseName === "preview.json";
|
|
84
|
+
if (!isPkg && !isCfg && !isPreview && !includeExt.has(ext)) {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const absPath = path.join(dir, name);
|
|
88
|
+
const fileStat = await fs.stat(absPath);
|
|
89
|
+
if (totalBytes + fileStat.size > MAX_TOTAL_BYTES) {
|
|
90
|
+
throw new Error(`block sources exceed ${MAX_TOTAL_BYTES} bytes (would-be ${totalBytes + fileStat.size} after "${relParent ? `${relParent}/${name}` : name}") - prune large assets or split the block`);
|
|
91
|
+
}
|
|
92
|
+
const buf = await fs.readFile(absPath);
|
|
93
|
+
totalBytes += buf.byteLength;
|
|
94
|
+
const relPath = relParent ? `${relParent}/${name}` : name;
|
|
95
|
+
const lower = relPath.toLowerCase();
|
|
96
|
+
if (seenLowercased.has(lower)) {
|
|
97
|
+
throw new Error(`duplicate path "${relPath}" (paths must be unique case-insensitively)`);
|
|
98
|
+
}
|
|
99
|
+
seenLowercased.add(lower);
|
|
100
|
+
files.push({ relPath, contentBase64: buf.toString("base64") });
|
|
101
|
+
if (files.length > MAX_FILES) {
|
|
102
|
+
throw new Error(`block has more than ${MAX_FILES} source files - prune the tree before publishing`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
await walk(blockDir, "");
|
|
107
|
+
if (files.length === 0) {
|
|
108
|
+
throw new Error(`block at ${blockDir} contains no recognized source files`);
|
|
109
|
+
}
|
|
110
|
+
const entryLower = entryRel.toLowerCase();
|
|
111
|
+
const entryMatch = files.find((f) => f.relPath.toLowerCase() === entryLower);
|
|
112
|
+
if (!entryMatch) {
|
|
113
|
+
throw new Error(`entry path "${entryRel}" not found in block source tree (${blockDir})`);
|
|
114
|
+
}
|
|
115
|
+
files.sort((a, b) => a.relPath.localeCompare(b.relPath));
|
|
116
|
+
return { files, entryPath: entryMatch.relPath };
|
|
117
|
+
}
|
|
118
|
+
export function normalizeEntryPath(input) {
|
|
119
|
+
const trimmed = input.trim();
|
|
120
|
+
if (path.isAbsolute(trimmed) || path.win32.isAbsolute(trimmed)) {
|
|
121
|
+
throw new Error(`entry path must be relative to the block directory, got "${input}"`);
|
|
122
|
+
}
|
|
123
|
+
let p = trimmed.replace(/\\/g, "/");
|
|
124
|
+
while (p.startsWith("./")) {
|
|
125
|
+
p = p.slice(2);
|
|
126
|
+
}
|
|
127
|
+
if (p.startsWith("/")) {
|
|
128
|
+
throw new Error(`entry path must be relative to the block directory, got "${input}"`);
|
|
129
|
+
}
|
|
130
|
+
if (p.length === 0) {
|
|
131
|
+
throw new Error(`entry path is empty after normalization (input: "${input}")`);
|
|
132
|
+
}
|
|
133
|
+
return p;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=source-collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-collector.js","sourceRoot":"","sources":["../../src/utils/source-collector.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cmssy/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.0",
|
|
4
4
|
"description": "Unified CLI for building and publishing blocks to Cmssy design library",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"access": "public"
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"@cmssy/types": "^0.
|
|
55
|
+
"@cmssy/types": "^0.12.0",
|
|
56
56
|
"@tailwindcss/postcss": "^4.1.18",
|
|
57
57
|
"archiver": "^7.0.1",
|
|
58
58
|
"chalk": "^5.3.0",
|