Skip to content

Commit c403e94

Browse files
committed
refactor: optimize code for next version
1 parent c91de3a commit c403e94

8 files changed

Lines changed: 64 additions & 55 deletions

File tree

File renamed without changes.

src/Common/VMScript.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
const vm = require('vm');
2+
const { transformToCommonJS } = require('./Utils');
3+
const { executeFunctionException } = require('../Plugin/Messages/Exception');
4+
5+
class VMScript {
6+
context = null;
7+
8+
/**
9+
*
10+
* @param {Object} context The context object.
11+
* @param {string} name The function name compiled in the VM context.
12+
*/
13+
constructor(context, name = '') {
14+
this.context = vm.createContext(context);
15+
this.name = name;
16+
}
17+
18+
/**
19+
* Execute the source code.
20+
*
21+
* @param {Buffer | string} code The source code.
22+
* @param {string} filename The filename is used in stack traces produced by this script.
23+
* @param {{}?} data The data passed in the compiled function.
24+
* @param {boolean?} esModule Whether the source code is an ES module.
25+
* @return {string}
26+
*/
27+
exec(code, { filename, data = {}, esModule = false }) {
28+
if (Buffer.isBuffer(code)) {
29+
code = code.toString();
30+
}
31+
32+
// transform the code to CommonJS
33+
if (esModule === true) {
34+
code = transformToCommonJS(code);
35+
}
36+
37+
try {
38+
const script = new vm.Script(code, { filename });
39+
let result = script.runInContext(this.context);
40+
41+
// if the code returns nothing but creates a named definition in the context
42+
if (!result && this.name && this.name in this.context) {
43+
result = this.context[this.name];
44+
//console.log('*** VM EXEC 1: ', { code, result });
45+
} else {
46+
//console.log('*** VM EXEC 2: ', { code, result });
47+
}
48+
49+
return typeof result === 'function' ? result(data) : result || '';
50+
} catch (error) {
51+
executeFunctionException(error, filename);
52+
}
53+
}
54+
}
55+
56+
module.exports = VMScript;

src/Loader/Option.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ class Option {
3535
const queryData = parseQuery(resourceQuery);
3636
let options = PluginService.getLoaderCache(loaderId);
3737

38+
this.fileSystem = loaderContext.fs.fileSystem;
3839
this.#pluginOption = PluginService.getOptions();
3940
this.#watch = PluginService.isWatchMode();
40-
this.fileSystem = loaderContext.fs.fileSystem;
4141
this.#webpackOptions = loaderContext._compiler.options || {};
4242
this.#rootContext = rootContext;
4343
this.#resourcePath = resourcePath;
@@ -59,6 +59,7 @@ class Option {
5959

6060
PluginService.setLoaderCache(loaderId, options);
6161
}
62+
6263
this.#options = options;
6364

6465
// if the data option is a string, it must be an absolute or relative filename of an existing file that exports the data

src/Loader/Preprocessor.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class Preprocessor {
3232
handlebars: 'Handlebars',
3333
nunjucks: 'Nunjucks',
3434
twig: 'Twig',
35+
pug: 'Pug',
3536
};
3637

3738
// disabled preprocessor

src/Loader/index.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ const {
2222
const loader = function (content, map, meta) {
2323
/** @type {BundlerPluginLoaderContext} */
2424
const loaderContext = this;
25-
2625
const loaderCallback = loaderContext.async();
2726
const { rootContext, resource, resourcePath, entryId } = loaderContext;
2827
const hooks = PluginService.getHooks();

src/Plugin/AssetCompiler.js

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const AssetEntry = require('./AssetEntry');
3030
const AssetResource = require('./AssetResource');
3131
const AssetInline = require('./AssetInline');
3232
const AssetTrash = require('./AssetTrash');
33-
const VMScript = require('./VMScript');
33+
const VMScript = require('../Common/VMScript');
3434
const Integrity = require('./Extras/Integrity');
3535

3636
const { compilationName, verbose } = require('./Messages/Info');
@@ -788,10 +788,8 @@ class AssetCompiler {
788788

789789
const entry = AssetEntry.getByChunk(chunk);
790790

791-
if (!entry) return;
792-
793791
// process only entries supported by this plugin
794-
if (!entry.isTemplate && !entry.isStyle) return;
792+
if (!entry || (!entry.isTemplate && !entry.isStyle)) return;
795793

796794
Collection.addEntry(entry);
797795

@@ -1198,7 +1196,7 @@ class AssetCompiler {
11981196
* Render the module source code generated by a loader.
11991197
*
12001198
* @param {string} type The type of module, one of the values: template, style.
1201-
* @param {Object} source The Webpack source.
1199+
* @param {RawSource} source The Webpack source.
12021200
* @param {string} resource The full path of source file, including a query.
12031201
* @param {string} sourceFile The full path of source file w/o a query.
12041202
* @param {string} assetFile
@@ -1223,7 +1221,7 @@ class AssetCompiler {
12231221
// the css-loader defaults generate ESM code, which must be transformed into CommonJS to compile the code
12241222
// the template loader generates CommonJS code, no need to transform
12251223
const esModule = type === 'style';
1226-
let result = vmScript.compile(source, sourceFile, esModule);
1224+
let result = vmScript.exec(source.source(), { filename: sourceFile, esModule });
12271225

12281226
if (type === 'style') {
12291227
result = CssExtractModule.apply(result);

src/Plugin/PluginService.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ class PluginService {
114114
/**
115115
* Returns plugin options instance.
116116
*
117-
* TODO: rename to getOptionInstance()
117+
* TODO: rename to getPluginOptionInstance()
118118
*
119119
* @return {OptionPluginInterface}
120120
*/

src/Plugin/VMScript.js

Lines changed: 0 additions & 46 deletions
This file was deleted.

0 commit comments

Comments
 (0)