@longzai-intelligence-builder/cli 0.0.6 → 0.0.8

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.
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,oCAAoC,CAAC;AAgErF;;;;;GAKG;AACH,iBAAe,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgFzF;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,oCAAoC,CAAC;AAyGrF;;;;;GAKG;AACH,iBAAe,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2HzF;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
package/dist/build.js CHANGED
@@ -1,9 +1,9 @@
1
+ import { readTsBuildInfoFile, resolveExternal, resolveTsconfig, } from '@longzai-intelligence-builder/core';
2
+ import { dts } from '@longzai-intelligence-tsdown/rolldown-plugin-dts';
1
3
  import { rm } from 'node:fs/promises';
2
4
  import { dirname, resolve } from 'node:path';
3
5
  import process from 'node:process';
4
- import { resolveTsconfig, readTsBuildInfoFile } from '@longzai-intelligence-builder/core';
5
6
  import { build } from 'rolldown';
6
- import { dts } from '@longzai-intelligence-tsdown/rolldown-plugin-dts';
7
7
  /**
8
8
  * 规范化 format 为数组
9
9
  *
@@ -23,6 +23,9 @@ function normalizeFormat(format) {
23
23
  * @returns 文件扩展名对象
24
24
  */
25
25
  function resolveExtensions(format, outExtensions) {
26
+ /**
27
+ * 消费方自定义扩展名
28
+ */
26
29
  const custom = outExtensions?.();
27
30
  if (custom?.js) {
28
31
  return { js: custom.js, dts: custom.dts ?? '.d.ts' };
@@ -60,7 +63,13 @@ function resolveDtsOptions(config) {
60
63
  * @param cwd - 当前工作目录
61
64
  */
62
65
  async function runBuild(config, cwd = process.cwd()) {
66
+ /**
67
+ * 规范化后的输出格式数组
68
+ */
63
69
  const formats = normalizeFormat(config.format);
70
+ /**
71
+ * 输出目录,默认 dist
72
+ */
64
73
  const outdir = config.outdir ?? 'dist';
65
74
  /**
66
75
  * 构建前清理产物
@@ -73,14 +82,23 @@ async function runBuild(config, cwd = process.cwd()) {
73
82
  * 避免残留缓存导致 tsgo 跳过输出、dts 残缺
74
83
  */
75
84
  if (config.clean !== false) {
85
+ /**
86
+ * 输出目录绝对路径
87
+ */
76
88
  const outPath = resolve(cwd, outdir);
77
89
  await rm(outPath, { recursive: true, force: true }).catch(() => { });
78
90
  /**
79
91
  * 读 tsconfig 的 tsBuildInfoFile,相对 tsconfig 文件目录解析后清理
80
92
  */
81
93
  const tsconfigPath = resolveTsconfig(cwd);
94
+ /**
95
+ * tsconfig 声明的 tsBuildInfoFile 路径
96
+ */
82
97
  const tsBuildInfoFile = await readTsBuildInfoFile(tsconfigPath);
83
98
  if (tsBuildInfoFile) {
99
+ /**
100
+ * tsBuildInfoFile 的绝对路径
101
+ */
84
102
  const tsBuildInfoPath = resolve(dirname(tsconfigPath), tsBuildInfoFile);
85
103
  await rm(tsBuildInfoPath, { recursive: true, force: true }).catch(() => { });
86
104
  }
@@ -89,11 +107,32 @@ async function runBuild(config, cwd = process.cwd()) {
89
107
  * 解析入口配置
90
108
  */
91
109
  const entry = config.entry ?? { index: 'src/index.ts' };
110
+ /**
111
+ * 规范化后的入口对象
112
+ */
92
113
  const resolvedEntry = typeof entry === 'string' ? { index: entry } : entry;
114
+ /**
115
+ * 解析 external 配置
116
+ *
117
+ * 库模式(deps.skipNodeModulesBundle !== false,defineConfig 默认):
118
+ * 读 package.json 的 dependencies + peerDependencies 派生 external 基底,
119
+ * 合并 deps.neverBundle 与 config.external,再用 deps.alwaysBundle 过滤。
120
+ * 与 tsdown 默认行为一致,消费方零配置迁移。
121
+ *
122
+ * 应用模式(deps.skipNodeModulesBundle === false,defineBundleConfig):
123
+ * 跳过派生,直接返回 config.external(通常为 undefined,即全量打包)。
124
+ */
125
+ const external = await resolveExternal(config.external, config.deps, cwd);
93
126
  /**
94
127
  * 构建 dts 插件(仅在需要时)
128
+ *
129
+ * dts 插件返回的 Plugin[] 注入 inputOptions.plugins,与 external 同处一份
130
+ * inputOptions,rolldown 打包 .d.ts 时共享 external,避免第三方类型被 inline。
95
131
  */
96
132
  const dtsOptions = resolveDtsOptions(config);
133
+ /**
134
+ * dts 插件实例数组
135
+ */
97
136
  const dtsPlugins = dtsOptions
98
137
  ? dts({
99
138
  tsconfig: dtsOptions.tsconfig ?? config.tsconfig,
@@ -105,18 +144,21 @@ async function runBuild(config, cwd = process.cwd()) {
105
144
  */
106
145
  const inputOptions = {
107
146
  input: resolvedEntry,
108
- external: config.external,
147
+ external,
109
148
  plugins: [...dtsPlugins, ...(config.plugins ?? [])],
110
149
  ...config.inputOptions,
111
150
  };
112
- if (config.deps?.skipNodeModulesBundle !== false) {
113
- inputOptions.external = config.external;
114
- }
115
151
  /**
116
152
  * 为每种格式构建输出选项并执行
117
153
  */
118
154
  for (const format of formats) {
155
+ /**
156
+ * 当前格式对应的文件扩展名
157
+ */
119
158
  const ext = resolveExtensions(format, config.outExtensions);
159
+ /**
160
+ * 当前格式的输出选项
161
+ */
120
162
  const outputOptions = {
121
163
  format: format === 'es' ? 'esm' : format,
122
164
  dir: outdir,
package/dist/build.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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","sourcesContent":["import { rm } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport process from 'node:process';\n\nimport type { BuilderConfig, BuildFormat } from '@longzai-intelligence-builder/core';\nimport { resolveTsconfig, readTsBuildInfoFile } from '@longzai-intelligence-builder/core';\nimport { build, type InputOptions, type OutputOptions, type Plugin } from 'rolldown';\nimport { dts } from '@longzai-intelligence-tsdown/rolldown-plugin-dts';\n\n/**\n * 规范化 format 为数组\n *\n * @param format - 格式配置\n * @returns 格式数组\n */\nfunction normalizeFormat(format: BuilderConfig['format']): BuildFormat[] {\n if (!format) return ['es'];\n return Array.isArray(format) ? format : [format];\n}\n\n/**\n * 根据 format 和 outExtensions 计算输出文件扩展名\n *\n * @param format - 输出格式\n * @param outExtensions - 自定义扩展名函数\n * @returns 文件扩展名对象\n */\nfunction resolveExtensions(\n format: BuildFormat,\n outExtensions?: BuilderConfig['outExtensions'],\n): { js: string; dts: string } {\n const custom = outExtensions?.();\n if (custom?.js) {\n return { js: custom.js, dts: custom.dts ?? '.d.ts' };\n }\n\n if (format === 'cjs') {\n return { js: '.cjs', dts: '.d.cts' };\n }\n\n return { js: '.js', dts: '.d.ts' };\n}\n\n/**\n * 构建 dts 插件配置\n *\n * @param config - 构建配置\n * @returns dts 插件选项或 null\n */\nfunction resolveDtsOptions(config: BuilderConfig): { tsconfig?: string; sourcemap?: boolean } | null {\n if (config.dts === false || config.dts === undefined) {\n return null;\n }\n\n if (config.dts === true) {\n return {};\n }\n\n if (config.dts.enabled === false) {\n return null;\n }\n\n return {\n tsconfig: config.dts.tsconfig,\n sourcemap: config.dts.sourcemap,\n };\n}\n\n/**\n * 将 BuilderConfig 转换为 rolldown 的 RolldownOptions 并执行构建\n *\n * @param config - builder 构建配置\n * @param cwd - 当前工作目录\n */\nasync function runBuild(config: BuilderConfig, cwd: string = process.cwd()): Promise<void> {\n const formats = normalizeFormat(config.format);\n const outdir = config.outdir ?? 'dist';\n\n /**\n * 构建前清理产物\n *\n * 清理本次构建的全部产物:\n * - outdir:rolldown 打包产物\n * - tsBuildInfoFile:dts 经 tsgo 产生的增量缓存\n *\n * tsBuildInfoFile 路径相对 tsconfig 文件目录解析(非 cwd),\n * 避免残留缓存导致 tsgo 跳过输出、dts 残缺\n */\n if (config.clean !== false) {\n const outPath = resolve(cwd, outdir);\n await rm(outPath, { recursive: true, force: true }).catch(() => {});\n\n /**\n * 读 tsconfig 的 tsBuildInfoFile,相对 tsconfig 文件目录解析后清理\n */\n const tsconfigPath = resolveTsconfig(cwd);\n const tsBuildInfoFile = await readTsBuildInfoFile(tsconfigPath);\n if (tsBuildInfoFile) {\n const tsBuildInfoPath = resolve(dirname(tsconfigPath), tsBuildInfoFile);\n await rm(tsBuildInfoPath, { recursive: true, force: true }).catch(() => {});\n }\n }\n\n /**\n * 解析入口配置\n */\n const entry = config.entry ?? { index: 'src/index.ts' };\n const resolvedEntry = typeof entry === 'string' ? { index: entry } : entry;\n\n /**\n * 构建 dts 插件(仅在需要时)\n */\n const dtsOptions = resolveDtsOptions(config);\n const dtsPlugins: Plugin[] = dtsOptions\n ? dts({\n tsconfig: dtsOptions.tsconfig ?? config.tsconfig,\n sourcemap: dtsOptions.sourcemap,\n })\n : [];\n\n /**\n * 构建 rolldown 输入选项\n */\n const inputOptions: InputOptions = {\n input: resolvedEntry,\n external: config.external,\n plugins: [...dtsPlugins, ...(config.plugins ?? [])],\n ...config.inputOptions,\n };\n\n if (config.deps?.skipNodeModulesBundle !== false) {\n inputOptions.external = config.external;\n }\n\n /**\n * 为每种格式构建输出选项并执行\n */\n for (const format of formats) {\n const ext = resolveExtensions(format, config.outExtensions);\n\n const outputOptions: OutputOptions = {\n format: format === 'es' ? 'esm' : format,\n dir: outdir,\n entryFileNames: `[name]${ext.js}`,\n sourcemap: config.sourcemap,\n minify: config.minify,\n ...config.outputOptions,\n };\n\n await build({\n ...inputOptions,\n output: outputOptions,\n });\n }\n}\n\nexport { runBuild };\n"]}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BuilderConfig, BuildFormat } from '@longzai-intelligence-builder/core';\n\nimport {\n readTsBuildInfoFile,\n resolveExternal,\n resolveTsconfig,\n} from '@longzai-intelligence-builder/core';\nimport { dts } from '@longzai-intelligence-tsdown/rolldown-plugin-dts';\nimport { rm } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport process from 'node:process';\nimport { build, type InputOptions, type OutputOptions, type Plugin } from 'rolldown';\n\n/**\n * 规范化 format 为数组\n *\n * @param format - 格式配置\n * @returns 格式数组\n */\nfunction normalizeFormat(format: BuilderConfig['format']): BuildFormat[] {\n if (!format) return ['es'];\n return Array.isArray(format) ? format : [format];\n}\n\n/**\n * 输出文件扩展名\n */\ntype ResolvedExtensions = {\n /**\n * JS 产物扩展名\n */\n js: string;\n\n /**\n * dts 产物扩展名\n */\n dts: string;\n};\n\n/**\n * 根据 format 和 outExtensions 计算输出文件扩展名\n *\n * @param format - 输出格式\n * @param outExtensions - 自定义扩展名函数\n * @returns 文件扩展名对象\n */\nfunction resolveExtensions(\n format: BuildFormat,\n outExtensions?: BuilderConfig['outExtensions'],\n): ResolvedExtensions {\n /**\n * 消费方自定义扩展名\n */\n const custom = outExtensions?.();\n if (custom?.js) {\n return { js: custom.js, dts: custom.dts ?? '.d.ts' };\n }\n\n if (format === 'cjs') {\n return { js: '.cjs', dts: '.d.cts' };\n }\n\n return { js: '.js', dts: '.d.ts' };\n}\n\n/**\n * dts 插件解析后的选项\n */\ntype ResolvedDtsOptions = {\n /**\n * tsconfig 路径\n */\n tsconfig?: string;\n\n /**\n * 是否生成 sourcemap\n */\n sourcemap?: boolean;\n};\n\n/**\n * 构建 dts 插件配置\n *\n * @param config - 构建配置\n * @returns dts 插件选项或 null\n */\nfunction resolveDtsOptions(config: BuilderConfig): ResolvedDtsOptions | null {\n if (config.dts === false || config.dts === undefined) {\n return null;\n }\n\n if (config.dts === true) {\n return {};\n }\n\n if (config.dts.enabled === false) {\n return null;\n }\n\n return {\n tsconfig: config.dts.tsconfig,\n sourcemap: config.dts.sourcemap,\n };\n}\n\n/**\n * 将 BuilderConfig 转换为 rolldown 的 RolldownOptions 并执行构建\n *\n * @param config - builder 构建配置\n * @param cwd - 当前工作目录\n */\nasync function runBuild(config: BuilderConfig, cwd: string = process.cwd()): Promise<void> {\n /**\n * 规范化后的输出格式数组\n */\n const formats = normalizeFormat(config.format);\n\n /**\n * 输出目录,默认 dist\n */\n const outdir = config.outdir ?? 'dist';\n\n /**\n * 构建前清理产物\n *\n * 清理本次构建的全部产物:\n * - outdir:rolldown 打包产物\n * - tsBuildInfoFile:dts 经 tsgo 产生的增量缓存\n *\n * tsBuildInfoFile 路径相对 tsconfig 文件目录解析(非 cwd),\n * 避免残留缓存导致 tsgo 跳过输出、dts 残缺\n */\n if (config.clean !== false) {\n /**\n * 输出目录绝对路径\n */\n const outPath = resolve(cwd, outdir);\n await rm(outPath, { recursive: true, force: true }).catch(() => {});\n\n /**\n * 读 tsconfig 的 tsBuildInfoFile,相对 tsconfig 文件目录解析后清理\n */\n const tsconfigPath = resolveTsconfig(cwd);\n\n /**\n * tsconfig 声明的 tsBuildInfoFile 路径\n */\n const tsBuildInfoFile = await readTsBuildInfoFile(tsconfigPath);\n if (tsBuildInfoFile) {\n /**\n * tsBuildInfoFile 的绝对路径\n */\n const tsBuildInfoPath = resolve(dirname(tsconfigPath), tsBuildInfoFile);\n await rm(tsBuildInfoPath, { recursive: true, force: true }).catch(() => {});\n }\n }\n\n /**\n * 解析入口配置\n */\n const entry = config.entry ?? { index: 'src/index.ts' };\n\n /**\n * 规范化后的入口对象\n */\n const resolvedEntry = typeof entry === 'string' ? { index: entry } : entry;\n\n /**\n * 解析 external 配置\n *\n * 库模式(deps.skipNodeModulesBundle !== false,defineConfig 默认):\n * 读 package.json 的 dependencies + peerDependencies 派生 external 基底,\n * 合并 deps.neverBundle 与 config.external,再用 deps.alwaysBundle 过滤。\n * 与 tsdown 默认行为一致,消费方零配置迁移。\n *\n * 应用模式(deps.skipNodeModulesBundle === false,defineBundleConfig):\n * 跳过派生,直接返回 config.external(通常为 undefined,即全量打包)。\n */\n const external = await resolveExternal(config.external, config.deps, cwd);\n\n /**\n * 构建 dts 插件(仅在需要时)\n *\n * dts 插件返回的 Plugin[] 注入 inputOptions.plugins,与 external 同处一份\n * inputOptions,rolldown 打包 .d.ts 时共享 external,避免第三方类型被 inline。\n */\n const dtsOptions = resolveDtsOptions(config);\n\n /**\n * dts 插件实例数组\n */\n const dtsPlugins: Plugin[] = dtsOptions\n ? dts({\n tsconfig: dtsOptions.tsconfig ?? config.tsconfig,\n sourcemap: dtsOptions.sourcemap,\n })\n : [];\n\n /**\n * 构建 rolldown 输入选项\n */\n const inputOptions: InputOptions = {\n input: resolvedEntry,\n external,\n plugins: [...dtsPlugins, ...(config.plugins ?? [])],\n ...config.inputOptions,\n };\n\n /**\n * 为每种格式构建输出选项并执行\n */\n for (const format of formats) {\n /**\n * 当前格式对应的文件扩展名\n */\n const ext = resolveExtensions(format, config.outExtensions);\n\n /**\n * 当前格式的输出选项\n */\n const outputOptions: OutputOptions = {\n format: format === 'es' ? 'esm' : format,\n dir: outdir,\n entryFileNames: `[name]${ext.js}`,\n sourcemap: config.sourcemap,\n minify: config.minify,\n ...config.outputOptions,\n };\n\n await build({\n ...inputOptions,\n output: outputOptions,\n });\n }\n}\n\nexport { runBuild };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAaxE;;;;;;;;;GASG;AACH,iBAAe,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,aAAa,CAAC,CAQ7E;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAexE;;;;;;;;;GASG;AACH,iBAAe,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,aAAa,CAAC,CAW7E;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
package/dist/config.js CHANGED
@@ -1,5 +1,5 @@
1
- import process from 'node:process';
2
1
  import { loadUnifiedConfig } from '@longzai-intelligence-shared-config/core';
2
+ import process from 'node:process';
3
3
  /**
4
4
  * builder 单独配置文件候选文件名
5
5
  */
@@ -20,6 +20,9 @@ const STANDALONE_CONFIG_FILES = [
20
20
  * @returns 解析后的构建配置,未找到配置文件时返回默认空配置
21
21
  */
22
22
  async function loadConfig(cwd = process.cwd()) {
23
+ /**
24
+ * 统一配置加载结果
25
+ */
23
26
  const result = await loadUnifiedConfig({
24
27
  cwd,
25
28
  standaloneFile: [...STANDALONE_CONFIG_FILES],
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAGnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAE7E;;GAEG;AACH,MAAM,uBAAuB,GAAG;IAC9B,uBAAuB;IACvB,wBAAwB;IACxB,uBAAuB;IACvB,wBAAwB;CAChB,CAAC;AAEX;;;;;;;;;GASG;AACH,KAAK,UAAU,UAAU,CAAC,GAAG,GAAW,OAAO,CAAC,GAAG,EAAE;IACnD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAgB;QACpD,GAAG;QACH,cAAc,EAAE,CAAC,GAAG,uBAAuB,CAAC;QAC5C,YAAY,EAAE,SAAS;KACxB,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7C,CAAC;AAED,OAAO,EAAE,UAAU,EAAE,CAAC","sourcesContent":["import process from 'node:process';\n\nimport type { BuilderConfig } from '@longzai-intelligence-builder/core';\nimport { loadUnifiedConfig } from '@longzai-intelligence-shared-config/core';\n\n/**\n * builder 单独配置文件候选文件名\n */\nconst STANDALONE_CONFIG_FILES = [\n 'lzi-builder.config.ts',\n 'lzi-builder.config.mts',\n 'lzi-builder.config.js',\n 'lzi-builder.config.mjs',\n] as const;\n\n/**\n * 查找并加载 builder 配置\n *\n * 使用 shared-config 的 loadUnifiedConfig 统一加载:\n * 1. 优先查找工具专属配置 lzi-builder.config.{ts,mts,js,mjs}\n * 2. 回退到统一配置 lzi.config.ts 的 builder 字段\n *\n * @param cwd - 当前工作目录\n * @returns 解析后的构建配置,未找到配置文件时返回默认空配置\n */\nasync function loadConfig(cwd: string = process.cwd()): Promise<BuilderConfig> {\n const result = await loadUnifiedConfig<BuilderConfig>({\n cwd,\n standaloneFile: [...STANDALONE_CONFIG_FILES],\n unifiedField: 'builder',\n });\n\n return result.success ? result.config : {};\n}\n\nexport { loadConfig };\n"]}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC;;GAEG;AACH,MAAM,uBAAuB,GAAG;IAC9B,uBAAuB;IACvB,wBAAwB;IACxB,uBAAuB;IACvB,wBAAwB;CAChB,CAAC;AAEX;;;;;;;;;GASG;AACH,KAAK,UAAU,UAAU,CAAC,GAAG,GAAW,OAAO,CAAC,GAAG,EAAE;IACnD;;OAEG;IACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAgB;QACpD,GAAG;QACH,cAAc,EAAE,CAAC,GAAG,uBAAuB,CAAC;QAC5C,YAAY,EAAE,SAAS;KACxB,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7C,CAAC;AAED,OAAO,EAAE,UAAU,EAAE,CAAC","sourcesContent":["import type { BuilderConfig } from '@longzai-intelligence-builder/core';\n\nimport { loadUnifiedConfig } from '@longzai-intelligence-shared-config/core';\nimport process from 'node:process';\n\n/**\n * builder 单独配置文件候选文件名\n */\nconst STANDALONE_CONFIG_FILES = [\n 'lzi-builder.config.ts',\n 'lzi-builder.config.mts',\n 'lzi-builder.config.js',\n 'lzi-builder.config.mjs',\n] as const;\n\n/**\n * 查找并加载 builder 配置\n *\n * 使用 shared-config 的 loadUnifiedConfig 统一加载:\n * 1. 优先查找工具专属配置 lzi-builder.config.{ts,mts,js,mjs}\n * 2. 回退到统一配置 lzi.config.ts 的 builder 字段\n *\n * @param cwd - 当前工作目录\n * @returns 解析后的构建配置,未找到配置文件时返回默认空配置\n */\nasync function loadConfig(cwd: string = process.cwd()): Promise<BuilderConfig> {\n /**\n * 统一配置加载结果\n */\n const result = await loadUnifiedConfig<BuilderConfig>({\n cwd,\n standaloneFile: [...STANDALONE_CONFIG_FILES],\n unifiedField: 'builder',\n });\n\n return result.success ? result.config : {};\n}\n\nexport { loadConfig };\n"]}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env bun
2
2
  import process from 'node:process';
3
- import { loadConfig } from './config.js';
4
3
  import { runBuild } from './build.js';
4
+ import { loadConfig } from './config.js';
5
5
  /**
6
6
  * lzi-builder CLI 入口
7
7
  *
@@ -9,15 +9,18 @@ import { runBuild } from './build.js';
9
9
  * 转换为 rolldown options → 注入 plugin-dts → 执行 rolldown.build()
10
10
  */
11
11
  async function main() {
12
+ /**
13
+ * 加载 builder 配置
14
+ */
12
15
  const config = await loadConfig();
13
16
  if (!config.entry) {
14
- console.error('错误: 未找到入口配置,请在 builder.config.ts 中声明 entry');
17
+ process.stderr.write('错误: 未找到入口配置,请在 builder.config.ts 中声明 entry\n');
15
18
  process.exit(1);
16
19
  }
17
20
  await runBuild(config);
18
21
  }
19
22
  main().catch((error) => {
20
- console.error('构建失败:', error);
23
+ process.stderr.write(`构建失败: ${error}\n`);
21
24
  process.exit(1);
22
25
  });
23
26
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC;;;;;GAKG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC","sourcesContent":["#!/usr/bin/env bun\nimport process from 'node:process';\n\nimport { loadConfig } from './config.js';\nimport { runBuild } from './build.js';\n\n/**\n * lzi-builder CLI 入口\n *\n * 流程:bun 原生加载 builder.config.ts → 获取 BuilderConfig →\n * 转换为 rolldown options → 注入 plugin-dts → 执行 rolldown.build()\n */\nasync function main(): Promise<void> {\n const config = await loadConfig();\n\n if (!config.entry) {\n console.error('错误: 未找到入口配置,请在 builder.config.ts 中声明 entry');\n process.exit(1);\n }\n\n await runBuild(config);\n}\n\nmain().catch((error) => {\n console.error('构建失败:', error);\n process.exit(1);\n});\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;GAKG;AACH,KAAK,UAAU,IAAI;IACjB;;OAEG;IACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC;IACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC","sourcesContent":["#!/usr/bin/env bun\nimport process from 'node:process';\n\nimport { runBuild } from './build.js';\nimport { loadConfig } from './config.js';\n\n/**\n * lzi-builder CLI 入口\n *\n * 流程:bun 原生加载 builder.config.ts → 获取 BuilderConfig →\n * 转换为 rolldown options → 注入 plugin-dts → 执行 rolldown.build()\n */\nasync function main(): Promise<void> {\n /**\n * 加载 builder 配置\n */\n const config = await loadConfig();\n\n if (!config.entry) {\n process.stderr.write('错误: 未找到入口配置,请在 builder.config.ts 中声明 entry\\n');\n process.exit(1);\n }\n\n await runBuild(config);\n}\n\nmain().catch((error) => {\n process.stderr.write(`构建失败: ${error}\\n`);\n process.exit(1);\n});\n"]}
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@longzai-intelligence-builder/cli",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
4
4
  "private": false,
5
5
  "license": "UNLICENSED",
6
- "type": "module",
7
6
  "bin": {
8
7
  "lzi-builder": "./dist/index.js"
9
8
  },
10
9
  "files": [
11
10
  "dist"
12
11
  ],
12
+ "type": "module",
13
13
  "scripts": {
14
14
  "build": "tsgo --build tsconfig/build.json && resolve-aliases -p tsconfig/build.json",
15
15
  "build:prod": "NODE_ENV=production bun run build",
@@ -25,7 +25,7 @@
25
25
  "clean": "lzi-dev-cli clean"
26
26
  },
27
27
  "dependencies": {
28
- "@longzai-intelligence-builder/core": "0.0.5",
28
+ "@longzai-intelligence-builder/core": "0.0.8",
29
29
  "@longzai-intelligence-shared-config/core": "^0.0.5",
30
30
  "@longzai-intelligence-tsdown/rolldown-plugin-dts": "^0.1.1",
31
31
  "rolldown": "^1.1.5"