Last active
December 9, 2015 07:53
-
-
Save wclr/e500e68ec37e052a2dc1 to your computer and use it in GitHub Desktop.
StealJS plugin to dynamiclty load language (resouces) packs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var getWindowLoader = function(name){ | |
return ` | |
module.exports = function(lang){ | |
return System.import("${name}" + "/" + lang + ".js!" + lang + ".lp") | |
} | |
` | |
} | |
var getNodeLoader = function(name, address, load){ | |
var fs = require('fs') | |
var langs = fs.readdirSync(address).map((f)=> f.split('.')[0]) | |
load.metadata.deps = langs.map((lang) => | |
name + '/' + lang + '.js!' + lang + '.lp' | |
) | |
var lpConfig = System.lp || {}, | |
defaultLang = lpConfig.defaultLang || '', | |
fallback = !!lpConfig.langFallback | |
langs = langs.map((lang) => '"' + lang + '"').join() | |
return ` | |
module.exports = function(lang){ | |
var langs = [${langs}] | |
var defaultLang = "${defaultLang}" | |
if ([langs].indexOf(lang) < 0){ | |
if (defaultLang && langs.indexOf(defaultLang) < 0){ | |
if (${fallback} && langs.length){ | |
lang = lang[0] | |
} else { | |
return Promise.resolve({}) | |
} | |
} | |
} | |
return System.import("${name}" + "/" + lang + ".js!" + lang + ".lp") | |
} | |
` | |
} | |
var matchLangPlugin = function(address){ | |
var match = address.match(/([\w\d-]+)\.lp\.js$/i) | |
return match && match[1] | |
} | |
if (typeof window === 'undefined'){ | |
var fs = require('fs') | |
var oldReadFile = fs.readFile; | |
fs.readFile = function(address){ | |
var lang = matchLangPlugin(address) | |
if (lang){ | |
var args = Array.prototype.slice.call(arguments), | |
callback = args[args.length - 1] | |
callback(null, ` | |
export function translate(load) { | |
return 'define("' + load.name + '", function(require, exports, module){' + | |
'' + load.source + '});' | |
} | |
export let buildType = '${lang}.lp' | |
`) | |
} else { | |
return oldReadFile.apply(fs, arguments) | |
} | |
} | |
} | |
var oldFetch = System.fetch; | |
System.fetch = function(load) { | |
var lang = matchLangPlugin(load.address) | |
if (lang){ | |
// for browser return empty language module | |
return '' | |
} else { | |
return oldFetch.call(this, load) | |
} | |
} | |
export function fetch(load) { | |
// clean up everything before # and after ! | |
let name = load.name.replace(/!.*$/, '').replace(/.*#/, '') | |
let address = load.address.replace(/^file:/, '').replace(/\\/g, '/') | |
if (typeof window === 'undefined'){ | |
return getNodeLoader(name, address, load) | |
} else { | |
return getWindowLoader(name, address) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment