New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details →
Socket
Book a DemoSign in
Socket

@spaceflow/cli

Package Overview
Dependencies
Maintainers
1
Versions
25
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@spaceflow/cli - npm Package Compare versions

Comparing version
0.31.0
to
0.32.0
+2
-7
dist/cli.js

@@ -51,9 +51,4 @@ #!/usr/bin/env node

}
// 检查全局目录
const globalDir = join(home, SPACEFLOW_DIR);
if (existsSync(globalDir)) {
return globalDir;
}
// 都没有,回退到 cwd(后续 ensureSpaceflowPackageJson 会创建)
return join(process.cwd(), SPACEFLOW_DIR);
// 没有找到任何工作区级 .spaceflow,回退到全局目录 ~/.spaceflow
return join(home, SPACEFLOW_DIR);
}

@@ -60,0 +55,0 @@ /**

@@ -1,1 +0,1 @@

{"version":3,"file":"cli.js","sources":["webpack://@spaceflow/cli/./src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from \"fs\";\nimport { join, dirname, resolve } from \"path\";\nimport { execSync } from \"child_process\";\nimport { homedir } from \"os\";\nimport {\n SPACEFLOW_DIR,\n ensureSpaceflowPackageJson,\n ensureDependencies,\n getDependencies,\n loadEnvFiles,\n getEnvFilePaths,\n} from \"@spaceflow/shared\";\n\n/**\n * Spaceflow CLI — 壳子入口\n *\n * 职责:\n * 1. 确保 .spaceflow/ 目录、package.json、.gitignore 完整\n * 2. 确保依赖已安装(pnpm install)\n * 3. 读取外部扩展列表\n * 4. 生成 .spaceflow/bin/index.js(静态 import 入口文件)\n * 5. spawn 子进程执行 node .spaceflow/bin/index.js\n */\n\n/**\n * 获取 .spaceflow 目录路径\n * 从 cwd 向上遍历查找已存在的 .spaceflow 目录,\n * 如果整个目录树中都没有,则回退到 cwd/.spaceflow\n */\nfunction getSpaceflowDir(): string {\n let current = resolve(process.cwd());\n const home = homedir();\n\n while (true) {\n const candidate = join(current, SPACEFLOW_DIR);\n if (existsSync(candidate)) {\n return candidate;\n }\n const parent = dirname(current);\n if (parent === current) break; // 文件系统根\n current = parent;\n }\n\n // 检查全局目录\n const globalDir = join(home, SPACEFLOW_DIR);\n if (existsSync(globalDir)) {\n return globalDir;\n }\n\n // 都没有,回退到 cwd(后续 ensureSpaceflowPackageJson 会创建)\n return join(process.cwd(), SPACEFLOW_DIR);\n}\n\n/**\n * 从 spaceflow.json / .spaceflowrc 读取外部扩展包名列表\n */\nfunction readExternalExtensions(): string[] {\n const deps = getDependencies(undefined, { local: true });\n return Object.keys(deps);\n}\n\n/**\n * 生成 .spaceflow/bin/index.js 内容\n *\n * 使用 dynamic import 加载扩展,确保 i18n 在扩展模块执行前已初始化\n * (扩展在 import 阶段就会调用 t() 获取 description,必须先初始化 i18n)\n */\nfunction generateIndexContent(extensions: string[]): string {\n const dynamicImports = extensions\n .map((name) => ` import('${name}').then(m => m.default || m.extension || m),`)\n .join(\"\\n\");\n\n return `import { exec, initCliI18n } from '@spaceflow/core';\n\nasync function bootstrap() {\n // 初始化 i18n,再加载扩展(扩展 import 时会调用 t() 获取翻译)\n initCliI18n();\n\n const extensions = await Promise.all([\n${dynamicImports}\n ]);\n\n await exec(extensions);\n}\n\nbootstrap().catch((err) => {\n console.error(err);\n process.exit(1);\n});\n`;\n}\n\n/**\n * 生成 .spaceflow/bin/index.js 文件\n */\nfunction generateBinFile(spaceflowDir: string, extensions: string[]): string {\n const binDir = join(spaceflowDir, \"bin\");\n const indexPath = join(binDir, \"index.js\");\n\n if (!existsSync(binDir)) {\n mkdirSync(binDir, { recursive: true });\n }\n\n const content = generateIndexContent(extensions);\n\n // 仅在内容变化时写入\n if (existsSync(indexPath)) {\n const existing = readFileSync(indexPath, \"utf-8\");\n if (existing === content) {\n return indexPath;\n }\n }\n\n writeFileSync(indexPath, content, \"utf-8\");\n return indexPath;\n}\n\n/**\n * 执行生成的 index.js\n */\nfunction executeIndexFile(indexPath: string): void {\n try {\n execSync(`node \"${indexPath}\" ${process.argv.slice(2).join(\" \")}`, {\n cwd: process.cwd(),\n stdio: \"inherit\",\n env: process.env,\n });\n } catch (error: any) {\n // execSync 在子进程非零退出时抛出错误\n // 子进程的 stdout/stderr 已通过 stdio: \"inherit\" 输出\n process.exit(error.status || 1);\n }\n}\n\n// ---- 主流程 ----\n\n// 0. 先加载 .env 文件,确保 process.env 在子进程(含 schema 模块求值)前已就绪\nloadEnvFiles(getEnvFilePaths());\n\n// 1. 确保 .spaceflow/ 目录结构完整(目录 + package.json + .gitignore)\nconst spaceflowDir = getSpaceflowDir();\nensureSpaceflowPackageJson(spaceflowDir);\n\n// 2. 确保依赖已安装\nensureDependencies(spaceflowDir);\n\n// 3. 读取外部扩展列表\nconst extNames = readExternalExtensions();\n\n// 4. 生成 .spaceflow/bin/index.js\nconst indexPath = generateBinFile(spaceflowDir, extNames);\n\n// 5. 执行生成的入口文件\nexecuteIndexFile(indexPath);\n"],"names":["existsSync","readFileSync","writeFileSync","mkdirSync","join","dirname","resolve","execSync","homedir","SPACEFLOW_DIR","ensureSpaceflowPackageJson","ensureDependencies","getDependencies","loadEnvFiles","getEnvFilePaths","getSpaceflowDir","current","process","home","candidate","parent","globalDir","readExternalExtensions","deps","undefined","Object","generateIndexContent","extensions","dynamicImports","name","generateBinFile","spaceflowDir","binDir","indexPath","content","existing","executeIndexFile","error","extNames"],"mappings":";;;;;;;;;;;;;;;;;;;;AACwE;AAC1B;AACL;AACZ;AAQF;AAE3B;;;;;;;;;CASC,GAED;;;;CAIC,GACD,SAASe;IACP,IAAIC,UAAUV,OAAOA,CAACW,QAAQ,GAAG;IACjC,MAAMC,OAAOV,OAAOA;IAEpB,MAAO,KAAM;QACX,MAAMW,YAAYf,IAAIA,CAACY,SAASP,aAAaA;QAC7C,IAAIT,UAAUA,CAACmB,YAAY;YACzB,OAAOA;QACT;QACA,MAAMC,SAASf,OAAOA,CAACW;QACvB,IAAII,WAAWJ,SAAS,OAAO,QAAQ;QACvCA,UAAUI;IACZ;IAEA,SAAS;IACT,MAAMC,YAAYjB,IAAIA,CAACc,MAAMT,aAAaA;IAC1C,IAAIT,UAAUA,CAACqB,YAAY;QACzB,OAAOA;IACT;IAEA,iDAAiD;IACjD,OAAOjB,IAAIA,CAACa,QAAQ,GAAG,IAAIR,aAAaA;AAC1C;AAEA;;CAEC,GACD,SAASa;IACP,MAAMC,OAAOX,eAAeA,CAACY,WAAW;QAAE,OAAO;IAAK;IACtD,OAAOC,OAAO,IAAI,CAACF;AACrB;AAEA;;;;;CAKC,GACD,SAASG,qBAAqBC,UAAoB;IAChD,MAAMC,iBAAiBD,WACpB,GAAG,CAAC,CAACE,OAAS,CAAC,YAAY,EAAEA,KAAK,4CAA4C,CAAC,EAC/E,IAAI,CAAC;IAER,OAAO,CAAC;;;;;;;AAOV,EAAED,eAAe;;;;;;;;;;AAUjB,CAAC;AACD;AAEA;;CAEC,GACD,SAASE,gBAAgBC,YAAoB,EAAEJ,UAAoB;IACjE,MAAMK,SAAS5B,IAAIA,CAAC2B,cAAc;IAClC,MAAME,YAAY7B,IAAIA,CAAC4B,QAAQ;IAE/B,IAAI,CAAChC,UAAUA,CAACgC,SAAS;QACvB7B,SAASA,CAAC6B,QAAQ;YAAE,WAAW;QAAK;IACtC;IAEA,MAAME,UAAUR,qBAAqBC;IAErC,YAAY;IACZ,IAAI3B,UAAUA,CAACiC,YAAY;QACzB,MAAME,WAAWlC,YAAYA,CAACgC,WAAW;QACzC,IAAIE,aAAaD,SAAS;YACxB,OAAOD;QACT;IACF;IAEA/B,aAAaA,CAAC+B,WAAWC,SAAS;IAClC,OAAOD;AACT;AAEA;;CAEC,GACD,SAASG,iBAAiBH,SAAiB;IACzC,IAAI;QACF1B,QAAQA,CAAC,CAAC,MAAM,EAAE0B,UAAU,EAAE,EAAEhB,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;YACjE,KAAKA,QAAQ,GAAG;YAChB,OAAO;YACP,KAAKA,QAAQ,GAAG;QAClB;IACF,EAAE,OAAOoB,OAAY;QACnB,yBAAyB;QACzB,6CAA6C;QAC7CpB,QAAQ,IAAI,CAACoB,MAAM,MAAM,IAAI;IAC/B;AACF;AAEA,gBAAgB;AAEhB,wDAAwD;AACxDxB,YAAYA,CAACC,eAAeA;AAE5B,2DAA2D;AAC3D,MAAMiB,gBAAYA,GAAGhB;AACrBL,0BAA0BA,CAACqB,gBAAYA;AAEvC,aAAa;AACbpB,kBAAkBA,CAACoB,gBAAYA;AAE/B,cAAc;AACd,MAAMO,WAAWhB;AAEjB,gCAAgC;AAChC,MAAMW,aAASA,GAAGH,gBAAgBC,gBAAYA,EAAEO;AAEhD,eAAe;AACfF,iBAAiBH,aAASA"}
{"version":3,"file":"cli.js","sources":["webpack://@spaceflow/cli/./src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from \"fs\";\nimport { join, dirname, resolve } from \"path\";\nimport { execSync } from \"child_process\";\nimport { homedir } from \"os\";\nimport {\n SPACEFLOW_DIR,\n ensureSpaceflowPackageJson,\n ensureDependencies,\n getDependencies,\n loadEnvFiles,\n getEnvFilePaths,\n} from \"@spaceflow/shared\";\n\n/**\n * Spaceflow CLI — 壳子入口\n *\n * 职责:\n * 1. 确保 .spaceflow/ 目录、package.json、.gitignore 完整\n * 2. 确保依赖已安装(pnpm install)\n * 3. 读取外部扩展列表\n * 4. 生成 .spaceflow/bin/index.js(静态 import 入口文件)\n * 5. spawn 子进程执行 node .spaceflow/bin/index.js\n */\n\n/**\n * 获取 .spaceflow 目录路径\n * 从 cwd 向上遍历查找已存在的 .spaceflow 目录,\n * 如果整个目录树中都没有,则回退到 cwd/.spaceflow\n */\nfunction getSpaceflowDir(): string {\n let current = resolve(process.cwd());\n const home = homedir();\n\n while (true) {\n const candidate = join(current, SPACEFLOW_DIR);\n if (existsSync(candidate)) {\n return candidate;\n }\n const parent = dirname(current);\n if (parent === current) break; // 文件系统根\n current = parent;\n }\n\n // 没有找到任何工作区级 .spaceflow,回退到全局目录 ~/.spaceflow\n return join(home, SPACEFLOW_DIR);\n}\n\n/**\n * 从 spaceflow.json / .spaceflowrc 读取外部扩展包名列表\n */\nfunction readExternalExtensions(): string[] {\n const deps = getDependencies(undefined, { local: true });\n return Object.keys(deps);\n}\n\n/**\n * 生成 .spaceflow/bin/index.js 内容\n *\n * 使用 dynamic import 加载扩展,确保 i18n 在扩展模块执行前已初始化\n * (扩展在 import 阶段就会调用 t() 获取 description,必须先初始化 i18n)\n */\nfunction generateIndexContent(extensions: string[]): string {\n const dynamicImports = extensions\n .map((name) => ` import('${name}').then(m => m.default || m.extension || m),`)\n .join(\"\\n\");\n\n return `import { exec, initCliI18n } from '@spaceflow/core';\n\nasync function bootstrap() {\n // 初始化 i18n,再加载扩展(扩展 import 时会调用 t() 获取翻译)\n initCliI18n();\n\n const extensions = await Promise.all([\n${dynamicImports}\n ]);\n\n await exec(extensions);\n}\n\nbootstrap().catch((err) => {\n console.error(err);\n process.exit(1);\n});\n`;\n}\n\n/**\n * 生成 .spaceflow/bin/index.js 文件\n */\nfunction generateBinFile(spaceflowDir: string, extensions: string[]): string {\n const binDir = join(spaceflowDir, \"bin\");\n const indexPath = join(binDir, \"index.js\");\n\n if (!existsSync(binDir)) {\n mkdirSync(binDir, { recursive: true });\n }\n\n const content = generateIndexContent(extensions);\n\n // 仅在内容变化时写入\n if (existsSync(indexPath)) {\n const existing = readFileSync(indexPath, \"utf-8\");\n if (existing === content) {\n return indexPath;\n }\n }\n\n writeFileSync(indexPath, content, \"utf-8\");\n return indexPath;\n}\n\n/**\n * 执行生成的 index.js\n */\nfunction executeIndexFile(indexPath: string): void {\n try {\n execSync(`node \"${indexPath}\" ${process.argv.slice(2).join(\" \")}`, {\n cwd: process.cwd(),\n stdio: \"inherit\",\n env: process.env,\n });\n } catch (error: any) {\n // execSync 在子进程非零退出时抛出错误\n // 子进程的 stdout/stderr 已通过 stdio: \"inherit\" 输出\n process.exit(error.status || 1);\n }\n}\n\n// ---- 主流程 ----\n\n// 0. 先加载 .env 文件,确保 process.env 在子进程(含 schema 模块求值)前已就绪\nloadEnvFiles(getEnvFilePaths());\n\n// 1. 确保 .spaceflow/ 目录结构完整(目录 + package.json + .gitignore)\nconst spaceflowDir = getSpaceflowDir();\nensureSpaceflowPackageJson(spaceflowDir);\n\n// 2. 确保依赖已安装\nensureDependencies(spaceflowDir);\n\n// 3. 读取外部扩展列表\nconst extNames = readExternalExtensions();\n\n// 4. 生成 .spaceflow/bin/index.js\nconst indexPath = generateBinFile(spaceflowDir, extNames);\n\n// 5. 执行生成的入口文件\nexecuteIndexFile(indexPath);\n"],"names":["existsSync","readFileSync","writeFileSync","mkdirSync","join","dirname","resolve","execSync","homedir","SPACEFLOW_DIR","ensureSpaceflowPackageJson","ensureDependencies","getDependencies","loadEnvFiles","getEnvFilePaths","getSpaceflowDir","current","process","home","candidate","parent","readExternalExtensions","deps","undefined","Object","generateIndexContent","extensions","dynamicImports","name","generateBinFile","spaceflowDir","binDir","indexPath","content","existing","executeIndexFile","error","extNames"],"mappings":";;;;;;;;;;;;;;;;;;;;AACwE;AAC1B;AACL;AACZ;AAQF;AAE3B;;;;;;;;;CASC,GAED;;;;CAIC,GACD,SAASe;IACP,IAAIC,UAAUV,OAAOA,CAACW,QAAQ,GAAG;IACjC,MAAMC,OAAOV,OAAOA;IAEpB,MAAO,KAAM;QACX,MAAMW,YAAYf,IAAIA,CAACY,SAASP,aAAaA;QAC7C,IAAIT,UAAUA,CAACmB,YAAY;YACzB,OAAOA;QACT;QACA,MAAMC,SAASf,OAAOA,CAACW;QACvB,IAAII,WAAWJ,SAAS,OAAO,QAAQ;QACvCA,UAAUI;IACZ;IAEA,6CAA6C;IAC7C,OAAOhB,IAAIA,CAACc,MAAMT,aAAaA;AACjC;AAEA;;CAEC,GACD,SAASY;IACP,MAAMC,OAAOV,eAAeA,CAACW,WAAW;QAAE,OAAO;IAAK;IACtD,OAAOC,OAAO,IAAI,CAACF;AACrB;AAEA;;;;;CAKC,GACD,SAASG,qBAAqBC,UAAoB;IAChD,MAAMC,iBAAiBD,WACpB,GAAG,CAAC,CAACE,OAAS,CAAC,YAAY,EAAEA,KAAK,4CAA4C,CAAC,EAC/E,IAAI,CAAC;IAER,OAAO,CAAC;;;;;;;AAOV,EAAED,eAAe;;;;;;;;;;AAUjB,CAAC;AACD;AAEA;;CAEC,GACD,SAASE,gBAAgBC,YAAoB,EAAEJ,UAAoB;IACjE,MAAMK,SAAS3B,IAAIA,CAAC0B,cAAc;IAClC,MAAME,YAAY5B,IAAIA,CAAC2B,QAAQ;IAE/B,IAAI,CAAC/B,UAAUA,CAAC+B,SAAS;QACvB5B,SAASA,CAAC4B,QAAQ;YAAE,WAAW;QAAK;IACtC;IAEA,MAAME,UAAUR,qBAAqBC;IAErC,YAAY;IACZ,IAAI1B,UAAUA,CAACgC,YAAY;QACzB,MAAME,WAAWjC,YAAYA,CAAC+B,WAAW;QACzC,IAAIE,aAAaD,SAAS;YACxB,OAAOD;QACT;IACF;IAEA9B,aAAaA,CAAC8B,WAAWC,SAAS;IAClC,OAAOD;AACT;AAEA;;CAEC,GACD,SAASG,iBAAiBH,SAAiB;IACzC,IAAI;QACFzB,QAAQA,CAAC,CAAC,MAAM,EAAEyB,UAAU,EAAE,EAAEf,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;YACjE,KAAKA,QAAQ,GAAG;YAChB,OAAO;YACP,KAAKA,QAAQ,GAAG;QAClB;IACF,EAAE,OAAOmB,OAAY;QACnB,yBAAyB;QACzB,6CAA6C;QAC7CnB,QAAQ,IAAI,CAACmB,MAAM,MAAM,IAAI;IAC/B;AACF;AAEA,gBAAgB;AAEhB,wDAAwD;AACxDvB,YAAYA,CAACC,eAAeA;AAE5B,2DAA2D;AAC3D,MAAMgB,gBAAYA,GAAGf;AACrBL,0BAA0BA,CAACoB,gBAAYA;AAEvC,aAAa;AACbnB,kBAAkBA,CAACmB,gBAAYA;AAE/B,cAAc;AACd,MAAMO,WAAWhB;AAEjB,gCAAgC;AAChC,MAAMW,aAASA,GAAGH,gBAAgBC,gBAAYA,EAAEO;AAEhD,eAAe;AACfF,iBAAiBH,aAASA"}
{
"name": "@spaceflow/cli",
"version": "0.31.0",
"version": "0.32.0",
"description": "Spaceflow CLI 工具",

@@ -5,0 +5,0 @@ "license": "MIT",