@embroider/webpack 3.2.3-unstable.8c7b24d → 3.2.3-unstable.a90d03d

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@embroider/webpack",
3
- "version": "3.2.3-unstable.8c7b24d",
3
+ "version": "3.2.3-unstable.a90d03d",
4
4
  "private": false,
5
5
  "description": "Builds EmberJS apps with Webpack",
6
6
  "repository": {
@@ -19,9 +19,9 @@
19
19
  "scripts": {},
20
20
  "dependencies": {
21
21
  "@babel/core": "^7.14.5",
22
- "@embroider/babel-loader-9": "3.1.2-unstable.8c7b24d",
23
- "@embroider/hbs-loader": "3.0.4-unstable.8c7b24d",
24
- "@embroider/shared-internals": "2.5.3-unstable.8c7b24d",
22
+ "@embroider/babel-loader-9": "3.1.2-unstable.a90d03d",
23
+ "@embroider/hbs-loader": "3.0.4-unstable.a90d03d",
24
+ "@embroider/shared-internals": "2.5.3-unstable.a90d03d",
25
25
  "@types/supports-color": "^8.1.0",
26
26
  "assert-never": "^1.2.1",
27
27
  "babel-loader": "^8.2.2",
@@ -42,7 +42,7 @@
42
42
  "thread-loader": "^3.0.4"
43
43
  },
44
44
  "devDependencies": {
45
- "@embroider/core": "3.4.6-unstable.8c7b24d",
45
+ "@embroider/core": "3.4.6-unstable.a90d03d",
46
46
  "@types/csso": "^3.5.1",
47
47
  "@types/debug": "^4.1.5",
48
48
  "@types/fs-extra": "^9.0.12",
@@ -54,7 +54,7 @@
54
54
  "webpack": "^5.38.1"
55
55
  },
56
56
  "peerDependencies": {
57
- "@embroider/core": "3.4.6-unstable.8c7b24d",
57
+ "@embroider/core": "3.4.6-unstable.a90d03d",
58
58
  "webpack": "^5.0.0"
59
59
  },
60
60
  "engines": {
@@ -37,20 +37,20 @@ class EmbroiderPlugin {
37
37
  __classPrivateFieldGet(this, _EmbroiderPlugin_instances, "m", _EmbroiderPlugin_addLoaderAlias).call(this, compiler, virtualLoaderName, virtualLoaderPath);
38
38
  compiler.hooks.normalModuleFactory.tap('@embroider/webpack', nmf => {
39
39
  let defaultResolve = getDefaultResolveHook(nmf.hooks.resolve.taps);
40
- let adaptedResolve = getAdaptedResolve(defaultResolve);
41
40
  nmf.hooks.resolve.tapAsync({ name: '@embroider/webpack', stage: 50 }, (state, callback) => {
42
- let request = WebpackModuleRequest.from(state, __classPrivateFieldGet(this, _EmbroiderPlugin_babelLoaderPrefix, "f"), __classPrivateFieldGet(this, _EmbroiderPlugin_appRoot, "f"));
41
+ let request = WebpackModuleRequest.from(defaultResolve, state, __classPrivateFieldGet(this, _EmbroiderPlugin_babelLoaderPrefix, "f"), __classPrivateFieldGet(this, _EmbroiderPlugin_appRoot, "f"));
43
42
  if (!request) {
44
43
  defaultResolve(state, callback);
45
44
  return;
46
45
  }
47
- __classPrivateFieldGet(this, _EmbroiderPlugin_resolver, "f").resolve(request, adaptedResolve).then(resolution => {
46
+ __classPrivateFieldGet(this, _EmbroiderPlugin_resolver, "f").resolve(request).then(resolution => {
48
47
  switch (resolution.type) {
49
48
  case 'not_found':
50
49
  callback(resolution.err);
51
50
  break;
52
51
  case 'found':
53
- callback(null, resolution.result);
52
+ case 'ignored':
53
+ callback(null, undefined);
54
54
  break;
55
55
  default:
56
56
  throw (0, assert_never_1.default)(resolution);
@@ -84,33 +84,8 @@ function getDefaultResolveHook(taps) {
84
84
  let { fn } = taps.find(t => t.name === 'NormalModuleFactory');
85
85
  return fn;
86
86
  }
87
- // This converts the raw function we got out of webpack into the right interface
88
- // for use by @embroider/core's resolver.
89
- function getAdaptedResolve(defaultResolve) {
90
- return function (request) {
91
- return new Promise(resolve => {
92
- if (request.isNotFound) {
93
- // TODO: we can make sure this looks correct in webpack output when a
94
- // user encounters it
95
- let err = new Error(`module not found ${request.specifier}`);
96
- err.code = 'MODULE_NOT_FOUND';
97
- resolve({ type: 'not_found', err });
98
- }
99
- defaultResolve(request.toWebpackResolveData(), (err, value) => {
100
- if (err) {
101
- // unfortunately webpack doesn't let us distinguish between Not Found
102
- // and other unexpected exceptions here.
103
- resolve({ type: 'not_found', err });
104
- }
105
- else {
106
- resolve({ type: 'found', result: value });
107
- }
108
- });
109
- });
110
- };
111
- }
112
87
  class WebpackModuleRequest {
113
- static from(state, babelLoaderPrefix, appRoot) {
88
+ static from(resolveFunction, state, babelLoaderPrefix, appRoot) {
114
89
  var _a;
115
90
  let specifier = state.request;
116
91
  if (specifier.includes(virtualLoaderName) || // prevents recursion on requests we have already sent to our virtual loader
@@ -138,9 +113,10 @@ class WebpackModuleRequest {
138
113
  if (!fromFile) {
139
114
  return;
140
115
  }
141
- return new WebpackModuleRequest(babelLoaderPrefix, appRoot, specifier, fromFile, state.contextInfo._embroiderMeta, false, false, state);
116
+ return new WebpackModuleRequest(resolveFunction, babelLoaderPrefix, appRoot, specifier, fromFile, state.contextInfo._embroiderMeta, false, false, undefined, state);
142
117
  }
143
- constructor(babelLoaderPrefix, appRoot, specifier, fromFile, meta, isVirtual, isNotFound, originalState) {
118
+ constructor(resolveFunction, babelLoaderPrefix, appRoot, specifier, fromFile, meta, isVirtual, isNotFound, resolvedTo, originalState) {
119
+ this.resolveFunction = resolveFunction;
144
120
  this.babelLoaderPrefix = babelLoaderPrefix;
145
121
  this.appRoot = appRoot;
146
122
  this.specifier = specifier;
@@ -148,6 +124,7 @@ class WebpackModuleRequest {
148
124
  this.meta = meta;
149
125
  this.isVirtual = isVirtual;
150
126
  this.isNotFound = isNotFound;
127
+ this.resolvedTo = resolvedTo;
151
128
  this.originalState = originalState;
152
129
  }
153
130
  get debugType() {
@@ -180,31 +157,63 @@ class WebpackModuleRequest {
180
157
  this.originalState.context = (0, path_1.dirname)(this.fromFile);
181
158
  this.originalState.contextInfo.issuer = this.fromFile;
182
159
  this.originalState.contextInfo._embroiderMeta = this.meta;
160
+ if (this.resolvedTo) {
161
+ if (this.resolvedTo.type === 'found') {
162
+ this.originalState.createData = this.resolvedTo.result;
163
+ }
164
+ }
183
165
  return this.originalState;
184
166
  }
185
167
  alias(newSpecifier) {
186
168
  if (newSpecifier === this.specifier) {
187
169
  return this;
188
170
  }
189
- return new WebpackModuleRequest(this.babelLoaderPrefix, this.appRoot, newSpecifier, this.fromFile, this.meta, this.isVirtual, false, this.originalState);
171
+ return new WebpackModuleRequest(this.resolveFunction, this.babelLoaderPrefix, this.appRoot, newSpecifier, this.fromFile, this.meta, this.isVirtual, false, undefined, this.originalState);
190
172
  }
191
173
  rehome(newFromFile) {
192
174
  if (this.fromFile === newFromFile) {
193
175
  return this;
194
176
  }
195
- return new WebpackModuleRequest(this.babelLoaderPrefix, this.appRoot, this.specifier, newFromFile, this.meta, this.isVirtual, false, this.originalState);
177
+ return new WebpackModuleRequest(this.resolveFunction, this.babelLoaderPrefix, this.appRoot, this.specifier, newFromFile, this.meta, this.isVirtual, false, undefined, this.originalState);
196
178
  }
197
179
  virtualize(filename) {
198
180
  let params = new URLSearchParams();
199
181
  params.set('f', filename);
200
182
  params.set('a', this.appRoot);
201
- return new WebpackModuleRequest(this.babelLoaderPrefix, this.appRoot, `${this.babelLoaderPrefix}${virtualLoaderName}?${params.toString()}!`, this.fromFile, this.meta, true, false, this.originalState);
183
+ return new WebpackModuleRequest(this.resolveFunction, this.babelLoaderPrefix, this.appRoot, `${this.babelLoaderPrefix}${virtualLoaderName}?${params.toString()}!`, this.fromFile, this.meta, true, false, undefined, this.originalState);
202
184
  }
203
185
  withMeta(meta) {
204
- return new WebpackModuleRequest(this.babelLoaderPrefix, this.appRoot, this.specifier, this.fromFile, meta, this.isVirtual, this.isNotFound, this.originalState);
186
+ return new WebpackModuleRequest(this.resolveFunction, this.babelLoaderPrefix, this.appRoot, this.specifier, this.fromFile, meta, this.isVirtual, this.isNotFound, this.resolvedTo, this.originalState);
205
187
  }
206
188
  notFound() {
207
- return new WebpackModuleRequest(this.babelLoaderPrefix, this.appRoot, this.specifier, this.fromFile, this.meta, this.isVirtual, true, this.originalState);
189
+ return new WebpackModuleRequest(this.resolveFunction, this.babelLoaderPrefix, this.appRoot, this.specifier, this.fromFile, this.meta, this.isVirtual, true, undefined, this.originalState);
190
+ }
191
+ resolveTo(resolution) {
192
+ return new WebpackModuleRequest(this.resolveFunction, this.babelLoaderPrefix, this.appRoot, this.specifier, this.fromFile, this.meta, this.isVirtual, this.isNotFound, resolution, this.originalState);
193
+ }
194
+ async defaultResolve() {
195
+ if (this.isNotFound) {
196
+ // TODO: we can make sure this looks correct in webpack output when a
197
+ // user encounters it
198
+ let err = new Error(`module not found ${this.specifier}`);
199
+ err.code = 'MODULE_NOT_FOUND';
200
+ return { type: 'not_found', err };
201
+ }
202
+ return await new Promise(resolve => this.resolveFunction(this.toWebpackResolveData(), err => {
203
+ if (err) {
204
+ // unfortunately webpack doesn't let us distinguish between Not Found
205
+ // and other unexpected exceptions here.
206
+ resolve({ type: 'not_found', err });
207
+ }
208
+ else {
209
+ resolve({
210
+ type: 'found',
211
+ result: this.originalState.createData,
212
+ isVirtual: this.isVirtual,
213
+ filename: this.originalState.createData.resource,
214
+ });
215
+ }
216
+ }));
208
217
  }
209
218
  }
210
219
  //# sourceMappingURL=webpack-resolver-plugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"webpack-resolver-plugin.js","sourceRoot":"","sources":["webpack-resolver-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { dirname, resolve } from 'path';\nimport type { ModuleRequest, ResolverFunction, Resolution } from '@embroider/core';\nimport { Resolver as EmbroiderResolver, ResolverOptions as EmbroiderResolverOptions } from '@embroider/core';\nimport type { Compiler, Module, ResolveData } from 'webpack';\nimport assertNever from 'assert-never';\nimport escapeRegExp from 'escape-string-regexp';\n\nexport { EmbroiderResolverOptions as Options };\n\nconst virtualLoaderName = '@embroider/webpack/src/virtual-loader';\nconst virtualLoaderPath = resolve(__dirname, './virtual-loader.js');\nconst virtualRequestPattern = new RegExp(`${escapeRegExp(virtualLoaderPath)}\\\\?(?<query>.+)!`);\n\nexport class EmbroiderPlugin {\n #resolver: EmbroiderResolver;\n #babelLoaderPrefix: string;\n #appRoot: string;\n\n constructor(opts: EmbroiderResolverOptions, babelLoaderPrefix: string) {\n this.#resolver = new EmbroiderResolver(opts);\n this.#babelLoaderPrefix = babelLoaderPrefix;\n this.#appRoot = opts.appRoot;\n }\n\n #addLoaderAlias(compiler: Compiler, name: string, alias: string) {\n let { resolveLoader } = compiler.options;\n if (Array.isArray(resolveLoader.alias)) {\n resolveLoader.alias.push({ name, alias });\n } else if (resolveLoader.alias) {\n resolveLoader.alias[name] = alias;\n } else {\n resolveLoader.alias = {\n [name]: alias,\n };\n }\n }\n\n apply(compiler: Compiler) {\n this.#addLoaderAlias(compiler, virtualLoaderName, virtualLoaderPath);\n\n compiler.hooks.normalModuleFactory.tap('@embroider/webpack', nmf => {\n let defaultResolve = getDefaultResolveHook(nmf.hooks.resolve.taps);\n let adaptedResolve = getAdaptedResolve(defaultResolve);\n\n nmf.hooks.resolve.tapAsync(\n { name: '@embroider/webpack', stage: 50 },\n (state: ExtendedResolveData, callback: CB) => {\n let request = WebpackModuleRequest.from(state, this.#babelLoaderPrefix, this.#appRoot);\n if (!request) {\n defaultResolve(state, callback);\n return;\n }\n\n this.#resolver.resolve(request, adaptedResolve).then(\n resolution => {\n switch (resolution.type) {\n case 'not_found':\n callback(resolution.err);\n break;\n case 'found':\n callback(null, resolution.result);\n break;\n default:\n throw assertNever(resolution);\n }\n },\n err => callback(err)\n );\n }\n );\n });\n }\n}\n\ntype CB = (err: null | Error, result?: Module | undefined) => void;\ntype DefaultResolve = (state: unknown, callback: CB) => void;\n\n// Despite being absolutely riddled with way-too-powerful tap points,\n// webpack still doesn't succeed in making it possible to provide a\n// fallback to the default resolve hook in the NormalModuleFactory. So\n// instead we will find the default behavior and call it from our own tap,\n// giving us a chance to handle its failures.\nfunction getDefaultResolveHook(taps: { name: string; fn: Function }[]): DefaultResolve {\n let { fn } = taps.find(t => t.name === 'NormalModuleFactory')!;\n return fn as DefaultResolve;\n}\n\n// This converts the raw function we got out of webpack into the right interface\n// for use by @embroider/core's resolver.\nfunction getAdaptedResolve(\n defaultResolve: DefaultResolve\n): ResolverFunction<WebpackModuleRequest, Resolution<Module, null | Error>> {\n return function (request: WebpackModuleRequest): Promise<Resolution<Module, null | Error>> {\n return new Promise(resolve => {\n if (request.isNotFound) {\n // TODO: we can make sure this looks correct in webpack output when a\n // user encounters it\n let err = new Error(`module not found ${request.specifier}`);\n (err as any).code = 'MODULE_NOT_FOUND';\n resolve({ type: 'not_found', err });\n }\n defaultResolve(request.toWebpackResolveData(), (err, value) => {\n if (err) {\n // unfortunately webpack doesn't let us distinguish between Not Found\n // and other unexpected exceptions here.\n resolve({ type: 'not_found', err });\n } else {\n resolve({ type: 'found', result: value! });\n }\n });\n });\n };\n}\n\ntype ExtendedResolveData = ResolveData & {\n contextInfo: ResolveData['contextInfo'] & { _embroiderMeta?: Record<string, any> };\n};\n\nclass WebpackModuleRequest implements ModuleRequest {\n static from(\n state: ExtendedResolveData,\n babelLoaderPrefix: string,\n appRoot: string\n ): WebpackModuleRequest | undefined {\n let specifier = state.request;\n if (\n specifier.includes(virtualLoaderName) || // prevents recursion on requests we have already sent to our virtual loader\n specifier.startsWith('!') // ignores internal webpack resolvers\n ) {\n return;\n }\n\n let fromFile: string | undefined;\n if (state.contextInfo.issuer) {\n fromFile = state.contextInfo.issuer;\n } else {\n // when the files emitted from our virtual-loader try to import things,\n // those requests show in webpack as having no issuer. But we can see here\n // which requests they are and adjust the issuer so they resolve things from\n // the correct logical place.\n for (let dep of state.dependencies) {\n let match = virtualRequestPattern.exec((dep as any)._parentModule?.userRequest);\n if (match) {\n fromFile = new URLSearchParams(match.groups!.query).get('f')!;\n break;\n }\n }\n }\n if (!fromFile) {\n return;\n }\n\n return new WebpackModuleRequest(\n babelLoaderPrefix,\n appRoot,\n specifier,\n fromFile,\n state.contextInfo._embroiderMeta,\n false,\n false,\n state\n );\n }\n\n private constructor(\n private babelLoaderPrefix: string,\n private appRoot: string,\n readonly specifier: string,\n readonly fromFile: string,\n readonly meta: Record<string, any> | undefined,\n readonly isVirtual: boolean,\n readonly isNotFound: boolean,\n private originalState: ExtendedResolveData\n ) {}\n\n get debugType() {\n return 'webpack';\n }\n\n // Webpack mostly relies on mutation to adjust requests. We could create a\n // whole new ResolveData instead, and that would allow defaultResolving to\n // happen, but for the output of that process to actually affect the\n // downstream code in Webpack we would still need to mutate the original\n // ResolveData with the results (primarily the `createData`). So since we\n // cannot avoid the mutation anyway, it seems best to do it earlier rather\n // than later, so that everything from here forward is \"normal\".\n //\n // Technically a NormalModuleLoader `resolve` hook *can* directly return a\n // Module, but that is not how the stock one works, and it would force us to\n // copy more of Webpack's default behaviors into the inside of our hook. Like,\n // we would need to invoke afterResolve, createModule, createModuleClass, etc,\n // just like webpack does if we wanted to produce a Module directly.\n //\n // So the mutation strategy is much less intrusive, even though it means there\n // is the risk of state leakage all over the place.\n //\n // We mitigate that risk by waiting until the last possible moment to apply\n // our desired ModuleRequest fields to the ResolveData. This means that as\n // requests evolve through the module-resolver they aren't actually all\n // mutating the shared state. Only when a request is allowed to bubble back\n // out to webpack does that happen.\n toWebpackResolveData(): ExtendedResolveData {\n this.originalState.request = this.specifier;\n this.originalState.context = dirname(this.fromFile);\n this.originalState.contextInfo.issuer = this.fromFile;\n this.originalState.contextInfo._embroiderMeta = this.meta;\n return this.originalState;\n }\n\n alias(newSpecifier: string) {\n if (newSpecifier === this.specifier) {\n return this;\n }\n return new WebpackModuleRequest(\n this.babelLoaderPrefix,\n this.appRoot,\n newSpecifier,\n this.fromFile,\n this.meta,\n this.isVirtual,\n false,\n this.originalState\n ) as this;\n }\n rehome(newFromFile: string) {\n if (this.fromFile === newFromFile) {\n return this;\n }\n return new WebpackModuleRequest(\n this.babelLoaderPrefix,\n this.appRoot,\n this.specifier,\n newFromFile,\n this.meta,\n this.isVirtual,\n false,\n this.originalState\n ) as this;\n }\n virtualize(filename: string) {\n let params = new URLSearchParams();\n params.set('f', filename);\n params.set('a', this.appRoot);\n return new WebpackModuleRequest(\n this.babelLoaderPrefix,\n this.appRoot,\n `${this.babelLoaderPrefix}${virtualLoaderName}?${params.toString()}!`,\n this.fromFile,\n this.meta,\n true,\n false,\n this.originalState\n ) as this;\n }\n withMeta(meta: Record<string, any> | undefined): this {\n return new WebpackModuleRequest(\n this.babelLoaderPrefix,\n this.appRoot,\n this.specifier,\n this.fromFile,\n meta,\n this.isVirtual,\n this.isNotFound,\n this.originalState\n ) as this;\n }\n notFound(): this {\n return new WebpackModuleRequest(\n this.babelLoaderPrefix,\n this.appRoot,\n this.specifier,\n this.fromFile,\n this.meta,\n this.isVirtual,\n true,\n this.originalState\n ) as this;\n }\n}\n"]}
1
+ {"version":3,"file":"webpack-resolver-plugin.js","sourceRoot":"","sources":["webpack-resolver-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { dirname, resolve } from 'path';\nimport type { ModuleRequest, Resolution } from '@embroider/core';\nimport { Resolver as EmbroiderResolver, ResolverOptions as EmbroiderResolverOptions } from '@embroider/core';\nimport type { Compiler, Module, ResolveData } from 'webpack';\nimport assertNever from 'assert-never';\nimport escapeRegExp from 'escape-string-regexp';\n\nexport { EmbroiderResolverOptions as Options };\n\nconst virtualLoaderName = '@embroider/webpack/src/virtual-loader';\nconst virtualLoaderPath = resolve(__dirname, './virtual-loader.js');\nconst virtualRequestPattern = new RegExp(`${escapeRegExp(virtualLoaderPath)}\\\\?(?<query>.+)!`);\n\nexport class EmbroiderPlugin {\n #resolver: EmbroiderResolver;\n #babelLoaderPrefix: string;\n #appRoot: string;\n\n constructor(opts: EmbroiderResolverOptions, babelLoaderPrefix: string) {\n this.#resolver = new EmbroiderResolver(opts);\n this.#babelLoaderPrefix = babelLoaderPrefix;\n this.#appRoot = opts.appRoot;\n }\n\n #addLoaderAlias(compiler: Compiler, name: string, alias: string) {\n let { resolveLoader } = compiler.options;\n if (Array.isArray(resolveLoader.alias)) {\n resolveLoader.alias.push({ name, alias });\n } else if (resolveLoader.alias) {\n resolveLoader.alias[name] = alias;\n } else {\n resolveLoader.alias = {\n [name]: alias,\n };\n }\n }\n\n apply(compiler: Compiler) {\n this.#addLoaderAlias(compiler, virtualLoaderName, virtualLoaderPath);\n\n compiler.hooks.normalModuleFactory.tap('@embroider/webpack', nmf => {\n let defaultResolve = getDefaultResolveHook(nmf.hooks.resolve.taps);\n\n nmf.hooks.resolve.tapAsync(\n { name: '@embroider/webpack', stage: 50 },\n (state: ExtendedResolveData, callback: CB) => {\n let request = WebpackModuleRequest.from(defaultResolve, state, this.#babelLoaderPrefix, this.#appRoot);\n if (!request) {\n defaultResolve(state, callback);\n return;\n }\n\n this.#resolver.resolve(request).then(\n resolution => {\n switch (resolution.type) {\n case 'not_found':\n callback(resolution.err);\n break;\n case 'found':\n case 'ignored':\n callback(null, undefined);\n break;\n default:\n throw assertNever(resolution);\n }\n },\n err => callback(err)\n );\n }\n );\n });\n }\n}\n\ninterface CB {\n (err: null, result: Module | undefined): void;\n (err: Error | null): void;\n}\ntype DefaultResolve = (state: ResolveData, callback: CB) => void;\n\n// Despite being absolutely riddled with way-too-powerful tap points,\n// webpack still doesn't succeed in making it possible to provide a\n// fallback to the default resolve hook in the NormalModuleFactory. So\n// instead we will find the default behavior and call it from our own tap,\n// giving us a chance to handle its failures.\nfunction getDefaultResolveHook(taps: { name: string; fn: Function }[]): DefaultResolve {\n let { fn } = taps.find(t => t.name === 'NormalModuleFactory')!;\n return fn as DefaultResolve;\n}\n\ntype ExtendedResolveData = ResolveData & {\n contextInfo: ResolveData['contextInfo'] & { _embroiderMeta?: Record<string, any> };\n};\n\ntype WebpackResolution = Resolution<ResolveData['createData'], null | Error>;\n\nclass WebpackModuleRequest implements ModuleRequest {\n static from(\n resolveFunction: DefaultResolve,\n state: ExtendedResolveData,\n babelLoaderPrefix: string,\n appRoot: string\n ): WebpackModuleRequest | undefined {\n let specifier = state.request;\n if (\n specifier.includes(virtualLoaderName) || // prevents recursion on requests we have already sent to our virtual loader\n specifier.startsWith('!') // ignores internal webpack resolvers\n ) {\n return;\n }\n\n let fromFile: string | undefined;\n if (state.contextInfo.issuer) {\n fromFile = state.contextInfo.issuer;\n } else {\n // when the files emitted from our virtual-loader try to import things,\n // those requests show in webpack as having no issuer. But we can see here\n // which requests they are and adjust the issuer so they resolve things from\n // the correct logical place.\n for (let dep of state.dependencies) {\n let match = virtualRequestPattern.exec((dep as any)._parentModule?.userRequest);\n if (match) {\n fromFile = new URLSearchParams(match.groups!.query).get('f')!;\n break;\n }\n }\n }\n if (!fromFile) {\n return;\n }\n\n return new WebpackModuleRequest(\n resolveFunction,\n babelLoaderPrefix,\n appRoot,\n specifier,\n fromFile,\n state.contextInfo._embroiderMeta,\n false,\n false,\n undefined,\n state\n );\n }\n\n private constructor(\n private resolveFunction: DefaultResolve,\n private babelLoaderPrefix: string,\n private appRoot: string,\n readonly specifier: string,\n readonly fromFile: string,\n readonly meta: Record<string, any> | undefined,\n readonly isVirtual: boolean,\n readonly isNotFound: boolean,\n readonly resolvedTo: WebpackResolution | undefined,\n private originalState: ExtendedResolveData\n ) {}\n\n get debugType() {\n return 'webpack';\n }\n\n // Webpack mostly relies on mutation to adjust requests. We could create a\n // whole new ResolveData instead, and that would allow defaultResolving to\n // happen, but for the output of that process to actually affect the\n // downstream code in Webpack we would still need to mutate the original\n // ResolveData with the results (primarily the `createData`). So since we\n // cannot avoid the mutation anyway, it seems best to do it earlier rather\n // than later, so that everything from here forward is \"normal\".\n //\n // Technically a NormalModuleLoader `resolve` hook *can* directly return a\n // Module, but that is not how the stock one works, and it would force us to\n // copy more of Webpack's default behaviors into the inside of our hook. Like,\n // we would need to invoke afterResolve, createModule, createModuleClass, etc,\n // just like webpack does if we wanted to produce a Module directly.\n //\n // So the mutation strategy is much less intrusive, even though it means there\n // is the risk of state leakage all over the place.\n //\n // We mitigate that risk by waiting until the last possible moment to apply\n // our desired ModuleRequest fields to the ResolveData. This means that as\n // requests evolve through the module-resolver they aren't actually all\n // mutating the shared state. Only when a request is allowed to bubble back\n // out to webpack does that happen.\n toWebpackResolveData(): ExtendedResolveData {\n this.originalState.request = this.specifier;\n this.originalState.context = dirname(this.fromFile);\n this.originalState.contextInfo.issuer = this.fromFile;\n this.originalState.contextInfo._embroiderMeta = this.meta;\n if (this.resolvedTo) {\n if (this.resolvedTo.type === 'found') {\n this.originalState.createData = this.resolvedTo.result;\n }\n }\n return this.originalState;\n }\n\n alias(newSpecifier: string) {\n if (newSpecifier === this.specifier) {\n return this;\n }\n return new WebpackModuleRequest(\n this.resolveFunction,\n this.babelLoaderPrefix,\n this.appRoot,\n newSpecifier,\n this.fromFile,\n this.meta,\n this.isVirtual,\n false,\n undefined,\n this.originalState\n ) as this;\n }\n rehome(newFromFile: string) {\n if (this.fromFile === newFromFile) {\n return this;\n }\n return new WebpackModuleRequest(\n this.resolveFunction,\n this.babelLoaderPrefix,\n this.appRoot,\n this.specifier,\n newFromFile,\n this.meta,\n this.isVirtual,\n false,\n undefined,\n this.originalState\n ) as this;\n }\n virtualize(filename: string) {\n let params = new URLSearchParams();\n params.set('f', filename);\n params.set('a', this.appRoot);\n return new WebpackModuleRequest(\n this.resolveFunction,\n this.babelLoaderPrefix,\n this.appRoot,\n `${this.babelLoaderPrefix}${virtualLoaderName}?${params.toString()}!`,\n this.fromFile,\n this.meta,\n true,\n false,\n undefined,\n this.originalState\n ) as this;\n }\n withMeta(meta: Record<string, any> | undefined): this {\n return new WebpackModuleRequest(\n this.resolveFunction,\n this.babelLoaderPrefix,\n this.appRoot,\n this.specifier,\n this.fromFile,\n meta,\n this.isVirtual,\n this.isNotFound,\n this.resolvedTo,\n this.originalState\n ) as this;\n }\n notFound(): this {\n return new WebpackModuleRequest(\n this.resolveFunction,\n this.babelLoaderPrefix,\n this.appRoot,\n this.specifier,\n this.fromFile,\n this.meta,\n this.isVirtual,\n true,\n undefined,\n this.originalState\n ) as this;\n }\n\n resolveTo(resolution: WebpackResolution): this {\n return new WebpackModuleRequest(\n this.resolveFunction,\n this.babelLoaderPrefix,\n this.appRoot,\n this.specifier,\n this.fromFile,\n this.meta,\n this.isVirtual,\n this.isNotFound,\n resolution,\n this.originalState\n ) as this;\n }\n\n async defaultResolve(): Promise<WebpackResolution> {\n if (this.isNotFound) {\n // TODO: we can make sure this looks correct in webpack output when a\n // user encounters it\n let err = new Error(`module not found ${this.specifier}`);\n (err as any).code = 'MODULE_NOT_FOUND';\n return { type: 'not_found', err };\n }\n return await new Promise(resolve =>\n this.resolveFunction(this.toWebpackResolveData(), err => {\n if (err) {\n // unfortunately webpack doesn't let us distinguish between Not Found\n // and other unexpected exceptions here.\n resolve({ type: 'not_found', err });\n } else {\n resolve({\n type: 'found',\n result: this.originalState.createData,\n isVirtual: this.isVirtual,\n filename: this.originalState.createData.resource!,\n });\n }\n })\n );\n }\n}\n"]}