Skip to content

Instantly share code, notes, and snippets.

@wclr
Last active December 9, 2015 07:53
Show Gist options
  • Save wclr/e500e68ec37e052a2dc1 to your computer and use it in GitHub Desktop.
Save wclr/e500e68ec37e052a2dc1 to your computer and use it in GitHub Desktop.
StealJS plugin to dynamiclty load language (resouces) packs
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