@wyw-in-js/webpack-loader 0.8.0 → 1.0.0

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/README.md CHANGED
@@ -11,6 +11,8 @@ npm i -D @wyw-in-js/webpack-loader
11
11
  yarn add --dev @wyw-in-js/webpack-loader
12
12
  # pnpm
13
13
  pnpm add -D @wyw-in-js/webpack-loader
14
+ # bun
15
+ bun add -d @wyw-in-js/webpack-loader
14
16
  ```
15
17
 
16
18
  ## Usage
@@ -31,4 +33,22 @@ module.exports = {
31
33
  };
32
34
  ```
33
35
 
36
+ ## Disabling vendor prefixing
37
+
38
+ Stylis adds vendor-prefixed CSS by default. To disable it (and reduce CSS size), pass `prefixer: false`:
39
+
40
+ ```js
41
+ module.exports = {
42
+ test: /\.js$/,
43
+ use: [
44
+ {
45
+ loader: '@wyw-in-js/webpack-loader',
46
+ options: {
47
+ prefixer: false,
48
+ },
49
+ },
50
+ ],
51
+ };
52
+ ```
53
+
34
54
  To get details about supported options by the plugin, please check [documentation](https://wyw-in-js.dev/bundlers/webpack).
@@ -1 +1 @@
1
- {"version":3,"file":"WYWinJSDebugPlugin.js","names":["createFileReporter","sharedState","WYWinJSDebugPlugin","constructor","options","emitter","onDone","apply","compiler","hooks","shutdown","tap","process","cwd"],"sources":["../src/WYWinJSDebugPlugin.ts"],"sourcesContent":["import type { Compiler } from 'webpack';\n\nimport type { EventEmitter, IFileReporterOptions } from '@wyw-in-js/transform';\nimport { createFileReporter } from '@wyw-in-js/transform';\n\nexport const sharedState: {\n emitter?: EventEmitter;\n} = {};\n\nexport class WYWinJSDebugPlugin {\n private readonly onDone: (root: string) => void;\n\n constructor(options?: IFileReporterOptions) {\n const { emitter, onDone } = createFileReporter(options ?? false);\n sharedState.emitter = emitter;\n this.onDone = onDone;\n }\n\n apply(compiler: Compiler) {\n compiler.hooks.shutdown.tap('WYWinJSDebug', () => {\n this.onDone(process.cwd());\n });\n }\n}\n"],"mappings":"AAGA,SAASA,kBAAkB,QAAQ,sBAAsB;AAEzD,OAAO,MAAMC,WAEZ,GAAG,CAAC,CAAC;AAEN,OAAO,MAAMC,kBAAkB,CAAC;EAG9BC,WAAWA,CAACC,OAA8B,EAAE;IAC1C,MAAM;MAAEC,OAAO;MAAEC;IAAO,CAAC,GAAGN,kBAAkB,CAACI,OAAO,IAAI,KAAK,CAAC;IAChEH,WAAW,CAACI,OAAO,GAAGA,OAAO;IAC7B,IAAI,CAACC,MAAM,GAAGA,MAAM;EACtB;EAEAC,KAAKA,CAACC,QAAkB,EAAE;IACxBA,QAAQ,CAACC,KAAK,CAACC,QAAQ,CAACC,GAAG,CAAC,cAAc,EAAE,MAAM;MAChD,IAAI,CAACL,MAAM,CAACM,OAAO,CAACC,GAAG,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC;EACJ;AACF"}
1
+ {"version":3,"file":"WYWinJSDebugPlugin.js","names":["createFileReporter","sharedState","WYWinJSDebugPlugin","constructor","options","emitter","onDone","apply","compiler","hooks","shutdown","tap","process","cwd"],"sources":["../src/WYWinJSDebugPlugin.ts"],"sourcesContent":["import type { Compiler } from 'webpack';\n\nimport type { EventEmitter, IFileReporterOptions } from '@wyw-in-js/transform';\nimport { createFileReporter } from '@wyw-in-js/transform';\n\nexport const sharedState: {\n emitter?: EventEmitter;\n} = {};\n\nexport class WYWinJSDebugPlugin {\n private readonly onDone: (root: string) => void;\n\n constructor(options?: IFileReporterOptions) {\n const { emitter, onDone } = createFileReporter(options ?? false);\n sharedState.emitter = emitter;\n this.onDone = onDone;\n }\n\n apply(compiler: Compiler) {\n compiler.hooks.shutdown.tap('WYWinJSDebug', () => {\n this.onDone(process.cwd());\n });\n }\n}\n"],"mappings":"AAGA,SAASA,kBAAkB,QAAQ,sBAAsB;AAEzD,OAAO,MAAMC,WAEZ,GAAG,CAAC,CAAC;AAEN,OAAO,MAAMC,kBAAkB,CAAC;EAG9BC,WAAWA,CAACC,OAA8B,EAAE;IAC1C,MAAM;MAAEC,OAAO;MAAEC;IAAO,CAAC,GAAGN,kBAAkB,CAACI,OAAO,IAAI,KAAK,CAAC;IAChEH,WAAW,CAACI,OAAO,GAAGA,OAAO;IAC7B,IAAI,CAACC,MAAM,GAAGA,MAAM;EACtB;EAEAC,KAAKA,CAACC,QAAkB,EAAE;IACxBA,QAAQ,CAACC,KAAK,CAACC,QAAQ,CAACC,GAAG,CAAC,cAAc,EAAE,MAAM;MAChD,IAAI,CAACL,MAAM,CAACM,OAAO,CAACC,GAAG,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC;EACJ;AACF","ignoreList":[]}
package/esm/cache.js CHANGED
@@ -1,3 +1,18 @@
1
+ let cacheProviderSeq = 0;
2
+ const cacheProviderIds = new WeakMap();
3
+ const cacheProvidersById = new Map();
4
+ export const registerCacheProvider = cacheProvider => {
5
+ const knownId = cacheProviderIds.get(cacheProvider);
6
+ if (knownId) {
7
+ return knownId;
8
+ }
9
+ cacheProviderSeq += 1;
10
+ const id = `${cacheProviderSeq}`;
11
+ cacheProviderIds.set(cacheProvider, id);
12
+ cacheProvidersById.set(id, cacheProvider);
13
+ return id;
14
+ };
15
+
1
16
  // memory cache, which is the default cache implementation in WYW-in-JS
2
17
 
3
18
  class MemoryCache {
@@ -25,7 +40,14 @@ export const memoryCache = new MemoryCache();
25
40
  * @param cacheProvider string | ICache | undefined
26
41
  * @returns ICache instance
27
42
  */
28
- export const getCacheInstance = async cacheProvider => {
43
+ export const getCacheInstance = async (cacheProvider, cacheProviderId) => {
44
+ if (cacheProviderId) {
45
+ const cacheProviderInstance = cacheProvidersById.get(cacheProviderId);
46
+ if (!cacheProviderInstance) {
47
+ throw new Error(`Invalid cache provider id: ${cacheProviderId}`);
48
+ }
49
+ return cacheProviderInstance;
50
+ }
29
51
  if (!cacheProvider) {
30
52
  return memoryCache;
31
53
  }
package/esm/cache.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","names":["MemoryCache","cache","Map","dependenciesCache","get","key","Promise","resolve","getDependencies","set","value","setDependencies","memoryCache","getCacheInstance","cacheProvider","require","Error"],"sources":["../src/cache.ts"],"sourcesContent":["export interface ICache {\n get: (key: string) => Promise<string>;\n getDependencies?: (key: string) => Promise<string[]>;\n set: (key: string, value: string) => Promise<void>;\n setDependencies?: (key: string, value: string[]) => Promise<void>;\n}\n\n// memory cache, which is the default cache implementation in WYW-in-JS\n\nclass MemoryCache implements ICache {\n private cache: Map<string, string> = new Map();\n\n private dependenciesCache: Map<string, string[]> = new Map();\n\n public get(key: string): Promise<string> {\n return Promise.resolve(this.cache.get(key) ?? '');\n }\n\n public getDependencies(key: string): Promise<string[]> {\n return Promise.resolve(this.dependenciesCache.get(key) ?? []);\n }\n\n public set(key: string, value: string): Promise<void> {\n this.cache.set(key, value);\n return Promise.resolve();\n }\n\n public setDependencies(key: string, value: string[]): Promise<void> {\n this.dependenciesCache.set(key, value);\n return Promise.resolve();\n }\n}\n\nexport const memoryCache = new MemoryCache();\n\n/**\n * return cache instance from `options.cacheProvider`\n * @param cacheProvider string | ICache | undefined\n * @returns ICache instance\n */\nexport const getCacheInstance = async (\n cacheProvider: string | ICache | undefined\n): Promise<ICache> => {\n if (!cacheProvider) {\n return memoryCache;\n }\n if (typeof cacheProvider === 'string') {\n return require(cacheProvider);\n }\n if (\n typeof cacheProvider === 'object' &&\n 'get' in cacheProvider &&\n 'set' in cacheProvider\n ) {\n return cacheProvider;\n }\n throw new Error(`Invalid cache provider: ${cacheProvider}`);\n};\n"],"mappings":"AAOA;;AAEA,MAAMA,WAAW,CAAmB;EAC1BC,KAAK,GAAwB,IAAIC,GAAG,CAAC,CAAC;EAEtCC,iBAAiB,GAA0B,IAAID,GAAG,CAAC,CAAC;EAErDE,GAAGA,CAACC,GAAW,EAAmB;IACvC,OAAOC,OAAO,CAACC,OAAO,CAAC,IAAI,CAACN,KAAK,CAACG,GAAG,CAACC,GAAG,CAAC,IAAI,EAAE,CAAC;EACnD;EAEOG,eAAeA,CAACH,GAAW,EAAqB;IACrD,OAAOC,OAAO,CAACC,OAAO,CAAC,IAAI,CAACJ,iBAAiB,CAACC,GAAG,CAACC,GAAG,CAAC,IAAI,EAAE,CAAC;EAC/D;EAEOI,GAAGA,CAACJ,GAAW,EAAEK,KAAa,EAAiB;IACpD,IAAI,CAACT,KAAK,CAACQ,GAAG,CAACJ,GAAG,EAAEK,KAAK,CAAC;IAC1B,OAAOJ,OAAO,CAACC,OAAO,CAAC,CAAC;EAC1B;EAEOI,eAAeA,CAACN,GAAW,EAAEK,KAAe,EAAiB;IAClE,IAAI,CAACP,iBAAiB,CAACM,GAAG,CAACJ,GAAG,EAAEK,KAAK,CAAC;IACtC,OAAOJ,OAAO,CAACC,OAAO,CAAC,CAAC;EAC1B;AACF;AAEA,OAAO,MAAMK,WAAW,GAAG,IAAIZ,WAAW,CAAC,CAAC;;AAE5C;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMa,gBAAgB,GAAG,MAC9BC,aAA0C,IACtB;EACpB,IAAI,CAACA,aAAa,EAAE;IAClB,OAAOF,WAAW;EACpB;EACA,IAAI,OAAOE,aAAa,KAAK,QAAQ,EAAE;IACrC,OAAOC,OAAO,CAACD,aAAa,CAAC;EAC/B;EACA,IACE,OAAOA,aAAa,KAAK,QAAQ,IACjC,KAAK,IAAIA,aAAa,IACtB,KAAK,IAAIA,aAAa,EACtB;IACA,OAAOA,aAAa;EACtB;EACA,MAAM,IAAIE,KAAK,CAAE,2BAA0BF,aAAc,EAAC,CAAC;AAC7D,CAAC"}
1
+ {"version":3,"file":"cache.js","names":["cacheProviderSeq","cacheProviderIds","WeakMap","cacheProvidersById","Map","registerCacheProvider","cacheProvider","knownId","get","id","set","MemoryCache","cache","dependenciesCache","key","Promise","resolve","getDependencies","value","setDependencies","memoryCache","getCacheInstance","cacheProviderId","cacheProviderInstance","Error","require"],"sources":["../src/cache.ts"],"sourcesContent":["export interface ICache {\n get: (key: string) => Promise<string>;\n getDependencies?: (key: string) => Promise<string[]>;\n set: (key: string, value: string) => Promise<void>;\n setDependencies?: (key: string, value: string[]) => Promise<void>;\n}\n\nlet cacheProviderSeq = 0;\nconst cacheProviderIds = new WeakMap<ICache, string>();\nconst cacheProvidersById = new Map<string, ICache>();\n\nexport const registerCacheProvider = (cacheProvider: ICache): string => {\n const knownId = cacheProviderIds.get(cacheProvider);\n if (knownId) {\n return knownId;\n }\n\n cacheProviderSeq += 1;\n const id = `${cacheProviderSeq}`;\n cacheProviderIds.set(cacheProvider, id);\n cacheProvidersById.set(id, cacheProvider);\n return id;\n};\n\n// memory cache, which is the default cache implementation in WYW-in-JS\n\nclass MemoryCache implements ICache {\n private cache: Map<string, string> = new Map();\n\n private dependenciesCache: Map<string, string[]> = new Map();\n\n public get(key: string): Promise<string> {\n return Promise.resolve(this.cache.get(key) ?? '');\n }\n\n public getDependencies(key: string): Promise<string[]> {\n return Promise.resolve(this.dependenciesCache.get(key) ?? []);\n }\n\n public set(key: string, value: string): Promise<void> {\n this.cache.set(key, value);\n return Promise.resolve();\n }\n\n public setDependencies(key: string, value: string[]): Promise<void> {\n this.dependenciesCache.set(key, value);\n return Promise.resolve();\n }\n}\n\nexport const memoryCache = new MemoryCache();\n\n/**\n * return cache instance from `options.cacheProvider`\n * @param cacheProvider string | ICache | undefined\n * @returns ICache instance\n */\nexport const getCacheInstance = async (\n cacheProvider: string | ICache | undefined,\n cacheProviderId?: string | undefined\n): Promise<ICache> => {\n if (cacheProviderId) {\n const cacheProviderInstance = cacheProvidersById.get(cacheProviderId);\n if (!cacheProviderInstance) {\n throw new Error(`Invalid cache provider id: ${cacheProviderId}`);\n }\n\n return cacheProviderInstance;\n }\n\n if (!cacheProvider) {\n return memoryCache;\n }\n if (typeof cacheProvider === 'string') {\n return require(cacheProvider);\n }\n if (\n typeof cacheProvider === 'object' &&\n 'get' in cacheProvider &&\n 'set' in cacheProvider\n ) {\n return cacheProvider;\n }\n throw new Error(`Invalid cache provider: ${cacheProvider}`);\n};\n"],"mappings":"AAOA,IAAIA,gBAAgB,GAAG,CAAC;AACxB,MAAMC,gBAAgB,GAAG,IAAIC,OAAO,CAAiB,CAAC;AACtD,MAAMC,kBAAkB,GAAG,IAAIC,GAAG,CAAiB,CAAC;AAEpD,OAAO,MAAMC,qBAAqB,GAAIC,aAAqB,IAAa;EACtE,MAAMC,OAAO,GAAGN,gBAAgB,CAACO,GAAG,CAACF,aAAa,CAAC;EACnD,IAAIC,OAAO,EAAE;IACX,OAAOA,OAAO;EAChB;EAEAP,gBAAgB,IAAI,CAAC;EACrB,MAAMS,EAAE,GAAG,GAAGT,gBAAgB,EAAE;EAChCC,gBAAgB,CAACS,GAAG,CAACJ,aAAa,EAAEG,EAAE,CAAC;EACvCN,kBAAkB,CAACO,GAAG,CAACD,EAAE,EAAEH,aAAa,CAAC;EACzC,OAAOG,EAAE;AACX,CAAC;;AAED;;AAEA,MAAME,WAAW,CAAmB;EAC1BC,KAAK,GAAwB,IAAIR,GAAG,CAAC,CAAC;EAEtCS,iBAAiB,GAA0B,IAAIT,GAAG,CAAC,CAAC;EAErDI,GAAGA,CAACM,GAAW,EAAmB;IACvC,OAAOC,OAAO,CAACC,OAAO,CAAC,IAAI,CAACJ,KAAK,CAACJ,GAAG,CAACM,GAAG,CAAC,IAAI,EAAE,CAAC;EACnD;EAEOG,eAAeA,CAACH,GAAW,EAAqB;IACrD,OAAOC,OAAO,CAACC,OAAO,CAAC,IAAI,CAACH,iBAAiB,CAACL,GAAG,CAACM,GAAG,CAAC,IAAI,EAAE,CAAC;EAC/D;EAEOJ,GAAGA,CAACI,GAAW,EAAEI,KAAa,EAAiB;IACpD,IAAI,CAACN,KAAK,CAACF,GAAG,CAACI,GAAG,EAAEI,KAAK,CAAC;IAC1B,OAAOH,OAAO,CAACC,OAAO,CAAC,CAAC;EAC1B;EAEOG,eAAeA,CAACL,GAAW,EAAEI,KAAe,EAAiB;IAClE,IAAI,CAACL,iBAAiB,CAACH,GAAG,CAACI,GAAG,EAAEI,KAAK,CAAC;IACtC,OAAOH,OAAO,CAACC,OAAO,CAAC,CAAC;EAC1B;AACF;AAEA,OAAO,MAAMI,WAAW,GAAG,IAAIT,WAAW,CAAC,CAAC;;AAE5C;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMU,gBAAgB,GAAG,MAAAA,CAC9Bf,aAA0C,EAC1CgB,eAAoC,KAChB;EACpB,IAAIA,eAAe,EAAE;IACnB,MAAMC,qBAAqB,GAAGpB,kBAAkB,CAACK,GAAG,CAACc,eAAe,CAAC;IACrE,IAAI,CAACC,qBAAqB,EAAE;MAC1B,MAAM,IAAIC,KAAK,CAAC,8BAA8BF,eAAe,EAAE,CAAC;IAClE;IAEA,OAAOC,qBAAqB;EAC9B;EAEA,IAAI,CAACjB,aAAa,EAAE;IAClB,OAAOc,WAAW;EACpB;EACA,IAAI,OAAOd,aAAa,KAAK,QAAQ,EAAE;IACrC,OAAOmB,OAAO,CAACnB,aAAa,CAAC;EAC/B;EACA,IACE,OAAOA,aAAa,KAAK,QAAQ,IACjC,KAAK,IAAIA,aAAa,IACtB,KAAK,IAAIA,aAAa,EACtB;IACA,OAAOA,aAAa;EACtB;EACA,MAAM,IAAIkB,KAAK,CAAC,2BAA2BlB,aAAa,EAAE,CAAC;AAC7D,CAAC","ignoreList":[]}
package/esm/index.js CHANGED
@@ -5,13 +5,54 @@
5
5
  */
6
6
 
7
7
  import path from 'path';
8
+ import crypto from 'crypto';
8
9
  import { logger } from '@wyw-in-js/shared';
9
10
  import { transform, TransformCacheCollection } from '@wyw-in-js/transform';
10
11
  import { sharedState } from './WYWinJSDebugPlugin';
11
- import { getCacheInstance } from './cache';
12
+ import { getCacheInstance, registerCacheProvider } from './cache';
12
13
  export { WYWinJSDebugPlugin } from './WYWinJSDebugPlugin';
13
14
  const outputCssLoader = require.resolve('./outputCssLoader');
15
+ const stripQueryAndHash = request => {
16
+ const queryIdx = request.indexOf('?');
17
+ const hashIdx = request.indexOf('#');
18
+ if (queryIdx === -1) {
19
+ return hashIdx === -1 ? request : request.slice(0, hashIdx);
20
+ }
21
+ if (hashIdx === -1) return request.slice(0, queryIdx);
22
+ return request.slice(0, Math.min(queryIdx, hashIdx));
23
+ };
24
+ const hashText = text => crypto.createHash('sha256').update(text).digest('hex').slice(0, 12);
14
25
  const cache = new TransformCacheCollection();
26
+ const resolvers = {};
27
+ const getResolverKey = (importer, stack) => {
28
+ const root = stack.length ? stack[stack.length - 1] : importer;
29
+ return stripQueryAndHash(root);
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');
43
+ }
44
+ return firstResult;
45
+ });
46
+ };
47
+ function addResolver(resourcePath, resolver) {
48
+ if (!resolvers[resourcePath]) {
49
+ resolvers[resourcePath] = [];
50
+ }
51
+ resolvers[resourcePath].push(resolver);
52
+ return () => {
53
+ resolvers[resourcePath] = resolvers[resourcePath].filter(r => r !== resolver);
54
+ };
55
+ }
15
56
  const webpack5Loader = function webpack5LoaderPlugin(content, inputSourceMap) {
16
57
  function convertSourceMap(value, filename) {
17
58
  if (typeof value === 'string' || !value) {
@@ -29,69 +70,104 @@ const webpack5Loader = function webpack5LoaderPlugin(content, inputSourceMap) {
29
70
 
30
71
  // tell Webpack this loader is async
31
72
  this.async();
73
+ const resolveOptions = {
74
+ dependencyType: 'esm'
75
+ };
76
+ const resolveModule = this.getResolve(resolveOptions);
77
+ const isPromiseLike = value => typeof value?.then === 'function';
78
+ const resolveModuleAsync = (context, request) => new Promise((resolve, reject) => {
79
+ let settled = false;
80
+ const finish = (err, result) => {
81
+ if (settled) return;
82
+ settled = true;
83
+ if (err) {
84
+ reject(err);
85
+ return;
86
+ }
87
+ if (typeof result === 'string') {
88
+ resolve(result);
89
+ return;
90
+ }
91
+ reject(new Error(`Cannot resolve ${request}`));
92
+ };
93
+ try {
94
+ const maybePromise = resolveModule(context, request, finish);
95
+ if (isPromiseLike(maybePromise)) {
96
+ maybePromise.then(result => finish(null, result), err => finish(err, null));
97
+ }
98
+ } catch (err) {
99
+ finish(err, null);
100
+ }
101
+ });
102
+ const removeResolver = addResolver(this.resourcePath, (what, importer) => {
103
+ const importerPath = stripQueryAndHash(importer);
104
+ const context = path.isAbsolute(importerPath) ? path.dirname(importerPath) : path.join(process.cwd(), path.dirname(importerPath));
105
+ return resolveModuleAsync(context, what).then(result => {
106
+ const filePath = stripQueryAndHash(result);
107
+ if (path.isAbsolute(filePath)) {
108
+ this.addDependency(filePath);
109
+ }
110
+ return result;
111
+ });
112
+ });
32
113
  logger('loader %s', this.resourcePath);
33
114
  const {
34
115
  sourceMap = undefined,
35
116
  preprocessor = undefined,
117
+ keepComments = undefined,
36
118
  prefixer = undefined,
37
119
  extension = '.wyw-in-js.css',
120
+ cssImport = 'require',
38
121
  cacheProvider,
39
122
  ...rest
40
123
  } = this.getOptions() || {};
41
124
  const outputFileName = this.resourcePath.replace(/\.[^.]+$/, extension);
42
- const resolveModule = this.getResolve({
43
- dependencyType: 'esm'
44
- });
45
- const asyncResolve = (token, importer) => {
46
- const context = path.isAbsolute(importer) ? path.dirname(importer) : path.join(process.cwd(), path.dirname(importer));
47
- return new Promise((resolve, reject) => {
48
- resolveModule(context, token, (err, result) => {
49
- if (err) {
50
- reject(err);
51
- } else if (result) {
52
- this.addDependency(result);
53
- resolve(result);
54
- } else {
55
- reject(new Error(`Cannot resolve ${token}`));
56
- }
57
- });
58
- });
59
- };
60
125
  const transformServices = {
61
126
  options: {
62
127
  filename: this.resourcePath,
63
128
  inputSourceMap: convertSourceMap(inputSourceMap, this.resourcePath),
64
129
  pluginOptions: rest,
65
130
  prefixer,
131
+ keepComments,
66
132
  preprocessor,
67
133
  root: process.cwd()
68
134
  },
69
135
  cache,
136
+ emitWarning: message => this.emitWarning(new Error(message)),
70
137
  eventEmitter: sharedState.emitter
71
138
  };
72
139
  transform(transformServices, content.toString(), asyncResolve).then(async result => {
73
- if (result.cssText) {
74
- let {
75
- cssText
76
- } = result;
77
- if (sourceMap) {
78
- cssText += `/*# sourceMappingURL=data:application/json;base64,${Buffer.from(result.cssSourceMapText || '').toString('base64')}*/`;
79
- }
80
- await Promise.all(result.dependencies?.map(dep => asyncResolve(dep, this.resourcePath)) ?? []);
81
- try {
140
+ try {
141
+ if (result.cssText) {
142
+ let {
143
+ cssText
144
+ } = result;
145
+ if (sourceMap) {
146
+ cssText += `/*# sourceMappingURL=data:application/json;base64,${Buffer.from(result.cssSourceMapText || '').toString('base64')}*/`;
147
+ }
148
+ await Promise.all(result.dependencies?.map(dep => asyncResolve(dep, this.resourcePath)) ?? []);
82
149
  const cacheInstance = await getCacheInstance(cacheProvider);
150
+ const cacheProviderId = cacheProvider && typeof cacheProvider === 'object' ? registerCacheProvider(cacheInstance) : '';
83
151
  await cacheInstance.set(this.resourcePath, cssText);
84
152
  await cacheInstance.setDependencies?.(this.resourcePath, this.getDependencies());
85
- const request = `${outputFileName}!=!${outputCssLoader}?cacheProvider=${encodeURIComponent(typeof cacheProvider === 'string' ? cacheProvider : '')}!${this.resourcePath}`;
153
+ const wywQuery = [`wyw=${encodeURIComponent(extension.replace(/^\./, ''))}`];
154
+ if (this.hot) {
155
+ wywQuery.push(`v=${encodeURIComponent(hashText(cssText))}`);
156
+ }
157
+ const resourcePathWithQuery = `${this.resourcePath}?${wywQuery.join('&')}`;
158
+ const request = `${outputFileName}!=!${outputCssLoader}?cacheProvider=${encodeURIComponent(typeof cacheProvider === 'string' ? cacheProvider : '')}&cacheProviderId=${encodeURIComponent(cacheProviderId)}!${resourcePathWithQuery}`;
86
159
  const stringifiedRequest = JSON.stringify(this.utils.contextify(this.context || this.rootContext, request));
87
- this.callback(null, `${result.code}\n\nrequire(${stringifiedRequest});`, result.sourceMap ?? undefined);
88
- } catch (err) {
89
- this.callback(err);
160
+ const importCss = cssImport === 'import' ? `import ${stringifiedRequest};` : `require(${stringifiedRequest});`;
161
+ this.callback(null, `${result.code}\n\n${importCss}`, result.sourceMap ?? undefined);
162
+ return;
90
163
  }
91
- return;
164
+ this.callback(null, result.code, result.sourceMap ?? undefined);
165
+ } catch (err) {
166
+ this.callback(err);
92
167
  }
93
- this.callback(null, result.code, result.sourceMap ?? undefined);
94
- }, err => this.callback(err)).catch(err => this.callback(err));
168
+ }, err => {
169
+ this.callback(err);
170
+ }).catch(err => this.callback(err)).finally(removeResolver);
95
171
  };
96
172
  export default webpack5Loader;
97
173
  //# sourceMappingURL=index.js.map
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["path","logger","transform","TransformCacheCollection","sharedState","getCacheInstance","WYWinJSDebugPlugin","outputCssLoader","require","resolve","cache","webpack5Loader","webpack5LoaderPlugin","content","inputSourceMap","convertSourceMap","value","filename","undefined","file","mappings","names","sources","version","async","resourcePath","sourceMap","preprocessor","prefixer","extension","cacheProvider","rest","getOptions","outputFileName","replace","resolveModule","getResolve","dependencyType","asyncResolve","token","importer","context","isAbsolute","dirname","join","process","cwd","Promise","reject","err","result","addDependency","Error","transformServices","options","pluginOptions","root","eventEmitter","emitter","toString","then","cssText","Buffer","from","cssSourceMapText","all","dependencies","map","dep","cacheInstance","set","setDependencies","getDependencies","request","encodeURIComponent","stringifiedRequest","JSON","stringify","utils","contextify","rootContext","callback","code","catch"],"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';\n\nimport type { RawSourceMap } from 'source-map';\nimport type { RawLoaderDefinitionFunction } from 'webpack';\n\nimport { logger } from '@wyw-in-js/shared';\nimport type { 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 } from './cache';\n\nexport { WYWinJSDebugPlugin } from './WYWinJSDebugPlugin';\n\nconst outputCssLoader = require.resolve('./outputCssLoader');\n\nexport type LoaderOptions = {\n cacheProvider?: string | ICache;\n extension?: string;\n prefixer?: boolean;\n preprocessor?: Preprocessor;\n sourceMap?: boolean;\n};\ntype Loader = RawLoaderDefinitionFunction<LoaderOptions>;\n\nconst cache = new TransformCacheCollection();\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 logger('loader %s', this.resourcePath);\n\n const {\n sourceMap = undefined,\n preprocessor = undefined,\n prefixer = undefined,\n extension = '.wyw-in-js.css',\n cacheProvider,\n ...rest\n } = this.getOptions() || {};\n\n const outputFileName = this.resourcePath.replace(/\\.[^.]+$/, extension);\n const resolveModule = this.getResolve({ dependencyType: 'esm' });\n\n const asyncResolve = (token: string, importer: string): Promise<string> => {\n const context = path.isAbsolute(importer)\n ? path.dirname(importer)\n : path.join(process.cwd(), path.dirname(importer));\n return new Promise((resolve, reject) => {\n resolveModule(context, token, (err, result) => {\n if (err) {\n reject(err);\n } else if (result) {\n this.addDependency(result);\n resolve(result);\n } else {\n reject(new Error(`Cannot resolve ${token}`));\n }\n });\n });\n };\n\n const transformServices = {\n options: {\n filename: this.resourcePath,\n inputSourceMap: convertSourceMap(inputSourceMap, this.resourcePath),\n pluginOptions: rest,\n prefixer,\n preprocessor,\n root: process.cwd(),\n },\n cache,\n eventEmitter: sharedState.emitter,\n };\n\n transform(transformServices, content.toString(), asyncResolve)\n .then(\n async (result: Result) => {\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 try {\n const cacheInstance = await getCacheInstance(cacheProvider);\n\n await cacheInstance.set(this.resourcePath, cssText);\n\n await cacheInstance.setDependencies?.(\n this.resourcePath,\n this.getDependencies()\n );\n\n const request = `${outputFileName}!=!${outputCssLoader}?cacheProvider=${encodeURIComponent(\n typeof cacheProvider === 'string' ? cacheProvider : ''\n )}!${this.resourcePath}`;\n const stringifiedRequest = JSON.stringify(\n this.utils.contextify(this.context || this.rootContext, request)\n );\n\n this.callback(\n null,\n `${result.code}\\n\\nrequire(${stringifiedRequest});`,\n result.sourceMap ?? undefined\n );\n } catch (err) {\n this.callback(err as Error);\n }\n\n return;\n }\n\n this.callback(null, result.code, result.sourceMap ?? undefined);\n },\n (err: Error) => this.callback(err)\n )\n .catch((err: Error) => this.callback(err));\n};\n\nexport default webpack5Loader;\n"],"mappings":"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"}
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":[]}
@@ -2,10 +2,11 @@ import { getCacheInstance } from './cache';
2
2
  export default async function outputCssLoader() {
3
3
  this.async();
4
4
  const {
5
- cacheProvider
5
+ cacheProvider,
6
+ cacheProviderId
6
7
  } = this.getOptions();
7
8
  try {
8
- const cacheInstance = await getCacheInstance(cacheProvider);
9
+ const cacheInstance = await getCacheInstance(cacheProvider, cacheProviderId);
9
10
  const result = await cacheInstance.get(this.resourcePath);
10
11
  const dependencies = (await cacheInstance.getDependencies?.(this.resourcePath)) ?? [];
11
12
  dependencies.forEach(dependency => {
@@ -1 +1 @@
1
- {"version":3,"file":"outputCssLoader.js","names":["getCacheInstance","outputCssLoader","async","cacheProvider","getOptions","cacheInstance","result","get","resourcePath","dependencies","getDependencies","forEach","dependency","addDependency","callback","err"],"sources":["../src/outputCssLoader.ts"],"sourcesContent":["import type webpack from 'webpack';\n\nimport type { ICache } from './cache';\nimport { getCacheInstance } from './cache';\n\nexport default async function outputCssLoader(\n this: webpack.LoaderContext<{ cacheProvider: string | ICache | undefined }>\n) {\n this.async();\n const { cacheProvider } = this.getOptions();\n\n try {\n const cacheInstance = await getCacheInstance(cacheProvider);\n\n const result = await cacheInstance.get(this.resourcePath);\n const dependencies =\n (await cacheInstance.getDependencies?.(this.resourcePath)) ?? [];\n\n dependencies.forEach((dependency) => {\n this.addDependency(dependency);\n });\n\n this.callback(null, result);\n } catch (err) {\n this.callback(err as Error);\n }\n}\n"],"mappings":"AAGA,SAASA,gBAAgB,QAAQ,SAAS;AAE1C,eAAe,eAAeC,eAAeA,CAAA,EAE3C;EACA,IAAI,CAACC,KAAK,CAAC,CAAC;EACZ,MAAM;IAAEC;EAAc,CAAC,GAAG,IAAI,CAACC,UAAU,CAAC,CAAC;EAE3C,IAAI;IACF,MAAMC,aAAa,GAAG,MAAML,gBAAgB,CAACG,aAAa,CAAC;IAE3D,MAAMG,MAAM,GAAG,MAAMD,aAAa,CAACE,GAAG,CAAC,IAAI,CAACC,YAAY,CAAC;IACzD,MAAMC,YAAY,GAChB,CAAC,MAAMJ,aAAa,CAACK,eAAe,GAAG,IAAI,CAACF,YAAY,CAAC,KAAK,EAAE;IAElEC,YAAY,CAACE,OAAO,CAAEC,UAAU,IAAK;MACnC,IAAI,CAACC,aAAa,CAACD,UAAU,CAAC;IAChC,CAAC,CAAC;IAEF,IAAI,CAACE,QAAQ,CAAC,IAAI,EAAER,MAAM,CAAC;EAC7B,CAAC,CAAC,OAAOS,GAAG,EAAE;IACZ,IAAI,CAACD,QAAQ,CAACC,GAAY,CAAC;EAC7B;AACF"}
1
+ {"version":3,"file":"outputCssLoader.js","names":["getCacheInstance","outputCssLoader","async","cacheProvider","cacheProviderId","getOptions","cacheInstance","result","get","resourcePath","dependencies","getDependencies","forEach","dependency","addDependency","callback","err"],"sources":["../src/outputCssLoader.ts"],"sourcesContent":["import type webpack from 'webpack';\n\nimport type { ICache } from './cache';\nimport { getCacheInstance } from './cache';\n\nexport default async function outputCssLoader(\n this: webpack.LoaderContext<{\n cacheProvider: string | ICache | undefined;\n cacheProviderId?: string | undefined;\n }>\n) {\n this.async();\n const { cacheProvider, cacheProviderId } = this.getOptions();\n\n try {\n const cacheInstance = await getCacheInstance(\n cacheProvider,\n cacheProviderId\n );\n\n const result = await cacheInstance.get(this.resourcePath);\n const dependencies =\n (await cacheInstance.getDependencies?.(this.resourcePath)) ?? [];\n\n dependencies.forEach((dependency) => {\n this.addDependency(dependency);\n });\n\n this.callback(null, result);\n } catch (err) {\n this.callback(err as Error);\n }\n}\n"],"mappings":"AAGA,SAASA,gBAAgB,QAAQ,SAAS;AAE1C,eAAe,eAAeC,eAAeA,CAAA,EAK3C;EACA,IAAI,CAACC,KAAK,CAAC,CAAC;EACZ,MAAM;IAAEC,aAAa;IAAEC;EAAgB,CAAC,GAAG,IAAI,CAACC,UAAU,CAAC,CAAC;EAE5D,IAAI;IACF,MAAMC,aAAa,GAAG,MAAMN,gBAAgB,CAC1CG,aAAa,EACbC,eACF,CAAC;IAED,MAAMG,MAAM,GAAG,MAAMD,aAAa,CAACE,GAAG,CAAC,IAAI,CAACC,YAAY,CAAC;IACzD,MAAMC,YAAY,GAChB,CAAC,MAAMJ,aAAa,CAACK,eAAe,GAAG,IAAI,CAACF,YAAY,CAAC,KAAK,EAAE;IAElEC,YAAY,CAACE,OAAO,CAAEC,UAAU,IAAK;MACnC,IAAI,CAACC,aAAa,CAACD,UAAU,CAAC;IAChC,CAAC,CAAC;IAEF,IAAI,CAACE,QAAQ,CAAC,IAAI,EAAER,MAAM,CAAC;EAC7B,CAAC,CAAC,OAAOS,GAAG,EAAE;IACZ,IAAI,CAACD,QAAQ,CAACC,GAAY,CAAC;EAC7B;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"WYWinJSDebugPlugin.js","names":["_transform","require","sharedState","exports","WYWinJSDebugPlugin","constructor","options","emitter","onDone","createFileReporter","apply","compiler","hooks","shutdown","tap","process","cwd"],"sources":["../src/WYWinJSDebugPlugin.ts"],"sourcesContent":["import type { Compiler } from 'webpack';\n\nimport type { EventEmitter, IFileReporterOptions } from '@wyw-in-js/transform';\nimport { createFileReporter } from '@wyw-in-js/transform';\n\nexport const sharedState: {\n emitter?: EventEmitter;\n} = {};\n\nexport class WYWinJSDebugPlugin {\n private readonly onDone: (root: string) => void;\n\n constructor(options?: IFileReporterOptions) {\n const { emitter, onDone } = createFileReporter(options ?? false);\n sharedState.emitter = emitter;\n this.onDone = onDone;\n }\n\n apply(compiler: Compiler) {\n compiler.hooks.shutdown.tap('WYWinJSDebug', () => {\n this.onDone(process.cwd());\n });\n }\n}\n"],"mappings":";;;;;;AAGA,IAAAA,UAAA,GAAAC,OAAA;AAEO,MAAMC,WAEZ,GAAAC,OAAA,CAAAD,WAAA,GAAG,CAAC,CAAC;AAEC,MAAME,kBAAkB,CAAC;EAG9BC,WAAWA,CAACC,OAA8B,EAAE;IAC1C,MAAM;MAAEC,OAAO;MAAEC;IAAO,CAAC,GAAG,IAAAC,6BAAkB,EAACH,OAAO,aAAPA,OAAO,cAAPA,OAAO,GAAI,KAAK,CAAC;IAChEJ,WAAW,CAACK,OAAO,GAAGA,OAAO;IAC7B,IAAI,CAACC,MAAM,GAAGA,MAAM;EACtB;EAEAE,KAAKA,CAACC,QAAkB,EAAE;IACxBA,QAAQ,CAACC,KAAK,CAACC,QAAQ,CAACC,GAAG,CAAC,cAAc,EAAE,MAAM;MAChD,IAAI,CAACN,MAAM,CAACO,OAAO,CAACC,GAAG,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC;EACJ;AACF;AAACb,OAAA,CAAAC,kBAAA,GAAAA,kBAAA"}
1
+ {"version":3,"file":"WYWinJSDebugPlugin.js","names":["_transform","require","sharedState","exports","WYWinJSDebugPlugin","constructor","options","emitter","onDone","createFileReporter","apply","compiler","hooks","shutdown","tap","process","cwd"],"sources":["../src/WYWinJSDebugPlugin.ts"],"sourcesContent":["import type { Compiler } from 'webpack';\n\nimport type { EventEmitter, IFileReporterOptions } from '@wyw-in-js/transform';\nimport { createFileReporter } from '@wyw-in-js/transform';\n\nexport const sharedState: {\n emitter?: EventEmitter;\n} = {};\n\nexport class WYWinJSDebugPlugin {\n private readonly onDone: (root: string) => void;\n\n constructor(options?: IFileReporterOptions) {\n const { emitter, onDone } = createFileReporter(options ?? false);\n sharedState.emitter = emitter;\n this.onDone = onDone;\n }\n\n apply(compiler: Compiler) {\n compiler.hooks.shutdown.tap('WYWinJSDebug', () => {\n this.onDone(process.cwd());\n });\n }\n}\n"],"mappings":";;;;;;AAGA,IAAAA,UAAA,GAAAC,OAAA;AAEO,MAAMC,WAEZ,GAAAC,OAAA,CAAAD,WAAA,GAAG,CAAC,CAAC;AAEC,MAAME,kBAAkB,CAAC;EAG9BC,WAAWA,CAACC,OAA8B,EAAE;IAC1C,MAAM;MAAEC,OAAO;MAAEC;IAAO,CAAC,GAAG,IAAAC,6BAAkB,EAACH,OAAO,aAAPA,OAAO,cAAPA,OAAO,GAAI,KAAK,CAAC;IAChEJ,WAAW,CAACK,OAAO,GAAGA,OAAO;IAC7B,IAAI,CAACC,MAAM,GAAGA,MAAM;EACtB;EAEAE,KAAKA,CAACC,QAAkB,EAAE;IACxBA,QAAQ,CAACC,KAAK,CAACC,QAAQ,CAACC,GAAG,CAAC,cAAc,EAAE,MAAM;MAChD,IAAI,CAACN,MAAM,CAACO,OAAO,CAACC,GAAG,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC;EACJ;AACF;AAACb,OAAA,CAAAC,kBAAA,GAAAA,kBAAA","ignoreList":[]}
package/lib/cache.js CHANGED
@@ -3,9 +3,24 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.memoryCache = exports.getCacheInstance = void 0;
7
- // memory cache, which is the default cache implementation in WYW-in-JS
6
+ exports.registerCacheProvider = exports.memoryCache = exports.getCacheInstance = void 0;
7
+ let cacheProviderSeq = 0;
8
+ const cacheProviderIds = new WeakMap();
9
+ const cacheProvidersById = new Map();
10
+ const registerCacheProvider = cacheProvider => {
11
+ const knownId = cacheProviderIds.get(cacheProvider);
12
+ if (knownId) {
13
+ return knownId;
14
+ }
15
+ cacheProviderSeq += 1;
16
+ const id = `${cacheProviderSeq}`;
17
+ cacheProviderIds.set(cacheProvider, id);
18
+ cacheProvidersById.set(id, cacheProvider);
19
+ return id;
20
+ };
8
21
 
22
+ // memory cache, which is the default cache implementation in WYW-in-JS
23
+ exports.registerCacheProvider = registerCacheProvider;
9
24
  class MemoryCache {
10
25
  cache = new Map();
11
26
  dependenciesCache = new Map();
@@ -33,7 +48,14 @@ const memoryCache = exports.memoryCache = new MemoryCache();
33
48
  * @param cacheProvider string | ICache | undefined
34
49
  * @returns ICache instance
35
50
  */
36
- const getCacheInstance = async cacheProvider => {
51
+ const getCacheInstance = async (cacheProvider, cacheProviderId) => {
52
+ if (cacheProviderId) {
53
+ const cacheProviderInstance = cacheProvidersById.get(cacheProviderId);
54
+ if (!cacheProviderInstance) {
55
+ throw new Error(`Invalid cache provider id: ${cacheProviderId}`);
56
+ }
57
+ return cacheProviderInstance;
58
+ }
37
59
  if (!cacheProvider) {
38
60
  return memoryCache;
39
61
  }
package/lib/cache.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","names":["MemoryCache","cache","Map","dependenciesCache","get","key","_this$cache$get","Promise","resolve","getDependencies","_this$dependenciesCac","set","value","setDependencies","memoryCache","exports","getCacheInstance","cacheProvider","require","Error"],"sources":["../src/cache.ts"],"sourcesContent":["export interface ICache {\n get: (key: string) => Promise<string>;\n getDependencies?: (key: string) => Promise<string[]>;\n set: (key: string, value: string) => Promise<void>;\n setDependencies?: (key: string, value: string[]) => Promise<void>;\n}\n\n// memory cache, which is the default cache implementation in WYW-in-JS\n\nclass MemoryCache implements ICache {\n private cache: Map<string, string> = new Map();\n\n private dependenciesCache: Map<string, string[]> = new Map();\n\n public get(key: string): Promise<string> {\n return Promise.resolve(this.cache.get(key) ?? '');\n }\n\n public getDependencies(key: string): Promise<string[]> {\n return Promise.resolve(this.dependenciesCache.get(key) ?? []);\n }\n\n public set(key: string, value: string): Promise<void> {\n this.cache.set(key, value);\n return Promise.resolve();\n }\n\n public setDependencies(key: string, value: string[]): Promise<void> {\n this.dependenciesCache.set(key, value);\n return Promise.resolve();\n }\n}\n\nexport const memoryCache = new MemoryCache();\n\n/**\n * return cache instance from `options.cacheProvider`\n * @param cacheProvider string | ICache | undefined\n * @returns ICache instance\n */\nexport const getCacheInstance = async (\n cacheProvider: string | ICache | undefined\n): Promise<ICache> => {\n if (!cacheProvider) {\n return memoryCache;\n }\n if (typeof cacheProvider === 'string') {\n return require(cacheProvider);\n }\n if (\n typeof cacheProvider === 'object' &&\n 'get' in cacheProvider &&\n 'set' in cacheProvider\n ) {\n return cacheProvider;\n }\n throw new Error(`Invalid cache provider: ${cacheProvider}`);\n};\n"],"mappings":";;;;;;AAOA;;AAEA,MAAMA,WAAW,CAAmB;EAC1BC,KAAK,GAAwB,IAAIC,GAAG,CAAC,CAAC;EAEtCC,iBAAiB,GAA0B,IAAID,GAAG,CAAC,CAAC;EAErDE,GAAGA,CAACC,GAAW,EAAmB;IAAA,IAAAC,eAAA;IACvC,OAAOC,OAAO,CAACC,OAAO,EAAAF,eAAA,GAAC,IAAI,CAACL,KAAK,CAACG,GAAG,CAACC,GAAG,CAAC,cAAAC,eAAA,cAAAA,eAAA,GAAI,EAAE,CAAC;EACnD;EAEOG,eAAeA,CAACJ,GAAW,EAAqB;IAAA,IAAAK,qBAAA;IACrD,OAAOH,OAAO,CAACC,OAAO,EAAAE,qBAAA,GAAC,IAAI,CAACP,iBAAiB,CAACC,GAAG,CAACC,GAAG,CAAC,cAAAK,qBAAA,cAAAA,qBAAA,GAAI,EAAE,CAAC;EAC/D;EAEOC,GAAGA,CAACN,GAAW,EAAEO,KAAa,EAAiB;IACpD,IAAI,CAACX,KAAK,CAACU,GAAG,CAACN,GAAG,EAAEO,KAAK,CAAC;IAC1B,OAAOL,OAAO,CAACC,OAAO,CAAC,CAAC;EAC1B;EAEOK,eAAeA,CAACR,GAAW,EAAEO,KAAe,EAAiB;IAClE,IAAI,CAACT,iBAAiB,CAACQ,GAAG,CAACN,GAAG,EAAEO,KAAK,CAAC;IACtC,OAAOL,OAAO,CAACC,OAAO,CAAC,CAAC;EAC1B;AACF;AAEO,MAAMM,WAAW,GAAAC,OAAA,CAAAD,WAAA,GAAG,IAAId,WAAW,CAAC,CAAC;;AAE5C;AACA;AACA;AACA;AACA;AACO,MAAMgB,gBAAgB,GAAG,MAC9BC,aAA0C,IACtB;EACpB,IAAI,CAACA,aAAa,EAAE;IAClB,OAAOH,WAAW;EACpB;EACA,IAAI,OAAOG,aAAa,KAAK,QAAQ,EAAE;IACrC,OAAOC,OAAO,CAACD,aAAa,CAAC;EAC/B;EACA,IACE,OAAOA,aAAa,KAAK,QAAQ,IACjC,KAAK,IAAIA,aAAa,IACtB,KAAK,IAAIA,aAAa,EACtB;IACA,OAAOA,aAAa;EACtB;EACA,MAAM,IAAIE,KAAK,CAAE,2BAA0BF,aAAc,EAAC,CAAC;AAC7D,CAAC;AAACF,OAAA,CAAAC,gBAAA,GAAAA,gBAAA"}
1
+ {"version":3,"file":"cache.js","names":["cacheProviderSeq","cacheProviderIds","WeakMap","cacheProvidersById","Map","registerCacheProvider","cacheProvider","knownId","get","id","set","exports","MemoryCache","cache","dependenciesCache","key","_this$cache$get","Promise","resolve","getDependencies","_this$dependenciesCac","value","setDependencies","memoryCache","getCacheInstance","cacheProviderId","cacheProviderInstance","Error","require"],"sources":["../src/cache.ts"],"sourcesContent":["export interface ICache {\n get: (key: string) => Promise<string>;\n getDependencies?: (key: string) => Promise<string[]>;\n set: (key: string, value: string) => Promise<void>;\n setDependencies?: (key: string, value: string[]) => Promise<void>;\n}\n\nlet cacheProviderSeq = 0;\nconst cacheProviderIds = new WeakMap<ICache, string>();\nconst cacheProvidersById = new Map<string, ICache>();\n\nexport const registerCacheProvider = (cacheProvider: ICache): string => {\n const knownId = cacheProviderIds.get(cacheProvider);\n if (knownId) {\n return knownId;\n }\n\n cacheProviderSeq += 1;\n const id = `${cacheProviderSeq}`;\n cacheProviderIds.set(cacheProvider, id);\n cacheProvidersById.set(id, cacheProvider);\n return id;\n};\n\n// memory cache, which is the default cache implementation in WYW-in-JS\n\nclass MemoryCache implements ICache {\n private cache: Map<string, string> = new Map();\n\n private dependenciesCache: Map<string, string[]> = new Map();\n\n public get(key: string): Promise<string> {\n return Promise.resolve(this.cache.get(key) ?? '');\n }\n\n public getDependencies(key: string): Promise<string[]> {\n return Promise.resolve(this.dependenciesCache.get(key) ?? []);\n }\n\n public set(key: string, value: string): Promise<void> {\n this.cache.set(key, value);\n return Promise.resolve();\n }\n\n public setDependencies(key: string, value: string[]): Promise<void> {\n this.dependenciesCache.set(key, value);\n return Promise.resolve();\n }\n}\n\nexport const memoryCache = new MemoryCache();\n\n/**\n * return cache instance from `options.cacheProvider`\n * @param cacheProvider string | ICache | undefined\n * @returns ICache instance\n */\nexport const getCacheInstance = async (\n cacheProvider: string | ICache | undefined,\n cacheProviderId?: string | undefined\n): Promise<ICache> => {\n if (cacheProviderId) {\n const cacheProviderInstance = cacheProvidersById.get(cacheProviderId);\n if (!cacheProviderInstance) {\n throw new Error(`Invalid cache provider id: ${cacheProviderId}`);\n }\n\n return cacheProviderInstance;\n }\n\n if (!cacheProvider) {\n return memoryCache;\n }\n if (typeof cacheProvider === 'string') {\n return require(cacheProvider);\n }\n if (\n typeof cacheProvider === 'object' &&\n 'get' in cacheProvider &&\n 'set' in cacheProvider\n ) {\n return cacheProvider;\n }\n throw new Error(`Invalid cache provider: ${cacheProvider}`);\n};\n"],"mappings":";;;;;;AAOA,IAAIA,gBAAgB,GAAG,CAAC;AACxB,MAAMC,gBAAgB,GAAG,IAAIC,OAAO,CAAiB,CAAC;AACtD,MAAMC,kBAAkB,GAAG,IAAIC,GAAG,CAAiB,CAAC;AAE7C,MAAMC,qBAAqB,GAAIC,aAAqB,IAAa;EACtE,MAAMC,OAAO,GAAGN,gBAAgB,CAACO,GAAG,CAACF,aAAa,CAAC;EACnD,IAAIC,OAAO,EAAE;IACX,OAAOA,OAAO;EAChB;EAEAP,gBAAgB,IAAI,CAAC;EACrB,MAAMS,EAAE,GAAG,GAAGT,gBAAgB,EAAE;EAChCC,gBAAgB,CAACS,GAAG,CAACJ,aAAa,EAAEG,EAAE,CAAC;EACvCN,kBAAkB,CAACO,GAAG,CAACD,EAAE,EAAEH,aAAa,CAAC;EACzC,OAAOG,EAAE;AACX,CAAC;;AAED;AAAAE,OAAA,CAAAN,qBAAA,GAAAA,qBAAA;AAEA,MAAMO,WAAW,CAAmB;EAC1BC,KAAK,GAAwB,IAAIT,GAAG,CAAC,CAAC;EAEtCU,iBAAiB,GAA0B,IAAIV,GAAG,CAAC,CAAC;EAErDI,GAAGA,CAACO,GAAW,EAAmB;IAAA,IAAAC,eAAA;IACvC,OAAOC,OAAO,CAACC,OAAO,EAAAF,eAAA,GAAC,IAAI,CAACH,KAAK,CAACL,GAAG,CAACO,GAAG,CAAC,cAAAC,eAAA,cAAAA,eAAA,GAAI,EAAE,CAAC;EACnD;EAEOG,eAAeA,CAACJ,GAAW,EAAqB;IAAA,IAAAK,qBAAA;IACrD,OAAOH,OAAO,CAACC,OAAO,EAAAE,qBAAA,GAAC,IAAI,CAACN,iBAAiB,CAACN,GAAG,CAACO,GAAG,CAAC,cAAAK,qBAAA,cAAAA,qBAAA,GAAI,EAAE,CAAC;EAC/D;EAEOV,GAAGA,CAACK,GAAW,EAAEM,KAAa,EAAiB;IACpD,IAAI,CAACR,KAAK,CAACH,GAAG,CAACK,GAAG,EAAEM,KAAK,CAAC;IAC1B,OAAOJ,OAAO,CAACC,OAAO,CAAC,CAAC;EAC1B;EAEOI,eAAeA,CAACP,GAAW,EAAEM,KAAe,EAAiB;IAClE,IAAI,CAACP,iBAAiB,CAACJ,GAAG,CAACK,GAAG,EAAEM,KAAK,CAAC;IACtC,OAAOJ,OAAO,CAACC,OAAO,CAAC,CAAC;EAC1B;AACF;AAEO,MAAMK,WAAW,GAAAZ,OAAA,CAAAY,WAAA,GAAG,IAAIX,WAAW,CAAC,CAAC;;AAE5C;AACA;AACA;AACA;AACA;AACO,MAAMY,gBAAgB,GAAG,MAAAA,CAC9BlB,aAA0C,EAC1CmB,eAAoC,KAChB;EACpB,IAAIA,eAAe,EAAE;IACnB,MAAMC,qBAAqB,GAAGvB,kBAAkB,CAACK,GAAG,CAACiB,eAAe,CAAC;IACrE,IAAI,CAACC,qBAAqB,EAAE;MAC1B,MAAM,IAAIC,KAAK,CAAC,8BAA8BF,eAAe,EAAE,CAAC;IAClE;IAEA,OAAOC,qBAAqB;EAC9B;EAEA,IAAI,CAACpB,aAAa,EAAE;IAClB,OAAOiB,WAAW;EACpB;EACA,IAAI,OAAOjB,aAAa,KAAK,QAAQ,EAAE;IACrC,OAAOsB,OAAO,CAACtB,aAAa,CAAC;EAC/B;EACA,IACE,OAAOA,aAAa,KAAK,QAAQ,IACjC,KAAK,IAAIA,aAAa,IACtB,KAAK,IAAIA,aAAa,EACtB;IACA,OAAOA,aAAa;EACtB;EACA,MAAM,IAAIqB,KAAK,CAAC,2BAA2BrB,aAAa,EAAE,CAAC;AAC7D,CAAC;AAACK,OAAA,CAAAa,gBAAA,GAAAA,gBAAA","ignoreList":[]}
package/lib/index.js CHANGED
@@ -11,11 +11,12 @@ Object.defineProperty(exports, "WYWinJSDebugPlugin", {
11
11
  });
12
12
  exports.default = void 0;
13
13
  var _path = _interopRequireDefault(require("path"));
14
+ var _crypto = _interopRequireDefault(require("crypto"));
14
15
  var _shared = require("@wyw-in-js/shared");
15
16
  var _transform = require("@wyw-in-js/transform");
16
17
  var _WYWinJSDebugPlugin = require("./WYWinJSDebugPlugin");
17
18
  var _cache = require("./cache");
18
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
19
20
  /**
20
21
  * This file contains a Webpack loader for WYW-in-JS.
21
22
  * It uses the transform.ts function to generate class names from source code,
@@ -23,7 +24,47 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
23
24
  */
24
25
 
25
26
  const outputCssLoader = require.resolve('./outputCssLoader');
27
+ const stripQueryAndHash = request => {
28
+ const queryIdx = request.indexOf('?');
29
+ const hashIdx = request.indexOf('#');
30
+ if (queryIdx === -1) {
31
+ return hashIdx === -1 ? request : request.slice(0, hashIdx);
32
+ }
33
+ if (hashIdx === -1) return request.slice(0, queryIdx);
34
+ return request.slice(0, Math.min(queryIdx, hashIdx));
35
+ };
36
+ const hashText = text => _crypto.default.createHash('sha256').update(text).digest('hex').slice(0, 12);
26
37
  const cache = new _transform.TransformCacheCollection();
38
+ const resolvers = {};
39
+ const getResolverKey = (importer, stack) => {
40
+ const root = stack.length ? stack[stack.length - 1] : importer;
41
+ return stripQueryAndHash(root);
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');
55
+ }
56
+ return firstResult;
57
+ });
58
+ };
59
+ function addResolver(resourcePath, resolver) {
60
+ if (!resolvers[resourcePath]) {
61
+ resolvers[resourcePath] = [];
62
+ }
63
+ resolvers[resourcePath].push(resolver);
64
+ return () => {
65
+ resolvers[resourcePath] = resolvers[resourcePath].filter(r => r !== resolver);
66
+ };
67
+ }
27
68
  const webpack5Loader = function webpack5LoaderPlugin(content, inputSourceMap) {
28
69
  function convertSourceMap(value, filename) {
29
70
  var _value$file, _value$mappings, _value$names, _value$sources, _value$version;
@@ -42,72 +83,106 @@ const webpack5Loader = function webpack5LoaderPlugin(content, inputSourceMap) {
42
83
 
43
84
  // tell Webpack this loader is async
44
85
  this.async();
86
+ const resolveOptions = {
87
+ dependencyType: 'esm'
88
+ };
89
+ const resolveModule = this.getResolve(resolveOptions);
90
+ const isPromiseLike = value => typeof (value === null || value === void 0 ? void 0 : value.then) === 'function';
91
+ const resolveModuleAsync = (context, request) => new Promise((resolve, reject) => {
92
+ let settled = false;
93
+ const finish = (err, result) => {
94
+ if (settled) return;
95
+ settled = true;
96
+ if (err) {
97
+ reject(err);
98
+ return;
99
+ }
100
+ if (typeof result === 'string') {
101
+ resolve(result);
102
+ return;
103
+ }
104
+ reject(new Error(`Cannot resolve ${request}`));
105
+ };
106
+ try {
107
+ const maybePromise = resolveModule(context, request, finish);
108
+ if (isPromiseLike(maybePromise)) {
109
+ maybePromise.then(result => finish(null, result), err => finish(err, null));
110
+ }
111
+ } catch (err) {
112
+ finish(err, null);
113
+ }
114
+ });
115
+ const removeResolver = addResolver(this.resourcePath, (what, importer) => {
116
+ const importerPath = stripQueryAndHash(importer);
117
+ const context = _path.default.isAbsolute(importerPath) ? _path.default.dirname(importerPath) : _path.default.join(process.cwd(), _path.default.dirname(importerPath));
118
+ return resolveModuleAsync(context, what).then(result => {
119
+ const filePath = stripQueryAndHash(result);
120
+ if (_path.default.isAbsolute(filePath)) {
121
+ this.addDependency(filePath);
122
+ }
123
+ return result;
124
+ });
125
+ });
45
126
  (0, _shared.logger)('loader %s', this.resourcePath);
46
127
  const {
47
128
  sourceMap = undefined,
48
129
  preprocessor = undefined,
130
+ keepComments = undefined,
49
131
  prefixer = undefined,
50
132
  extension = '.wyw-in-js.css',
133
+ cssImport = 'require',
51
134
  cacheProvider,
52
135
  ...rest
53
136
  } = this.getOptions() || {};
54
137
  const outputFileName = this.resourcePath.replace(/\.[^.]+$/, extension);
55
- const resolveModule = this.getResolve({
56
- dependencyType: 'esm'
57
- });
58
- const asyncResolve = (token, importer) => {
59
- const context = _path.default.isAbsolute(importer) ? _path.default.dirname(importer) : _path.default.join(process.cwd(), _path.default.dirname(importer));
60
- return new Promise((resolve, reject) => {
61
- resolveModule(context, token, (err, result) => {
62
- if (err) {
63
- reject(err);
64
- } else if (result) {
65
- this.addDependency(result);
66
- resolve(result);
67
- } else {
68
- reject(new Error(`Cannot resolve ${token}`));
69
- }
70
- });
71
- });
72
- };
73
138
  const transformServices = {
74
139
  options: {
75
140
  filename: this.resourcePath,
76
141
  inputSourceMap: convertSourceMap(inputSourceMap, this.resourcePath),
77
142
  pluginOptions: rest,
78
143
  prefixer,
144
+ keepComments,
79
145
  preprocessor,
80
146
  root: process.cwd()
81
147
  },
82
148
  cache,
149
+ emitWarning: message => this.emitWarning(new Error(message)),
83
150
  eventEmitter: _WYWinJSDebugPlugin.sharedState.emitter
84
151
  };
85
152
  (0, _transform.transform)(transformServices, content.toString(), asyncResolve).then(async result => {
86
- var _result$sourceMap2;
87
- if (result.cssText) {
88
- var _result$dependencies$, _result$dependencies;
89
- let {
90
- cssText
91
- } = result;
92
- if (sourceMap) {
93
- cssText += `/*# sourceMappingURL=data:application/json;base64,${Buffer.from(result.cssSourceMapText || '').toString('base64')}*/`;
94
- }
95
- await Promise.all((_result$dependencies$ = (_result$dependencies = result.dependencies) === null || _result$dependencies === void 0 ? void 0 : _result$dependencies.map(dep => asyncResolve(dep, this.resourcePath))) !== null && _result$dependencies$ !== void 0 ? _result$dependencies$ : []);
96
- try {
97
- var _cacheInstance$setDep, _result$sourceMap;
153
+ try {
154
+ var _result$sourceMap2;
155
+ if (result.cssText) {
156
+ var _result$dependencies$, _result$dependencies, _cacheInstance$setDep, _result$sourceMap;
157
+ let {
158
+ cssText
159
+ } = result;
160
+ if (sourceMap) {
161
+ cssText += `/*# sourceMappingURL=data:application/json;base64,${Buffer.from(result.cssSourceMapText || '').toString('base64')}*/`;
162
+ }
163
+ await Promise.all((_result$dependencies$ = (_result$dependencies = result.dependencies) === null || _result$dependencies === void 0 ? void 0 : _result$dependencies.map(dep => asyncResolve(dep, this.resourcePath))) !== null && _result$dependencies$ !== void 0 ? _result$dependencies$ : []);
98
164
  const cacheInstance = await (0, _cache.getCacheInstance)(cacheProvider);
165
+ const cacheProviderId = cacheProvider && typeof cacheProvider === 'object' ? (0, _cache.registerCacheProvider)(cacheInstance) : '';
99
166
  await cacheInstance.set(this.resourcePath, cssText);
100
167
  await ((_cacheInstance$setDep = cacheInstance.setDependencies) === null || _cacheInstance$setDep === void 0 ? void 0 : _cacheInstance$setDep.call(cacheInstance, this.resourcePath, this.getDependencies()));
101
- const request = `${outputFileName}!=!${outputCssLoader}?cacheProvider=${encodeURIComponent(typeof cacheProvider === 'string' ? cacheProvider : '')}!${this.resourcePath}`;
168
+ const wywQuery = [`wyw=${encodeURIComponent(extension.replace(/^\./, ''))}`];
169
+ if (this.hot) {
170
+ wywQuery.push(`v=${encodeURIComponent(hashText(cssText))}`);
171
+ }
172
+ const resourcePathWithQuery = `${this.resourcePath}?${wywQuery.join('&')}`;
173
+ const request = `${outputFileName}!=!${outputCssLoader}?cacheProvider=${encodeURIComponent(typeof cacheProvider === 'string' ? cacheProvider : '')}&cacheProviderId=${encodeURIComponent(cacheProviderId)}!${resourcePathWithQuery}`;
102
174
  const stringifiedRequest = JSON.stringify(this.utils.contextify(this.context || this.rootContext, request));
103
- this.callback(null, `${result.code}\n\nrequire(${stringifiedRequest});`, (_result$sourceMap = result.sourceMap) !== null && _result$sourceMap !== void 0 ? _result$sourceMap : undefined);
104
- } catch (err) {
105
- this.callback(err);
175
+ const importCss = cssImport === 'import' ? `import ${stringifiedRequest};` : `require(${stringifiedRequest});`;
176
+ this.callback(null, `${result.code}\n\n${importCss}`, (_result$sourceMap = result.sourceMap) !== null && _result$sourceMap !== void 0 ? _result$sourceMap : undefined);
177
+ return;
106
178
  }
107
- return;
179
+ this.callback(null, result.code, (_result$sourceMap2 = result.sourceMap) !== null && _result$sourceMap2 !== void 0 ? _result$sourceMap2 : undefined);
180
+ } catch (err) {
181
+ this.callback(err);
108
182
  }
109
- this.callback(null, result.code, (_result$sourceMap2 = result.sourceMap) !== null && _result$sourceMap2 !== void 0 ? _result$sourceMap2 : undefined);
110
- }, err => this.callback(err)).catch(err => this.callback(err));
183
+ }, err => {
184
+ this.callback(err);
185
+ }).catch(err => this.callback(err)).finally(removeResolver);
111
186
  };
112
187
  var _default = exports.default = webpack5Loader;
113
188
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_path","_interopRequireDefault","require","_shared","_transform","_WYWinJSDebugPlugin","_cache","obj","__esModule","default","outputCssLoader","resolve","cache","TransformCacheCollection","webpack5Loader","webpack5LoaderPlugin","content","inputSourceMap","convertSourceMap","value","filename","_value$file","_value$mappings","_value$names","_value$sources","_value$version","undefined","file","mappings","names","sources","version","async","logger","resourcePath","sourceMap","preprocessor","prefixer","extension","cacheProvider","rest","getOptions","outputFileName","replace","resolveModule","getResolve","dependencyType","asyncResolve","token","importer","context","path","isAbsolute","dirname","join","process","cwd","Promise","reject","err","result","addDependency","Error","transformServices","options","pluginOptions","root","eventEmitter","sharedState","emitter","transform","toString","then","_result$sourceMap2","cssText","_result$dependencies$","_result$dependencies","Buffer","from","cssSourceMapText","all","dependencies","map","dep","_cacheInstance$setDep","_result$sourceMap","cacheInstance","getCacheInstance","set","setDependencies","call","getDependencies","request","encodeURIComponent","stringifiedRequest","JSON","stringify","utils","contextify","rootContext","callback","code","catch","_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';\n\nimport type { RawSourceMap } from 'source-map';\nimport type { RawLoaderDefinitionFunction } from 'webpack';\n\nimport { logger } from '@wyw-in-js/shared';\nimport type { 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 } from './cache';\n\nexport { WYWinJSDebugPlugin } from './WYWinJSDebugPlugin';\n\nconst outputCssLoader = require.resolve('./outputCssLoader');\n\nexport type LoaderOptions = {\n cacheProvider?: string | ICache;\n extension?: string;\n prefixer?: boolean;\n preprocessor?: Preprocessor;\n sourceMap?: boolean;\n};\ntype Loader = RawLoaderDefinitionFunction<LoaderOptions>;\n\nconst cache = new TransformCacheCollection();\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 logger('loader %s', this.resourcePath);\n\n const {\n sourceMap = undefined,\n preprocessor = undefined,\n prefixer = undefined,\n extension = '.wyw-in-js.css',\n cacheProvider,\n ...rest\n } = this.getOptions() || {};\n\n const outputFileName = this.resourcePath.replace(/\\.[^.]+$/, extension);\n const resolveModule = this.getResolve({ dependencyType: 'esm' });\n\n const asyncResolve = (token: string, importer: string): Promise<string> => {\n const context = path.isAbsolute(importer)\n ? path.dirname(importer)\n : path.join(process.cwd(), path.dirname(importer));\n return new Promise((resolve, reject) => {\n resolveModule(context, token, (err, result) => {\n if (err) {\n reject(err);\n } else if (result) {\n this.addDependency(result);\n resolve(result);\n } else {\n reject(new Error(`Cannot resolve ${token}`));\n }\n });\n });\n };\n\n const transformServices = {\n options: {\n filename: this.resourcePath,\n inputSourceMap: convertSourceMap(inputSourceMap, this.resourcePath),\n pluginOptions: rest,\n prefixer,\n preprocessor,\n root: process.cwd(),\n },\n cache,\n eventEmitter: sharedState.emitter,\n };\n\n transform(transformServices, content.toString(), asyncResolve)\n .then(\n async (result: Result) => {\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 try {\n const cacheInstance = await getCacheInstance(cacheProvider);\n\n await cacheInstance.set(this.resourcePath, cssText);\n\n await cacheInstance.setDependencies?.(\n this.resourcePath,\n this.getDependencies()\n );\n\n const request = `${outputFileName}!=!${outputCssLoader}?cacheProvider=${encodeURIComponent(\n typeof cacheProvider === 'string' ? cacheProvider : ''\n )}!${this.resourcePath}`;\n const stringifiedRequest = JSON.stringify(\n this.utils.contextify(this.context || this.rootContext, request)\n );\n\n this.callback(\n null,\n `${result.code}\\n\\nrequire(${stringifiedRequest});`,\n result.sourceMap ?? undefined\n );\n } catch (err) {\n this.callback(err as Error);\n }\n\n return;\n }\n\n this.callback(null, result.code, result.sourceMap ?? undefined);\n },\n (err: Error) => this.callback(err)\n )\n .catch((err: Error) => this.callback(err));\n};\n\nexport default webpack5Loader;\n"],"mappings":";;;;;;;;;;;;AAMA,IAAAA,KAAA,GAAAC,sBAAA,CAAAC,OAAA;AAKA,IAAAC,OAAA,GAAAD,OAAA;AAEA,IAAAE,UAAA,GAAAF,OAAA;AAEA,IAAAG,mBAAA,GAAAH,OAAA;AAEA,IAAAI,MAAA,GAAAJ,OAAA;AAA2C,SAAAD,uBAAAM,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAjB3C;AACA;AACA;AACA;AACA;;AAiBA,MAAMG,eAAe,GAAGR,OAAO,CAACS,OAAO,CAAC,mBAAmB,CAAC;AAW5D,MAAMC,KAAK,GAAG,IAAIC,mCAAwB,CAAC,CAAC;AAE5C,MAAMC,cAAsB,GAAG,SAASC,oBAAoBA,CAC1DC,OAAO,EACPC,cAAc,EACd;EACA,SAASC,gBAAgBA,CACvBC,KAA4B,EAC5BC,QAAgB,EACU;IAAA,IAAAC,WAAA,EAAAC,eAAA,EAAAC,YAAA,EAAAC,cAAA,EAAAC,cAAA;IAC1B,IAAI,OAAON,KAAK,KAAK,QAAQ,IAAI,CAACA,KAAK,EAAE;MACvC,OAAOO,SAAS;IAClB;IAEA,OAAO;MACL,GAAGP,KAAK;MACRQ,IAAI,GAAAN,WAAA,GAAEF,KAAK,CAACQ,IAAI,cAAAN,WAAA,cAAAA,WAAA,GAAID,QAAQ;MAC5BQ,QAAQ,GAAAN,eAAA,GAAEH,KAAK,CAACS,QAAQ,cAAAN,eAAA,cAAAA,eAAA,GAAI,EAAE;MAC9BO,KAAK,GAAAN,YAAA,GAAEJ,KAAK,CAACU,KAAK,cAAAN,YAAA,cAAAA,YAAA,GAAI,EAAE;MACxBO,OAAO,GAAAN,cAAA,GAAEL,KAAK,CAACW,OAAO,cAAAN,cAAA,cAAAA,cAAA,GAAI,EAAE;MAC5BO,OAAO,GAAAN,cAAA,GAAEN,KAAK,CAACY,OAAO,cAAAN,cAAA,cAAAA,cAAA,GAAI;IAC5B,CAAC;EACH;;EAEA;EACA,IAAI,CAACO,KAAK,CAAC,CAAC;EAEZ,IAAAC,cAAM,EAAC,WAAW,EAAE,IAAI,CAACC,YAAY,CAAC;EAEtC,MAAM;IACJC,SAAS,GAAGT,SAAS;IACrBU,YAAY,GAAGV,SAAS;IACxBW,QAAQ,GAAGX,SAAS;IACpBY,SAAS,GAAG,gBAAgB;IAC5BC,aAAa;IACb,GAAGC;EACL,CAAC,GAAG,IAAI,CAACC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;EAE3B,MAAMC,cAAc,GAAG,IAAI,CAACR,YAAY,CAACS,OAAO,CAAC,UAAU,EAAEL,SAAS,CAAC;EACvE,MAAMM,aAAa,GAAG,IAAI,CAACC,UAAU,CAAC;IAAEC,cAAc,EAAE;EAAM,CAAC,CAAC;EAEhE,MAAMC,YAAY,GAAGA,CAACC,KAAa,EAAEC,QAAgB,KAAsB;IACzE,MAAMC,OAAO,GAAGC,aAAI,CAACC,UAAU,CAACH,QAAQ,CAAC,GACrCE,aAAI,CAACE,OAAO,CAACJ,QAAQ,CAAC,GACtBE,aAAI,CAACG,IAAI,CAACC,OAAO,CAACC,GAAG,CAAC,CAAC,EAAEL,aAAI,CAACE,OAAO,CAACJ,QAAQ,CAAC,CAAC;IACpD,OAAO,IAAIQ,OAAO,CAAC,CAAC9C,OAAO,EAAE+C,MAAM,KAAK;MACtCd,aAAa,CAACM,OAAO,EAAEF,KAAK,EAAE,CAACW,GAAG,EAAEC,MAAM,KAAK;QAC7C,IAAID,GAAG,EAAE;UACPD,MAAM,CAACC,GAAG,CAAC;QACb,CAAC,MAAM,IAAIC,MAAM,EAAE;UACjB,IAAI,CAACC,aAAa,CAACD,MAAM,CAAC;UAC1BjD,OAAO,CAACiD,MAAM,CAAC;QACjB,CAAC,MAAM;UACLF,MAAM,CAAC,IAAII,KAAK,CAAE,kBAAiBd,KAAM,EAAC,CAAC,CAAC;QAC9C;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ,CAAC;EAED,MAAMe,iBAAiB,GAAG;IACxBC,OAAO,EAAE;MACP5C,QAAQ,EAAE,IAAI,CAACc,YAAY;MAC3BjB,cAAc,EAAEC,gBAAgB,CAACD,cAAc,EAAE,IAAI,CAACiB,YAAY,CAAC;MACnE+B,aAAa,EAAEzB,IAAI;MACnBH,QAAQ;MACRD,YAAY;MACZ8B,IAAI,EAAEX,OAAO,CAACC,GAAG,CAAC;IACpB,CAAC;IACD5C,KAAK;IACLuD,YAAY,EAAEC,+BAAW,CAACC;EAC5B,CAAC;EAED,IAAAC,oBAAS,EAACP,iBAAiB,EAAE/C,OAAO,CAACuD,QAAQ,CAAC,CAAC,EAAExB,YAAY,CAAC,CAC3DyB,IAAI,CACH,MAAOZ,MAAc,IAAK;IAAA,IAAAa,kBAAA;IACxB,IAAIb,MAAM,CAACc,OAAO,EAAE;MAAA,IAAAC,qBAAA,EAAAC,oBAAA;MAClB,IAAI;QAAEF;MAAQ,CAAC,GAAGd,MAAM;MAExB,IAAIzB,SAAS,EAAE;QACbuC,OAAO,IAAK,qDAAoDG,MAAM,CAACC,IAAI,CACzElB,MAAM,CAACmB,gBAAgB,IAAI,EAC7B,CAAC,CAACR,QAAQ,CAAC,QAAQ,CAAE,IAAG;MAC1B;MAEA,MAAMd,OAAO,CAACuB,GAAG,EAAAL,qBAAA,IAAAC,oBAAA,GACfhB,MAAM,CAACqB,YAAY,cAAAL,oBAAA,uBAAnBA,oBAAA,CAAqBM,GAAG,CAAEC,GAAG,IAC3BpC,YAAY,CAACoC,GAAG,EAAE,IAAI,CAACjD,YAAY,CACrC,CAAC,cAAAyC,qBAAA,cAAAA,qBAAA,GAAI,EACP,CAAC;MAED,IAAI;QAAA,IAAAS,qBAAA,EAAAC,iBAAA;QACF,MAAMC,aAAa,GAAG,MAAM,IAAAC,uBAAgB,EAAChD,aAAa,CAAC;QAE3D,MAAM+C,aAAa,CAACE,GAAG,CAAC,IAAI,CAACtD,YAAY,EAAEwC,OAAO,CAAC;QAEnD,QAAAU,qBAAA,GAAME,aAAa,CAACG,eAAe,cAAAL,qBAAA,uBAA7BA,qBAAA,CAAAM,IAAA,CAAAJ,aAAa,EACjB,IAAI,CAACpD,YAAY,EACjB,IAAI,CAACyD,eAAe,CAAC,CACvB,CAAC;QAED,MAAMC,OAAO,GAAI,GAAElD,cAAe,MAAKhC,eAAgB,kBAAiBmF,kBAAkB,CACxF,OAAOtD,aAAa,KAAK,QAAQ,GAAGA,aAAa,GAAG,EACtD,CAAE,IAAG,IAAI,CAACL,YAAa,EAAC;QACxB,MAAM4D,kBAAkB,GAAGC,IAAI,CAACC,SAAS,CACvC,IAAI,CAACC,KAAK,CAACC,UAAU,CAAC,IAAI,CAAChD,OAAO,IAAI,IAAI,CAACiD,WAAW,EAAEP,OAAO,CACjE,CAAC;QAED,IAAI,CAACQ,QAAQ,CACX,IAAI,EACH,GAAExC,MAAM,CAACyC,IAAK,eAAcP,kBAAmB,IAAG,GAAAT,iBAAA,GACnDzB,MAAM,CAACzB,SAAS,cAAAkD,iBAAA,cAAAA,iBAAA,GAAI3D,SACtB,CAAC;MACH,CAAC,CAAC,OAAOiC,GAAG,EAAE;QACZ,IAAI,CAACyC,QAAQ,CAACzC,GAAY,CAAC;MAC7B;MAEA;IACF;IAEA,IAAI,CAACyC,QAAQ,CAAC,IAAI,EAAExC,MAAM,CAACyC,IAAI,GAAA5B,kBAAA,GAAEb,MAAM,CAACzB,SAAS,cAAAsC,kBAAA,cAAAA,kBAAA,GAAI/C,SAAS,CAAC;EACjE,CAAC,EACAiC,GAAU,IAAK,IAAI,CAACyC,QAAQ,CAACzC,GAAG,CACnC,CAAC,CACA2C,KAAK,CAAE3C,GAAU,IAAK,IAAI,CAACyC,QAAQ,CAACzC,GAAG,CAAC,CAAC;AAC9C,CAAC;AAAC,IAAA4C,QAAA,GAAAC,OAAA,CAAA/F,OAAA,GAEaK,cAAc"}
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":[]}
@@ -8,11 +8,12 @@ var _cache = require("./cache");
8
8
  async function outputCssLoader() {
9
9
  this.async();
10
10
  const {
11
- cacheProvider
11
+ cacheProvider,
12
+ cacheProviderId
12
13
  } = this.getOptions();
13
14
  try {
14
15
  var _await$cacheInstance$, _cacheInstance$getDep;
15
- const cacheInstance = await (0, _cache.getCacheInstance)(cacheProvider);
16
+ const cacheInstance = await (0, _cache.getCacheInstance)(cacheProvider, cacheProviderId);
16
17
  const result = await cacheInstance.get(this.resourcePath);
17
18
  const dependencies = (_await$cacheInstance$ = await ((_cacheInstance$getDep = cacheInstance.getDependencies) === null || _cacheInstance$getDep === void 0 ? void 0 : _cacheInstance$getDep.call(cacheInstance, this.resourcePath))) !== null && _await$cacheInstance$ !== void 0 ? _await$cacheInstance$ : [];
18
19
  dependencies.forEach(dependency => {
@@ -1 +1 @@
1
- {"version":3,"file":"outputCssLoader.js","names":["_cache","require","outputCssLoader","async","cacheProvider","getOptions","_await$cacheInstance$","_cacheInstance$getDep","cacheInstance","getCacheInstance","result","get","resourcePath","dependencies","getDependencies","call","forEach","dependency","addDependency","callback","err"],"sources":["../src/outputCssLoader.ts"],"sourcesContent":["import type webpack from 'webpack';\n\nimport type { ICache } from './cache';\nimport { getCacheInstance } from './cache';\n\nexport default async function outputCssLoader(\n this: webpack.LoaderContext<{ cacheProvider: string | ICache | undefined }>\n) {\n this.async();\n const { cacheProvider } = this.getOptions();\n\n try {\n const cacheInstance = await getCacheInstance(cacheProvider);\n\n const result = await cacheInstance.get(this.resourcePath);\n const dependencies =\n (await cacheInstance.getDependencies?.(this.resourcePath)) ?? [];\n\n dependencies.forEach((dependency) => {\n this.addDependency(dependency);\n });\n\n this.callback(null, result);\n } catch (err) {\n this.callback(err as Error);\n }\n}\n"],"mappings":";;;;;;AAGA,IAAAA,MAAA,GAAAC,OAAA;AAEe,eAAeC,eAAeA,CAAA,EAE3C;EACA,IAAI,CAACC,KAAK,CAAC,CAAC;EACZ,MAAM;IAAEC;EAAc,CAAC,GAAG,IAAI,CAACC,UAAU,CAAC,CAAC;EAE3C,IAAI;IAAA,IAAAC,qBAAA,EAAAC,qBAAA;IACF,MAAMC,aAAa,GAAG,MAAM,IAAAC,uBAAgB,EAACL,aAAa,CAAC;IAE3D,MAAMM,MAAM,GAAG,MAAMF,aAAa,CAACG,GAAG,CAAC,IAAI,CAACC,YAAY,CAAC;IACzD,MAAMC,YAAY,IAAAP,qBAAA,GACf,QAAAC,qBAAA,GAAMC,aAAa,CAACM,eAAe,cAAAP,qBAAA,uBAA7BA,qBAAA,CAAAQ,IAAA,CAAAP,aAAa,EAAmB,IAAI,CAACI,YAAY,CAAC,eAAAN,qBAAA,cAAAA,qBAAA,GAAK,EAAE;IAElEO,YAAY,CAACG,OAAO,CAAEC,UAAU,IAAK;MACnC,IAAI,CAACC,aAAa,CAACD,UAAU,CAAC;IAChC,CAAC,CAAC;IAEF,IAAI,CAACE,QAAQ,CAAC,IAAI,EAAET,MAAM,CAAC;EAC7B,CAAC,CAAC,OAAOU,GAAG,EAAE;IACZ,IAAI,CAACD,QAAQ,CAACC,GAAY,CAAC;EAC7B;AACF"}
1
+ {"version":3,"file":"outputCssLoader.js","names":["_cache","require","outputCssLoader","async","cacheProvider","cacheProviderId","getOptions","_await$cacheInstance$","_cacheInstance$getDep","cacheInstance","getCacheInstance","result","get","resourcePath","dependencies","getDependencies","call","forEach","dependency","addDependency","callback","err"],"sources":["../src/outputCssLoader.ts"],"sourcesContent":["import type webpack from 'webpack';\n\nimport type { ICache } from './cache';\nimport { getCacheInstance } from './cache';\n\nexport default async function outputCssLoader(\n this: webpack.LoaderContext<{\n cacheProvider: string | ICache | undefined;\n cacheProviderId?: string | undefined;\n }>\n) {\n this.async();\n const { cacheProvider, cacheProviderId } = this.getOptions();\n\n try {\n const cacheInstance = await getCacheInstance(\n cacheProvider,\n cacheProviderId\n );\n\n const result = await cacheInstance.get(this.resourcePath);\n const dependencies =\n (await cacheInstance.getDependencies?.(this.resourcePath)) ?? [];\n\n dependencies.forEach((dependency) => {\n this.addDependency(dependency);\n });\n\n this.callback(null, result);\n } catch (err) {\n this.callback(err as Error);\n }\n}\n"],"mappings":";;;;;;AAGA,IAAAA,MAAA,GAAAC,OAAA;AAEe,eAAeC,eAAeA,CAAA,EAK3C;EACA,IAAI,CAACC,KAAK,CAAC,CAAC;EACZ,MAAM;IAAEC,aAAa;IAAEC;EAAgB,CAAC,GAAG,IAAI,CAACC,UAAU,CAAC,CAAC;EAE5D,IAAI;IAAA,IAAAC,qBAAA,EAAAC,qBAAA;IACF,MAAMC,aAAa,GAAG,MAAM,IAAAC,uBAAgB,EAC1CN,aAAa,EACbC,eACF,CAAC;IAED,MAAMM,MAAM,GAAG,MAAMF,aAAa,CAACG,GAAG,CAAC,IAAI,CAACC,YAAY,CAAC;IACzD,MAAMC,YAAY,IAAAP,qBAAA,GACf,QAAAC,qBAAA,GAAMC,aAAa,CAACM,eAAe,cAAAP,qBAAA,uBAA7BA,qBAAA,CAAAQ,IAAA,CAAAP,aAAa,EAAmB,IAAI,CAACI,YAAY,CAAC,eAAAN,qBAAA,cAAAA,qBAAA,GAAK,EAAE;IAElEO,YAAY,CAACG,OAAO,CAAEC,UAAU,IAAK;MACnC,IAAI,CAACC,aAAa,CAACD,UAAU,CAAC;IAChC,CAAC,CAAC;IAEF,IAAI,CAACE,QAAQ,CAAC,IAAI,EAAET,MAAM,CAAC;EAC7B,CAAC,CAAC,OAAOU,GAAG,EAAE;IACZ,IAAI,CAACD,QAAQ,CAACC,GAAY,CAAC;EAC7B;AACF","ignoreList":[]}
package/package.json CHANGED
@@ -1,18 +1,17 @@
1
1
  {
2
2
  "name": "@wyw-in-js/webpack-loader",
3
- "version": "0.8.0",
3
+ "version": "1.0.0",
4
4
  "dependencies": {
5
- "@wyw-in-js/shared": "0.8.0",
6
- "@wyw-in-js/transform": "0.8.0"
5
+ "@wyw-in-js/shared": "workspace:*",
6
+ "@wyw-in-js/transform": "workspace:*"
7
7
  },
8
8
  "devDependencies": {
9
9
  "@types/node": "^16.18.55",
10
+ "@wyw-in-js/babel-config": "workspace:*",
11
+ "@wyw-in-js/eslint-config": "workspace:*",
12
+ "@wyw-in-js/ts-config": "workspace:*",
10
13
  "source-map": "^0.7.4",
11
- "webpack": "^5.76.0",
12
- "@wyw-in-js/babel-config": "0.8.0",
13
- "@wyw-in-js/eslint-config": "0.8.0",
14
- "@wyw-in-js/jest-preset": "0.8.0",
15
- "@wyw-in-js/ts-config": "0.8.0"
14
+ "webpack": "^5.76.0"
16
15
  },
17
16
  "engines": {
18
17
  "node": ">=16.0.0"
@@ -31,11 +30,12 @@
31
30
  "publishConfig": {
32
31
  "access": "public"
33
32
  },
34
- "types": "types/index.d.ts",
35
33
  "scripts": {
36
34
  "build:esm": "babel src --out-dir esm --extensions '.js,.jsx,.ts,.tsx' --source-maps --delete-dir-on-start",
37
35
  "build:lib": "cross-env NODE_ENV=legacy babel src --out-dir lib --extensions '.js,.jsx,.ts,.tsx' --source-maps --delete-dir-on-start",
38
36
  "build:types": "tsc --project ./tsconfig.lib.json --baseUrl . --rootDir ./src",
39
- "lint": "eslint --ext .js,.ts ."
40
- }
41
- }
37
+ "lint": "eslint --ext .js,.ts .",
38
+ "test": "bun test src"
39
+ },
40
+ "types": "types/index.d.ts"
41
+ }
package/types/cache.d.ts CHANGED
@@ -4,6 +4,7 @@ export interface ICache {
4
4
  set: (key: string, value: string) => Promise<void>;
5
5
  setDependencies?: (key: string, value: string[]) => Promise<void>;
6
6
  }
7
+ export declare const registerCacheProvider: (cacheProvider: ICache) => string;
7
8
  declare class MemoryCache implements ICache {
8
9
  private cache;
9
10
  private dependenciesCache;
@@ -18,5 +19,5 @@ export declare const memoryCache: MemoryCache;
18
19
  * @param cacheProvider string | ICache | undefined
19
20
  * @returns ICache instance
20
21
  */
21
- export declare const getCacheInstance: (cacheProvider: string | ICache | undefined) => Promise<ICache>;
22
+ export declare const getCacheInstance: (cacheProvider: string | ICache | undefined, cacheProviderId?: string | undefined) => Promise<ICache>;
22
23
  export {};
package/types/cache.js CHANGED
@@ -1,6 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getCacheInstance = exports.memoryCache = void 0;
3
+ exports.getCacheInstance = exports.memoryCache = exports.registerCacheProvider = void 0;
4
+ let cacheProviderSeq = 0;
5
+ const cacheProviderIds = new WeakMap();
6
+ const cacheProvidersById = new Map();
7
+ const registerCacheProvider = (cacheProvider) => {
8
+ const knownId = cacheProviderIds.get(cacheProvider);
9
+ if (knownId) {
10
+ return knownId;
11
+ }
12
+ cacheProviderSeq += 1;
13
+ const id = `${cacheProviderSeq}`;
14
+ cacheProviderIds.set(cacheProvider, id);
15
+ cacheProvidersById.set(id, cacheProvider);
16
+ return id;
17
+ };
18
+ exports.registerCacheProvider = registerCacheProvider;
4
19
  // memory cache, which is the default cache implementation in WYW-in-JS
5
20
  class MemoryCache {
6
21
  cache = new Map();
@@ -26,7 +41,14 @@ exports.memoryCache = new MemoryCache();
26
41
  * @param cacheProvider string | ICache | undefined
27
42
  * @returns ICache instance
28
43
  */
29
- const getCacheInstance = async (cacheProvider) => {
44
+ const getCacheInstance = async (cacheProvider, cacheProviderId) => {
45
+ if (cacheProviderId) {
46
+ const cacheProviderInstance = cacheProvidersById.get(cacheProviderId);
47
+ if (!cacheProviderInstance) {
48
+ throw new Error(`Invalid cache provider id: ${cacheProviderId}`);
49
+ }
50
+ return cacheProviderInstance;
51
+ }
30
52
  if (!cacheProvider) {
31
53
  return exports.memoryCache;
32
54
  }
package/types/index.d.ts CHANGED
@@ -4,16 +4,18 @@
4
4
  * returns transformed code without template literals and attaches generated source maps
5
5
  */
6
6
  import type { RawLoaderDefinitionFunction } from 'webpack';
7
- import type { Preprocessor } from '@wyw-in-js/transform';
7
+ import type { PluginOptions, Preprocessor } from '@wyw-in-js/transform';
8
8
  import type { ICache } from './cache';
9
9
  export { WYWinJSDebugPlugin } from './WYWinJSDebugPlugin';
10
10
  export type LoaderOptions = {
11
11
  cacheProvider?: string | ICache;
12
+ cssImport?: 'require' | 'import';
12
13
  extension?: string;
14
+ keepComments?: boolean | RegExp;
13
15
  prefixer?: boolean;
14
16
  preprocessor?: Preprocessor;
15
17
  sourceMap?: boolean;
16
- };
18
+ } & Partial<PluginOptions>;
17
19
  type Loader = RawLoaderDefinitionFunction<LoaderOptions>;
18
20
  declare const webpack5Loader: Loader;
19
21
  export default webpack5Loader;
package/types/index.js CHANGED
@@ -10,6 +10,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
10
10
  Object.defineProperty(exports, "__esModule", { value: true });
11
11
  exports.WYWinJSDebugPlugin = void 0;
12
12
  const path_1 = __importDefault(require("path"));
13
+ const crypto_1 = __importDefault(require("crypto"));
13
14
  const shared_1 = require("@wyw-in-js/shared");
14
15
  const transform_1 = require("@wyw-in-js/transform");
15
16
  const WYWinJSDebugPlugin_1 = require("./WYWinJSDebugPlugin");
@@ -17,7 +18,47 @@ const cache_1 = require("./cache");
17
18
  var WYWinJSDebugPlugin_2 = require("./WYWinJSDebugPlugin");
18
19
  Object.defineProperty(exports, "WYWinJSDebugPlugin", { enumerable: true, get: function () { return WYWinJSDebugPlugin_2.WYWinJSDebugPlugin; } });
19
20
  const outputCssLoader = require.resolve('./outputCssLoader');
21
+ const stripQueryAndHash = (request) => {
22
+ const queryIdx = request.indexOf('?');
23
+ const hashIdx = request.indexOf('#');
24
+ if (queryIdx === -1) {
25
+ return hashIdx === -1 ? request : request.slice(0, hashIdx);
26
+ }
27
+ if (hashIdx === -1)
28
+ return request.slice(0, queryIdx);
29
+ return request.slice(0, Math.min(queryIdx, hashIdx));
30
+ };
31
+ const hashText = (text) => crypto_1.default.createHash('sha256').update(text).digest('hex').slice(0, 12);
20
32
  const cache = new transform_1.TransformCacheCollection();
33
+ const resolvers = {};
34
+ const getResolverKey = (importer, stack) => {
35
+ const root = stack.length ? stack[stack.length - 1] : importer;
36
+ return stripQueryAndHash(root);
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');
49
+ }
50
+ return firstResult;
51
+ });
52
+ };
53
+ function addResolver(resourcePath, resolver) {
54
+ if (!resolvers[resourcePath]) {
55
+ resolvers[resourcePath] = [];
56
+ }
57
+ resolvers[resourcePath].push(resolver);
58
+ return () => {
59
+ resolvers[resourcePath] = resolvers[resourcePath].filter((r) => r !== resolver);
60
+ };
61
+ }
21
62
  const webpack5Loader = function webpack5LoaderPlugin(content, inputSourceMap) {
22
63
  function convertSourceMap(value, filename) {
23
64
  if (typeof value === 'string' || !value) {
@@ -34,64 +75,104 @@ const webpack5Loader = function webpack5LoaderPlugin(content, inputSourceMap) {
34
75
  }
35
76
  // tell Webpack this loader is async
36
77
  this.async();
78
+ const resolveOptions = { dependencyType: 'esm' };
79
+ const resolveModule = this.getResolve(resolveOptions);
80
+ const isPromiseLike = (value) => typeof value?.then === 'function';
81
+ const resolveModuleAsync = (context, request) => new Promise((resolve, reject) => {
82
+ let settled = false;
83
+ const finish = (err, result) => {
84
+ if (settled)
85
+ return;
86
+ settled = true;
87
+ if (err) {
88
+ reject(err);
89
+ return;
90
+ }
91
+ if (typeof result === 'string') {
92
+ resolve(result);
93
+ return;
94
+ }
95
+ reject(new Error(`Cannot resolve ${request}`));
96
+ };
97
+ try {
98
+ const maybePromise = resolveModule(context, request, finish);
99
+ if (isPromiseLike(maybePromise)) {
100
+ maybePromise.then((result) => finish(null, result), (err) => finish(err, null));
101
+ }
102
+ }
103
+ catch (err) {
104
+ finish(err, null);
105
+ }
106
+ });
107
+ const removeResolver = addResolver(this.resourcePath, (what, importer) => {
108
+ const importerPath = stripQueryAndHash(importer);
109
+ const context = path_1.default.isAbsolute(importerPath)
110
+ ? path_1.default.dirname(importerPath)
111
+ : path_1.default.join(process.cwd(), path_1.default.dirname(importerPath));
112
+ return resolveModuleAsync(context, what).then((result) => {
113
+ const filePath = stripQueryAndHash(result);
114
+ if (path_1.default.isAbsolute(filePath)) {
115
+ this.addDependency(filePath);
116
+ }
117
+ return result;
118
+ });
119
+ });
37
120
  (0, shared_1.logger)('loader %s', this.resourcePath);
38
- const { sourceMap = undefined, preprocessor = undefined, prefixer = undefined, extension = '.wyw-in-js.css', cacheProvider, ...rest } = this.getOptions() || {};
121
+ const { sourceMap = undefined, preprocessor = undefined, keepComments = undefined, prefixer = undefined, extension = '.wyw-in-js.css', cssImport = 'require', cacheProvider, ...rest } = this.getOptions() || {};
39
122
  const outputFileName = this.resourcePath.replace(/\.[^.]+$/, extension);
40
- const resolveModule = this.getResolve({ dependencyType: 'esm' });
41
- const asyncResolve = (token, importer) => {
42
- const context = path_1.default.isAbsolute(importer)
43
- ? path_1.default.dirname(importer)
44
- : path_1.default.join(process.cwd(), path_1.default.dirname(importer));
45
- return new Promise((resolve, reject) => {
46
- resolveModule(context, token, (err, result) => {
47
- if (err) {
48
- reject(err);
49
- }
50
- else if (result) {
51
- this.addDependency(result);
52
- resolve(result);
53
- }
54
- else {
55
- reject(new Error(`Cannot resolve ${token}`));
56
- }
57
- });
58
- });
59
- };
60
123
  const transformServices = {
61
124
  options: {
62
125
  filename: this.resourcePath,
63
126
  inputSourceMap: convertSourceMap(inputSourceMap, this.resourcePath),
64
127
  pluginOptions: rest,
65
128
  prefixer,
129
+ keepComments,
66
130
  preprocessor,
67
131
  root: process.cwd(),
68
132
  },
69
133
  cache,
134
+ emitWarning: (message) => this.emitWarning(new Error(message)),
70
135
  eventEmitter: WYWinJSDebugPlugin_1.sharedState.emitter,
71
136
  };
72
137
  (0, transform_1.transform)(transformServices, content.toString(), asyncResolve)
73
138
  .then(async (result) => {
74
- if (result.cssText) {
75
- let { cssText } = result;
76
- if (sourceMap) {
77
- cssText += `/*# sourceMappingURL=data:application/json;base64,${Buffer.from(result.cssSourceMapText || '').toString('base64')}*/`;
78
- }
79
- await Promise.all(result.dependencies?.map((dep) => asyncResolve(dep, this.resourcePath)) ?? []);
80
- try {
139
+ try {
140
+ if (result.cssText) {
141
+ let { cssText } = result;
142
+ if (sourceMap) {
143
+ cssText += `/*# sourceMappingURL=data:application/json;base64,${Buffer.from(result.cssSourceMapText || '').toString('base64')}*/`;
144
+ }
145
+ await Promise.all(result.dependencies?.map((dep) => asyncResolve(dep, this.resourcePath)) ?? []);
81
146
  const cacheInstance = await (0, cache_1.getCacheInstance)(cacheProvider);
147
+ const cacheProviderId = cacheProvider && typeof cacheProvider === 'object'
148
+ ? (0, cache_1.registerCacheProvider)(cacheInstance)
149
+ : '';
82
150
  await cacheInstance.set(this.resourcePath, cssText);
83
151
  await cacheInstance.setDependencies?.(this.resourcePath, this.getDependencies());
84
- const request = `${outputFileName}!=!${outputCssLoader}?cacheProvider=${encodeURIComponent(typeof cacheProvider === 'string' ? cacheProvider : '')}!${this.resourcePath}`;
152
+ const wywQuery = [
153
+ `wyw=${encodeURIComponent(extension.replace(/^\./, ''))}`,
154
+ ];
155
+ if (this.hot) {
156
+ wywQuery.push(`v=${encodeURIComponent(hashText(cssText))}`);
157
+ }
158
+ const resourcePathWithQuery = `${this.resourcePath}?${wywQuery.join('&')}`;
159
+ const request = `${outputFileName}!=!${outputCssLoader}?cacheProvider=${encodeURIComponent(typeof cacheProvider === 'string' ? cacheProvider : '')}&cacheProviderId=${encodeURIComponent(cacheProviderId)}!${resourcePathWithQuery}`;
85
160
  const stringifiedRequest = JSON.stringify(this.utils.contextify(this.context || this.rootContext, request));
86
- this.callback(null, `${result.code}\n\nrequire(${stringifiedRequest});`, result.sourceMap ?? undefined);
87
- }
88
- catch (err) {
89
- this.callback(err);
161
+ const importCss = cssImport === 'import'
162
+ ? `import ${stringifiedRequest};`
163
+ : `require(${stringifiedRequest});`;
164
+ this.callback(null, `${result.code}\n\n${importCss}`, result.sourceMap ?? undefined);
165
+ return;
90
166
  }
91
- return;
167
+ this.callback(null, result.code, result.sourceMap ?? undefined);
168
+ }
169
+ catch (err) {
170
+ this.callback(err);
92
171
  }
93
- this.callback(null, result.code, result.sourceMap ?? undefined);
94
- }, (err) => this.callback(err))
95
- .catch((err) => this.callback(err));
172
+ }, (err) => {
173
+ this.callback(err);
174
+ })
175
+ .catch((err) => this.callback(err))
176
+ .finally(removeResolver);
96
177
  };
97
178
  exports.default = webpack5Loader;
@@ -2,4 +2,5 @@ import type webpack from 'webpack';
2
2
  import type { ICache } from './cache';
3
3
  export default function outputCssLoader(this: webpack.LoaderContext<{
4
4
  cacheProvider: string | ICache | undefined;
5
+ cacheProviderId?: string | undefined;
5
6
  }>): Promise<void>;
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = outputCssLoader;
3
4
  const cache_1 = require("./cache");
4
5
  async function outputCssLoader() {
5
6
  this.async();
6
- const { cacheProvider } = this.getOptions();
7
+ const { cacheProvider, cacheProviderId } = this.getOptions();
7
8
  try {
8
- const cacheInstance = await (0, cache_1.getCacheInstance)(cacheProvider);
9
+ const cacheInstance = await (0, cache_1.getCacheInstance)(cacheProvider, cacheProviderId);
9
10
  const result = await cacheInstance.get(this.resourcePath);
10
11
  const dependencies = (await cacheInstance.getDependencies?.(this.resourcePath)) ?? [];
11
12
  dependencies.forEach((dependency) => {
@@ -17,4 +18,3 @@ async function outputCssLoader() {
17
18
  this.callback(err);
18
19
  }
19
20
  }
20
- exports.default = outputCssLoader;
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2023 Anton Evzhakov
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.