@vitus-labs/tools-rolldown 1.14.0 → 1.15.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/CHANGELOG.md +13 -0
- package/lib/rolldown/createBuildPipeline.js +12 -1
- package/lib/rolldown/createBuildPipeline.js.map +1 -1
- package/lib/types/rolldown/createBuildPipeline.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/rolldown/createBuildPipeline.test.ts +26 -0
- package/src/rolldown/createBuildPipeline.ts +14 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
|
|
3
|
+
## 1.15.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`41ac6c5`](https://github.com/vitus-labs/tools/commit/41ac6c5288dec3d1e113db15c2a62a042174f6b4) Thanks [@vitbokisch](https://github.com/vitbokisch)! - **vitest**: Upgrade to vite 8 peer dependency. Plugin types use `unknown[]` for cross-version compatibility.
|
|
8
|
+
|
|
9
|
+
**rolldown**: Skip passthrough exports (e.g. `"./package.json": "./package.json"`) and exports without build conditions.
|
|
10
|
+
|
|
11
|
+
**all**: Update next 16.1.7, vite 8.0.0. Fix publish script tarball parsing.
|
|
12
|
+
|
|
13
|
+
- Updated dependencies [[`41ac6c5`](https://github.com/vitus-labs/tools/commit/41ac6c5288dec3d1e113db15c2a62a042174f6b4)]:
|
|
14
|
+
- @vitus-labs/tools-core@1.15.0
|
|
15
|
+
|
|
3
16
|
## 1.14.0
|
|
4
17
|
|
|
5
18
|
### Minor Changes
|
|
@@ -76,13 +76,24 @@ const parseSubpathExports = (exportsOptions) => {
|
|
|
76
76
|
const result = [];
|
|
77
77
|
for (const [exportPath, exportConfig] of Object.entries(exportsOptions)) {
|
|
78
78
|
if (typeof exportConfig === 'string') {
|
|
79
|
+
// Skip passthrough exports (e.g. "./package.json": "./package.json")
|
|
80
|
+
if (!exportConfig.endsWith('.js') && !exportConfig.endsWith('.mjs')) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
79
83
|
result.push({
|
|
80
84
|
file: exportConfig,
|
|
81
85
|
input: resolveSubpathInput(exportPath),
|
|
82
86
|
...BUILD_VARIANTS.module,
|
|
83
87
|
});
|
|
84
88
|
}
|
|
85
|
-
else if (typeof exportConfig === 'object') {
|
|
89
|
+
else if (typeof exportConfig === 'object' && exportConfig !== null) {
|
|
90
|
+
// Skip exports without build conditions (import/require/node/default)
|
|
91
|
+
if (!exportConfig.import &&
|
|
92
|
+
!exportConfig.require &&
|
|
93
|
+
!exportConfig.node &&
|
|
94
|
+
!exportConfig.default) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
86
97
|
const input = resolveSubpathInput(exportPath);
|
|
87
98
|
result.push(...parseConditions(exportConfig, input));
|
|
88
99
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createBuildPipeline.js","sourceRoot":"","sources":["../../src/rolldown/createBuildPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import { CONFIG, PKG } from '../config/index.js'\n\nconst isESModuleOnly = PKG.type === 'module'\n\nconst hasDifferentNativeBuild = () => {\n return PKG['react-native'] !== PKG.module\n}\n\nconst hasDifferentBrowserBuild = (type: string) => {\n if (!PKG.browser) return false\n\n return Object.entries(PKG.browser as Record<string, string>).some(\n ([key, value]) => {\n const source = key.substring(2)\n const output = value.substring(2)\n\n return source !== PKG[type] && source !== output\n },\n )\n}\n\nconst BUILD_VARIANTS: Record<\n string,\n { format: string; env: string; platform?: string }\n> = {\n main: {\n format: isESModuleOnly ? 'es' : 'cjs',\n env: 'development',\n platform: 'universal',\n },\n module: {\n format: 'es',\n env: 'development',\n platform: 'universal',\n },\n 'react-native': {\n format: 'es',\n env: 'development',\n platform: 'native',\n },\n 'umd:main': { format: 'umd', env: 'development' },\n unpkg: { format: 'umd', env: 'production' },\n}\n\n/** Check if an exports object uses subpath keys (e.g. \".\", \"./devtools\") */\nconst isSubpathExports = (obj: Record<string, any>): boolean =>\n Object.keys(obj).some((k) => k === '.' || k.startsWith('./'))\n\n/** Resolve the source input file for a subpath export using convention:\n * \".\" → \"src/index.ts\", \"./devtools\" → \"src/devtools/index.ts\",\n * \"./validation/zod\" → \"src/validation/zod.ts\" (file) or \"src/validation/zod/index.ts\" (dir) */\nconst resolveSubpathInput = (exportPath: string): string => {\n if (exportPath === '.') return `${CONFIG.sourceDir}/index.ts`\n const subpath = exportPath.slice(2) // strip \"./\"\n return `${CONFIG.sourceDir}/${subpath}`\n}\n\n/** Extract build variants from a single export's condition object */\nconst parseConditions = (\n conditions: Record<string, any>,\n input?: string,\n): Record<string, any>[] => {\n const result: Record<string, any>[] = []\n const base = input ? { input } : {}\n\n if (conditions.import) {\n result.push({ file: conditions.import, ...BUILD_VARIANTS.module, ...base })\n }\n if (conditions.require) {\n result.push({\n file: conditions.require,\n format: 'cjs',\n env: 'development',\n platform: 'universal',\n ...base,\n })\n }\n if (conditions.node) {\n result.push({\n file: conditions.node,\n ...BUILD_VARIANTS.module,\n platform: 'node',\n ...base,\n })\n }\n if (conditions.default && !conditions.import) {\n result.push({ file: conditions.default, ...BUILD_VARIANTS.module, ...base })\n }\n\n return result\n}\n\n/** Parse subpath exports object into build variants */\nconst parseSubpathExports = (\n exportsOptions: Record<string, any>,\n): Record<string, any>[] => {\n const result: Record<string, any>[] = []\n\n for (const [exportPath, exportConfig] of Object.entries(exportsOptions)) {\n if (typeof exportConfig === 'string') {\n result.push({\n file: exportConfig,\n input: resolveSubpathInput(exportPath),\n ...BUILD_VARIANTS.module,\n })\n } else if (typeof exportConfig === 'object') {\n const input = resolveSubpathInput(exportPath)\n result.push(...parseConditions(exportConfig, input))\n }\n }\n\n return result\n}\n\nconst getExportsOptions = () => {\n const exportsOptions = PKG.exports\n\n if (!exportsOptions) return []\n\n if (typeof exportsOptions === 'string') {\n return [{ file: PKG.exports, ...BUILD_VARIANTS.module }]\n }\n\n if (typeof exportsOptions === 'object') {\n return isSubpathExports(exportsOptions)\n ? parseSubpathExports(exportsOptions)\n : parseConditions(exportsOptions)\n }\n\n return []\n}\n\nconst createBasicBuildVariants = () => {\n let result: Record<string, any>[] = []\n\n if (isESModuleOnly) result = [...getExportsOptions()]\n\n Object.keys(BUILD_VARIANTS).forEach((key) => {\n const PKGOutDir = PKG[key]\n\n if (PKGOutDir) {\n const hasBrowserBuild = hasDifferentBrowserBuild(key)\n const hasNativeBuild = hasDifferentNativeBuild()\n\n // create a helper function for adding a build variant to an array\n const add = (props = {}) => {\n result.push({ ...BUILD_VARIANTS[key], file: PKGOutDir, ...props })\n }\n\n if (key === 'react-native') {\n // add a separate RN build only if output path differs from module path\n if (hasNativeBuild) {\n add()\n }\n } else if (hasBrowserBuild) {\n // if has a different browser build, set default platform to node\n // as there is going to be created a separate browser build as well\n add({ platform: 'node' })\n } else {\n add()\n }\n }\n })\n\n return result\n}\n\nconst createBrowserBuildVariants = () => {\n const result: Record<string, any>[] = []\n if (!PKG.browser) return result\n\n Object.entries(PKG.browser as Record<string, string>).forEach(\n ([key, value]) => {\n const source = key.substring(2) // strip './' from the beginning of path\n const output = value.substring(2) // strip './' from the beginning of path\n\n Object.keys(BUILD_VARIANTS).forEach((item) => {\n if (PKG[item] === source && source !== output) {\n result.push({\n ...BUILD_VARIANTS[item],\n file: output,\n platform: 'browser',\n })\n }\n })\n },\n )\n\n return result\n}\n\nconst createBuildPipeline = () => {\n if (Array.isArray(CONFIG.entries) && CONFIG.entries.length > 0) {\n return CONFIG.entries.map((entry: Record<string, string | undefined>) => ({\n format: entry.format || 'es',\n env: entry.env || 'development',\n platform: entry.platform || 'universal',\n file: entry.file,\n input: entry.input,\n }))\n }\n\n return [...createBasicBuildVariants(), ...createBrowserBuildVariants()]\n}\n\nexport default createBuildPipeline\n"]}
|
|
1
|
+
{"version":3,"file":"createBuildPipeline.js","sourceRoot":"","sources":["../../src/rolldown/createBuildPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import { CONFIG, PKG } from '../config/index.js'\n\nconst isESModuleOnly = PKG.type === 'module'\n\nconst hasDifferentNativeBuild = () => {\n return PKG['react-native'] !== PKG.module\n}\n\nconst hasDifferentBrowserBuild = (type: string) => {\n if (!PKG.browser) return false\n\n return Object.entries(PKG.browser as Record<string, string>).some(\n ([key, value]) => {\n const source = key.substring(2)\n const output = value.substring(2)\n\n return source !== PKG[type] && source !== output\n },\n )\n}\n\nconst BUILD_VARIANTS: Record<\n string,\n { format: string; env: string; platform?: string }\n> = {\n main: {\n format: isESModuleOnly ? 'es' : 'cjs',\n env: 'development',\n platform: 'universal',\n },\n module: {\n format: 'es',\n env: 'development',\n platform: 'universal',\n },\n 'react-native': {\n format: 'es',\n env: 'development',\n platform: 'native',\n },\n 'umd:main': { format: 'umd', env: 'development' },\n unpkg: { format: 'umd', env: 'production' },\n}\n\n/** Check if an exports object uses subpath keys (e.g. \".\", \"./devtools\") */\nconst isSubpathExports = (obj: Record<string, any>): boolean =>\n Object.keys(obj).some((k) => k === '.' || k.startsWith('./'))\n\n/** Resolve the source input file for a subpath export using convention:\n * \".\" → \"src/index.ts\", \"./devtools\" → \"src/devtools/index.ts\",\n * \"./validation/zod\" → \"src/validation/zod.ts\" (file) or \"src/validation/zod/index.ts\" (dir) */\nconst resolveSubpathInput = (exportPath: string): string => {\n if (exportPath === '.') return `${CONFIG.sourceDir}/index.ts`\n const subpath = exportPath.slice(2) // strip \"./\"\n return `${CONFIG.sourceDir}/${subpath}`\n}\n\n/** Extract build variants from a single export's condition object */\nconst parseConditions = (\n conditions: Record<string, any>,\n input?: string,\n): Record<string, any>[] => {\n const result: Record<string, any>[] = []\n const base = input ? { input } : {}\n\n if (conditions.import) {\n result.push({ file: conditions.import, ...BUILD_VARIANTS.module, ...base })\n }\n if (conditions.require) {\n result.push({\n file: conditions.require,\n format: 'cjs',\n env: 'development',\n platform: 'universal',\n ...base,\n })\n }\n if (conditions.node) {\n result.push({\n file: conditions.node,\n ...BUILD_VARIANTS.module,\n platform: 'node',\n ...base,\n })\n }\n if (conditions.default && !conditions.import) {\n result.push({ file: conditions.default, ...BUILD_VARIANTS.module, ...base })\n }\n\n return result\n}\n\n/** Parse subpath exports object into build variants */\nconst parseSubpathExports = (\n exportsOptions: Record<string, any>,\n): Record<string, any>[] => {\n const result: Record<string, any>[] = []\n\n for (const [exportPath, exportConfig] of Object.entries(exportsOptions)) {\n if (typeof exportConfig === 'string') {\n // Skip passthrough exports (e.g. \"./package.json\": \"./package.json\")\n if (!exportConfig.endsWith('.js') && !exportConfig.endsWith('.mjs')) {\n continue\n }\n result.push({\n file: exportConfig,\n input: resolveSubpathInput(exportPath),\n ...BUILD_VARIANTS.module,\n })\n } else if (typeof exportConfig === 'object' && exportConfig !== null) {\n // Skip exports without build conditions (import/require/node/default)\n if (\n !exportConfig.import &&\n !exportConfig.require &&\n !exportConfig.node &&\n !exportConfig.default\n ) {\n continue\n }\n const input = resolveSubpathInput(exportPath)\n result.push(...parseConditions(exportConfig, input))\n }\n }\n\n return result\n}\n\nconst getExportsOptions = () => {\n const exportsOptions = PKG.exports\n\n if (!exportsOptions) return []\n\n if (typeof exportsOptions === 'string') {\n return [{ file: PKG.exports, ...BUILD_VARIANTS.module }]\n }\n\n if (typeof exportsOptions === 'object') {\n return isSubpathExports(exportsOptions)\n ? parseSubpathExports(exportsOptions)\n : parseConditions(exportsOptions)\n }\n\n return []\n}\n\nconst createBasicBuildVariants = () => {\n let result: Record<string, any>[] = []\n\n if (isESModuleOnly) result = [...getExportsOptions()]\n\n Object.keys(BUILD_VARIANTS).forEach((key) => {\n const PKGOutDir = PKG[key]\n\n if (PKGOutDir) {\n const hasBrowserBuild = hasDifferentBrowserBuild(key)\n const hasNativeBuild = hasDifferentNativeBuild()\n\n // create a helper function for adding a build variant to an array\n const add = (props = {}) => {\n result.push({ ...BUILD_VARIANTS[key], file: PKGOutDir, ...props })\n }\n\n if (key === 'react-native') {\n // add a separate RN build only if output path differs from module path\n if (hasNativeBuild) {\n add()\n }\n } else if (hasBrowserBuild) {\n // if has a different browser build, set default platform to node\n // as there is going to be created a separate browser build as well\n add({ platform: 'node' })\n } else {\n add()\n }\n }\n })\n\n return result\n}\n\nconst createBrowserBuildVariants = () => {\n const result: Record<string, any>[] = []\n if (!PKG.browser) return result\n\n Object.entries(PKG.browser as Record<string, string>).forEach(\n ([key, value]) => {\n const source = key.substring(2) // strip './' from the beginning of path\n const output = value.substring(2) // strip './' from the beginning of path\n\n Object.keys(BUILD_VARIANTS).forEach((item) => {\n if (PKG[item] === source && source !== output) {\n result.push({\n ...BUILD_VARIANTS[item],\n file: output,\n platform: 'browser',\n })\n }\n })\n },\n )\n\n return result\n}\n\nconst createBuildPipeline = () => {\n if (Array.isArray(CONFIG.entries) && CONFIG.entries.length > 0) {\n return CONFIG.entries.map((entry: Record<string, string | undefined>) => ({\n format: entry.format || 'es',\n env: entry.env || 'development',\n platform: entry.platform || 'universal',\n file: entry.file,\n input: entry.input,\n }))\n }\n\n return [...createBasicBuildVariants(), ...createBrowserBuildVariants()]\n}\n\nexport default createBuildPipeline\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createBuildPipeline.d.ts","sourceRoot":"","sources":["../../../src/rolldown/createBuildPipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"createBuildPipeline.d.ts","sourceRoot":"","sources":["../../../src/rolldown/createBuildPipeline.ts"],"names":[],"mappings":"AA4MA,QAAA,MAAM,mBAAmB,WAYxB,CAAA;AAED,eAAe,mBAAmB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vitus-labs/tools-rolldown",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.15.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"access": "public"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@vitus-labs/tools-core": "^1.
|
|
40
|
+
"@vitus-labs/tools-core": "^1.14.0",
|
|
41
41
|
"chalk": "^5.6.2",
|
|
42
42
|
"rimraf": "^6.1.3",
|
|
43
43
|
"rolldown": "^1.0.0-rc.9",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"rollup-plugin-visualizer": "^7.0.1"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@vitus-labs/tools-typescript": "^1.
|
|
49
|
+
"@vitus-labs/tools-typescript": "^1.14.0",
|
|
50
50
|
"typescript": "^5.9.3"
|
|
51
51
|
}
|
|
52
52
|
}
|
|
@@ -148,6 +148,32 @@ describe('createBuildPipeline', () => {
|
|
|
148
148
|
})
|
|
149
149
|
})
|
|
150
150
|
|
|
151
|
+
describe('with passthrough exports like package.json', () => {
|
|
152
|
+
let createBuildPipeline: () => any[]
|
|
153
|
+
|
|
154
|
+
beforeEach(async () => {
|
|
155
|
+
vi.resetModules()
|
|
156
|
+
mockPKG.type = 'module'
|
|
157
|
+
delete mockPKG.main
|
|
158
|
+
delete mockPKG.module
|
|
159
|
+
mockPKG.exports = {
|
|
160
|
+
'.': {
|
|
161
|
+
import: './lib/index.js',
|
|
162
|
+
},
|
|
163
|
+
'./package.json': './package.json',
|
|
164
|
+
}
|
|
165
|
+
const mod = await import('./createBuildPipeline.js')
|
|
166
|
+
createBuildPipeline = mod.default
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
it('should skip passthrough exports that are not JS files', () => {
|
|
170
|
+
const builds = createBuildPipeline()
|
|
171
|
+
|
|
172
|
+
expect(builds).toHaveLength(1)
|
|
173
|
+
expect(builds[0].file).toBe('./lib/index.js')
|
|
174
|
+
})
|
|
175
|
+
})
|
|
176
|
+
|
|
151
177
|
describe('with react-native build', () => {
|
|
152
178
|
let createBuildPipeline: () => any[]
|
|
153
179
|
|
|
@@ -98,12 +98,25 @@ const parseSubpathExports = (
|
|
|
98
98
|
|
|
99
99
|
for (const [exportPath, exportConfig] of Object.entries(exportsOptions)) {
|
|
100
100
|
if (typeof exportConfig === 'string') {
|
|
101
|
+
// Skip passthrough exports (e.g. "./package.json": "./package.json")
|
|
102
|
+
if (!exportConfig.endsWith('.js') && !exportConfig.endsWith('.mjs')) {
|
|
103
|
+
continue
|
|
104
|
+
}
|
|
101
105
|
result.push({
|
|
102
106
|
file: exportConfig,
|
|
103
107
|
input: resolveSubpathInput(exportPath),
|
|
104
108
|
...BUILD_VARIANTS.module,
|
|
105
109
|
})
|
|
106
|
-
} else if (typeof exportConfig === 'object') {
|
|
110
|
+
} else if (typeof exportConfig === 'object' && exportConfig !== null) {
|
|
111
|
+
// Skip exports without build conditions (import/require/node/default)
|
|
112
|
+
if (
|
|
113
|
+
!exportConfig.import &&
|
|
114
|
+
!exportConfig.require &&
|
|
115
|
+
!exportConfig.node &&
|
|
116
|
+
!exportConfig.default
|
|
117
|
+
) {
|
|
118
|
+
continue
|
|
119
|
+
}
|
|
107
120
|
const input = resolveSubpathInput(exportPath)
|
|
108
121
|
result.push(...parseConditions(exportConfig, input))
|
|
109
122
|
}
|