@longzai-intelligence-builder/core 0.0.6 → 0.0.7

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.
@@ -9,8 +9,8 @@ type GetBaseConfigFn = () => Partial<BuilderConfig>;
9
9
  * 接收一个获取基础配置的函数,返回 defineConfig 和 defineBundleConfig。
10
10
  * esm 和 dual 各自提供不同的 getBaseConfig 即可复用此逻辑。
11
11
  *
12
- * - defineConfig: 库包,生成 dts,外部化依赖
13
- * - defineBundleConfig: CLI/应用,不生成 dts,自动 bundle 所有依赖
12
+ * - defineConfig: 库包,生成 dts,外部化 dependencies + peerDependencies(skipNodeModulesBundle: true)
13
+ * - defineBundleConfig: CLI/应用,不生成 dts,打包全部依赖(skipNodeModulesBundle: false)
14
14
  *
15
15
  * @param getBaseConfig - 获取基础配置的函数
16
16
  * @returns 包含 defineConfig 和 defineBundleConfig 的对象
@@ -1 +1 @@
1
- {"version":3,"file":"create-config.factory.d.ts","sourceRoot":"","sources":["../../src/factories/create-config.factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAe,MAAM,cAAc,CAAC;AAI9E;;GAEG;AACH,KAAK,eAAe,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;AAEpD;;;;;;;;;;;GAWG;AACH,iBAAS,mBAAmB,CAAC,aAAa,EAAE,eAAe;6BAyC1B,aAAa,KAAQ,aAAa;mCAyB5B,aAAa,KAAQ,aAAa;EAiBxE;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
1
+ {"version":3,"file":"create-config.factory.d.ts","sourceRoot":"","sources":["../../src/factories/create-config.factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAe,MAAM,cAAc,CAAC;AAI9E;;GAEG;AACH,KAAK,eAAe,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;AAEpD;;;;;;;;;;;GAWG;AACH,iBAAS,mBAAmB,CAAC,aAAa,EAAE,eAAe;6BA4C1B,aAAa,KAAQ,aAAa;mCA0B5B,aAAa,KAAQ,aAAa;EAiBxE;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -5,8 +5,8 @@ import { mergeArrayConfig, mergeExternalConfig, resolveTsconfig } from '../utils
5
5
  * 接收一个获取基础配置的函数,返回 defineConfig 和 defineBundleConfig。
6
6
  * esm 和 dual 各自提供不同的 getBaseConfig 即可复用此逻辑。
7
7
  *
8
- * - defineConfig: 库包,生成 dts,外部化依赖
9
- * - defineBundleConfig: CLI/应用,不生成 dts,自动 bundle 所有依赖
8
+ * - defineConfig: 库包,生成 dts,外部化 dependencies + peerDependencies(skipNodeModulesBundle: true)
9
+ * - defineBundleConfig: CLI/应用,不生成 dts,打包全部依赖(skipNodeModulesBundle: false)
10
10
  *
11
11
  * @param getBaseConfig - 获取基础配置的函数
12
12
  * @returns 包含 defineConfig 和 defineBundleConfig 的对象
@@ -41,8 +41,11 @@ function createConfigFactory(getBaseConfig) {
41
41
  /**
42
42
  * 定义库包构建配置
43
43
  *
44
- * 默认行为:生成 dts,外部化 dependencies
45
- * 支持通过 deps.alwaysBundle / deps.neverBundle 覆盖
44
+ * 默认行为:生成 dts,外部化 dependencies + peerDependencies(含 workspace 与第三方依赖)
45
+ *
46
+ * external 派生由 runBuild 调用 resolveExternal 完成,默认读取当前包 package.json 的
47
+ * dependencies + peerDependencies 作为外部化基底,与 tsdown 默认行为一致。
48
+ * 支持通过 deps.alwaysBundle(强制打包)/ deps.neverBundle(补充外部化)覆盖。
46
49
  *
47
50
  * @param options - 配置选项
48
51
  * @returns 完整的构建配置
@@ -56,6 +59,7 @@ function createConfigFactory(getBaseConfig) {
56
59
  ...config,
57
60
  deps: {
58
61
  ...config.deps,
62
+ skipNodeModulesBundle: true,
59
63
  neverBundle: mergeExternalConfig(config.deps?.neverBundle, options.deps?.neverBundle),
60
64
  alwaysBundle: mergeArrayConfig(config.deps?.alwaysBundle, options.deps?.alwaysBundle),
61
65
  },
@@ -1 +1 @@
1
- {"version":3,"file":"create-config.factory.js","sourceRoot":"","sources":["../../src/factories/create-config.factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAO3F;;;;;;;;;;;GAWG;AACH,SAAS,mBAAmB,CAAC,aAA8B;IACzD;;;;;OAKG;IACH,SAAS,WAAW,CAAC,OAAO,GAAkB,EAAE;QAC9C;;WAEG;QACH,MAAM,EAAE,KAAK,GAAG,cAAc,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC;QAE3D;;WAEG;QACH,MAAM,WAAW,GACf,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAEvD;;WAEG;QACH,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;QAEnC,OAAO;YACL,GAAG,aAAa,EAAE;YAClB,KAAK,EAAE,WAAW;YAClB,QAAQ;YACR,GAAG,WAAW;SACf,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,SAAS,YAAY,CAAC,OAAO,GAAkB,EAAE;QAC/C;;WAEG;QACH,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAEpC,OAAO;YACL,GAAG,MAAM;YACT,IAAI,EAAE;gBACJ,GAAG,MAAM,CAAC,IAAI;gBACd,WAAW,EAAE,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC;gBACrF,YAAY,EAAE,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC;aACtF;SACF,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,SAAS,kBAAkB,CAAC,OAAO,GAAkB,EAAE;QACrD;;WAEG;QACH,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAEpC,OAAO;YACL,GAAG,MAAM;YACT,GAAG,EAAE,KAAK;YACV,IAAI,EAAE;gBACJ,GAAG,MAAM,CAAC,IAAI;gBACd,qBAAqB,EAAE,KAAK;aAC7B;SACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAC9C,CAAC;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC","sourcesContent":["import type { ConfigOptions, BuilderConfig, EntryConfig } from '@/core/types';\n\nimport { mergeArrayConfig, mergeExternalConfig, resolveTsconfig } from '../utils/index.js';\n\n/**\n * 获取基础配置的函数类型\n */\ntype GetBaseConfigFn = () => Partial<BuilderConfig>;\n\n/**\n * 通用配置创建工厂\n *\n * 接收一个获取基础配置的函数,返回 defineConfig 和 defineBundleConfig。\n * esm 和 dual 各自提供不同的 getBaseConfig 即可复用此逻辑。\n *\n * - defineConfig: 库包,生成 dts,外部化依赖\n * - defineBundleConfig: CLI/应用,不生成 dts,自动 bundle 所有依赖\n *\n * @param getBaseConfig - 获取基础配置的函数\n * @returns 包含 defineConfig 和 defineBundleConfig 的对象\n */\nfunction createConfigFactory(getBaseConfig: GetBaseConfigFn) {\n /**\n * 从 ConfigOptions 中提取 entry 并构建完整配置\n *\n * @param options - 配置选项\n * @returns 完整的构建配置\n */\n function buildConfig(options: ConfigOptions = {}): BuilderConfig {\n /**\n * 从配置选项中解构出 entry 和其余选项\n */\n const { entry = 'src/index.ts', ...restOptions } = options;\n\n /**\n * 构建入口配置对象\n */\n const entryConfig: EntryConfig | undefined =\n typeof entry === 'string' ? { index: entry } : entry;\n\n /**\n * 解析 tsconfig 配置\n */\n const tsconfig = resolveTsconfig();\n\n return {\n ...getBaseConfig(),\n entry: entryConfig,\n tsconfig,\n ...restOptions,\n };\n }\n\n /**\n * 定义库包构建配置\n *\n * 默认行为:生成 dts,外部化 dependencies\n * 支持通过 deps.alwaysBundle / deps.neverBundle 覆盖\n *\n * @param options - 配置选项\n * @returns 完整的构建配置\n */\n function defineConfig(options: ConfigOptions = {}): BuilderConfig {\n /**\n * 构建基础配置\n */\n const config = buildConfig(options);\n\n return {\n ...config,\n deps: {\n ...config.deps,\n neverBundle: mergeExternalConfig(config.deps?.neverBundle, options.deps?.neverBundle),\n alwaysBundle: mergeArrayConfig(config.deps?.alwaysBundle, options.deps?.alwaysBundle),\n },\n };\n }\n\n /**\n * 定义 CLI/应用构建配置\n *\n * - 不生成 dts\n * - 自动 bundle 所有 node_modules 依赖(skipNodeModulesBundle: false)\n *\n * @param options - 配置选项\n * @returns 完整的构建配置\n */\n function defineBundleConfig(options: ConfigOptions = {}): BuilderConfig {\n /**\n * 构建基础配置\n */\n const config = buildConfig(options);\n\n return {\n ...config,\n dts: false,\n deps: {\n ...config.deps,\n skipNodeModulesBundle: false,\n },\n };\n }\n\n return { defineConfig, defineBundleConfig };\n}\n\nexport { createConfigFactory };\n"]}
1
+ {"version":3,"file":"create-config.factory.js","sourceRoot":"","sources":["../../src/factories/create-config.factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAO3F;;;;;;;;;;;GAWG;AACH,SAAS,mBAAmB,CAAC,aAA8B;IACzD;;;;;OAKG;IACH,SAAS,WAAW,CAAC,OAAO,GAAkB,EAAE;QAC9C;;WAEG;QACH,MAAM,EAAE,KAAK,GAAG,cAAc,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC;QAE3D;;WAEG;QACH,MAAM,WAAW,GACf,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAEvD;;WAEG;QACH,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;QAEnC,OAAO;YACL,GAAG,aAAa,EAAE;YAClB,KAAK,EAAE,WAAW;YAClB,QAAQ;YACR,GAAG,WAAW;SACf,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;OAWG;IACH,SAAS,YAAY,CAAC,OAAO,GAAkB,EAAE;QAC/C;;WAEG;QACH,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAEpC,OAAO;YACL,GAAG,MAAM;YACT,IAAI,EAAE;gBACJ,GAAG,MAAM,CAAC,IAAI;gBACd,qBAAqB,EAAE,IAAI;gBAC3B,WAAW,EAAE,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC;gBACrF,YAAY,EAAE,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC;aACtF;SACF,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,SAAS,kBAAkB,CAAC,OAAO,GAAkB,EAAE;QACrD;;WAEG;QACH,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAEpC,OAAO;YACL,GAAG,MAAM;YACT,GAAG,EAAE,KAAK;YACV,IAAI,EAAE;gBACJ,GAAG,MAAM,CAAC,IAAI;gBACd,qBAAqB,EAAE,KAAK;aAC7B;SACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAC9C,CAAC;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC","sourcesContent":["import type { ConfigOptions, BuilderConfig, EntryConfig } from '@/core/types';\n\nimport { mergeArrayConfig, mergeExternalConfig, resolveTsconfig } from '../utils/index.js';\n\n/**\n * 获取基础配置的函数类型\n */\ntype GetBaseConfigFn = () => Partial<BuilderConfig>;\n\n/**\n * 通用配置创建工厂\n *\n * 接收一个获取基础配置的函数,返回 defineConfig 和 defineBundleConfig。\n * esm 和 dual 各自提供不同的 getBaseConfig 即可复用此逻辑。\n *\n * - defineConfig: 库包,生成 dts,外部化 dependencies + peerDependencies(skipNodeModulesBundle: true)\n * - defineBundleConfig: CLI/应用,不生成 dts,打包全部依赖(skipNodeModulesBundle: false)\n *\n * @param getBaseConfig - 获取基础配置的函数\n * @returns 包含 defineConfig 和 defineBundleConfig 的对象\n */\nfunction createConfigFactory(getBaseConfig: GetBaseConfigFn) {\n /**\n * 从 ConfigOptions 中提取 entry 并构建完整配置\n *\n * @param options - 配置选项\n * @returns 完整的构建配置\n */\n function buildConfig(options: ConfigOptions = {}): BuilderConfig {\n /**\n * 从配置选项中解构出 entry 和其余选项\n */\n const { entry = 'src/index.ts', ...restOptions } = options;\n\n /**\n * 构建入口配置对象\n */\n const entryConfig: EntryConfig | undefined =\n typeof entry === 'string' ? { index: entry } : entry;\n\n /**\n * 解析 tsconfig 配置\n */\n const tsconfig = resolveTsconfig();\n\n return {\n ...getBaseConfig(),\n entry: entryConfig,\n tsconfig,\n ...restOptions,\n };\n }\n\n /**\n * 定义库包构建配置\n *\n * 默认行为:生成 dts,外部化 dependencies + peerDependencies(含 workspace 与第三方依赖)\n *\n * external 派生由 runBuild 调用 resolveExternal 完成,默认读取当前包 package.json 的\n * dependencies + peerDependencies 作为外部化基底,与 tsdown 默认行为一致。\n * 支持通过 deps.alwaysBundle(强制打包)/ deps.neverBundle(补充外部化)覆盖。\n *\n * @param options - 配置选项\n * @returns 完整的构建配置\n */\n function defineConfig(options: ConfigOptions = {}): BuilderConfig {\n /**\n * 构建基础配置\n */\n const config = buildConfig(options);\n\n return {\n ...config,\n deps: {\n ...config.deps,\n skipNodeModulesBundle: true,\n neverBundle: mergeExternalConfig(config.deps?.neverBundle, options.deps?.neverBundle),\n alwaysBundle: mergeArrayConfig(config.deps?.alwaysBundle, options.deps?.alwaysBundle),\n },\n };\n }\n\n /**\n * 定义 CLI/应用构建配置\n *\n * - 不生成 dts\n * - 自动 bundle 所有 node_modules 依赖(skipNodeModulesBundle: false)\n *\n * @param options - 配置选项\n * @returns 完整的构建配置\n */\n function defineBundleConfig(options: ConfigOptions = {}): BuilderConfig {\n /**\n * 构建基础配置\n */\n const config = buildConfig(options);\n\n return {\n ...config,\n dts: false,\n deps: {\n ...config.deps,\n skipNodeModulesBundle: false,\n },\n };\n }\n\n return { defineConfig, defineBundleConfig };\n}\n\nexport { createConfigFactory };\n"]}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export type { BuildFormat, BuilderConfig, ConfigOptions, DepsOptions, DtsOptions, EntryConfig, PresetDefinition } from './core/types.js';
2
- export { resolveTsconfig, readTsBuildInfoFile, mergeArrayConfig, normalizeExternal, mergeExternalConfig, } from './utils/index.js';
2
+ export { resolveTsconfig, readTsBuildInfoFile, mergeArrayConfig, normalizeExternal, mergeExternalConfig, resolveExternal, readPackageDependencies, matchAlwaysBundle, collectExternal, } from './utils/index.js';
3
+ export type { PackageJsonLike } from './utils/index.js';
3
4
  export { createConfigFactory } from './factories/index.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEzI,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEzI,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { resolveTsconfig, readTsBuildInfoFile, mergeArrayConfig, normalizeExternal, mergeExternalConfig, } from './utils/index.js';
1
+ export { resolveTsconfig, readTsBuildInfoFile, mergeArrayConfig, normalizeExternal, mergeExternalConfig, resolveExternal, readPackageDependencies, matchAlwaysBundle, collectExternal, } from './utils/index.js';
2
2
  export { createConfigFactory } from './factories/index.js';
3
3
  //# 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":"AAEA,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC","sourcesContent":["export type { BuildFormat, BuilderConfig, ConfigOptions, DepsOptions, DtsOptions, EntryConfig, PresetDefinition } from './core/types.js';\n\nexport {\n resolveTsconfig,\n readTsBuildInfoFile,\n mergeArrayConfig,\n normalizeExternal,\n mergeExternalConfig,\n} from './utils/index.js';\n\nexport { createConfigFactory } from './factories/index.js';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC","sourcesContent":["export type { BuildFormat, BuilderConfig, ConfigOptions, DepsOptions, DtsOptions, EntryConfig, PresetDefinition } from './core/types.js';\n\nexport {\n resolveTsconfig,\n readTsBuildInfoFile,\n mergeArrayConfig,\n normalizeExternal,\n mergeExternalConfig,\n resolveExternal,\n readPackageDependencies,\n matchAlwaysBundle,\n collectExternal,\n} from './utils/index.js';\nexport type { PackageJsonLike } from './utils/index.js';\n\nexport { createConfigFactory } from './factories/index.js';\n"]}
@@ -2,4 +2,6 @@ export { resolveTsconfig } from './resolve-tsconfig.utils.js';
2
2
  export { readTsBuildInfoFile } from './read-tsbuildinfo.utils.js';
3
3
  export { mergeArrayConfig } from './merge-array-config.utils.js';
4
4
  export { mergeExternalConfig, normalizeExternal } from './merge-external-config.utils.js';
5
+ export { resolveExternal, readPackageDependencies, matchAlwaysBundle, collectExternal } from './resolve-external.utils.js';
6
+ export type { PackageJsonLike } from './resolve-external.utils.js';
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAE1F,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC3H,YAAY,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC"}
@@ -2,4 +2,5 @@ export { resolveTsconfig } from './resolve-tsconfig.utils.js';
2
2
  export { readTsBuildInfoFile } from './read-tsbuildinfo.utils.js';
3
3
  export { mergeArrayConfig } from './merge-array-config.utils.js';
4
4
  export { mergeExternalConfig, normalizeExternal } from './merge-external-config.utils.js';
5
+ export { resolveExternal, readPackageDependencies, matchAlwaysBundle, collectExternal } from './resolve-external.utils.js';
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC","sourcesContent":["export { resolveTsconfig } from './resolve-tsconfig.utils.js';\n\nexport { readTsBuildInfoFile } from './read-tsbuildinfo.utils.js';\n\nexport { mergeArrayConfig } from './merge-array-config.utils.js';\n\nexport { mergeExternalConfig, normalizeExternal } from './merge-external-config.utils.js';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAE1F,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC","sourcesContent":["export { resolveTsconfig } from './resolve-tsconfig.utils.js';\n\nexport { readTsBuildInfoFile } from './read-tsbuildinfo.utils.js';\n\nexport { mergeArrayConfig } from './merge-array-config.utils.js';\n\nexport { mergeExternalConfig, normalizeExternal } from './merge-external-config.utils.js';\n\nexport { resolveExternal, readPackageDependencies, matchAlwaysBundle, collectExternal } from './resolve-external.utils.js';\nexport type { PackageJsonLike } from './resolve-external.utils.js';\n"]}
@@ -4,6 +4,13 @@
4
4
  * @typeParam T - 数组元素类型
5
5
  */
6
6
  type Arrayable<T> = T | T[];
7
+ /**
8
+ * 将 alwaysBundle 配置规范化为数组
9
+ *
10
+ * @param value - alwaysBundle 配置
11
+ * @returns 规范化后的数组
12
+ */
13
+ declare function normalizeArrayConfig(value: Arrayable<string | RegExp> | undefined): (string | RegExp)[];
7
14
  /**
8
15
  * 合并两个 alwaysBundle 配置
9
16
  *
@@ -14,5 +21,5 @@ type Arrayable<T> = T | T[];
14
21
  * @returns 合并后的新数组
15
22
  */
16
23
  declare function mergeArrayConfig(base: Arrayable<string | RegExp> | undefined, override: Arrayable<string | RegExp> | undefined): (string | RegExp)[];
17
- export { mergeArrayConfig };
24
+ export { mergeArrayConfig, normalizeArrayConfig };
18
25
  //# sourceMappingURL=merge-array-config.utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"merge-array-config.utils.d.ts","sourceRoot":"","sources":["../../src/utils/merge-array-config.utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAiB5B;;;;;;;;GAQG;AACH,iBAAS,gBAAgB,CACvB,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS,EAC5C,QAAQ,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS,GAC/C,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAErB;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"merge-array-config.utils.d.ts","sourceRoot":"","sources":["../../src/utils/merge-array-config.utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAE5B;;;;;GAKG;AACH,iBAAS,oBAAoB,CAC3B,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS,GAC5C,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAKrB;AAED;;;;;;;;GAQG;AACH,iBAAS,gBAAgB,CACvB,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS,EAC5C,QAAQ,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS,GAC/C,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAErB;AAED,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,CAAC"}
@@ -23,5 +23,5 @@ function normalizeArrayConfig(value) {
23
23
  function mergeArrayConfig(base, override) {
24
24
  return [...normalizeArrayConfig(base), ...normalizeArrayConfig(override)];
25
25
  }
26
- export { mergeArrayConfig };
26
+ export { mergeArrayConfig, normalizeArrayConfig };
27
27
  //# sourceMappingURL=merge-array-config.utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"merge-array-config.utils.js","sourceRoot":"","sources":["../../src/utils/merge-array-config.utils.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,SAAS,oBAAoB,CAC3B,KAA6C;IAE7C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACnC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEvC,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,gBAAgB,CACvB,IAA4C,EAC5C,QAAgD;IAEhD,OAAO,CAAC,GAAG,oBAAoB,CAAC,IAAI,CAAC,EAAE,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC","sourcesContent":["/**\n * 可数组化类型,值为单值或数组的联合\n *\n * @typeParam T - 数组元素类型\n */\ntype Arrayable<T> = T | T[];\n\n/**\n * 将 alwaysBundle 配置规范化为数组\n *\n * @param value - alwaysBundle 配置\n * @returns 规范化后的数组\n */\nfunction normalizeArrayConfig(\n value: Arrayable<string | RegExp> | undefined,\n): (string | RegExp)[] {\n if (value === undefined) return [];\n if (Array.isArray(value)) return value;\n\n return [value];\n}\n\n/**\n * 合并两个 alwaysBundle 配置\n *\n * 用于合并 deps.alwaysBundle。两个来源的元素都会保留,不会去重。\n *\n * @param base - 基础配置\n * @param override - 需要合并的配置\n * @returns 合并后的新数组\n */\nfunction mergeArrayConfig(\n base: Arrayable<string | RegExp> | undefined,\n override: Arrayable<string | RegExp> | undefined,\n): (string | RegExp)[] {\n return [...normalizeArrayConfig(base), ...normalizeArrayConfig(override)];\n}\n\nexport { mergeArrayConfig };\n"]}
1
+ {"version":3,"file":"merge-array-config.utils.js","sourceRoot":"","sources":["../../src/utils/merge-array-config.utils.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,SAAS,oBAAoB,CAC3B,KAA6C;IAE7C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACnC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEvC,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,gBAAgB,CACvB,IAA4C,EAC5C,QAAgD;IAEhD,OAAO,CAAC,GAAG,oBAAoB,CAAC,IAAI,CAAC,EAAE,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,CAAC","sourcesContent":["/**\n * 可数组化类型,值为单值或数组的联合\n *\n * @typeParam T - 数组元素类型\n */\ntype Arrayable<T> = T | T[];\n\n/**\n * 将 alwaysBundle 配置规范化为数组\n *\n * @param value - alwaysBundle 配置\n * @returns 规范化后的数组\n */\nfunction normalizeArrayConfig(\n value: Arrayable<string | RegExp> | undefined,\n): (string | RegExp)[] {\n if (value === undefined) return [];\n if (Array.isArray(value)) return value;\n\n return [value];\n}\n\n/**\n * 合并两个 alwaysBundle 配置\n *\n * 用于合并 deps.alwaysBundle。两个来源的元素都会保留,不会去重。\n *\n * @param base - 基础配置\n * @param override - 需要合并的配置\n * @returns 合并后的新数组\n */\nfunction mergeArrayConfig(\n base: Arrayable<string | RegExp> | undefined,\n override: Arrayable<string | RegExp> | undefined,\n): (string | RegExp)[] {\n return [...normalizeArrayConfig(base), ...normalizeArrayConfig(override)];\n}\n\nexport { mergeArrayConfig, normalizeArrayConfig };\n"]}
@@ -0,0 +1,67 @@
1
+ import type { ExternalOption } from 'rolldown';
2
+ import type { DepsOptions } from '../core/types';
3
+ /**
4
+ * package.json 的最小结构(仅读取 external 派生所需字段)
5
+ */
6
+ type PackageJsonLike = {
7
+ dependencies?: Record<string, string>;
8
+ peerDependencies?: Record<string, string>;
9
+ };
10
+ /**
11
+ * 判断目标依赖名是否匹配 alwaysBundle 中的某一条规则
12
+ *
13
+ * alwaysBundle 元素可为字符串(精确匹配或前缀匹配)或 RegExp。
14
+ * 字符串规则匹配依赖名本身或 `${依赖名}/...` 子路径,使 `'zod'` 能覆盖 `'zod/v4'`。
15
+ *
16
+ * @param id - 待判定的依赖名
17
+ * @param alwaysBundle - 始终打包规则数组
18
+ * @returns 命中则返回 true
19
+ */
20
+ declare function matchAlwaysBundle(id: string, alwaysBundle: (string | RegExp)[]): boolean;
21
+ /**
22
+ * 将若干 ExternalOption 来源合并为一个数组
23
+ *
24
+ * 函数类型的 external 无法与其他来源合并,遇到时直接返回原函数,
25
+ * 由调用方决定透传策略。
26
+ *
27
+ * @param sources - 待合并的 external 来源
28
+ * @returns 合并后的数组,可能为空
29
+ */
30
+ declare function collectExternal(sources: (ExternalOption | undefined)[]): (string | RegExp)[];
31
+ /**
32
+ * 读取指定目录的 package.json 的 dependencies 与 peerDependencies 依赖名
33
+ *
34
+ * 仅读取依赖键名(用于派生 external),不解析版本号。
35
+ * dependencies 与 peerDependencies 均纳入(与 tsdown 默认行为一致)。
36
+ * 不读 devDependencies(开发依赖不进产物,无需外部化)。
37
+ *
38
+ * @param cwd - 当前包目录,默认为 process.cwd()
39
+ * @returns 依赖名数组,读取失败或无依赖时返回空数组
40
+ */
41
+ declare function readPackageDependencies(cwd?: string): Promise<string[]>;
42
+ /**
43
+ * 解析最终作用于 rolldown 的 external 配置
44
+ *
45
+ * 库模式(deps.skipNodeModulesBundle !== false)默认外部化 package.json 的
46
+ * dependencies + peerDependencies,消费方零配置即与 tsdown 默认行为对齐。
47
+ *
48
+ * 合并优先级(后者追加,不覆盖前者):
49
+ * 1. package.json 派生的依赖名(默认基底)
50
+ * 2. deps.neverBundle(始终外部化的补充规则)
51
+ * 3. config.external(消费方显式声明)
52
+ *
53
+ * 随后用 deps.alwaysBundle 过滤:命中的依赖从 external 移除,强制打包进产物,
54
+ * 用于库包需要把某些 dependencies 内联分发的场景。
55
+ *
56
+ * 应用模式(deps.skipNodeModulesBundle === false)跳过派生,直接返回
57
+ * config.external(通常为 undefined,即全量打包)。
58
+ *
59
+ * @param configExternal - 消费方在 BuilderConfig.external 声明的外部依赖
60
+ * @param deps - 依赖处理选项
61
+ * @param cwd - 当前包目录,默认为 process.cwd()
62
+ * @returns 解析后的 external,可能为 undefined(表示不外部化,全量打包)
63
+ */
64
+ declare function resolveExternal(configExternal: ExternalOption | undefined, deps: DepsOptions | undefined, cwd?: string): Promise<ExternalOption | undefined>;
65
+ export { resolveExternal, readPackageDependencies, matchAlwaysBundle, collectExternal };
66
+ export type { PackageJsonLike };
67
+ //# sourceMappingURL=resolve-external.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-external.utils.d.ts","sourceRoot":"","sources":["../../src/utils/resolve-external.utils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAKhD;;GAEG;AACH,KAAK,eAAe,GAAG;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C,CAAC;AAEF;;;;;;;;;GASG;AACH,iBAAS,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAUjF;AAED;;;;;;;;GAQG;AACH,iBAAS,eAAe,CAAC,OAAO,EAAE,CAAC,cAAc,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAMrF;AAED;;;;;;;;;GASG;AACH,iBAAe,uBAAuB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAarF;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,iBAAe,eAAe,CAC5B,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,IAAI,EAAE,WAAW,GAAG,SAAS,EAC7B,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAyCrC;AAED,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC;AACxF,YAAY,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,127 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { resolve } from 'node:path';
3
+ import process from 'node:process';
4
+ import { normalizeExternal } from './merge-external-config.utils.js';
5
+ import { normalizeArrayConfig } from './merge-array-config.utils.js';
6
+ /**
7
+ * 判断目标依赖名是否匹配 alwaysBundle 中的某一条规则
8
+ *
9
+ * alwaysBundle 元素可为字符串(精确匹配或前缀匹配)或 RegExp。
10
+ * 字符串规则匹配依赖名本身或 `${依赖名}/...` 子路径,使 `'zod'` 能覆盖 `'zod/v4'`。
11
+ *
12
+ * @param id - 待判定的依赖名
13
+ * @param alwaysBundle - 始终打包规则数组
14
+ * @returns 命中则返回 true
15
+ */
16
+ function matchAlwaysBundle(id, alwaysBundle) {
17
+ return alwaysBundle.some((rule) => {
18
+ if (rule instanceof RegExp) {
19
+ return rule.test(id);
20
+ }
21
+ /**
22
+ * 字符串规则:精确匹配或以 `${rule}/` 开头(覆盖子路径导入)
23
+ */
24
+ return id === rule || id.startsWith(`${rule}/`);
25
+ });
26
+ }
27
+ /**
28
+ * 将若干 ExternalOption 来源合并为一个数组
29
+ *
30
+ * 函数类型的 external 无法与其他来源合并,遇到时直接返回原函数,
31
+ * 由调用方决定透传策略。
32
+ *
33
+ * @param sources - 待合并的 external 来源
34
+ * @returns 合并后的数组,可能为空
35
+ */
36
+ function collectExternal(sources) {
37
+ const collected = [];
38
+ for (const source of sources) {
39
+ collected.push(...normalizeExternal(source));
40
+ }
41
+ return collected;
42
+ }
43
+ /**
44
+ * 读取指定目录的 package.json 的 dependencies 与 peerDependencies 依赖名
45
+ *
46
+ * 仅读取依赖键名(用于派生 external),不解析版本号。
47
+ * dependencies 与 peerDependencies 均纳入(与 tsdown 默认行为一致)。
48
+ * 不读 devDependencies(开发依赖不进产物,无需外部化)。
49
+ *
50
+ * @param cwd - 当前包目录,默认为 process.cwd()
51
+ * @returns 依赖名数组,读取失败或无依赖时返回空数组
52
+ */
53
+ async function readPackageDependencies(cwd = process.cwd()) {
54
+ try {
55
+ const pkgPath = resolve(cwd, 'package.json');
56
+ const raw = await readFile(pkgPath, 'utf-8');
57
+ const pkg = JSON.parse(raw);
58
+ return Object.keys({
59
+ ...pkg.dependencies,
60
+ ...pkg.peerDependencies,
61
+ });
62
+ }
63
+ catch {
64
+ return [];
65
+ }
66
+ }
67
+ /**
68
+ * 解析最终作用于 rolldown 的 external 配置
69
+ *
70
+ * 库模式(deps.skipNodeModulesBundle !== false)默认外部化 package.json 的
71
+ * dependencies + peerDependencies,消费方零配置即与 tsdown 默认行为对齐。
72
+ *
73
+ * 合并优先级(后者追加,不覆盖前者):
74
+ * 1. package.json 派生的依赖名(默认基底)
75
+ * 2. deps.neverBundle(始终外部化的补充规则)
76
+ * 3. config.external(消费方显式声明)
77
+ *
78
+ * 随后用 deps.alwaysBundle 过滤:命中的依赖从 external 移除,强制打包进产物,
79
+ * 用于库包需要把某些 dependencies 内联分发的场景。
80
+ *
81
+ * 应用模式(deps.skipNodeModulesBundle === false)跳过派生,直接返回
82
+ * config.external(通常为 undefined,即全量打包)。
83
+ *
84
+ * @param configExternal - 消费方在 BuilderConfig.external 声明的外部依赖
85
+ * @param deps - 依赖处理选项
86
+ * @param cwd - 当前包目录,默认为 process.cwd()
87
+ * @returns 解析后的 external,可能为 undefined(表示不外部化,全量打包)
88
+ */
89
+ async function resolveExternal(configExternal, deps, cwd = process.cwd()) {
90
+ /**
91
+ * 应用模式:全量打包,仅透传消费方显式声明
92
+ */
93
+ if (deps?.skipNodeModulesBundle === false) {
94
+ return configExternal;
95
+ }
96
+ /**
97
+ * 消费方若以函数形式声明 external,无法与派生列表合并,直接透传
98
+ */
99
+ if (typeof configExternal === 'function') {
100
+ return configExternal;
101
+ }
102
+ /**
103
+ * 从 package.json 派生默认 external 基底
104
+ */
105
+ const packageDeps = await readPackageDependencies(cwd);
106
+ /**
107
+ * 合并三处来源:package.json 依赖名 + neverBundle + config.external
108
+ */
109
+ const merged = collectExternal([
110
+ packageDeps,
111
+ deps?.neverBundle,
112
+ configExternal,
113
+ ]);
114
+ /**
115
+ * alwaysBundle 命中的依赖强制打包,从 external 中剔除
116
+ */
117
+ const alwaysBundle = normalizeArrayConfig(deps?.alwaysBundle);
118
+ const filtered = merged.filter((rule) => {
119
+ if (typeof rule !== 'string') {
120
+ return true;
121
+ }
122
+ return !matchAlwaysBundle(rule, alwaysBundle);
123
+ });
124
+ return filtered.length > 0 ? filtered : undefined;
125
+ }
126
+ export { resolveExternal, readPackageDependencies, matchAlwaysBundle, collectExternal };
127
+ //# sourceMappingURL=resolve-external.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-external.utils.js","sourceRoot":"","sources":["../../src/utils/resolve-external.utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport process from 'node:process';\n\nimport type { ExternalOption } from 'rolldown';\n\nimport type { DepsOptions } from '@/core/types';\n\nimport { normalizeExternal } from './merge-external-config.utils.js';\nimport { normalizeArrayConfig } from './merge-array-config.utils.js';\n\n/**\n * package.json 的最小结构(仅读取 external 派生所需字段)\n */\ntype PackageJsonLike = {\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n};\n\n/**\n * 判断目标依赖名是否匹配 alwaysBundle 中的某一条规则\n *\n * alwaysBundle 元素可为字符串(精确匹配或前缀匹配)或 RegExp。\n * 字符串规则匹配依赖名本身或 `${依赖名}/...` 子路径,使 `'zod'` 能覆盖 `'zod/v4'`。\n *\n * @param id - 待判定的依赖名\n * @param alwaysBundle - 始终打包规则数组\n * @returns 命中则返回 true\n */\nfunction matchAlwaysBundle(id: string, alwaysBundle: (string | RegExp)[]): boolean {\n return alwaysBundle.some((rule) => {\n if (rule instanceof RegExp) {\n return rule.test(id);\n }\n /**\n * 字符串规则:精确匹配或以 `${rule}/` 开头(覆盖子路径导入)\n */\n return id === rule || id.startsWith(`${rule}/`);\n });\n}\n\n/**\n * 将若干 ExternalOption 来源合并为一个数组\n *\n * 函数类型的 external 无法与其他来源合并,遇到时直接返回原函数,\n * 由调用方决定透传策略。\n *\n * @param sources - 待合并的 external 来源\n * @returns 合并后的数组,可能为空\n */\nfunction collectExternal(sources: (ExternalOption | undefined)[]): (string | RegExp)[] {\n const collected: (string | RegExp)[] = [];\n for (const source of sources) {\n collected.push(...normalizeExternal(source));\n }\n return collected;\n}\n\n/**\n * 读取指定目录的 package.json 的 dependencies 与 peerDependencies 依赖名\n *\n * 仅读取依赖键名(用于派生 external),不解析版本号。\n * dependencies 与 peerDependencies 均纳入(与 tsdown 默认行为一致)。\n * 不读 devDependencies(开发依赖不进产物,无需外部化)。\n *\n * @param cwd - 当前包目录,默认为 process.cwd()\n * @returns 依赖名数组,读取失败或无依赖时返回空数组\n */\nasync function readPackageDependencies(cwd: string = process.cwd()): Promise<string[]> {\n try {\n const pkgPath = resolve(cwd, 'package.json');\n const raw = await readFile(pkgPath, 'utf-8');\n const pkg = JSON.parse(raw) as PackageJsonLike;\n\n return Object.keys({\n ...pkg.dependencies,\n ...pkg.peerDependencies,\n });\n } catch {\n return [];\n }\n}\n\n/**\n * 解析最终作用于 rolldown 的 external 配置\n *\n * 库模式(deps.skipNodeModulesBundle !== false)默认外部化 package.json 的\n * dependencies + peerDependencies,消费方零配置即与 tsdown 默认行为对齐。\n *\n * 合并优先级(后者追加,不覆盖前者):\n * 1. package.json 派生的依赖名(默认基底)\n * 2. deps.neverBundle(始终外部化的补充规则)\n * 3. config.external(消费方显式声明)\n *\n * 随后用 deps.alwaysBundle 过滤:命中的依赖从 external 移除,强制打包进产物,\n * 用于库包需要把某些 dependencies 内联分发的场景。\n *\n * 应用模式(deps.skipNodeModulesBundle === false)跳过派生,直接返回\n * config.external(通常为 undefined,即全量打包)。\n *\n * @param configExternal - 消费方在 BuilderConfig.external 声明的外部依赖\n * @param deps - 依赖处理选项\n * @param cwd - 当前包目录,默认为 process.cwd()\n * @returns 解析后的 external,可能为 undefined(表示不外部化,全量打包)\n */\nasync function resolveExternal(\n configExternal: ExternalOption | undefined,\n deps: DepsOptions | undefined,\n cwd: string = process.cwd(),\n): Promise<ExternalOption | undefined> {\n /**\n * 应用模式:全量打包,仅透传消费方显式声明\n */\n if (deps?.skipNodeModulesBundle === false) {\n return configExternal;\n }\n\n /**\n * 消费方若以函数形式声明 external,无法与派生列表合并,直接透传\n */\n if (typeof configExternal === 'function') {\n return configExternal;\n }\n\n /**\n * 从 package.json 派生默认 external 基底\n */\n const packageDeps = await readPackageDependencies(cwd);\n\n /**\n * 合并三处来源:package.json 依赖名 + neverBundle + config.external\n */\n const merged = collectExternal([\n packageDeps,\n deps?.neverBundle,\n configExternal,\n ]);\n\n /**\n * alwaysBundle 命中的依赖强制打包,从 external 中剔除\n */\n const alwaysBundle = normalizeArrayConfig(deps?.alwaysBundle);\n const filtered = merged.filter((rule) => {\n if (typeof rule !== 'string') {\n return true;\n }\n return !matchAlwaysBundle(rule, alwaysBundle);\n });\n\n return filtered.length > 0 ? filtered : undefined;\n}\n\nexport { resolveExternal, readPackageDependencies, matchAlwaysBundle, collectExternal };\nexport type { PackageJsonLike };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@longzai-intelligence-builder/core",
3
- "version": "0.0.6",
3
+ "version": "0.0.7",
4
4
  "private": false,
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
@@ -31,7 +31,7 @@
31
31
  "clean": "lzi-dev-cli clean"
32
32
  },
33
33
  "dependencies": {
34
- "@longzai-intelligence-builder/config": "0.0.6"
34
+ "@longzai-intelligence-builder/config": "0.0.7"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@typescript/native-preview": "^7.0.0-dev.20260707.2"