build: generate shims for esnext

also cleaned up build script a bit
This commit is contained in:
alina 🌸 2024-04-30 16:27:58 +03:00
parent 4acd0d58e9
commit 3d38cc4500
Signed by: teidesu
SSH key fingerprint: SHA256:uNeCpw6aTSU4aIObXLvHfLkDa82HWH9EiOj9AXOIRpI

View file

@ -32,7 +32,6 @@ const buildConfig = {
buildTs: true, buildTs: true,
buildCjs: true, buildCjs: true,
removeReferenceComments: true, removeReferenceComments: true,
replaceSrcImports: true,
esmOnlyDirectives: false, esmOnlyDirectives: false,
esmImportDirectives: false, esmImportDirectives: false,
before: () => {}, before: () => {},
@ -349,28 +348,9 @@ if (buildConfig.buildTs && !IS_JSR) {
let content = fs.readFileSync(f, 'utf8') let content = fs.readFileSync(f, 'utf8')
let changed = false let changed = false
if (content.indexOf('/// <reference types="node" />') !== -1) { if (content.indexOf('/// <reference types="') !== -1) {
changed = true changed = true
content = content.replace('/// <reference types="node" />', '') content = content.replace(/\/\/\/ <reference types="(node|deno\/ns)".+?\/>\n?/g, '')
}
if (content.match(/@mtcute\/[a-z-]+\/src/)) {
changed = true
content = content.replace(/(@mtcute\/[a-z-]+)\/src/g, '$1')
}
if (changed) fs.writeFileSync(f, content)
}
}
if (buildConfig.replaceSrcImports) {
for (const f of glob.sync(path.join(outDir, '**/*.js'))) {
let content = fs.readFileSync(f, 'utf8')
let changed = false
if (content.match(/@mtcute\/[a-z-]+\/src/)) {
changed = true
content = content.replace(/(@mtcute\/[a-z-]+)\/src/g, '$1')
} }
if (changed) fs.writeFileSync(f, content) if (changed) fs.writeFileSync(f, content)
@ -497,6 +477,15 @@ if (typeof globalThis !== 'undefined' && !globalThis._MTCUTE_CJS_DEPRECATION_WAR
} }
} }
// validate exports
if (typeof builtPkgJson.exports === 'object') {
for (const [name, target] of Object.entries(builtPkgJson.exports)) {
if (name.includes('*')) {
throw new Error(`Wildcards are not supported: ${name} -> ${target}`)
}
}
}
if (IS_JSR) { if (IS_JSR) {
// generate deno.json from package.json // generate deno.json from package.json
// https://jsr.io/docs/package-configuration // https://jsr.io/docs/package-configuration
@ -517,27 +506,6 @@ if (IS_JSR) {
} }
} }
for (const [name, target] of Object.entries(builtPkgJson.exports)) {
// jsr doesn't support wildcards, so we need to flatten those
if (!name.includes('*')) continue
if (!name.endsWith('*') || !target.endsWith('*')) {
// for simplicity + it's the only one supported in some bundlers
throw new Error(`Invalid wildcard in export map: ${name} -> ${target}`)
}
const base = name.slice(0, -1)
const targetBase = target.slice(0, -1)
for (const file of glob.sync(path.join(outDir, base, '**/*'))) {
const newName = (base + path.relative(path.join(outDir, base), file)).replace(/\.ts$/, '.js')
const newTarget = targetBase + path.relative(path.join(outDir, base), file)
builtPkgJson.exports[newName] = newTarget
}
delete builtPkgJson.exports[name]
}
const denoJson = path.join(outDir, 'deno.json') const denoJson = path.join(outDir, 'deno.json')
fs.writeFileSync( fs.writeFileSync(
denoJson, denoJson,
@ -596,6 +564,34 @@ if (IS_JSR) {
console.log('[v] Changed %d files', unsavedSourceFiles.length) console.log('[v] Changed %d files', unsavedSourceFiles.length)
project.saveSync() project.saveSync()
} }
} else {
// make shims for esnext resolution (that doesn't respect package.json `exports` field)
function makeShim(name, target) {
if (name === '.') name = './index.js'
if (!fs.existsSync(path.join(outDir, name))) {
fs.writeFileSync(path.join(outDir, name), `export * from '${target}'\n`)
fs.writeFileSync(path.join(outDir, name.replace(/\.js$/, '.d.ts')), `export * from '${target}'\n`)
}
}
if (typeof builtPkgJson.exports === 'string') {
makeShim('.', builtPkgJson.exports)
} else if (typeof builtPkgJson.exports === 'object') {
for (const [name, target] of Object.entries(builtPkgJson.exports)) {
let esmTarget
if (typeof target === 'object') {
if (!target.import) throw new Error(`Invalid export target: ${name} -> ${JSON.stringify(target)}`)
esmTarget = target.import
} else if (typeof target === 'string') {
if (buildConfig.buildCjs) throw new Error(`Invalid export target (with cjs): ${name} -> ${target}`)
esmTarget = target
}
makeShim(name, esmTarget)
}
}
} }
try { try {