@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 +20 -0
- package/esm/WYWinJSDebugPlugin.js.map +1 -1
- package/esm/cache.js +23 -1
- package/esm/cache.js.map +1 -1
- package/esm/index.js +111 -35
- package/esm/index.js.map +1 -1
- package/esm/outputCssLoader.js +3 -2
- package/esm/outputCssLoader.js.map +1 -1
- package/lib/WYWinJSDebugPlugin.js.map +1 -1
- package/lib/cache.js +25 -3
- package/lib/cache.js.map +1 -1
- package/lib/index.js +113 -38
- package/lib/index.js.map +1 -1
- package/lib/outputCssLoader.js +3 -2
- package/lib/outputCssLoader.js.map +1 -1
- package/package.json +12 -12
- package/types/cache.d.ts +2 -1
- package/types/cache.js +24 -2
- package/types/index.d.ts +4 -2
- package/types/index.js +118 -37
- package/types/outputCssLoader.d.ts +1 -0
- package/types/outputCssLoader.js +3 -3
- package/LICENSE +0 -21
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":["
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
|
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
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
164
|
+
this.callback(null, result.code, result.sourceMap ?? undefined);
|
|
165
|
+
} catch (err) {
|
|
166
|
+
this.callback(err);
|
|
92
167
|
}
|
|
93
|
-
|
|
94
|
-
|
|
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":[]}
|
package/esm/outputCssLoader.js
CHANGED
|
@@ -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<{
|
|
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
|
-
|
|
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":["
|
|
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(
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
|
|
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
|
-
|
|
110
|
-
|
|
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":"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"}
|
|
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":[]}
|
package/lib/outputCssLoader.js
CHANGED
|
@@ -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<{
|
|
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.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"dependencies": {
|
|
5
|
-
"@wyw-in-js/shared": "
|
|
6
|
-
"@wyw-in-js/transform": "
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
this.callback(
|
|
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
|
-
|
|
167
|
+
this.callback(null, result.code, result.sourceMap ?? undefined);
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
this.callback(err);
|
|
92
171
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
172
|
+
}, (err) => {
|
|
173
|
+
this.callback(err);
|
|
174
|
+
})
|
|
175
|
+
.catch((err) => this.callback(err))
|
|
176
|
+
.finally(removeResolver);
|
|
96
177
|
};
|
|
97
178
|
exports.default = webpack5Loader;
|
package/types/outputCssLoader.js
CHANGED
|
@@ -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.
|