@wyw-in-js/webpack-loader 1.0.5 → 1.0.7

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/esm/index.js CHANGED
@@ -28,21 +28,30 @@ const getResolverKey = (importer, stack) => {
28
28
  const root = stack.length ? stack[stack.length - 1] : importer;
29
29
  return stripQueryAndHash(root);
30
30
  };
31
- const asyncResolve = (what, importer, stack = [importer]) => {
32
- const resolver = resolvers[getResolverKey(importer, stack)];
33
- if (!resolver || resolver.length === 0) {
34
- throw new Error('No resolver found');
35
- }
36
-
37
- // Every resolver should return the same result, but we need to call all of them
38
- // to ensure that all side effects are executed (e.g. adding dependencies)
39
- return Promise.all(resolver.map(r => r(what, importer, stack))).then(results => {
40
- const firstResult = results[0];
41
- if (results.some(r => r !== firstResult)) {
42
- throw new Error('Resolvers returned different results');
31
+ const getActiveResolvers = key => {
32
+ const entries = resolvers[key];
33
+ return entries?.length ? entries : [];
34
+ };
35
+ const createAsyncResolve = resourcePath => {
36
+ const currentResolverKey = stripQueryAndHash(resourcePath);
37
+ return (what, importer, stack = [importer]) => {
38
+ const rootResolverKey = getResolverKey(importer, stack);
39
+ const rootResolvers = getActiveResolvers(rootResolverKey);
40
+ const resolver = rootResolvers.length > 0 ? rootResolvers : getActiveResolvers(currentResolverKey);
41
+ if (resolver.length === 0) {
42
+ throw new Error('No resolver found');
43
43
  }
44
- return firstResult;
45
- });
44
+
45
+ // Every resolver should return the same result, but we need to call all of them
46
+ // to ensure that all side effects are executed (e.g. adding dependencies)
47
+ return Promise.all(resolver.map(r => r(what, importer, stack))).then(results => {
48
+ const firstResult = results[0];
49
+ if (results.some(r => r !== firstResult)) {
50
+ throw new Error('Resolvers returned different results');
51
+ }
52
+ return firstResult;
53
+ });
54
+ };
46
55
  };
47
56
  function addResolver(resourcePath, resolver) {
48
57
  if (!resolvers[resourcePath]) {
@@ -110,6 +119,7 @@ const webpack5Loader = function webpack5LoaderPlugin(content, inputSourceMap) {
110
119
  return result;
111
120
  });
112
121
  });
122
+ const asyncResolve = createAsyncResolve(this.resourcePath);
113
123
  logger('loader %s', this.resourcePath);
114
124
  const {
115
125
  sourceMap = undefined,
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["path","crypto","logger","transform","TransformCacheCollection","sharedState","getCacheInstance","registerCacheProvider","WYWinJSDebugPlugin","outputCssLoader","require","resolve","stripQueryAndHash","request","queryIdx","indexOf","hashIdx","slice","Math","min","hashText","text","createHash","update","digest","cache","resolvers","getResolverKey","importer","stack","root","length","asyncResolve","what","resolver","Error","Promise","all","map","r","then","results","firstResult","some","addResolver","resourcePath","push","filter","webpack5Loader","webpack5LoaderPlugin","content","inputSourceMap","convertSourceMap","value","filename","undefined","file","mappings","names","sources","version","async","resolveOptions","dependencyType","resolveModule","getResolve","isPromiseLike","resolveModuleAsync","context","reject","settled","finish","err","result","maybePromise","removeResolver","importerPath","isAbsolute","dirname","join","process","cwd","filePath","addDependency","sourceMap","preprocessor","keepComments","prefixer","extension","cssImport","cacheProvider","rest","getOptions","outputFileName","replace","transformServices","options","pluginOptions","emitWarning","message","eventEmitter","emitter","toString","cssText","Buffer","from","cssSourceMapText","dependencies","dep","cacheInstance","cacheProviderId","set","setDependencies","getDependencies","wywQuery","encodeURIComponent","hot","resourcePathWithQuery","stringifiedRequest","JSON","stringify","utils","contextify","rootContext","importCss","callback","code","catch","finally"],"sources":["../src/index.ts"],"sourcesContent":["/**\n * This file contains a Webpack loader for WYW-in-JS.\n * It uses the transform.ts function to generate class names from source code,\n * returns transformed code without template literals and attaches generated source maps\n */\n\nimport path from 'path';\nimport crypto from 'crypto';\n\nimport type { RawSourceMap } from 'source-map';\nimport type { RawLoaderDefinitionFunction } from 'webpack';\n\nimport { logger } from '@wyw-in-js/shared';\nimport type { PluginOptions, Preprocessor, Result } from '@wyw-in-js/transform';\nimport { transform, TransformCacheCollection } from '@wyw-in-js/transform';\n\nimport { sharedState } from './WYWinJSDebugPlugin';\nimport type { ICache } from './cache';\nimport { getCacheInstance, registerCacheProvider } from './cache';\n\nexport { WYWinJSDebugPlugin } from './WYWinJSDebugPlugin';\n\nconst outputCssLoader = require.resolve('./outputCssLoader');\n\nconst stripQueryAndHash = (request: string) => {\n const queryIdx = request.indexOf('?');\n const hashIdx = request.indexOf('#');\n\n if (queryIdx === -1) {\n return hashIdx === -1 ? request : request.slice(0, hashIdx);\n }\n if (hashIdx === -1) return request.slice(0, queryIdx);\n\n return request.slice(0, Math.min(queryIdx, hashIdx));\n};\n\nconst hashText = (text: string): string =>\n crypto.createHash('sha256').update(text).digest('hex').slice(0, 12);\n\nexport type LoaderOptions = {\n cacheProvider?: string | ICache;\n cssImport?: 'require' | 'import';\n extension?: string;\n keepComments?: boolean | RegExp;\n prefixer?: boolean;\n preprocessor?: Preprocessor;\n sourceMap?: boolean;\n} & Partial<PluginOptions>;\ntype Loader = RawLoaderDefinitionFunction<LoaderOptions>;\n\nconst cache = new TransformCacheCollection();\n\ntype Resolver = (\n what: string,\n importer: string,\n stack: string[]\n) => Promise<string>;\n\nconst resolvers: Record<string, Resolver[]> = {};\n\nconst getResolverKey = (importer: string, stack: string[]): string => {\n const root = stack.length ? stack[stack.length - 1] : importer;\n return stripQueryAndHash(root);\n};\n\nconst asyncResolve = (\n what: string,\n importer: string,\n stack: string[] = [importer]\n): Promise<string> => {\n const resolver = resolvers[getResolverKey(importer, stack)];\n if (!resolver || resolver.length === 0) {\n throw new Error('No resolver found');\n }\n\n // Every resolver should return the same result, but we need to call all of them\n // to ensure that all side effects are executed (e.g. adding dependencies)\n return Promise.all(resolver.map((r) => r(what, importer, stack))).then(\n (results) => {\n const firstResult = results[0];\n if (results.some((r) => r !== firstResult)) {\n throw new Error('Resolvers returned different results');\n }\n\n return firstResult;\n }\n );\n};\n\nfunction addResolver(resourcePath: string, resolver: Resolver) {\n if (!resolvers[resourcePath]) {\n resolvers[resourcePath] = [];\n }\n\n resolvers[resourcePath].push(resolver);\n\n return () => {\n resolvers[resourcePath] = resolvers[resourcePath].filter(\n (r) => r !== resolver\n );\n };\n}\n\nconst webpack5Loader: Loader = function webpack5LoaderPlugin(\n content,\n inputSourceMap\n) {\n function convertSourceMap(\n value: typeof inputSourceMap,\n filename: string\n ): RawSourceMap | undefined {\n if (typeof value === 'string' || !value) {\n return undefined;\n }\n\n return {\n ...value,\n file: value.file ?? filename,\n mappings: value.mappings ?? '',\n names: value.names ?? [],\n sources: value.sources ?? [],\n version: value.version ?? 3,\n };\n }\n\n // tell Webpack this loader is async\n this.async();\n\n const resolveOptions = { dependencyType: 'esm' };\n\n const resolveModule: (\n context: string,\n request: string,\n callback: (err: unknown, result: unknown) => void\n ) => unknown = this.getResolve(resolveOptions);\n\n const isPromiseLike = (value: unknown): value is Promise<unknown> =>\n typeof (value as { then?: unknown } | null)?.then === 'function';\n\n const resolveModuleAsync = (context: string, request: string) =>\n new Promise<string>((resolve, reject) => {\n let settled = false;\n const finish = (err: unknown, result: unknown) => {\n if (settled) return;\n settled = true;\n\n if (err) {\n reject(err);\n return;\n }\n\n if (typeof result === 'string') {\n resolve(result);\n return;\n }\n\n reject(new Error(`Cannot resolve ${request}`));\n };\n\n try {\n const maybePromise = resolveModule(context, request, finish);\n if (isPromiseLike(maybePromise)) {\n maybePromise.then(\n (result) => finish(null, result),\n (err) => finish(err, null)\n );\n }\n } catch (err) {\n finish(err, null);\n }\n });\n\n const removeResolver = addResolver(this.resourcePath, (what, importer) => {\n const importerPath = stripQueryAndHash(importer);\n const context = path.isAbsolute(importerPath)\n ? path.dirname(importerPath)\n : path.join(process.cwd(), path.dirname(importerPath));\n\n return resolveModuleAsync(context, what).then((result) => {\n const filePath = stripQueryAndHash(result);\n if (path.isAbsolute(filePath)) {\n this.addDependency(filePath);\n }\n\n return result;\n });\n });\n\n logger('loader %s', this.resourcePath);\n\n const {\n sourceMap = undefined,\n preprocessor = undefined,\n keepComments = undefined,\n prefixer = undefined,\n extension = '.wyw-in-js.css',\n cssImport = 'require',\n cacheProvider,\n ...rest\n } = this.getOptions() || {};\n\n const outputFileName = this.resourcePath.replace(/\\.[^.]+$/, extension);\n\n const transformServices = {\n options: {\n filename: this.resourcePath,\n inputSourceMap: convertSourceMap(inputSourceMap, this.resourcePath),\n pluginOptions: rest,\n prefixer,\n keepComments,\n preprocessor,\n root: process.cwd(),\n },\n cache,\n emitWarning: (message: string) => this.emitWarning(new Error(message)),\n eventEmitter: sharedState.emitter,\n };\n\n transform(transformServices, content.toString(), asyncResolve)\n .then(\n async (result: Result) => {\n try {\n if (result.cssText) {\n let { cssText } = result;\n\n if (sourceMap) {\n cssText += `/*# sourceMappingURL=data:application/json;base64,${Buffer.from(\n result.cssSourceMapText || ''\n ).toString('base64')}*/`;\n }\n\n await Promise.all(\n result.dependencies?.map((dep) =>\n asyncResolve(dep, this.resourcePath)\n ) ?? []\n );\n\n const cacheInstance = await getCacheInstance(cacheProvider);\n const cacheProviderId =\n cacheProvider && typeof cacheProvider === 'object'\n ? registerCacheProvider(cacheInstance)\n : '';\n\n await cacheInstance.set(this.resourcePath, cssText);\n\n await cacheInstance.setDependencies?.(\n this.resourcePath,\n this.getDependencies()\n );\n\n const wywQuery = [\n `wyw=${encodeURIComponent(extension.replace(/^\\./, ''))}`,\n ];\n\n if (this.hot) {\n wywQuery.push(`v=${encodeURIComponent(hashText(cssText))}`);\n }\n\n const resourcePathWithQuery = `${this.resourcePath}?${wywQuery.join(\n '&'\n )}`;\n\n const request = `${outputFileName}!=!${outputCssLoader}?cacheProvider=${encodeURIComponent(\n typeof cacheProvider === 'string' ? cacheProvider : ''\n )}&cacheProviderId=${encodeURIComponent(\n cacheProviderId\n )}!${resourcePathWithQuery}`;\n const stringifiedRequest = JSON.stringify(\n this.utils.contextify(this.context || this.rootContext, request)\n );\n\n const importCss =\n cssImport === 'import'\n ? `import ${stringifiedRequest};`\n : `require(${stringifiedRequest});`;\n\n this.callback(\n null,\n `${result.code}\\n\\n${importCss}`,\n result.sourceMap ?? undefined\n );\n\n return;\n }\n\n this.callback(null, result.code, result.sourceMap ?? undefined);\n } catch (err) {\n this.callback(err as Error);\n }\n },\n (err: Error) => {\n this.callback(err);\n }\n )\n .catch((err: Error) => this.callback(err))\n .finally(removeResolver);\n};\n\nexport default webpack5Loader;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["path","crypto","logger","transform","TransformCacheCollection","sharedState","getCacheInstance","registerCacheProvider","WYWinJSDebugPlugin","outputCssLoader","require","resolve","stripQueryAndHash","request","queryIdx","indexOf","hashIdx","slice","Math","min","hashText","text","createHash","update","digest","cache","resolvers","getResolverKey","importer","stack","root","length","getActiveResolvers","key","entries","createAsyncResolve","resourcePath","currentResolverKey","what","rootResolverKey","rootResolvers","resolver","Error","Promise","all","map","r","then","results","firstResult","some","addResolver","push","filter","webpack5Loader","webpack5LoaderPlugin","content","inputSourceMap","convertSourceMap","value","filename","undefined","file","mappings","names","sources","version","async","resolveOptions","dependencyType","resolveModule","getResolve","isPromiseLike","resolveModuleAsync","context","reject","settled","finish","err","result","maybePromise","removeResolver","importerPath","isAbsolute","dirname","join","process","cwd","filePath","addDependency","asyncResolve","sourceMap","preprocessor","keepComments","prefixer","extension","cssImport","cacheProvider","rest","getOptions","outputFileName","replace","transformServices","options","pluginOptions","emitWarning","message","eventEmitter","emitter","toString","cssText","Buffer","from","cssSourceMapText","dependencies","dep","cacheInstance","cacheProviderId","set","setDependencies","getDependencies","wywQuery","encodeURIComponent","hot","resourcePathWithQuery","stringifiedRequest","JSON","stringify","utils","contextify","rootContext","importCss","callback","code","catch","finally"],"sources":["../src/index.ts"],"sourcesContent":["/**\n * This file contains a Webpack loader for WYW-in-JS.\n * It uses the transform.ts function to generate class names from source code,\n * returns transformed code without template literals and attaches generated source maps\n */\n\nimport path from 'path';\nimport crypto from 'crypto';\n\nimport type { RawSourceMap } from 'source-map';\nimport type { RawLoaderDefinitionFunction } from 'webpack';\n\nimport { logger } from '@wyw-in-js/shared';\nimport type { PluginOptions, Preprocessor, Result } from '@wyw-in-js/transform';\nimport { transform, TransformCacheCollection } from '@wyw-in-js/transform';\n\nimport { sharedState } from './WYWinJSDebugPlugin';\nimport type { ICache } from './cache';\nimport { getCacheInstance, registerCacheProvider } from './cache';\n\nexport { WYWinJSDebugPlugin } from './WYWinJSDebugPlugin';\n\nconst outputCssLoader = require.resolve('./outputCssLoader');\n\nconst stripQueryAndHash = (request: string) => {\n const queryIdx = request.indexOf('?');\n const hashIdx = request.indexOf('#');\n\n if (queryIdx === -1) {\n return hashIdx === -1 ? request : request.slice(0, hashIdx);\n }\n if (hashIdx === -1) return request.slice(0, queryIdx);\n\n return request.slice(0, Math.min(queryIdx, hashIdx));\n};\n\nconst hashText = (text: string): string =>\n crypto.createHash('sha256').update(text).digest('hex').slice(0, 12);\n\nexport type LoaderOptions = {\n cacheProvider?: string | ICache;\n cssImport?: 'require' | 'import';\n extension?: string;\n keepComments?: boolean | RegExp;\n prefixer?: boolean;\n preprocessor?: Preprocessor;\n sourceMap?: boolean;\n} & Partial<PluginOptions>;\ntype Loader = RawLoaderDefinitionFunction<LoaderOptions>;\n\nconst cache = new TransformCacheCollection();\n\ntype Resolver = (\n what: string,\n importer: string,\n stack: string[]\n) => Promise<string>;\n\nconst resolvers: Record<string, Resolver[]> = {};\n\nconst getResolverKey = (importer: string, stack: string[]): string => {\n const root = stack.length ? stack[stack.length - 1] : importer;\n return stripQueryAndHash(root);\n};\n\nconst getActiveResolvers = (key: string): Resolver[] => {\n const entries = resolvers[key];\n return entries?.length ? entries : [];\n};\n\nconst createAsyncResolve = (resourcePath: string) => {\n const currentResolverKey = stripQueryAndHash(resourcePath);\n\n return (\n what: string,\n importer: string,\n stack: string[] = [importer]\n ): Promise<string> => {\n const rootResolverKey = getResolverKey(importer, stack);\n const rootResolvers = getActiveResolvers(rootResolverKey);\n const resolver =\n rootResolvers.length > 0\n ? rootResolvers\n : getActiveResolvers(currentResolverKey);\n\n if (resolver.length === 0) {\n throw new Error('No resolver found');\n }\n\n // Every resolver should return the same result, but we need to call all of them\n // to ensure that all side effects are executed (e.g. adding dependencies)\n return Promise.all(resolver.map((r) => r(what, importer, stack))).then(\n (results) => {\n const firstResult = results[0];\n if (results.some((r) => r !== firstResult)) {\n throw new Error('Resolvers returned different results');\n }\n\n return firstResult;\n }\n );\n };\n};\n\nfunction addResolver(resourcePath: string, resolver: Resolver) {\n if (!resolvers[resourcePath]) {\n resolvers[resourcePath] = [];\n }\n\n resolvers[resourcePath].push(resolver);\n\n return () => {\n resolvers[resourcePath] = resolvers[resourcePath].filter(\n (r) => r !== resolver\n );\n };\n}\n\nconst webpack5Loader: Loader = function webpack5LoaderPlugin(\n content,\n inputSourceMap\n) {\n function convertSourceMap(\n value: typeof inputSourceMap,\n filename: string\n ): RawSourceMap | undefined {\n if (typeof value === 'string' || !value) {\n return undefined;\n }\n\n return {\n ...value,\n file: value.file ?? filename,\n mappings: value.mappings ?? '',\n names: value.names ?? [],\n sources: value.sources ?? [],\n version: value.version ?? 3,\n };\n }\n\n // tell Webpack this loader is async\n this.async();\n\n const resolveOptions = { dependencyType: 'esm' };\n\n const resolveModule: (\n context: string,\n request: string,\n callback: (err: unknown, result: unknown) => void\n ) => unknown = this.getResolve(resolveOptions);\n\n const isPromiseLike = (value: unknown): value is Promise<unknown> =>\n typeof (value as { then?: unknown } | null)?.then === 'function';\n\n const resolveModuleAsync = (context: string, request: string) =>\n new Promise<string>((resolve, reject) => {\n let settled = false;\n const finish = (err: unknown, result: unknown) => {\n if (settled) return;\n settled = true;\n\n if (err) {\n reject(err);\n return;\n }\n\n if (typeof result === 'string') {\n resolve(result);\n return;\n }\n\n reject(new Error(`Cannot resolve ${request}`));\n };\n\n try {\n const maybePromise = resolveModule(context, request, finish);\n if (isPromiseLike(maybePromise)) {\n maybePromise.then(\n (result) => finish(null, result),\n (err) => finish(err, null)\n );\n }\n } catch (err) {\n finish(err, null);\n }\n });\n\n const removeResolver = addResolver(this.resourcePath, (what, importer) => {\n const importerPath = stripQueryAndHash(importer);\n const context = path.isAbsolute(importerPath)\n ? path.dirname(importerPath)\n : path.join(process.cwd(), path.dirname(importerPath));\n\n return resolveModuleAsync(context, what).then((result) => {\n const filePath = stripQueryAndHash(result);\n if (path.isAbsolute(filePath)) {\n this.addDependency(filePath);\n }\n\n return result;\n });\n });\n const asyncResolve = createAsyncResolve(this.resourcePath);\n\n logger('loader %s', this.resourcePath);\n\n const {\n sourceMap = undefined,\n preprocessor = undefined,\n keepComments = undefined,\n prefixer = undefined,\n extension = '.wyw-in-js.css',\n cssImport = 'require',\n cacheProvider,\n ...rest\n } = this.getOptions() || {};\n\n const outputFileName = this.resourcePath.replace(/\\.[^.]+$/, extension);\n\n const transformServices = {\n options: {\n filename: this.resourcePath,\n inputSourceMap: convertSourceMap(inputSourceMap, this.resourcePath),\n pluginOptions: rest,\n prefixer,\n keepComments,\n preprocessor,\n root: process.cwd(),\n },\n cache,\n emitWarning: (message: string) => this.emitWarning(new Error(message)),\n eventEmitter: sharedState.emitter,\n };\n\n transform(transformServices, content.toString(), asyncResolve)\n .then(\n async (result: Result) => {\n try {\n if (result.cssText) {\n let { cssText } = result;\n\n if (sourceMap) {\n cssText += `/*# sourceMappingURL=data:application/json;base64,${Buffer.from(\n result.cssSourceMapText || ''\n ).toString('base64')}*/`;\n }\n\n await Promise.all(\n result.dependencies?.map((dep) =>\n asyncResolve(dep, this.resourcePath)\n ) ?? []\n );\n\n const cacheInstance = await getCacheInstance(cacheProvider);\n const cacheProviderId =\n cacheProvider && typeof cacheProvider === 'object'\n ? registerCacheProvider(cacheInstance)\n : '';\n\n await cacheInstance.set(this.resourcePath, cssText);\n\n await cacheInstance.setDependencies?.(\n this.resourcePath,\n this.getDependencies()\n );\n\n const wywQuery = [\n `wyw=${encodeURIComponent(extension.replace(/^\\./, ''))}`,\n ];\n\n if (this.hot) {\n wywQuery.push(`v=${encodeURIComponent(hashText(cssText))}`);\n }\n\n const resourcePathWithQuery = `${this.resourcePath}?${wywQuery.join(\n '&'\n )}`;\n\n const request = `${outputFileName}!=!${outputCssLoader}?cacheProvider=${encodeURIComponent(\n typeof cacheProvider === 'string' ? cacheProvider : ''\n )}&cacheProviderId=${encodeURIComponent(\n cacheProviderId\n )}!${resourcePathWithQuery}`;\n const stringifiedRequest = JSON.stringify(\n this.utils.contextify(this.context || this.rootContext, request)\n );\n\n const importCss =\n cssImport === 'import'\n ? `import ${stringifiedRequest};`\n : `require(${stringifiedRequest});`;\n\n this.callback(\n null,\n `${result.code}\\n\\n${importCss}`,\n result.sourceMap ?? undefined\n );\n\n return;\n }\n\n this.callback(null, result.code, result.sourceMap ?? undefined);\n } catch (err) {\n this.callback(err as Error);\n }\n },\n (err: Error) => {\n this.callback(err);\n }\n )\n .catch((err: Error) => this.callback(err))\n .finally(removeResolver);\n};\n\nexport default webpack5Loader;\n"],"mappings":"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","ignoreList":[]}
package/lib/index.js CHANGED
@@ -40,21 +40,30 @@ const getResolverKey = (importer, stack) => {
40
40
  const root = stack.length ? stack[stack.length - 1] : importer;
41
41
  return stripQueryAndHash(root);
42
42
  };
43
- const asyncResolve = (what, importer, stack = [importer]) => {
44
- const resolver = resolvers[getResolverKey(importer, stack)];
45
- if (!resolver || resolver.length === 0) {
46
- throw new Error('No resolver found');
47
- }
48
-
49
- // Every resolver should return the same result, but we need to call all of them
50
- // to ensure that all side effects are executed (e.g. adding dependencies)
51
- return Promise.all(resolver.map(r => r(what, importer, stack))).then(results => {
52
- const firstResult = results[0];
53
- if (results.some(r => r !== firstResult)) {
54
- throw new Error('Resolvers returned different results');
43
+ const getActiveResolvers = key => {
44
+ const entries = resolvers[key];
45
+ return entries !== null && entries !== void 0 && entries.length ? entries : [];
46
+ };
47
+ const createAsyncResolve = resourcePath => {
48
+ const currentResolverKey = stripQueryAndHash(resourcePath);
49
+ return (what, importer, stack = [importer]) => {
50
+ const rootResolverKey = getResolverKey(importer, stack);
51
+ const rootResolvers = getActiveResolvers(rootResolverKey);
52
+ const resolver = rootResolvers.length > 0 ? rootResolvers : getActiveResolvers(currentResolverKey);
53
+ if (resolver.length === 0) {
54
+ throw new Error('No resolver found');
55
55
  }
56
- return firstResult;
57
- });
56
+
57
+ // Every resolver should return the same result, but we need to call all of them
58
+ // to ensure that all side effects are executed (e.g. adding dependencies)
59
+ return Promise.all(resolver.map(r => r(what, importer, stack))).then(results => {
60
+ const firstResult = results[0];
61
+ if (results.some(r => r !== firstResult)) {
62
+ throw new Error('Resolvers returned different results');
63
+ }
64
+ return firstResult;
65
+ });
66
+ };
58
67
  };
59
68
  function addResolver(resourcePath, resolver) {
60
69
  if (!resolvers[resourcePath]) {
@@ -123,6 +132,7 @@ const webpack5Loader = function webpack5LoaderPlugin(content, inputSourceMap) {
123
132
  return result;
124
133
  });
125
134
  });
135
+ const asyncResolve = createAsyncResolve(this.resourcePath);
126
136
  (0, _shared.logger)('loader %s', this.resourcePath);
127
137
  const {
128
138
  sourceMap = undefined,
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_path","_interopRequireDefault","require","_crypto","_shared","_transform","_WYWinJSDebugPlugin","_cache","e","__esModule","default","outputCssLoader","resolve","stripQueryAndHash","request","queryIdx","indexOf","hashIdx","slice","Math","min","hashText","text","crypto","createHash","update","digest","cache","TransformCacheCollection","resolvers","getResolverKey","importer","stack","root","length","asyncResolve","what","resolver","Error","Promise","all","map","r","then","results","firstResult","some","addResolver","resourcePath","push","filter","webpack5Loader","webpack5LoaderPlugin","content","inputSourceMap","convertSourceMap","value","filename","_value$file","_value$mappings","_value$names","_value$sources","_value$version","undefined","file","mappings","names","sources","version","async","resolveOptions","dependencyType","resolveModule","getResolve","isPromiseLike","resolveModuleAsync","context","reject","settled","finish","err","result","maybePromise","removeResolver","importerPath","path","isAbsolute","dirname","join","process","cwd","filePath","addDependency","logger","sourceMap","preprocessor","keepComments","prefixer","extension","cssImport","cacheProvider","rest","getOptions","outputFileName","replace","transformServices","options","pluginOptions","emitWarning","message","eventEmitter","sharedState","emitter","transform","toString","_result$sourceMap2","cssText","_result$dependencies$","_result$dependencies","_cacheInstance$setDep","_result$sourceMap","Buffer","from","cssSourceMapText","dependencies","dep","cacheInstance","getCacheInstance","cacheProviderId","registerCacheProvider","set","setDependencies","call","getDependencies","wywQuery","encodeURIComponent","hot","resourcePathWithQuery","stringifiedRequest","JSON","stringify","utils","contextify","rootContext","importCss","callback","code","catch","finally","_default","exports"],"sources":["../src/index.ts"],"sourcesContent":["/**\n * This file contains a Webpack loader for WYW-in-JS.\n * It uses the transform.ts function to generate class names from source code,\n * returns transformed code without template literals and attaches generated source maps\n */\n\nimport path from 'path';\nimport crypto from 'crypto';\n\nimport type { RawSourceMap } from 'source-map';\nimport type { RawLoaderDefinitionFunction } from 'webpack';\n\nimport { logger } from '@wyw-in-js/shared';\nimport type { PluginOptions, Preprocessor, Result } from '@wyw-in-js/transform';\nimport { transform, TransformCacheCollection } from '@wyw-in-js/transform';\n\nimport { sharedState } from './WYWinJSDebugPlugin';\nimport type { ICache } from './cache';\nimport { getCacheInstance, registerCacheProvider } from './cache';\n\nexport { WYWinJSDebugPlugin } from './WYWinJSDebugPlugin';\n\nconst outputCssLoader = require.resolve('./outputCssLoader');\n\nconst stripQueryAndHash = (request: string) => {\n const queryIdx = request.indexOf('?');\n const hashIdx = request.indexOf('#');\n\n if (queryIdx === -1) {\n return hashIdx === -1 ? request : request.slice(0, hashIdx);\n }\n if (hashIdx === -1) return request.slice(0, queryIdx);\n\n return request.slice(0, Math.min(queryIdx, hashIdx));\n};\n\nconst hashText = (text: string): string =>\n crypto.createHash('sha256').update(text).digest('hex').slice(0, 12);\n\nexport type LoaderOptions = {\n cacheProvider?: string | ICache;\n cssImport?: 'require' | 'import';\n extension?: string;\n keepComments?: boolean | RegExp;\n prefixer?: boolean;\n preprocessor?: Preprocessor;\n sourceMap?: boolean;\n} & Partial<PluginOptions>;\ntype Loader = RawLoaderDefinitionFunction<LoaderOptions>;\n\nconst cache = new TransformCacheCollection();\n\ntype Resolver = (\n what: string,\n importer: string,\n stack: string[]\n) => Promise<string>;\n\nconst resolvers: Record<string, Resolver[]> = {};\n\nconst getResolverKey = (importer: string, stack: string[]): string => {\n const root = stack.length ? stack[stack.length - 1] : importer;\n return stripQueryAndHash(root);\n};\n\nconst asyncResolve = (\n what: string,\n importer: string,\n stack: string[] = [importer]\n): Promise<string> => {\n const resolver = resolvers[getResolverKey(importer, stack)];\n if (!resolver || resolver.length === 0) {\n throw new Error('No resolver found');\n }\n\n // Every resolver should return the same result, but we need to call all of them\n // to ensure that all side effects are executed (e.g. adding dependencies)\n return Promise.all(resolver.map((r) => r(what, importer, stack))).then(\n (results) => {\n const firstResult = results[0];\n if (results.some((r) => r !== firstResult)) {\n throw new Error('Resolvers returned different results');\n }\n\n return firstResult;\n }\n );\n};\n\nfunction addResolver(resourcePath: string, resolver: Resolver) {\n if (!resolvers[resourcePath]) {\n resolvers[resourcePath] = [];\n }\n\n resolvers[resourcePath].push(resolver);\n\n return () => {\n resolvers[resourcePath] = resolvers[resourcePath].filter(\n (r) => r !== resolver\n );\n };\n}\n\nconst webpack5Loader: Loader = function webpack5LoaderPlugin(\n content,\n inputSourceMap\n) {\n function convertSourceMap(\n value: typeof inputSourceMap,\n filename: string\n ): RawSourceMap | undefined {\n if (typeof value === 'string' || !value) {\n return undefined;\n }\n\n return {\n ...value,\n file: value.file ?? filename,\n mappings: value.mappings ?? '',\n names: value.names ?? [],\n sources: value.sources ?? [],\n version: value.version ?? 3,\n };\n }\n\n // tell Webpack this loader is async\n this.async();\n\n const resolveOptions = { dependencyType: 'esm' };\n\n const resolveModule: (\n context: string,\n request: string,\n callback: (err: unknown, result: unknown) => void\n ) => unknown = this.getResolve(resolveOptions);\n\n const isPromiseLike = (value: unknown): value is Promise<unknown> =>\n typeof (value as { then?: unknown } | null)?.then === 'function';\n\n const resolveModuleAsync = (context: string, request: string) =>\n new Promise<string>((resolve, reject) => {\n let settled = false;\n const finish = (err: unknown, result: unknown) => {\n if (settled) return;\n settled = true;\n\n if (err) {\n reject(err);\n return;\n }\n\n if (typeof result === 'string') {\n resolve(result);\n return;\n }\n\n reject(new Error(`Cannot resolve ${request}`));\n };\n\n try {\n const maybePromise = resolveModule(context, request, finish);\n if (isPromiseLike(maybePromise)) {\n maybePromise.then(\n (result) => finish(null, result),\n (err) => finish(err, null)\n );\n }\n } catch (err) {\n finish(err, null);\n }\n });\n\n const removeResolver = addResolver(this.resourcePath, (what, importer) => {\n const importerPath = stripQueryAndHash(importer);\n const context = path.isAbsolute(importerPath)\n ? path.dirname(importerPath)\n : path.join(process.cwd(), path.dirname(importerPath));\n\n return resolveModuleAsync(context, what).then((result) => {\n const filePath = stripQueryAndHash(result);\n if (path.isAbsolute(filePath)) {\n this.addDependency(filePath);\n }\n\n return result;\n });\n });\n\n logger('loader %s', this.resourcePath);\n\n const {\n sourceMap = undefined,\n preprocessor = undefined,\n keepComments = undefined,\n prefixer = undefined,\n extension = '.wyw-in-js.css',\n cssImport = 'require',\n cacheProvider,\n ...rest\n } = this.getOptions() || {};\n\n const outputFileName = this.resourcePath.replace(/\\.[^.]+$/, extension);\n\n const transformServices = {\n options: {\n filename: this.resourcePath,\n inputSourceMap: convertSourceMap(inputSourceMap, this.resourcePath),\n pluginOptions: rest,\n prefixer,\n keepComments,\n preprocessor,\n root: process.cwd(),\n },\n cache,\n emitWarning: (message: string) => this.emitWarning(new Error(message)),\n eventEmitter: sharedState.emitter,\n };\n\n transform(transformServices, content.toString(), asyncResolve)\n .then(\n async (result: Result) => {\n try {\n if (result.cssText) {\n let { cssText } = result;\n\n if (sourceMap) {\n cssText += `/*# sourceMappingURL=data:application/json;base64,${Buffer.from(\n result.cssSourceMapText || ''\n ).toString('base64')}*/`;\n }\n\n await Promise.all(\n result.dependencies?.map((dep) =>\n asyncResolve(dep, this.resourcePath)\n ) ?? []\n );\n\n const cacheInstance = await getCacheInstance(cacheProvider);\n const cacheProviderId =\n cacheProvider && typeof cacheProvider === 'object'\n ? registerCacheProvider(cacheInstance)\n : '';\n\n await cacheInstance.set(this.resourcePath, cssText);\n\n await cacheInstance.setDependencies?.(\n this.resourcePath,\n this.getDependencies()\n );\n\n const wywQuery = [\n `wyw=${encodeURIComponent(extension.replace(/^\\./, ''))}`,\n ];\n\n if (this.hot) {\n wywQuery.push(`v=${encodeURIComponent(hashText(cssText))}`);\n }\n\n const resourcePathWithQuery = `${this.resourcePath}?${wywQuery.join(\n '&'\n )}`;\n\n const request = `${outputFileName}!=!${outputCssLoader}?cacheProvider=${encodeURIComponent(\n typeof cacheProvider === 'string' ? cacheProvider : ''\n )}&cacheProviderId=${encodeURIComponent(\n cacheProviderId\n )}!${resourcePathWithQuery}`;\n const stringifiedRequest = JSON.stringify(\n this.utils.contextify(this.context || this.rootContext, request)\n );\n\n const importCss =\n cssImport === 'import'\n ? `import ${stringifiedRequest};`\n : `require(${stringifiedRequest});`;\n\n this.callback(\n null,\n `${result.code}\\n\\n${importCss}`,\n result.sourceMap ?? undefined\n );\n\n return;\n }\n\n this.callback(null, result.code, result.sourceMap ?? undefined);\n } catch (err) {\n this.callback(err as Error);\n }\n },\n (err: Error) => {\n this.callback(err);\n }\n )\n .catch((err: Error) => this.callback(err))\n .finally(removeResolver);\n};\n\nexport default webpack5Loader;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_path","_interopRequireDefault","require","_crypto","_shared","_transform","_WYWinJSDebugPlugin","_cache","e","__esModule","default","outputCssLoader","resolve","stripQueryAndHash","request","queryIdx","indexOf","hashIdx","slice","Math","min","hashText","text","crypto","createHash","update","digest","cache","TransformCacheCollection","resolvers","getResolverKey","importer","stack","root","length","getActiveResolvers","key","entries","createAsyncResolve","resourcePath","currentResolverKey","what","rootResolverKey","rootResolvers","resolver","Error","Promise","all","map","r","then","results","firstResult","some","addResolver","push","filter","webpack5Loader","webpack5LoaderPlugin","content","inputSourceMap","convertSourceMap","value","filename","_value$file","_value$mappings","_value$names","_value$sources","_value$version","undefined","file","mappings","names","sources","version","async","resolveOptions","dependencyType","resolveModule","getResolve","isPromiseLike","resolveModuleAsync","context","reject","settled","finish","err","result","maybePromise","removeResolver","importerPath","path","isAbsolute","dirname","join","process","cwd","filePath","addDependency","asyncResolve","logger","sourceMap","preprocessor","keepComments","prefixer","extension","cssImport","cacheProvider","rest","getOptions","outputFileName","replace","transformServices","options","pluginOptions","emitWarning","message","eventEmitter","sharedState","emitter","transform","toString","_result$sourceMap2","cssText","_result$dependencies$","_result$dependencies","_cacheInstance$setDep","_result$sourceMap","Buffer","from","cssSourceMapText","dependencies","dep","cacheInstance","getCacheInstance","cacheProviderId","registerCacheProvider","set","setDependencies","call","getDependencies","wywQuery","encodeURIComponent","hot","resourcePathWithQuery","stringifiedRequest","JSON","stringify","utils","contextify","rootContext","importCss","callback","code","catch","finally","_default","exports"],"sources":["../src/index.ts"],"sourcesContent":["/**\n * This file contains a Webpack loader for WYW-in-JS.\n * It uses the transform.ts function to generate class names from source code,\n * returns transformed code without template literals and attaches generated source maps\n */\n\nimport path from 'path';\nimport crypto from 'crypto';\n\nimport type { RawSourceMap } from 'source-map';\nimport type { RawLoaderDefinitionFunction } from 'webpack';\n\nimport { logger } from '@wyw-in-js/shared';\nimport type { PluginOptions, Preprocessor, Result } from '@wyw-in-js/transform';\nimport { transform, TransformCacheCollection } from '@wyw-in-js/transform';\n\nimport { sharedState } from './WYWinJSDebugPlugin';\nimport type { ICache } from './cache';\nimport { getCacheInstance, registerCacheProvider } from './cache';\n\nexport { WYWinJSDebugPlugin } from './WYWinJSDebugPlugin';\n\nconst outputCssLoader = require.resolve('./outputCssLoader');\n\nconst stripQueryAndHash = (request: string) => {\n const queryIdx = request.indexOf('?');\n const hashIdx = request.indexOf('#');\n\n if (queryIdx === -1) {\n return hashIdx === -1 ? request : request.slice(0, hashIdx);\n }\n if (hashIdx === -1) return request.slice(0, queryIdx);\n\n return request.slice(0, Math.min(queryIdx, hashIdx));\n};\n\nconst hashText = (text: string): string =>\n crypto.createHash('sha256').update(text).digest('hex').slice(0, 12);\n\nexport type LoaderOptions = {\n cacheProvider?: string | ICache;\n cssImport?: 'require' | 'import';\n extension?: string;\n keepComments?: boolean | RegExp;\n prefixer?: boolean;\n preprocessor?: Preprocessor;\n sourceMap?: boolean;\n} & Partial<PluginOptions>;\ntype Loader = RawLoaderDefinitionFunction<LoaderOptions>;\n\nconst cache = new TransformCacheCollection();\n\ntype Resolver = (\n what: string,\n importer: string,\n stack: string[]\n) => Promise<string>;\n\nconst resolvers: Record<string, Resolver[]> = {};\n\nconst getResolverKey = (importer: string, stack: string[]): string => {\n const root = stack.length ? stack[stack.length - 1] : importer;\n return stripQueryAndHash(root);\n};\n\nconst getActiveResolvers = (key: string): Resolver[] => {\n const entries = resolvers[key];\n return entries?.length ? entries : [];\n};\n\nconst createAsyncResolve = (resourcePath: string) => {\n const currentResolverKey = stripQueryAndHash(resourcePath);\n\n return (\n what: string,\n importer: string,\n stack: string[] = [importer]\n ): Promise<string> => {\n const rootResolverKey = getResolverKey(importer, stack);\n const rootResolvers = getActiveResolvers(rootResolverKey);\n const resolver =\n rootResolvers.length > 0\n ? rootResolvers\n : getActiveResolvers(currentResolverKey);\n\n if (resolver.length === 0) {\n throw new Error('No resolver found');\n }\n\n // Every resolver should return the same result, but we need to call all of them\n // to ensure that all side effects are executed (e.g. adding dependencies)\n return Promise.all(resolver.map((r) => r(what, importer, stack))).then(\n (results) => {\n const firstResult = results[0];\n if (results.some((r) => r !== firstResult)) {\n throw new Error('Resolvers returned different results');\n }\n\n return firstResult;\n }\n );\n };\n};\n\nfunction addResolver(resourcePath: string, resolver: Resolver) {\n if (!resolvers[resourcePath]) {\n resolvers[resourcePath] = [];\n }\n\n resolvers[resourcePath].push(resolver);\n\n return () => {\n resolvers[resourcePath] = resolvers[resourcePath].filter(\n (r) => r !== resolver\n );\n };\n}\n\nconst webpack5Loader: Loader = function webpack5LoaderPlugin(\n content,\n inputSourceMap\n) {\n function convertSourceMap(\n value: typeof inputSourceMap,\n filename: string\n ): RawSourceMap | undefined {\n if (typeof value === 'string' || !value) {\n return undefined;\n }\n\n return {\n ...value,\n file: value.file ?? filename,\n mappings: value.mappings ?? '',\n names: value.names ?? [],\n sources: value.sources ?? [],\n version: value.version ?? 3,\n };\n }\n\n // tell Webpack this loader is async\n this.async();\n\n const resolveOptions = { dependencyType: 'esm' };\n\n const resolveModule: (\n context: string,\n request: string,\n callback: (err: unknown, result: unknown) => void\n ) => unknown = this.getResolve(resolveOptions);\n\n const isPromiseLike = (value: unknown): value is Promise<unknown> =>\n typeof (value as { then?: unknown } | null)?.then === 'function';\n\n const resolveModuleAsync = (context: string, request: string) =>\n new Promise<string>((resolve, reject) => {\n let settled = false;\n const finish = (err: unknown, result: unknown) => {\n if (settled) return;\n settled = true;\n\n if (err) {\n reject(err);\n return;\n }\n\n if (typeof result === 'string') {\n resolve(result);\n return;\n }\n\n reject(new Error(`Cannot resolve ${request}`));\n };\n\n try {\n const maybePromise = resolveModule(context, request, finish);\n if (isPromiseLike(maybePromise)) {\n maybePromise.then(\n (result) => finish(null, result),\n (err) => finish(err, null)\n );\n }\n } catch (err) {\n finish(err, null);\n }\n });\n\n const removeResolver = addResolver(this.resourcePath, (what, importer) => {\n const importerPath = stripQueryAndHash(importer);\n const context = path.isAbsolute(importerPath)\n ? path.dirname(importerPath)\n : path.join(process.cwd(), path.dirname(importerPath));\n\n return resolveModuleAsync(context, what).then((result) => {\n const filePath = stripQueryAndHash(result);\n if (path.isAbsolute(filePath)) {\n this.addDependency(filePath);\n }\n\n return result;\n });\n });\n const asyncResolve = createAsyncResolve(this.resourcePath);\n\n logger('loader %s', this.resourcePath);\n\n const {\n sourceMap = undefined,\n preprocessor = undefined,\n keepComments = undefined,\n prefixer = undefined,\n extension = '.wyw-in-js.css',\n cssImport = 'require',\n cacheProvider,\n ...rest\n } = this.getOptions() || {};\n\n const outputFileName = this.resourcePath.replace(/\\.[^.]+$/, extension);\n\n const transformServices = {\n options: {\n filename: this.resourcePath,\n inputSourceMap: convertSourceMap(inputSourceMap, this.resourcePath),\n pluginOptions: rest,\n prefixer,\n keepComments,\n preprocessor,\n root: process.cwd(),\n },\n cache,\n emitWarning: (message: string) => this.emitWarning(new Error(message)),\n eventEmitter: sharedState.emitter,\n };\n\n transform(transformServices, content.toString(), asyncResolve)\n .then(\n async (result: Result) => {\n try {\n if (result.cssText) {\n let { cssText } = result;\n\n if (sourceMap) {\n cssText += `/*# sourceMappingURL=data:application/json;base64,${Buffer.from(\n result.cssSourceMapText || ''\n ).toString('base64')}*/`;\n }\n\n await Promise.all(\n result.dependencies?.map((dep) =>\n asyncResolve(dep, this.resourcePath)\n ) ?? []\n );\n\n const cacheInstance = await getCacheInstance(cacheProvider);\n const cacheProviderId =\n cacheProvider && typeof cacheProvider === 'object'\n ? registerCacheProvider(cacheInstance)\n : '';\n\n await cacheInstance.set(this.resourcePath, cssText);\n\n await cacheInstance.setDependencies?.(\n this.resourcePath,\n this.getDependencies()\n );\n\n const wywQuery = [\n `wyw=${encodeURIComponent(extension.replace(/^\\./, ''))}`,\n ];\n\n if (this.hot) {\n wywQuery.push(`v=${encodeURIComponent(hashText(cssText))}`);\n }\n\n const resourcePathWithQuery = `${this.resourcePath}?${wywQuery.join(\n '&'\n )}`;\n\n const request = `${outputFileName}!=!${outputCssLoader}?cacheProvider=${encodeURIComponent(\n typeof cacheProvider === 'string' ? cacheProvider : ''\n )}&cacheProviderId=${encodeURIComponent(\n cacheProviderId\n )}!${resourcePathWithQuery}`;\n const stringifiedRequest = JSON.stringify(\n this.utils.contextify(this.context || this.rootContext, request)\n );\n\n const importCss =\n cssImport === 'import'\n ? `import ${stringifiedRequest};`\n : `require(${stringifiedRequest});`;\n\n this.callback(\n null,\n `${result.code}\\n\\n${importCss}`,\n result.sourceMap ?? undefined\n );\n\n return;\n }\n\n this.callback(null, result.code, result.sourceMap ?? undefined);\n } catch (err) {\n this.callback(err as Error);\n }\n },\n (err: Error) => {\n this.callback(err);\n }\n )\n .catch((err: Error) => this.callback(err))\n .finally(removeResolver);\n};\n\nexport default webpack5Loader;\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@wyw-in-js/webpack-loader",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "dependencies": {
5
- "@wyw-in-js/shared": "1.0.4",
6
- "@wyw-in-js/transform": "1.0.5"
5
+ "@wyw-in-js/shared": "1.0.5",
6
+ "@wyw-in-js/transform": "1.0.7"
7
7
  },
8
8
  "devDependencies": {
9
9
  "@types/node": "^16.18.55",
@@ -37,5 +37,9 @@
37
37
  "lint": "eslint --ext .js,.ts .",
38
38
  "test": "bun test src"
39
39
  },
40
- "types": "types/index.d.ts"
40
+ "types": "types/index.d.ts",
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "https://github.com/Anber/wyw-in-js"
44
+ }
41
45
  }
package/types/index.js CHANGED
@@ -35,20 +35,31 @@ const getResolverKey = (importer, stack) => {
35
35
  const root = stack.length ? stack[stack.length - 1] : importer;
36
36
  return stripQueryAndHash(root);
37
37
  };
38
- const asyncResolve = (what, importer, stack = [importer]) => {
39
- const resolver = resolvers[getResolverKey(importer, stack)];
40
- if (!resolver || resolver.length === 0) {
41
- throw new Error('No resolver found');
42
- }
43
- // Every resolver should return the same result, but we need to call all of them
44
- // to ensure that all side effects are executed (e.g. adding dependencies)
45
- return Promise.all(resolver.map((r) => r(what, importer, stack))).then((results) => {
46
- const firstResult = results[0];
47
- if (results.some((r) => r !== firstResult)) {
48
- throw new Error('Resolvers returned different results');
38
+ const getActiveResolvers = (key) => {
39
+ const entries = resolvers[key];
40
+ return entries?.length ? entries : [];
41
+ };
42
+ const createAsyncResolve = (resourcePath) => {
43
+ const currentResolverKey = stripQueryAndHash(resourcePath);
44
+ return (what, importer, stack = [importer]) => {
45
+ const rootResolverKey = getResolverKey(importer, stack);
46
+ const rootResolvers = getActiveResolvers(rootResolverKey);
47
+ const resolver = rootResolvers.length > 0
48
+ ? rootResolvers
49
+ : getActiveResolvers(currentResolverKey);
50
+ if (resolver.length === 0) {
51
+ throw new Error('No resolver found');
49
52
  }
50
- return firstResult;
51
- });
53
+ // Every resolver should return the same result, but we need to call all of them
54
+ // to ensure that all side effects are executed (e.g. adding dependencies)
55
+ return Promise.all(resolver.map((r) => r(what, importer, stack))).then((results) => {
56
+ const firstResult = results[0];
57
+ if (results.some((r) => r !== firstResult)) {
58
+ throw new Error('Resolvers returned different results');
59
+ }
60
+ return firstResult;
61
+ });
62
+ };
52
63
  };
53
64
  function addResolver(resourcePath, resolver) {
54
65
  if (!resolvers[resourcePath]) {
@@ -117,6 +128,7 @@ const webpack5Loader = function webpack5LoaderPlugin(content, inputSourceMap) {
117
128
  return result;
118
129
  });
119
130
  });
131
+ const asyncResolve = createAsyncResolve(this.resourcePath);
120
132
  (0, shared_1.logger)('loader %s', this.resourcePath);
121
133
  const { sourceMap = undefined, preprocessor = undefined, keepComments = undefined, prefixer = undefined, extension = '.wyw-in-js.css', cssImport = 'require', cacheProvider, ...rest } = this.getOptions() || {};
122
134
  const outputFileName = this.resourcePath.replace(/\.[^.]+$/, extension);