UNPKG

mmir-webpack

Version:

Integration for MMIR library in webpack builds

63 lines (49 loc) 3.15 kB
import fileUtils from 'mmir-tooling/utils/filepath-utils'; import grammarGen from 'mmir-tooling/grammar/grammar-gen'; import { getLoaderOptions } from '../utils/compat-utils'; const grammarLoader = function(content, map, meta) { var callback = this.async(); var options = getLoaderOptions(this) || {}; // log('mmir-grammer-loader: options -> ', options);//DEBUG if(!options || !options.mapping){ callback('failed to parse JSON grammar: missing list for grammar settings [{id: "the ID", file: "the file path", ...}, ...]'); return;/////////////// EARLY EXIT ///////////////// } var grammarFile = fileUtils.normalizePath(this.resource); grammarGen.compile(content, grammarFile, options, callback, map, meta); return; }; //HACK force prevention of json-loader var jsonLoaderPath: string; grammarLoader.pitch = function(_remainingRequest, _precedingRequest, _data) { // log('mmir-grammer-loader: PITCHing | remaining: ', _remainingRequest, ' | preceding: ', _precedingRequest, ' | data: ', _data);//DEBUG // log('mmir-grammer-loader: PITCHing options -> ',loaderUtils.getOptions(this));//DEBUG var options = getLoaderOptions(this) || {}; grammarGen.initPendingAsyncGrammarInfo(options); //HACK for webpack < 4.x the Rule.type property for indicating the conversion JSON -> javascript is not allowed // -> for webpack >= 2.x the json-loader may register itself for the JSON grammar which would produce errors // since it will receive the javascript code emitted by the grammar-loader // WORKAROUND/HACK: try to detect json-loader, and remove it if present: var options = getLoaderOptions(this) || {}; if(options && options.isRuleTypeDisabled){//<- this will be set, if Rule.type had to be removed due to webpack version < 4.x if(!jsonLoaderPath){ try{ jsonLoaderPath = fileUtils.normalizePath(require.resolve('json-loader')); } catch(err){ //-> json-loader is not available // log('mmir-grammer-loader: PITCHing phase, [WARN] json-loader prevention WORKAROUND - options.isRuleTypeDisabled is set, but json-loader module cannot be resolved, arguments: | remainingRequest: ', remainingRequest, ' | precedingRequest: ', precedingRequest, ' | data: ', data); //-> ignore: no use trying to remove json-loader from this.loaders... return;////////////// EARLY EXIT ///////////////////////// } } for(var i=this.loaders.length-1; i >= 0; --i){ // log('mmir-grammer-loader: checking loaders at ', i, ' -> ', this.loaders[i]);//DEBUG // for(var n in this.loaders[i]) log('mmir-grammer-loader: loaders ', i, '['+n+'] -> ', this.loaders[i][n])//DEBUG if(fileUtils.normalizePath(this.loaders[i].path) === jsonLoaderPath){ // log('mmir-grammer-loader: removing default json-loader at ', i);//DEBUG this.loaders.splice(i,1) } } } }; export = grammarLoader;