UNPKG

systemjs

Version:

System loader extension for flexible AMD & CommonJS support

95 lines (83 loc) 2.59 kB
/* * Meta Extension * * Sets default metadata on a load record (load.metadata) from * loader.meta[moduleName]. * Also provides an inline meta syntax for module meta in source. * * Eg: * * loader.meta['my/module'] = { some: 'meta' }; * * load.metadata.some = 'meta' will now be set on the load record. * * The same meta could be set with a my/module.js file containing: * * my/module.js * "some meta"; * "another meta"; * console.log('this is my/module'); * * The benefit of inline meta is that coniguration doesn't need * to be known in advance, which is useful for modularising * configuration and avoiding the need for configuration injection. * * * Example * ------- * * The simplest meta example is setting the module format: * * System.meta['my/module'] = { format: 'amd' }; * * or inside 'my/module.js': * * "format amd"; * define(...); * */ function meta(loader) { var metaRegEx = /^(\s*\/\*.*\*\/|\s*\/\/[^\n]*|\s*"[^"]+"\s*;?|\s*'[^']+'\s*;?)+/; var metaPartRegEx = /\/\*.*\*\/|\/\/[^\n]*|"[^"]+"\s*;?|'[^']+'\s*;?/g; loader.meta = {}; function setConfigMeta(loader, load) { var meta = loader.meta && loader.meta[load.name]; if (meta) { for (var p in meta) load.metadata[p] = load.metadata[p] || meta[p]; } } var loaderLocate = loader.locate; loader.locate = function(load) { setConfigMeta(this, load); return loaderLocate.call(this, load); } var loaderTranslate = loader.translate; loader.translate = function(load) { // detect any meta header syntax var meta = load.source.match(metaRegEx); if (meta) { var metaParts = meta[0].match(metaPartRegEx); for (var i = 0; i < metaParts.length; i++) { var len = metaParts[i].length; var firstChar = metaParts[i].substr(0, 1); if (metaParts[i].substr(len - 1, 1) == ';') len--; if (firstChar != '"' && firstChar != "'") continue; var metaString = metaParts[i].substr(1, metaParts[i].length - 3); var metaName = metaString.substr(0, metaString.indexOf(' ')); if (metaName) { var metaValue = metaString.substr(metaName.length + 1, metaString.length - metaName.length - 1); if (load.metadata[metaName] instanceof Array) load.metadata[metaName].push(metaValue); else if (!load.metadata[metaName]) load.metadata[metaName] = metaValue; } } } // config meta overrides setConfigMeta(this, load); return loaderTranslate.call(this, load); } }