Skip to content

Commit 4c900d8

Browse files
feat(url): add assets support (url/experimental)
1 parent f6e366b commit 4c900d8

9 files changed

+161
-0
lines changed

lib/WebpackOptionsApply.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ const OptionsApply = require("./OptionsApply");
99
const JavascriptModulesPlugin = require("./JavascriptModulesPlugin");
1010
const JsonModulesPlugin = require("./JsonModulesPlugin");
1111
const WebAssemblyModulesPlugin = require("./WebAssemblyModulesPlugin");
12+
// URL
13+
const URLModulesPlugin = require("./url/URLModulesPlugin");
14+
const URLDependencyPlugin = require("./url/URLDependency");
1215

1316
const LoaderTargetPlugin = require("./LoaderTargetPlugin");
1417
const FunctionModulePlugin = require("./FunctionModulePlugin");
@@ -270,6 +273,9 @@ class WebpackOptionsApply extends OptionsApply {
270273
new JavascriptModulesPlugin().apply(compiler);
271274
new JsonModulesPlugin().apply(compiler);
272275
new WebAssemblyModulesPlugin().apply(compiler);
276+
// URL
277+
new URLModulesPlugin().apply(compiler);
278+
new URLDependencyPlugin().apply(compiler);
273279

274280
new EntryOptionPlugin().apply(compiler);
275281
compiler.hooks.entryOption.call(options.context, options.entry);

lib/url/URLDependency.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
const {
2+
URLDependency
3+
} = require('./dependencies');
4+
5+
class URLDependencyPlugin {
6+
constructor(options) {
7+
this.plugin = {
8+
name: "URLDependencyPlugin"
9+
};
10+
this.options = options;
11+
}
12+
13+
apply(compiler) {
14+
const { plugin } = this;
15+
const { compilation } = compiler.hooks
16+
17+
compilation.tap(plugin, (compilation, { normalModuleFactory }) => {
18+
const { dependencyFactories } = compilation;
19+
20+
dependencyFactories.set(URLDependency, normalModuleFactory);
21+
});
22+
}
23+
}
24+
25+
module.exports = URLDependencyPlugin;

lib/url/URLGenerator.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class URLGenerator {
2+
generate(module) {
3+
return module.originalSource();
4+
}
5+
}
6+
7+
module.exports = URLGenerator;

lib/url/URLModulesPlugin.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
const URLParser = require('./URLParser');
2+
const URLGenerator = require('./URLGenerator');
3+
4+
class URLModulesPlugin {
5+
constructor() {
6+
this.plugin = {
7+
name: "URLModulesPlugin"
8+
}
9+
}
10+
11+
apply(compiler) {
12+
const { plugin } = this;
13+
const { compilation } = compiler.hooks;
14+
15+
compilation.tap(plugin, (compilation, { normalModuleFactory }) => {
16+
const { moduleTemplates } = compilation.hooks;
17+
const { createParser, createGenerator } = normalModuleFactory.hooks;
18+
19+
createParser.for('url/experimental').tap(plugin, () => {
20+
return new URLParser();
21+
})
22+
23+
createGenerator.for('url/experimental').tap(plugin, () => {
24+
return new URLGenerator();
25+
});
26+
});
27+
}
28+
}
29+
30+
module.exports = URLModulesPlugin;

lib/url/URLParser.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
const path = require('path');
2+
const { RawSource } = require('webpack-sources');
3+
4+
class URLParser {
5+
constructor (options = {}) {
6+
this.options = options
7+
}
8+
9+
parse(source, state) {
10+
const { module } = state;
11+
12+
if (typeof source === 'string') {
13+
source = Buffer.from(source);
14+
}
15+
16+
const file = path.relative(module.context, module.request);
17+
18+
source = new RawSource(source);
19+
20+
state.module._source = new RawSource(
21+
`export default '${module.rawRequest}'`
22+
);
23+
24+
state.module.buildInfo.assets = {
25+
[file]: source
26+
};
27+
28+
return state;
29+
}
30+
}
31+
32+
module.exports = URLParser;

lib/url/URLTemplate.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
const { RawSource } = require('webpack-sources');
2+
3+
class URLModulesTemplatePlugin {
4+
constructor () {
5+
this.plugin = "URLModulesTemplatePlugin";
6+
}
7+
8+
apply(moduleTemplate) {
9+
const { plugin } = this;
10+
const { content, hash } = moduleTemplate.hooks;
11+
12+
content.tap(plugin, (source, module, { chunk }) => {
13+
if (module.type && module.type.startsWith('url')) {
14+
const url = new RawSource(source);
15+
16+
return url;
17+
} else {
18+
return source;
19+
}
20+
})
21+
22+
hash.tap(plugin, (hash) => {
23+
hash.update(plugin);
24+
hash.update('1');
25+
})
26+
}
27+
}
28+
29+
module.exports = URLModulesTemplatePlugin;

lib/url/dependencies/URLDependency.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
const ModuleDependency = require('../../dependencies/ModuleDependency')
2+
3+
class URLDependency extends ModuleDependency {
4+
constructor(request, name) {
5+
super(request);
6+
7+
this.name = name;
8+
}
9+
10+
get type() {
11+
return 'asset url';
12+
}
13+
14+
getReference() {
15+
if (!this.module) {
16+
return null;
17+
}
18+
19+
return {
20+
module: this.module,
21+
importedNames: [ this.name ]
22+
};
23+
}
24+
}
25+
26+
module.exports = URLDependency;

lib/url/dependencies/index.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
const URLDependency = require('./URLDependency');
2+
3+
module.exports = {
4+
URLDependency
5+
};

schemas/WebpackOptions.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -947,6 +947,7 @@
947947
"javascript/dynamic",
948948
"javascript/esm",
949949
"json",
950+
"url/experimental",
950951
"webassembly/experimental"
951952
]
952953
},

0 commit comments

Comments
 (0)