Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save juliendargelos/f5a3f62287e035d73ae72f1491044bed to your computer and use it in GitHub Desktop.
Save juliendargelos/f5a3f62287e035d73ae72f1491044bed to your computer and use it in GitHub Desktop.
Rollup plugin to rename imports in an ES modules
import fs from 'fs'
/**
* @example
* // In rollup.config.js
* export default {
* // ...
* plugins: [
* webDependencies({
* // Use pika cdn by default
* 'preact': '^8.5.2',
* // Use custom location
* 'redux': 'https://cdn.pika.dev/redux/^4.0.4'
* })
* ]
* }
*
* // In package.json
* {
* "webDependencies": {
* "preact": "^8.5.2",
* "redux": "https://cdn.pika.dev/redux/^4.0.4"
* }
* }
*/
export default function webDependencies(webDepencencies = {}) {
return {
name: 'web-dependencies',
transform(code) {
this.externals.forEach(({ pattern, source }) => code.replace(
pattern,
`$1'${source}'$2`
)
},
async options(opts) {
opts = { external: [], ...opts }
const pkg = await new Promise((resolve) => {
fs.readFile('package.json', (error, content) => resolve(error
? {}
: JSON.parse(content.toString())
))
})
this.externals = Object
.entries({ ...pkg.webDependencies, ...webDependencies })
.map((name, source) => {
opts.external.push(name)
return {
pattern: new RegExp(`^(\s*import\s+.?)(?:'${name}'|"${name}")(\s*;?\s*)$`, 'mg'),
source: /^https?:\/\//.test(source)
? source
: `https://cdn.pika.dev/${name}/${source}`
}
}
return opts
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment