feat: add filer webpack plugin
This commit is contained in:
parent
fd90f32d4c
commit
d040763a73
|
@ -0,0 +1,88 @@
|
|||
var path = require('path');
|
||||
var utils = require('./utils');
|
||||
|
||||
const PLUGIN_NAME = 'filer-webpack-plugin';
|
||||
|
||||
const OPTIONS_SCHEMA = require('./schema');
|
||||
const OPTIONS_PROCESSORS = require('./processors');
|
||||
|
||||
module.exports = class FilerWebpackPlugin {
|
||||
|
||||
constructor(options = {}) {
|
||||
utils.validateOptions(options, OPTIONS_SCHEMA);
|
||||
this.options = utils.processOptions(options, OPTIONS_PROCESSORS);
|
||||
}
|
||||
|
||||
apply(compiler) {
|
||||
compiler.hooks.normalModuleFactory.tap(
|
||||
PLUGIN_NAME,
|
||||
(factory) => {
|
||||
factory.hooks.resolve.tap(
|
||||
PLUGIN_NAME,
|
||||
(resolveData) => {
|
||||
// Resolve fsProvider if required
|
||||
if (
|
||||
resolveData.request === 'fsProvider'
|
||||
&& resolveData.context === this.options.shimsDir
|
||||
) {
|
||||
return this.resolveFsProvider(resolveData);
|
||||
}
|
||||
|
||||
// Ignore filer files (these should resolve modules normally)
|
||||
if (resolveData.context.startsWith(this.options.filerDir)) return;
|
||||
|
||||
// Apply fs, path and buffer shims if required
|
||||
switch (resolveData.request) {
|
||||
case 'fs':
|
||||
if (!this.options.shimFs) return;
|
||||
return this.applyFsShim(resolveData);
|
||||
case 'path':
|
||||
if (!this.options.shimPath) return;
|
||||
return this.applyPathShim(resolveData);
|
||||
case 'buffer':
|
||||
if (!this.options.shimBuffer) return;
|
||||
return this.applyBufferShim(resolveData);
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
);
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
resolveFsProvider(resolveData) {
|
||||
switch (this.options.fsProvider) {
|
||||
case 'default':
|
||||
resolveData.request = path.join(this.options.fsProviderDir, 'default.js');
|
||||
break;
|
||||
case 'indexeddb':
|
||||
resolveData.request = path.join(this.options.fsProviderDir, 'indexeddb.js');
|
||||
break;
|
||||
case 'memory':
|
||||
resolveData.request = path.join(this.options.fsProviderDir, 'memory.js');
|
||||
break;
|
||||
case 'custom':
|
||||
resolveData.request = path.join(this.options.fsProviderDir, 'custom.js');
|
||||
break;
|
||||
default:
|
||||
throw new Error([
|
||||
`Invalid option for fsProvider.`,
|
||||
`fsProvider must be one of 'default', 'indexeddb', 'memory' or 'custom'.`,
|
||||
`If using a custom fsProvider, you must also provide the fsProviderDir option.`
|
||||
].join(' '));
|
||||
}
|
||||
}
|
||||
|
||||
applyFsShim(resolveData) {
|
||||
resolveData.request = path.join(this.options.shimsDir, 'fs.js');
|
||||
}
|
||||
|
||||
applyPathShim(resolveData) {
|
||||
resolveData.request = path.join(this.options.shimsDir, 'path.js');
|
||||
}
|
||||
|
||||
applyBufferShim(resolveData) {
|
||||
resolveData.request = path.join(this.options.shimsDir, 'buffer.js');
|
||||
}
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
const ROOT_DIR_TAG = '<rootDir>';
|
||||
const CWD = process.cwd();
|
||||
|
||||
module.exports = {
|
||||
filerDir: {
|
||||
process: function(value) {
|
||||
if (!value) {
|
||||
return path.join(CWD, 'node_modules', 'filer');
|
||||
}
|
||||
return value.replace(ROOT_DIR_TAG, CWD);
|
||||
},
|
||||
},
|
||||
shimsDir: {
|
||||
process: function(value) {
|
||||
if (!value) {
|
||||
return path.join(CWD, 'node_modules', 'filer', 'shims');
|
||||
}
|
||||
return value.replace(ROOT_DIR_TAG, CWD);
|
||||
}
|
||||
},
|
||||
shimFs: { default: true },
|
||||
shimPath: { default: true},
|
||||
shimBuffer: { default: true},
|
||||
fsProvider: { default: 'default'},
|
||||
fsProviderDir: {
|
||||
process: function(value) {
|
||||
if (!value) {
|
||||
return path.join(CWD, 'node_modules', 'filer', 'shims', 'providers');
|
||||
}
|
||||
return value.replace(ROOT_DIR_TAG, CWD);validateOptions
|
||||
},
|
||||
},
|
||||
};
|
|
@ -0,0 +1,26 @@
|
|||
module.exports = {
|
||||
type: 'object',
|
||||
properties: {
|
||||
filerDir: {
|
||||
type: 'string',
|
||||
},
|
||||
shimsDir: {
|
||||
type: 'string',
|
||||
},
|
||||
shimFs: {
|
||||
type: 'boolean',
|
||||
},
|
||||
shimPath: {
|
||||
type: 'boolean',
|
||||
},
|
||||
shimBuffer: {
|
||||
type: 'boolean',
|
||||
},
|
||||
fsProvider: {
|
||||
type: 'string',
|
||||
},
|
||||
fsProviderDir: {
|
||||
type: 'string',
|
||||
},
|
||||
}
|
||||
};
|
|
@ -0,0 +1,26 @@
|
|||
var { validate } = require('schema-utils');
|
||||
|
||||
function validateOptions(options, schema) {
|
||||
validate(schema, options);
|
||||
}
|
||||
|
||||
function processOptions(options, processors) {
|
||||
const processedOptions = {};
|
||||
|
||||
for (const [property, processor] of Object.entries(processors)) {
|
||||
processedOptions[property] = options[property];
|
||||
if (processedOptions[property] === undefined) {
|
||||
processedOptions[property] = processor.default;
|
||||
}
|
||||
if (processor.process) {
|
||||
processedOptions[property] = processor.process(processedOptions[property]);
|
||||
}
|
||||
}
|
||||
|
||||
return processedOptions;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
validateOptions,
|
||||
processOptions,
|
||||
};
|
Loading…
Reference in New Issue