Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(gatsby): upgrade latest-version #36434

Merged
merged 8 commits into from Oct 18, 2022
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
@@ -0,0 +1,54 @@
const path = require(`path`)

/**
* @typedef {import('@babel/core').NodePath} NodePath
* @typedef {import('@babel/core').PluginObj} PluginObj
* @typedef {import('@babel/core').PluginPass} PluginPass
* @typedef {import('@babel/core').types} BabelTypes
* @typedef {import('@babel/core').types.Identifier} Identifier
* @typedef {import('@babel/core').types.MemberExpression} MemberExpression
*/

/**
* @typedef {Object} IPluginOptions
* @property {Array<string>} keepDynamicImports
*/

/**
*
* @param {{ types: BabelTypes }} _unused
* @param {Partial<IPluginOptions>} opts
* @returns {PluginObj}
*/
module.exports = function keepDynamicImports(
_unused,
opts
) {
if (!opts.keepDynamicImports) {
throw new Error(`keepDynamicImports option needs to be set`)
} else if (!Array.isArray(opts.keepDynamicImports)) {
throw new Error(`keepDynamicImports option needs to be an array`)
}

const absolutePaths = opts.keepDynamicImports.map(p => path.resolve(p))

return {
name: `babel-transform-mark-to-keep-dynamic-import`,
visitor: {
Program() {
const filename = this.file?.opts?.filename
if (!filename) {
return
}

if (absolutePaths.includes(filename)) {
// this is big hack - it relies on some babel plugins internal to basically
// do early return ( https://github.com/babel/babel/blob/3526b79c87863052f1c61ec0c49c0fc287ba32e6/packages/babel-plugin-transform-modules-commonjs/src/index.ts#L174 )
// on top of that `BabelFile` doesn't expose delete for the metadata,
// so we reach into internal `_map` to delete it
this.file._map.delete("@babel/plugin-proposal-dynamic-import")
}
}
},
}
}
7 changes: 7 additions & 0 deletions packages/babel-preset-gatsby-package/lib/index.js
Expand Up @@ -7,6 +7,7 @@ function preset(context, options = {}) {
nodeVersion = `18.0.0`,
esm = false,
availableCompilerFlags = [`GATSBY_MAJOR`],
keepDynamicImports = null
} = options
const {
NODE_ENV,
Expand Down Expand Up @@ -86,6 +87,12 @@ function preset(context, options = {}) {
},
],
r(`babel-plugin-lodash`),
Array.isArray(keepDynamicImports) && keepDynamicImports.length > 0 && [
r(`./babel-trasnform-mark-to-keep-dynamic-import`),
{
keepDynamicImports,
},
]
].filter(Boolean),
overrides: [
{
Expand Down
4 changes: 3 additions & 1 deletion packages/gatsby/babel.config.js
Expand Up @@ -3,5 +3,7 @@
// Ref: https://github.com/babel/babel/pull/7358
module.exports = {
sourceMaps: true,
presets: [["babel-preset-gatsby-package"]],
presets: [["babel-preset-gatsby-package", {
keepDynamicImports: [`./src/utils/feedback.ts`]
}]],
Comment on lines -6 to +8
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this PR adds a way to mark individual files to not transform

await import("")

to

await Promise.resolve().then(() => _interopRequireWildcard(require("")));

and instead keep dynamic import

We have plenty of dynamic imports in our codebase / gatsby package and switching it everywhere (through already existing esm: true option that babel-preset-gatsby-package) doesn't seem like good idea and definitely would require solid testing.

This approach allows us to address individual modules and we can over-time migrate more things if needed

}
2 changes: 1 addition & 1 deletion packages/gatsby/package.json
Expand Up @@ -117,7 +117,7 @@
"is-relative-url": "^3.0.0",
"joi": "^17.4.2",
"json-loader": "^0.5.7",
"latest-version": "5.1.0",
"latest-version": "^7.0.0",
"lmdb": "2.5.3",
"lodash": "^4.17.21",
"md5-file": "^5.0.0",
Expand Down
2 changes: 1 addition & 1 deletion packages/gatsby/src/utils/feedback.ts
@@ -1,7 +1,6 @@
import report from "gatsby-cli/lib/reporter"
import { getConfigStore, getGatsbyVersion, isCI } from "gatsby-core-utils"
import { trackCli } from "gatsby-telemetry"
import latestVersion from "latest-version"
import getDayOfYear from "date-fns/getDayOfYear"

const feedbackKey = `feedback.disabled`
Expand Down Expand Up @@ -115,6 +114,7 @@ export async function userPassesFeedbackRequestHeuristic(): Promise<boolean> {
const versionPoints = getGatsbyVersion().split(`.`)
let latestVersionPoints: Array<string> = []
try {
const { default: latestVersion } = await import(`latest-version`)
latestVersionPoints = (await latestVersion(`gatsby`)).split(`.`)
} catch (e) {
// do nothing.
Expand Down