diff --git a/packages/core/core/src/requests/PathRequest.js b/packages/core/core/src/requests/PathRequest.js index 347fbe12468..6bb95cc21be 100644 --- a/packages/core/core/src/requests/PathRequest.js +++ b/packages/core/core/src/requests/PathRequest.js @@ -67,6 +67,12 @@ async function run({input, api, options}: RunOpts) { }); let result: ResolverResult = await resolverRunner.resolve(input.dependency); + if (result.invalidateOnEnvChange) { + for (let env of result.invalidateOnEnvChange) { + api.invalidateOnEnvChange(env); + } + } + if (result.invalidateOnFileCreate) { for (let file of result.invalidateOnFileCreate) { api.invalidateOnFileCreate( @@ -105,6 +111,7 @@ type ResolverResult = {| assetGroup: ?AssetGroup, invalidateOnFileCreate?: Array, invalidateOnFileChange?: Array, + invalidateOnEnvChange?: Array, diagnostics?: Array, |}; @@ -185,6 +192,7 @@ export class ResolverRunner { let diagnostics: Array = []; let invalidateOnFileCreate = []; let invalidateOnFileChange = []; + let invalidateOnEnvChange = []; for (let resolver of resolvers) { try { let result = await resolver.plugin.resolve({ @@ -208,6 +216,10 @@ export class ResolverRunner { dependency.priority = Priority[result.priority]; } + if (result.invalidateOnEnvChange) { + invalidateOnEnvChange.push(...result.invalidateOnEnvChange); + } + if (result.invalidateOnFileCreate) { invalidateOnFileCreate.push(...result.invalidateOnFileCreate); } @@ -221,6 +233,7 @@ export class ResolverRunner { assetGroup: null, invalidateOnFileCreate, invalidateOnFileChange, + invalidateOnEnvChange, }; } @@ -251,6 +264,7 @@ export class ResolverRunner { }, invalidateOnFileCreate, invalidateOnFileChange, + invalidateOnEnvChange, }; } @@ -286,6 +300,7 @@ export class ResolverRunner { assetGroup: null, invalidateOnFileCreate, invalidateOnFileChange, + invalidateOnEnvChange, }; } @@ -308,6 +323,7 @@ export class ResolverRunner { assetGroup: null, invalidateOnFileCreate, invalidateOnFileChange, + invalidateOnEnvChange, diagnostics, }; } diff --git a/packages/core/integration-tests/test/integration/resolver-can-invalidateonenvchange/.parcelrc b/packages/core/integration-tests/test/integration/resolver-can-invalidateonenvchange/.parcelrc new file mode 100644 index 00000000000..6e7fa4a9bde --- /dev/null +++ b/packages/core/integration-tests/test/integration/resolver-can-invalidateonenvchange/.parcelrc @@ -0,0 +1,4 @@ +{ + "extends": "@parcel/config-default", + "resolvers": ["parcel-resolver-can-invalidateonenvchange"] +} diff --git a/packages/core/integration-tests/test/integration/resolver-can-invalidateonenvchange/index.js b/packages/core/integration-tests/test/integration/resolver-can-invalidateonenvchange/index.js new file mode 100644 index 00000000000..69b7c3258ab --- /dev/null +++ b/packages/core/integration-tests/test/integration/resolver-can-invalidateonenvchange/index.js @@ -0,0 +1 @@ +const willBeReplaced = true; \ No newline at end of file diff --git a/packages/core/integration-tests/test/integration/resolver-can-invalidateonenvchange/node_modules/parcel-resolver-can-invalidateonenvchange/index.js b/packages/core/integration-tests/test/integration/resolver-can-invalidateonenvchange/node_modules/parcel-resolver-can-invalidateonenvchange/index.js new file mode 100644 index 00000000000..ade8fcd2fd7 --- /dev/null +++ b/packages/core/integration-tests/test/integration/resolver-can-invalidateonenvchange/node_modules/parcel-resolver-can-invalidateonenvchange/index.js @@ -0,0 +1,27 @@ +// @flow + +const {Resolver} = require('@parcel/plugin'); +const path = require('path'); +const {default: NodeResolver} = require('@parcel/node-resolver-core'); + +module.exports = new Resolver({ + async resolve({dependency, options, specifier,logger}) { + let mainFields = ['source', 'browser', 'module', 'main']; + const replacedCode = options.env.replacedCode; + const resolver = new NodeResolver({ + fs: options.inputFS, + projectRoot: options.projectRoot, + extensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'css', 'styl', 'vue'], + mainFields, + }); + let result = await resolver.resolve({ + filename: specifier, + specifierType: dependency.specifierType, + parent: dependency.sourcePath, + env: dependency.env, + }); + result.code = replacedCode; + result.invalidateOnEnvChange = ['replacedCode']; + return result; + }, +}); diff --git a/packages/core/integration-tests/test/integration/resolver-can-invalidateonenvchange/node_modules/parcel-resolver-can-invalidateonenvchange/package.json b/packages/core/integration-tests/test/integration/resolver-can-invalidateonenvchange/node_modules/parcel-resolver-can-invalidateonenvchange/package.json new file mode 100644 index 00000000000..005c6096b8f --- /dev/null +++ b/packages/core/integration-tests/test/integration/resolver-can-invalidateonenvchange/node_modules/parcel-resolver-can-invalidateonenvchange/package.json @@ -0,0 +1,7 @@ +{ + "name": "parcel-resolver-can-invalidateonenvchange", + "version": "1.0.0", + "private": true, + "main": "index.js" + } + \ No newline at end of file diff --git a/packages/core/integration-tests/test/integration/resolver-can-invalidateonenvchange/package.json b/packages/core/integration-tests/test/integration/resolver-can-invalidateonenvchange/package.json new file mode 100644 index 00000000000..65d2634be87 --- /dev/null +++ b/packages/core/integration-tests/test/integration/resolver-can-invalidateonenvchange/package.json @@ -0,0 +1,4 @@ +{ + "name": "test-resolver-invalidateonenevchange", + "private": true +} \ No newline at end of file diff --git a/packages/core/integration-tests/test/integration/resolver-can-invalidateonenvchange/yarn.lock b/packages/core/integration-tests/test/integration/resolver-can-invalidateonenvchange/yarn.lock new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/core/integration-tests/test/plugin.js b/packages/core/integration-tests/test/plugin.js index 26256535e64..5b86ca5fbe9 100644 --- a/packages/core/integration-tests/test/plugin.js +++ b/packages/core/integration-tests/test/plugin.js @@ -190,4 +190,24 @@ parcel-transformer-b`, assert.equal(await run(b), 2); }); + + it('should allow resolvers to invalidateOnEnvChange', async () => { + async function assertAsset(replacedCode) { + let b = await bundle( + path.join( + __dirname, + '/integration/resolver-can-invalidateonenvchange/index.js', + ), + { + shouldDisableCache: false, + inputFS: overlayFS, + env: {replacedCode}, + }, + ); + let code = await b.getBundles()[0].getEntryAssets()[0].getCode(); + assert(code.indexOf(replacedCode) !== -1); + } + await assertAsset('const replaced = 1;'); + await assertAsset('const replaced = 2;'); + }); }); diff --git a/packages/core/types/index.js b/packages/core/types/index.js index 57c29b0c5ee..6ca07f9001d 100644 --- a/packages/core/types/index.js +++ b/packages/core/types/index.js @@ -1499,6 +1499,8 @@ export type ResolveResult = {| +invalidateOnFileCreate?: Array, /** A list of files that should invalidate the resolution if modified or deleted. */ +invalidateOnFileChange?: Array, + /** Invalidates the resolution when the given environment variable changes.*/ + +invalidateOnEnvChange?: Array, |}; /**