weex-loader
Advanced tools
Comparing version 0.1.5 to 0.2.0
285
index.js
@@ -1,284 +0,1 @@ | ||
'use strict'; | ||
var path = require('path'); | ||
var fs = require('fs'); | ||
var md5 = require('md5'); | ||
var loaderUtils = require('loader-utils'); | ||
var blocker = require('weex-transformer/lib/blocker'); | ||
var pkg = require('./package.json'); | ||
var transformerVersion = pkg.dependencies['weex-transformer'].match(/\d+(?:\.\d+){0,2}/)[0]; | ||
var templater = require('weex-templater'); | ||
var styler = require('weex-styler'); | ||
var scripter = require('weex-scripter'); | ||
var MODULE_EXPORTS_REG = /module\.exports/g; | ||
var REQUIRE_REG = /require\((["'])(\@weex\-module\/[^\)\1]+)\1\)/g; | ||
function parseScript(loader, params, source, config, data, elementName, elements) { | ||
elements = elements || [] | ||
if (!scripter) { | ||
return Promise.reject('please use a script parser. e.g. weex-scripter'); | ||
} | ||
var target = scripter.fix(source); | ||
var name = elementName || params.resourceQuery.name || | ||
path.basename(params.resourcePath).replace(/\..*$/, ''); | ||
if (!elementName && params.resourceQuery.entry === true) { | ||
name = md5(source); | ||
} | ||
target = target.replace(MODULE_EXPORTS_REG, '__weex_module__.exports') | ||
.replace(REQUIRE_REG, '__weex_require__($1$2$1)'); | ||
target = ';__weex_define__("@weex-component/' + name + '", [], ' + | ||
'function(__weex_require__, __weex_exports__, __weex_module__)' + | ||
'{\n' + target + '\n})'; | ||
if (!elementName && params.resourceQuery.entry === true) { | ||
target += '\n;__weex_bootstrap__("@weex-component/' + name + '", ' + | ||
String(config) + ',' + | ||
String(data) + ')'; | ||
} | ||
target = elements.concat(target).join(';\n\n') | ||
return Promise.resolve(target); | ||
} | ||
var logLevel = false; | ||
function logWarning(loader, log) { | ||
if (logLevel === false) return; | ||
if (log && log instanceof Array) { | ||
log.forEach(function(l) { | ||
loader.emitWarning(l.reason + '\t@' + l.line + ':' + l.column) | ||
}); | ||
} | ||
} | ||
function parseStyle(loader, params, source) { | ||
return new Promise(function(resolve, reject) { | ||
if (!styler) { | ||
return reject('please use a style parser. e.g. weex-styler'); | ||
} | ||
styler.parse(source, function(err, obj) { | ||
if (err) { | ||
reject(err); | ||
} else { | ||
logWarning(loader, obj.log); | ||
var target = JSON.stringify(obj.jsonStyle, null, ' '); | ||
resolve(target); | ||
} | ||
}); | ||
}); | ||
} | ||
var FUNC_START = '#####FUN_S#####'; | ||
var FUNC_START_REG = new RegExp('["\']' + FUNC_START, 'g'); | ||
var FUNC_END = '#####FUN_E#####'; | ||
var FUNC_END_REG = new RegExp(FUNC_END + '["\']', 'g'); | ||
function stringifyFunction(key, value) { | ||
if (typeof value === 'function') { | ||
return FUNC_START + value.toString() + '#####FUN_E#####'; | ||
} | ||
return value; | ||
} | ||
function parseTemplate(loader, params, source, deps) { | ||
return new Promise(function(resolve, reject) { | ||
if (!templater) { | ||
return reject('please use a template parser. e.g. weex-templater'); | ||
} | ||
templater.parse(source, function(err, obj) { | ||
if (err) { | ||
reject(err); | ||
} else { | ||
logWarning(loader, obj.log); | ||
if (deps && obj.deps) { | ||
var context = path.dirname(params.resourcePath); | ||
obj.deps.map(function(dep) { | ||
var filename = './' + dep + '.we'; | ||
var filepath = path.resolve(context, filename); | ||
if (fs.existsSync(filepath)) { | ||
return filename; | ||
} | ||
}).forEach(function(dep) { | ||
if (dep) { | ||
deps.push(dep); | ||
} | ||
}); | ||
} | ||
var target = JSON.stringify(obj.jsonTemplate, stringifyFunction, ' '); | ||
target = target.replace(FUNC_START_REG, '') | ||
.replace(FUNC_END_REG, ''); | ||
resolve(target); | ||
} | ||
}); | ||
}); | ||
} | ||
function parseWeexFile(loader, params, source, deps, elementName) { | ||
var results; | ||
deps = deps || []; | ||
return new Promise(function(resolve, reject) { | ||
blocker.format(source, function(err, ret) { | ||
if (err) { | ||
reject(err); | ||
} else { | ||
results = ret; | ||
resolve(); | ||
} | ||
}); | ||
}).then(function() { | ||
var promises = [Promise.resolve(), Promise.resolve(), Promise.resolve()]; | ||
var content; | ||
if (results.elements) { | ||
var elPromises = [] | ||
Object.keys(results.elements).forEach(function (key) { | ||
var el = results.elements[key]; | ||
elPromises.push(parseWeexFile(loader, params, el.content, deps, el.name)); | ||
}); | ||
promises[0] = Promise.all(elPromises); | ||
} | ||
if (results.template) { | ||
content = results.template.content; | ||
promises[1] = parseTemplate(loader, params, content, deps); | ||
} | ||
if (results.styles) { | ||
content = results.styles.reduce(function(pre, cur) { | ||
return pre + '\n' + cur.content; | ||
}, ''); | ||
promises[2] = parseStyle(loader, params, content); | ||
} | ||
return Promise.all(promises); | ||
}).then(function(ret) { | ||
var elements = ret[0] || []; | ||
var template = ret[1]; | ||
var style = ret[2]; | ||
var content = ''; | ||
var config = {}; | ||
var data; | ||
if (results.scripts) { | ||
content += results.scripts.reduce(function(pre, cur) { | ||
return pre + '\n;' + cur.content; | ||
}, ''); | ||
} | ||
var requireContent = ''; | ||
if (deps.length) { | ||
requireContent += deps.map(function(dep) { | ||
if (!content.match(new RegExp('require\\(["\']./' + path.basename(dep) + '(\.we)?["\']\\)', 'g'))) { | ||
return 'require("' + dep + '");'; | ||
} else { | ||
return ''; | ||
} | ||
}).join('\n'); | ||
content = requireContent + '\n' + content; | ||
} | ||
if (template) { | ||
content += '\n;module.exports.template = module.exports.template || {}' + | ||
'\n;Object.assign(module.exports.template, ' + template + ')'; | ||
} | ||
if (style) { | ||
content += '\n;module.exports.style = module.exports.style || {}' + | ||
'\n;Object.assign(module.exports.style, ' + style + ')'; | ||
} | ||
if (results.config) { | ||
config = new Function('return ' + results.config.content.replace(/\n/g, ''))(); | ||
} | ||
config.transformerVersion = transformerVersion; | ||
config = JSON.stringify(config, null, ' '); | ||
if (results.data) { | ||
data = new Function('return ' + results.data.content.replace(/\n/g, ''))(); | ||
data = JSON.stringify(data, null, ' '); | ||
} | ||
return parseScript(loader, params, content, config, data, elementName, elements); | ||
}); | ||
} | ||
function partedLoader(type, loader, params, source) { | ||
var promise; | ||
switch(type) { | ||
case 'js': | ||
case 'script': | ||
var config = JSON.stringify({ | ||
transformerVersion: transformerVersion | ||
}); | ||
promise = parseScript(loader, params, source, config); | ||
break; | ||
case 'css': | ||
case 'style': | ||
promise = parseStyle(loader, params, source); | ||
break; | ||
case 'html': | ||
case 'tpl': | ||
case 'template': | ||
promise = parseTemplate(loader, params, source); | ||
break; | ||
case 'we': | ||
default: | ||
promise = parseWeexFile(loader, params, source); | ||
break; | ||
} | ||
return promise; | ||
} | ||
function loader(source) { | ||
var self = this; | ||
this.cacheable && this.cacheable(); | ||
var callback = this.async(); | ||
var params = { | ||
loaderQuery: loaderUtils.parseQuery(this.query), | ||
resourceQuery: loaderUtils.parseQuery(this.resourceQuery), | ||
resourcePath: this.resourcePath | ||
}; | ||
var type = params.loaderQuery.type || 'we'; | ||
var promise = partedLoader(type, this, params, source); | ||
promise.then(function(result) { | ||
if (type === 'style' || type === 'css' || | ||
type === 'html' || type === 'tpl' || type === 'template') { | ||
result = 'module.exports=' + result; | ||
} | ||
callback(null, result); | ||
}).catch(function(err) { | ||
self.emitError(err.toString()); | ||
callback(err.toString(), ''); | ||
}); | ||
} | ||
loader.useScripter = function(module) { | ||
console.warn('\u001b[1;32m[Warn]\u001b[0m: method useScripter() in weex-loader is no more necessary'); | ||
} | ||
loader.useStyler = function(module) { | ||
console.warn('\u001b[1;32m[Warn]\u001b[0m: method useStyler() in weex-loader is no more necessary'); | ||
} | ||
loader.useTemplater = function(module) { | ||
console.warn('\u001b[1;32m[Warn]\u001b[0m: method useTemplater() in weex-loader is no more necessary'); | ||
} | ||
loader.setLogLevel = function(level) { | ||
logLevel = level | ||
} | ||
module.exports = loader; | ||
module.exports = require('./lib/') |
{ | ||
"name": "weex-loader", | ||
"version": "0.1.5", | ||
"version": "0.2.0", | ||
"description": "a webpack loader for weex", | ||
@@ -9,5 +9,5 @@ "main": "index.js", | ||
"type": "git", | ||
"url": "git@github.com:alibaba/weex_toolchain.git" | ||
"url": "https://github.com/weexteam/weex-loader.git" | ||
}, | ||
"licenses": "MIT", | ||
"licenses": "GPL-3.0", | ||
"keywords": [ | ||
@@ -20,13 +20,17 @@ "weex", | ||
"scripts": { | ||
"prepublish": "node_modules/babel-cli/bin/babel.js src --out-dir lib", | ||
"test:lint": "eslint src", | ||
"test:build": "webpack --config test/webpack.config.js", | ||
"test:transform": "transformer test/expect/*.we -o test/expect", | ||
"test:mocha": "mocha --compilers js:babel-core/register test/test.js", | ||
"test": "npm run test:build && npm run test:transform && npm run test:mocha", | ||
"test:mocha": "mocha test/test.js", | ||
"test": "npm run prepublish && npm run test:lint && npm run test:build && npm run test:transform && npm run test:mocha", | ||
"serve": "serve ./test -p 12581" | ||
}, | ||
"devDependencies": { | ||
"babel-core": "^6.7.6", | ||
"babel-cli": "^6.10.1", | ||
"babel-core": "^6.10.4", | ||
"babel-loader": "^6.2.4", | ||
"babel-preset-es2015": "^6.6.0", | ||
"babel-preset-es2015": "^6.9.0", | ||
"chai": "^3.5.0", | ||
"eslint": "^2.13.1", | ||
"less": "^2.6.1", | ||
@@ -43,2 +47,3 @@ "less-loader": "^2.2.3", | ||
"md5": "^2.1.0", | ||
"source-map": "^0.5.6", | ||
"weex-scripter": "^0.1.4", | ||
@@ -48,3 +53,8 @@ "weex-styler": "^0.0.17", | ||
"weex-transformer": "^0.3.1" | ||
}, | ||
"babel": { | ||
"presets": [ | ||
"es2015" | ||
] | ||
} | ||
} |
@@ -86,3 +86,3 @@ # Weex Loader | ||
**loader for script** | ||
```json | ||
```javascript | ||
{ | ||
@@ -95,3 +95,3 @@ test: /\.js(\?[^?]+)?$/, | ||
**loader for style** | ||
```json | ||
```javascript | ||
{ | ||
@@ -104,3 +104,3 @@ test: /\.css(\?[^?]+)?$/, | ||
**loader for template** | ||
```json | ||
```javascript | ||
{ | ||
@@ -136,3 +136,3 @@ test: /\.tpl(\?[^?]+)?$/, | ||
```json | ||
```javascript | ||
{ | ||
@@ -148,3 +148,3 @@ test: /\.js(\?[^?]+)?$/, | ||
```json | ||
```javascript | ||
{ | ||
@@ -151,0 +151,0 @@ test: /\.scss(\?[^?]+)?$/, |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Copyleft License
License(Experimental) Copyleft license information was found.
Found 1 instance in 1 package
Non-permissive License
License(Experimental) A license not known to be considered permissive was found.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
61151
13
453
7
13
2
70
+ Addedsource-map@^0.5.6