@embroider/webpack 4.0.9-unstable.57e628d → 4.0.9-unstable.6caeed4

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": "4.0.9-unstable.57e628d",
3
+ "version": "4.0.9-unstable.6caeed4",
4
4
  "private": false,
5
5
  "description": "Builds EmberJS apps with Webpack",
6
6
  "repository": {
@@ -36,9 +36,9 @@
36
36
  "supports-color": "^8.1.0",
37
37
  "terser": "^5.7.0",
38
38
  "thread-loader": "^3.0.4",
39
- "@embroider/babel-loader-9": "3.1.2-unstable.57e628d",
40
- "@embroider/hbs-loader": "3.0.4-unstable.57e628d",
41
- "@embroider/shared-internals": "2.8.2-unstable.57e628d"
39
+ "@embroider/babel-loader-9": "3.1.2-unstable.6caeed4",
40
+ "@embroider/hbs-loader": "3.0.4-unstable.6caeed4",
41
+ "@embroider/shared-internals": "2.8.2-unstable.6caeed4"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@types/csso": "^3.5.1",
@@ -50,11 +50,11 @@
50
50
  "@types/semver": "^7.3.6",
51
51
  "typescript": "^5.4.5",
52
52
  "webpack": "^5.38.1",
53
- "@embroider/core": "^3.4.20-unstable.57e628d"
53
+ "@embroider/core": "^3.4.20-unstable.6caeed4"
54
54
  },
55
55
  "peerDependencies": {
56
56
  "webpack": "^5.0.0",
57
- "@embroider/core": "^3.4.20-unstable.57e628d"
57
+ "@embroider/core": "^3.4.20-unstable.6caeed4"
58
58
  },
