diff --git a/packages/unocss/astro.d.ts b/packages/unocss/astro.d.ts deleted file mode 100644 index e679a9bf0f..0000000000 --- a/packages/unocss/astro.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dist/astro' -export { default } from './dist/astro' diff --git a/packages/unocss/index.d.ts b/packages/unocss/index.d.ts deleted file mode 100644 index f9b53da738..0000000000 --- a/packages/unocss/index.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dist/index' -export { default } from './dist/index' diff --git a/packages/unocss/package.json b/packages/unocss/package.json index 62e1bbe913..05b56a452a 100644 --- a/packages/unocss/package.json +++ b/packages/unocss/package.json @@ -94,9 +94,16 @@ }, "main": "dist/index.mjs", "module": "dist/index.mjs", - "types": "index.d.ts", + "types": "dist/index.d.ts", + "typesVersions": { + "*": { + "*": [ + "./dist/*", + "./*" + ] + } + }, "files": [ - "*.d.ts", "dist" ], "engines": { diff --git a/packages/unocss/postcss.d.ts b/packages/unocss/postcss.d.ts deleted file mode 100644 index 3493339b88..0000000000 --- a/packages/unocss/postcss.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dist/postcss' -export { default } from './dist/postcss' diff --git a/packages/unocss/preset-attributify.d.ts b/packages/unocss/preset-attributify.d.ts deleted file mode 100644 index 2b54a3e080..0000000000 --- a/packages/unocss/preset-attributify.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dist/preset-attributify' -export { default } from './dist/preset-attributify' diff --git a/packages/unocss/preset-icons.d.ts b/packages/unocss/preset-icons.d.ts deleted file mode 100644 index 30f30c9a14..0000000000 --- a/packages/unocss/preset-icons.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dist/preset-icons' -export { default } from './dist/preset-icons' diff --git a/packages/unocss/preset-mini.d.ts b/packages/unocss/preset-mini.d.ts deleted file mode 100644 index 02ca65112e..0000000000 --- a/packages/unocss/preset-mini.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dist/preset-mini' -export { default } from './dist/preset-mini' diff --git a/packages/unocss/preset-tagify.d.ts b/packages/unocss/preset-tagify.d.ts deleted file mode 100644 index 1474f23a19..0000000000 --- a/packages/unocss/preset-tagify.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dist/preset-tagify' -export { default } from './dist/preset-tagify' diff --git a/packages/unocss/preset-typography.d.ts b/packages/unocss/preset-typography.d.ts deleted file mode 100644 index f3dc1ffd52..0000000000 --- a/packages/unocss/preset-typography.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dist/preset-typography' -export { default } from './dist/preset-typography' diff --git a/packages/unocss/preset-uno.d.ts b/packages/unocss/preset-uno.d.ts deleted file mode 100644 index fc88e40213..0000000000 --- a/packages/unocss/preset-uno.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dist/preset-uno' -export { default } from './dist/preset-uno' diff --git a/packages/unocss/preset-web-fonts.d.ts b/packages/unocss/preset-web-fonts.d.ts deleted file mode 100644 index 5f4fd18f51..0000000000 --- a/packages/unocss/preset-web-fonts.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dist/preset-web-fonts' -export { default } from './dist/preset-web-fonts' diff --git a/packages/unocss/preset-wind.d.ts b/packages/unocss/preset-wind.d.ts deleted file mode 100644 index fe8457c312..0000000000 --- a/packages/unocss/preset-wind.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dist/preset-wind' -export { default } from './dist/preset-wind' diff --git a/packages/unocss/vite.d.ts b/packages/unocss/vite.d.ts deleted file mode 100644 index a791d26bb3..0000000000 --- a/packages/unocss/vite.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dist/vite' -export { default } from './dist/vite' diff --git a/packages/unocss/webpack.d.ts b/packages/unocss/webpack.d.ts deleted file mode 100644 index 190a5fe396..0000000000 --- a/packages/unocss/webpack.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './dist/webpack' -export { default } from './dist/webpack' diff --git a/scripts/dist-verify.ts b/scripts/dist-verify.ts index 23b860756a..b4bb166ea4 100644 --- a/scripts/dist-verify.ts +++ b/scripts/dist-verify.ts @@ -3,21 +3,26 @@ import process from 'node:process' import fg from 'fast-glob' export async function verifyDist() { - const cjsFiles = await fg('packages/*/dist/**/*.cjs', { + const cjsFiles = await fg(['packages/*/dist/**/*.d.ts', 'packages/*/dist/**/*.d.cts'], { ignore: ['**/node_modules/**'], }) + // const cjsFiles = await fg('packages/*/dist/**/*.cjs', { + // ignore: ['**/node_modules/**'], + // }) - console.log(`${cjsFiles.length} cjs files found`) + console.log(`${cjsFiles.length} dts files found`) + // console.log(`${cjsFiles.length} cjs files found`) console.log(cjsFiles.map(i => ` - ${i}`).join('\n')) const forbidden = [ // Make sure no CJS is importing UnoCSS packages as they are ESM only /require\(['"]@?unocss(\/core)?['"]\)/, // Use `exports.default` instead, should be patched by postbuild.ts - 'module.exports', + // 'module.exports', ] - const exportsDefault = 'exports.default' + const exportsDefault = 'as default' + // const exportsDefault = 'exports.default' let error = false await Promise.all(cjsFiles.map(async (file) => { diff --git a/scripts/postbuild.ts b/scripts/postbuild.ts index a3366074fe..27b3a97597 100644 --- a/scripts/postbuild.ts +++ b/scripts/postbuild.ts @@ -2,28 +2,78 @@ import { readFileSync, writeFileSync } from 'node:fs' import { resolve } from 'node:path' import { verifyDist } from './dist-verify' -function patchCjs(cjsModulePath: string, name: string) { - const cjsModule = readFileSync(cjsModulePath, 'utf-8') - writeFileSync( - cjsModulePath, - cjsModule - .replace(`'use strict';`, `'use strict';Object.defineProperty(exports, '__esModule', {value: true});`) - .replace(`module.exports = ${name};`, `exports.default = ${name};`), - { encoding: 'utf-8' }, - ) +const regexp = /export\s*\{\s*(.*)\s*};/ + +function parseExports(dtsModulePath: string, defaultExport: string, content: string) { + const exportAsDefault = `${defaultExport} as default` + const entries = content.split('\n').reduce((acc, line) => { + // skip LF if last line + if (acc.content.length && acc.content.at(-1) === '\n' && line.trim().length === 0) + return acc + + const match = line.match(regexp) + if (match?.length && match[0].includes(exportAsDefault)) { + const exportsArray = match[1].split(',').map(e => e.trim()) + const removeImport = `${defaultExport} as default` + // Filtering out the default export + const nonDefaultExports = exportsArray.filter(item => item !== removeImport).map(e => e.trim()) + acc.matched = true + acc.content = nonDefaultExports.length > 0 + ? `${acc.content}\nexport = ${defaultExport};\nexport { ${nonDefaultExports.join(', ')} };\n` + : `${acc.content}\nexport = ${defaultExport};\n` + } + else { + // avoid adding LF at first line + acc.content = acc.content.length > 0 + ? `${acc.content}\n${line}` + : line + } + + return acc + }, { content: '', matched: false }) + + if (entries.matched) + return entries.content + else + throw new Error(`UPPS, no match found for ${defaultExport} in ${dtsModulePath}!`) +} + +function patchDefaultCjsExport(dtsModuleName: string, defaultExport: string = '_default') { + for (const path of [`${dtsModuleName}.d.ts`, `${dtsModuleName}.d.cts`]) { + writeFileSync( + path, + parseExports(path, defaultExport, readFileSync(path, 'utf-8')), + { encoding: 'utf-8' }, + ) + } +} + +function patchUnoCSSPostcssCjsExport(dtsModuleName: string) { + for (const path of [`${dtsModuleName}.d.ts`, `${dtsModuleName}.d.cts`]) { + const content = readFileSync(path, 'utf-8') + writeFileSync( + path, + content.replace('export { default } from \'@unocss/postcss\';', '\nexport = postcss;'), + { encoding: 'utf-8' }, + ) + } } // @unocss/eslint-config -patchCjs(resolve('./packages/eslint-config/dist/flat.cjs'), 'flat') -patchCjs(resolve('./packages/eslint-config/dist/index.cjs'), 'index') +patchDefaultCjsExport(resolve('./packages/eslint-config/dist/flat')) +patchDefaultCjsExport(resolve('./packages/eslint-config/dist/index')) // @unocss/eslint-plugin -patchCjs(resolve('./packages/eslint-plugin/dist/index.cjs'), 'index') +patchDefaultCjsExport(resolve('./packages/eslint-plugin/dist/index')) // @unocss/postcss -patchCjs(resolve('./packages/postcss/dist/index.cjs'), 'unocss') +patchDefaultCjsExport(resolve('./packages/postcss/dist/index'), 'unocss') + +// @unocss/webpack +patchDefaultCjsExport(resolve('./packages/webpack/dist/index'), 'WebpackPlugin') // unocss -patchCjs(resolve('./packages/unocss/dist/postcss.cjs'), 'postcss__default') +patchUnoCSSPostcssCjsExport(resolve('./packages/unocss/dist/postcss')) +patchDefaultCjsExport(resolve('./packages/unocss/dist/webpack'), 'UnocssWebpackPlugin') await verifyDist()