Skip to content

Commit

Permalink
feat: generate polyfills based on targets
Browse files Browse the repository at this point in the history
  • Loading branch information
eddyw committed Mar 11, 2020
1 parent 285f7bd commit 788e8b2
Show file tree
Hide file tree
Showing 5 changed files with 260 additions and 9 deletions.
12 changes: 9 additions & 3 deletions _next.config.js → next.config.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
const path = require('path')

const POLYFILL_NOMODULE = path.resolve(
__dirname,
'polyfills',
'polyfill-nomodule.js'
)

module.exports = (_, config) => {
config.webpack = (options) => {
const originalEntry = options.entry
options.entry = async () => {
const entries = await originalEntry()

if (entries['static/runtime/polyfills.js']) {
console.log(require.resolve('core-js/stable'))
entries['static/runtime/polyfills.js'] = [
require.resolve('core-js/stable'),
entries['static/runtime/polyfills.js'],
POLYFILL_NOMODULE,
]
}
return entries;
Expand Down
14 changes: 10 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,21 @@
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start"
"dev": "node polyfills/generate.js && next dev",
"build": "node polyfills/generate.js && next build",
"start": "next start",
"generate": "node polyfills/generate.js"
},
"dependencies": {
"core-js": "3",
"core-js-compat": "^3.6.4",
"next": "9.3.0",
"object-assign": "^4.1.1",
"promise-polyfill": "^8.1.3",
"react": "16.13.0",
"react-dom": "16.13.0"
"react-dom": "16.13.0",
"url-polyfill": "^1.1.8",
"whatwg-fetch": "^3.0.0"
},
"devDependencies": {
"@types/node": "^13.9.0",
Expand Down
27 changes: 27 additions & 0 deletions polyfills/generate.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
const path = require('path')
const fs = require('fs')

const {
list,
targets,
} = require('core-js-compat')({
targets: 'IE 11',
filter: /^(es|web)\./,
})

const modulesToPolyfill = Object
.keys(targets)
.map(moduleName => `import 'core-js/modules/${moduleName}'`)

modulesToPolyfill.push(`
// Specialized Packages:
import 'promise-polyfill/src/polyfill'
import 'whatwg-fetch/fetch'
import 'url-polyfill'
import assign from 'object-assign'
Object.assign = assign
`)

const POLYFILLS_OUT = path.resolve(__dirname, 'polyfill-nomodule.js')

fs.writeFileSync(POLYFILLS_OUT, modulesToPolyfill.join('\n'), { encoding: 'utf-8' })
202 changes: 202 additions & 0 deletions polyfills/polyfill-nomodule.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
import 'core-js/modules/es.symbol'
import 'core-js/modules/es.symbol.description'
import 'core-js/modules/es.symbol.async-iterator'
import 'core-js/modules/es.symbol.has-instance'
import 'core-js/modules/es.symbol.is-concat-spreadable'
import 'core-js/modules/es.symbol.iterator'
import 'core-js/modules/es.symbol.match'
import 'core-js/modules/es.symbol.match-all'
import 'core-js/modules/es.symbol.replace'
import 'core-js/modules/es.symbol.search'
import 'core-js/modules/es.symbol.species'
import 'core-js/modules/es.symbol.split'
import 'core-js/modules/es.symbol.to-primitive'
import 'core-js/modules/es.symbol.to-string-tag'
import 'core-js/modules/es.symbol.unscopables'
import 'core-js/modules/es.array.concat'
import 'core-js/modules/es.array.copy-within'
import 'core-js/modules/es.array.every'
import 'core-js/modules/es.array.fill'
import 'core-js/modules/es.array.filter'
import 'core-js/modules/es.array.find'
import 'core-js/modules/es.array.find-index'
import 'core-js/modules/es.array.flat'
import 'core-js/modules/es.array.flat-map'
import 'core-js/modules/es.array.for-each'
import 'core-js/modules/es.array.from'
import 'core-js/modules/es.array.includes'
import 'core-js/modules/es.array.index-of'
import 'core-js/modules/es.array.iterator'
import 'core-js/modules/es.array.join'
import 'core-js/modules/es.array.last-index-of'
import 'core-js/modules/es.array.map'
import 'core-js/modules/es.array.of'
import 'core-js/modules/es.array.reduce'
import 'core-js/modules/es.array.reduce-right'
import 'core-js/modules/es.array.slice'
import 'core-js/modules/es.array.some'
import 'core-js/modules/es.array.species'
import 'core-js/modules/es.array.splice'
import 'core-js/modules/es.array.unscopables.flat'
import 'core-js/modules/es.array.unscopables.flat-map'
import 'core-js/modules/es.array-buffer.constructor'
import 'core-js/modules/es.date.to-primitive'
import 'core-js/modules/es.function.has-instance'
import 'core-js/modules/es.function.name'
import 'core-js/modules/es.global-this'
import 'core-js/modules/es.json.stringify'
import 'core-js/modules/es.json.to-string-tag'
import 'core-js/modules/es.map'
import 'core-js/modules/es.math.acosh'
import 'core-js/modules/es.math.asinh'
import 'core-js/modules/es.math.atanh'
import 'core-js/modules/es.math.cbrt'
import 'core-js/modules/es.math.clz32'
import 'core-js/modules/es.math.cosh'
import 'core-js/modules/es.math.expm1'
import 'core-js/modules/es.math.fround'
import 'core-js/modules/es.math.hypot'
import 'core-js/modules/es.math.imul'
import 'core-js/modules/es.math.log10'
import 'core-js/modules/es.math.log1p'
import 'core-js/modules/es.math.log2'
import 'core-js/modules/es.math.sign'
import 'core-js/modules/es.math.sinh'
import 'core-js/modules/es.math.tanh'
import 'core-js/modules/es.math.to-string-tag'
import 'core-js/modules/es.math.trunc'
import 'core-js/modules/es.number.constructor'
import 'core-js/modules/es.number.epsilon'
import 'core-js/modules/es.number.is-finite'
import 'core-js/modules/es.number.is-integer'
import 'core-js/modules/es.number.is-nan'
import 'core-js/modules/es.number.is-safe-integer'
import 'core-js/modules/es.number.max-safe-integer'
import 'core-js/modules/es.number.min-safe-integer'
import 'core-js/modules/es.number.parse-float'
import 'core-js/modules/es.number.parse-int'
import 'core-js/modules/es.number.to-fixed'
import 'core-js/modules/es.object.assign'
import 'core-js/modules/es.object.define-getter'
import 'core-js/modules/es.object.define-setter'
import 'core-js/modules/es.object.entries'
import 'core-js/modules/es.object.freeze'
import 'core-js/modules/es.object.from-entries'
import 'core-js/modules/es.object.get-own-property-descriptor'
import 'core-js/modules/es.object.get-own-property-descriptors'
import 'core-js/modules/es.object.get-own-property-names'
import 'core-js/modules/es.object.get-prototype-of'
import 'core-js/modules/es.object.is'
import 'core-js/modules/es.object.is-extensible'
import 'core-js/modules/es.object.is-frozen'
import 'core-js/modules/es.object.is-sealed'
import 'core-js/modules/es.object.keys'
import 'core-js/modules/es.object.lookup-getter'
import 'core-js/modules/es.object.lookup-setter'
import 'core-js/modules/es.object.prevent-extensions'
import 'core-js/modules/es.object.seal'
import 'core-js/modules/es.object.to-string'
import 'core-js/modules/es.object.values'
import 'core-js/modules/es.promise'
import 'core-js/modules/es.promise.all-settled'
import 'core-js/modules/es.promise.finally'
import 'core-js/modules/es.reflect.apply'
import 'core-js/modules/es.reflect.construct'
import 'core-js/modules/es.reflect.define-property'
import 'core-js/modules/es.reflect.delete-property'
import 'core-js/modules/es.reflect.get'
import 'core-js/modules/es.reflect.get-own-property-descriptor'
import 'core-js/modules/es.reflect.get-prototype-of'
import 'core-js/modules/es.reflect.has'
import 'core-js/modules/es.reflect.is-extensible'
import 'core-js/modules/es.reflect.own-keys'
import 'core-js/modules/es.reflect.prevent-extensions'
import 'core-js/modules/es.reflect.set'
import 'core-js/modules/es.reflect.set-prototype-of'
import 'core-js/modules/es.regexp.constructor'
import 'core-js/modules/es.regexp.exec'
import 'core-js/modules/es.regexp.flags'
import 'core-js/modules/es.regexp.sticky'
import 'core-js/modules/es.regexp.test'
import 'core-js/modules/es.regexp.to-string'
import 'core-js/modules/es.set'
import 'core-js/modules/es.string.code-point-at'
import 'core-js/modules/es.string.ends-with'
import 'core-js/modules/es.string.from-code-point'
import 'core-js/modules/es.string.includes'
import 'core-js/modules/es.string.iterator'
import 'core-js/modules/es.string.match'
import 'core-js/modules/es.string.match-all'
import 'core-js/modules/es.string.pad-end'
import 'core-js/modules/es.string.pad-start'
import 'core-js/modules/es.string.raw'
import 'core-js/modules/es.string.repeat'
import 'core-js/modules/es.string.replace'
import 'core-js/modules/es.string.search'
import 'core-js/modules/es.string.split'
import 'core-js/modules/es.string.starts-with'
import 'core-js/modules/es.string.trim'
import 'core-js/modules/es.string.trim-end'
import 'core-js/modules/es.string.trim-start'
import 'core-js/modules/es.string.anchor'
import 'core-js/modules/es.string.big'
import 'core-js/modules/es.string.blink'
import 'core-js/modules/es.string.bold'
import 'core-js/modules/es.string.fixed'
import 'core-js/modules/es.string.fontcolor'
import 'core-js/modules/es.string.fontsize'
import 'core-js/modules/es.string.italics'
import 'core-js/modules/es.string.link'
import 'core-js/modules/es.string.small'
import 'core-js/modules/es.string.strike'
import 'core-js/modules/es.string.sub'
import 'core-js/modules/es.string.sup'
import 'core-js/modules/es.typed-array.float32-array'
import 'core-js/modules/es.typed-array.float64-array'
import 'core-js/modules/es.typed-array.int8-array'
import 'core-js/modules/es.typed-array.int16-array'
import 'core-js/modules/es.typed-array.int32-array'
import 'core-js/modules/es.typed-array.uint8-array'
import 'core-js/modules/es.typed-array.uint8-clamped-array'
import 'core-js/modules/es.typed-array.uint16-array'
import 'core-js/modules/es.typed-array.uint32-array'
import 'core-js/modules/es.typed-array.copy-within'
import 'core-js/modules/es.typed-array.every'
import 'core-js/modules/es.typed-array.fill'
import 'core-js/modules/es.typed-array.filter'
import 'core-js/modules/es.typed-array.find'
import 'core-js/modules/es.typed-array.find-index'
import 'core-js/modules/es.typed-array.for-each'
import 'core-js/modules/es.typed-array.from'
import 'core-js/modules/es.typed-array.includes'
import 'core-js/modules/es.typed-array.index-of'
import 'core-js/modules/es.typed-array.iterator'
import 'core-js/modules/es.typed-array.join'
import 'core-js/modules/es.typed-array.last-index-of'
import 'core-js/modules/es.typed-array.map'
import 'core-js/modules/es.typed-array.of'
import 'core-js/modules/es.typed-array.reduce'
import 'core-js/modules/es.typed-array.reduce-right'
import 'core-js/modules/es.typed-array.reverse'
import 'core-js/modules/es.typed-array.set'
import 'core-js/modules/es.typed-array.slice'
import 'core-js/modules/es.typed-array.some'
import 'core-js/modules/es.typed-array.sort'
import 'core-js/modules/es.typed-array.subarray'
import 'core-js/modules/es.typed-array.to-locale-string'
import 'core-js/modules/es.typed-array.to-string'
import 'core-js/modules/es.weak-map'
import 'core-js/modules/es.weak-set'
import 'core-js/modules/web.dom-collections.for-each'
import 'core-js/modules/web.dom-collections.iterator'
import 'core-js/modules/web.queue-microtask'
import 'core-js/modules/web.url'
import 'core-js/modules/web.url.to-json'
import 'core-js/modules/web.url-search-params'

// Specialized Packages:
import 'promise-polyfill/src/polyfill'
import 'whatwg-fetch/fetch'
import 'url-polyfill'
import assign from 'object-assign'
Object.assign = assign
14 changes: 12 additions & 2 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1952,7 +1952,7 @@ copy-descriptor@^0.1.0:
resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=

core-js-compat@^3.1.1:
core-js-compat@^3.1.1, core-js-compat@^3.6.4:
version "3.6.4"
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17"
integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==
Expand Down Expand Up @@ -4666,6 +4666,11 @@ promise-inflight@^1.0.1:
resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=

promise-polyfill@^8.1.3:
version "8.1.3"
resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.1.3.tgz#8c99b3cf53f3a91c68226ffde7bde81d7f904116"
integrity sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g==

[email protected]:
version "8.0.1"
resolved "https://registry.yarnpkg.com/promise/-/promise-8.0.1.tgz#e45d68b00a17647b6da711bf85ed6ed47208f450"
Expand Down Expand Up @@ -5725,6 +5730,11 @@ urix@^0.1.0:
resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=

url-polyfill@^1.1.8:
version "1.1.8"
resolved "https://registry.yarnpkg.com/url-polyfill/-/url-polyfill-1.1.8.tgz#21eb58ad61192f52b77dcac8ab5293ae7bc67060"
integrity sha512-Ey61F4FEqhcu1vHSOMmjl0Vd/RPRLEjMj402qszD/dhMBrVfoUsnIj8KSZo2yj+eIlxJGKFdnm6ES+7UzMgZ3Q==

[email protected], url@^0.11.0:
version "0.11.0"
resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
Expand Down Expand Up @@ -5881,7 +5891,7 @@ [email protected]:
watchpack "^1.6.0"
webpack-sources "^1.4.1"

[email protected]:
[email protected], whatwg-fetch@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb"
integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==
Expand Down

0 comments on commit 788e8b2

Please sign in to comment.