59
59
  "engines": {
60
60
  "node": "12.* || 14.* || >= 16"
@@ -159,11 +159,11 @@ class WebpackRequestAdapter {
159
159
  // requests evolve through the module-resolver they aren't actually all
160
160
  // mutating the shared state. Only when a request is allowed to bubble back
161
161
  // out to webpack does that happen.
162
- toWebpackResolveData(request) {
162
+ toWebpackResolveData(request, virtualFileName) {
163
163
  let specifier = request.specifier;
164
- if (request.isVirtual) {
164
+ if (virtualFileName) {
165
165
  let params = new URLSearchParams();
166
- params.set('f', specifier);
166
+ params.set('f', virtualFileName);
167
167
  params.set('a', this.appRoot);
168
168
  specifier = `${this.babelLoaderPrefix}${virtualLoaderName}?${params.toString()}!`;
169
169
  }
@@ -171,22 +171,28 @@ class WebpackRequestAdapter {
171
171
  this.originalState.context = (0, path_1.dirname)(request.fromFile);
172
172
  this.originalState.contextInfo.issuer = request.fromFile;
173
173
  this.originalState.contextInfo._embroiderMeta = request.meta;
174
- if (request.resolvedTo) {
174
+ if (request.resolvedTo && typeof request.resolvedTo !== 'function') {
175
175
  if (request.resolvedTo.type === 'found') {
176
176
  this.originalState.createData = request.resolvedTo.result;
177
177
  }
178
178
  }
179
179
  return this.originalState;
180
180
  }
181
+ notFoundResponse(request) {
182
+ let err = new Error(`module not found ${request.specifier}`);
183
+ err.code = 'MODULE_NOT_FOUND';
184
+ return { type: 'not_found', err };
185
+ }
186
+ virtualResponse(request, virtualFileName) {
187
+ return () => {
188
+ return this._resolve(request, virtualFileName);
189
+ };
190
+ }
181
191
  async resolve(request) {
182
- if (request.isNotFound) {
183
- // TODO: we can make sure this looks correct in webpack output when a
184
- // user encounters it
185
- let err = new Error(`module not found ${request.specifier}`);
186
- err.code = 'MODULE_NOT_FOUND';
187
- return { type: 'not_found', err };
188
- }
189
- return await new Promise(resolve => this.resolveFunction(this.toWebpackResolveData(request), err => {
192
+ return this._resolve(request, undefined);
193
+ }
194
+ async _resolve(request, virtualFileName) {
195
+ return await new Promise(resolve => this.resolveFunction(this.toWebpackResolveData(request, virtualFileName), err => {
190
196
  if (err) {
191
197
  // unfortunately webpack doesn't let us distinguish between Not Found
192
198
  // and other unexpected exceptions here.
@@ -196,7 +202,7 @@ class WebpackRequestAdapter {
196
202
  resolve({
197
203
  type: 'found',
198
204
  result: this.originalState.createData,
199
- isVirtual: request.isVirtual,
205
+ isVirtual: Boolean(virtualFileName),
200
206
  filename: this.originalState.createData.resource,
201
207
  });
202
208
  }
@@ -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 { ModuleRequest, type RequestAdapter, type 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 = ModuleRequest.create(WebpackRequestAdapter.create, {\n resolveFunction: defaultResolve,\n state,\n babelLoaderPrefix: this.#babelLoaderPrefix,\n appRoot: this.#appRoot,\n });\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 WebpackRequestAdapter implements RequestAdapter<WebpackResolution> {\n static create({\n resolveFunction,\n state,\n babelLoaderPrefix,\n appRoot,\n }: {\n resolveFunction: DefaultResolve;\n state: ExtendedResolveData;\n babelLoaderPrefix: string;\n appRoot: string;\n }) {\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 {\n initialState: {\n specifier,\n fromFile,\n meta: state.contextInfo._embroiderMeta,\n },\n adapter: new WebpackRequestAdapter(resolveFunction, babelLoaderPrefix, appRoot, state),\n };\n }\n\n private constructor(\n private resolveFunction: DefaultResolve,\n private babelLoaderPrefix: string,\n private appRoot: string,\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(request: ModuleRequest<WebpackResolution>): ExtendedResolveData {\n let specifier = request.specifier;\n if (request.isVirtual) {\n let params = new URLSearchParams();\n params.set('f', specifier);\n params.set('a', this.appRoot);\n specifier = `${this.babelLoaderPrefix}${virtualLoaderName}?${params.toString()}!`;\n }\n\n this.originalState.request = specifier;\n this.originalState.context = dirname(request.fromFile);\n this.originalState.contextInfo.issuer = request.fromFile;\n this.originalState.contextInfo._embroiderMeta = request.meta;\n if (request.resolvedTo) {\n if (request.resolvedTo.type === 'found') {\n this.originalState.createData = request.resolvedTo.result;\n }\n }\n return this.originalState;\n }\n\n async resolve(request: ModuleRequest<WebpackResolution>): Promise<WebpackResolution> {\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 return { type: 'not_found', err };\n }\n return await new Promise(resolve =>\n this.resolveFunction(this.toWebpackResolveData(request), 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: request.isVirtual,\n filename: this.originalState.createData.resource!,\n });\n }\n })\n );\n }\n}\n"]}
1
+ {"version":3,"file":"webpack-resolver-plugin.js","sourceRoot":"","sources":["webpack-resolver-plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,+BAAwC;AACxC,0CAAsF;AACtF,0CAA6G;AAE7G,gEAAuC;AACvC,gFAAgD;AAIhD,MAAM,iBAAiB,GAAG,uCAAuC,CAAC;AAClE,MAAM,iBAAiB,GAAG,IAAA,cAAO,EAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;AACpE,MAAM,qBAAqB,GAAG,IAAI,MAAM,CAAC,GAAG,IAAA,8BAAY,EAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;AAE/F,MAAa,eAAe;IAK1B,YAAY,IAA8B,EAAE,iBAAyB;;QAJrE,4CAA6B;QAC7B,qDAA2B;QAC3B,2CAAiB;QAGf,uBAAA,IAAI,6BAAa,IAAI,eAAiB,CAAC,IAAI,CAAC,MAAA,CAAC;QAC7C,uBAAA,IAAI,sCAAsB,iBAAiB,MAAA,CAAC;QAC5C,uBAAA,IAAI,4BAAY,IAAI,CAAC,OAAO,MAAA,CAAC;IAC/B,CAAC;IAeD,KAAK,CAAC,QAAkB;QACtB,uBAAA,IAAI,mEAAgB,MAApB,IAAI,EAAiB,QAAQ,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;QAErE,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,oBAAoB,EAAE,GAAG,CAAC,EAAE;YACjE,IAAI,cAAc,GAAG,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAEnE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CACxB,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,EAAE,EAAE,EACzC,CAAC,KAA0B,EAAE,QAAY,EAAE,EAAE;gBAC3C,IAAI,OAAO,GAAG,oBAAa,CAAC,MAAM,CAAC,qBAAqB,CAAC,MAAM,EAAE;oBAC/D,eAAe,EAAE,cAAc;oBAC/B,KAAK;oBACL,iBAAiB,EAAE,uBAAA,IAAI,0CAAmB;oBAC1C,OAAO,EAAE,uBAAA,IAAI,gCAAS;iBACvB,CAAC,CAAC;gBACH,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;oBAChC,OAAO;gBACT,CAAC;gBAED,uBAAA,IAAI,iCAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAClC,UAAU,CAAC,EAAE;oBACX,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;wBACxB,KAAK,WAAW;4BACd,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;4BACzB,MAAM;wBACR,KAAK,OAAO,CAAC;wBACb,KAAK,SAAS;4BACZ,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;4BAC1B,MAAM;wBACR;4BACE,MAAM,IAAA,sBAAW,EAAC,UAAU,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC,EACD,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CACrB,CAAC;YACJ,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAhED,0CAgEC;gQArDiB,QAAkB,EAAE,IAAY,EAAE,KAAa;IAC7D,IAAI,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC;IACzC,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5C,CAAC;SAAM,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;QAC/B,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,aAAa,CAAC,KAAK,GAAG;YACpB,CAAC,IAAI,CAAC,EAAE,KAAK;SACd,CAAC;IACJ,CAAC;AACH,CAAC;AAkDH,qEAAqE;AACrE,mEAAmE;AACnE,sEAAsE;AACtE,0EAA0E;AAC1E,6CAA6C;AAC7C,SAAS,qBAAqB,CAAC,IAAsC;IACnE,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAqB,CAAE,CAAC;IAC/D,OAAO,EAAoB,CAAC;AAC9B,CAAC;AAQD,MAAM,qBAAqB;IACzB,MAAM,CAAC,MAAM,CAAC,EACZ,eAAe,EACf,KAAK,EACL,iBAAiB,EACjB,OAAO,GAMR;;QACC,IAAI,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,IACE,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,4EAA4E;YACrH,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,qCAAqC;UAC/D,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,QAA4B,CAAC;QACjC,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YAC7B,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,uEAAuE;YACvE,0EAA0E;YAC1E,4EAA4E;YAC5E,6BAA6B;YAC7B,KAAK,IAAI,GAAG,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBACnC,IAAI,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAC,GAAW,CAAC,aAAa,0CAAE,WAAW,CAAC,CAAC;gBAChF,IAAI,KAAK,EAAE,CAAC;oBACV,QAAQ,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,MAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;oBAC9D,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,OAAO;YACL,YAAY,EAAE;gBACZ,SAAS;gBACT,QAAQ;gBACR,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,cAAc;aACvC;YACD,OAAO,EAAE,IAAI,qBAAqB,CAAC,eAAe,EAAE,iBAAiB,EAAE,OAAO,EAAE,KAAK,CAAC;SACvF,CAAC;IACJ,CAAC;IAED,YACU,eAA+B,EAC/B,iBAAyB,EACzB,OAAe,EACf,aAAkC;QAHlC,oBAAe,GAAf,eAAe,CAAgB;QAC/B,sBAAiB,GAAjB,iBAAiB,CAAQ;QACzB,YAAO,GAAP,OAAO,CAAQ;QACf,kBAAa,GAAb,aAAa,CAAqB;IACzC,CAAC;IAEJ,IAAI,SAAS;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,0EAA0E;IAC1E,0EAA0E;IAC1E,oEAAoE;IACpE,wEAAwE;IACxE,yEAAyE;IACzE,0EAA0E;IAC1E,gEAAgE;IAChE,EAAE;IACF,0EAA0E;IAC1E,4EAA4E;IAC5E,8EAA8E;IAC9E,8EAA8E;IAC9E,oEAAoE;IACpE,EAAE;IACF,8EAA8E;IAC9E,mDAAmD;IACnD,EAAE;IACF,2EAA2E;IAC3E,0EAA0E;IAC1E,uEAAuE;IACvE,2EAA2E;IAC3E,mCAAmC;IACnC,oBAAoB,CAClB,OAAyC,EACzC,eAAmC;QAEnC,IAAI,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAClC,IAAI,eAAe,EAAE,CAAC;YACpB,IAAI,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,SAAS,GAAG,GAAG,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,IAAI,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC;QACpF,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,OAAO,GAAG,SAAS,CAAC;QACvC,IAAI,CAAC,aAAa,CAAC,OAAO,GAAG,IAAA,cAAO,EAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;QACzD,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;QAC7D,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;YACnE,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACxC,IAAI,CAAC,aAAa,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;YAC5D,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,gBAAgB,CAAC,OAAyC;QACxD,IAAI,GAAG,GAAG,IAAI,KAAK,CAAC,oBAAoB,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAC5D,GAAW,CAAC,IAAI,GAAG,kBAAkB,CAAC;QACvC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;IACpC,CAAC;IAED,eAAe,CACb,OAAyC,EACzC,eAAuB;QAEvB,OAAO,GAAG,EAAE;YACV,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QACjD,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAyC;QACrD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,OAAyC,EACzC,eAAmC;QAEnC,OAAO,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CACjC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,GAAG,CAAC,EAAE;YAC9E,IAAI,GAAG,EAAE,CAAC;gBACR,qEAAqE;gBACrE,wCAAwC;gBACxC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC;oBACN,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,UAAU;oBACrC,SAAS,EAAE,OAAO,CAAC,eAAe,CAAC;oBACnC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,QAAS;iBAClD,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;CACF","sourcesContent":["import { dirname, resolve } from 'path';\nimport { ModuleRequest, type RequestAdapter, type 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 = ModuleRequest.create(WebpackRequestAdapter.create, {\n resolveFunction: defaultResolve,\n state,\n babelLoaderPrefix: this.#babelLoaderPrefix,\n appRoot: this.#appRoot,\n });\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 WebpackRequestAdapter implements RequestAdapter<WebpackResolution> {\n static create({\n resolveFunction,\n state,\n babelLoaderPrefix,\n appRoot,\n }: {\n resolveFunction: DefaultResolve;\n state: ExtendedResolveData;\n babelLoaderPrefix: string;\n appRoot: string;\n }) {\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 {\n initialState: {\n specifier,\n fromFile,\n meta: state.contextInfo._embroiderMeta,\n },\n adapter: new WebpackRequestAdapter(resolveFunction, babelLoaderPrefix, appRoot, state),\n };\n }\n\n private constructor(\n private resolveFunction: DefaultResolve,\n private babelLoaderPrefix: string,\n private appRoot: string,\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(\n request: ModuleRequest<WebpackResolution>,\n virtualFileName: string | undefined\n ): ExtendedResolveData {\n let specifier = request.specifier;\n if (virtualFileName) {\n let params = new URLSearchParams();\n params.set('f', virtualFileName);\n params.set('a', this.appRoot);\n specifier = `${this.babelLoaderPrefix}${virtualLoaderName}?${params.toString()}!`;\n }\n\n this.originalState.request = specifier;\n this.originalState.context = dirname(request.fromFile);\n this.originalState.contextInfo.issuer = request.fromFile;\n this.originalState.contextInfo._embroiderMeta = request.meta;\n if (request.resolvedTo && typeof request.resolvedTo !== 'function') {\n if (request.resolvedTo.type === 'found') {\n this.originalState.createData = request.resolvedTo.result;\n }\n }\n return this.originalState;\n }\n\n notFoundResponse(request: ModuleRequest<WebpackResolution>): WebpackResolution {\n let err = new Error(`module not found ${request.specifier}`);\n (err as any).code = 'MODULE_NOT_FOUND';\n return { type: 'not_found', err };\n }\n\n virtualResponse(\n request: ModuleRequest<WebpackResolution>,\n virtualFileName: string\n ): () => Promise<WebpackResolution> {\n return () => {\n return this._resolve(request, virtualFileName);\n };\n }\n\n async resolve(request: ModuleRequest<WebpackResolution>): Promise<WebpackResolution> {\n return this._resolve(request, undefined);\n }\n\n async _resolve(\n request: ModuleRequest<WebpackResolution>,\n virtualFileName: string | undefined\n ): Promise<WebpackResolution> {\n return await new Promise(resolve =>\n this.resolveFunction(this.toWebpackResolveData(request, virtualFileName), 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: Boolean(virtualFileName),\n filename: this.originalState.createData.resource!,\n });\n }\n })\n );\n }\n}\n"]}