Bump version 0.0.22
diff --git a/component.json b/component.json
new file mode 100644
index 0000000..42fd824
--- /dev/null
+++ b/component.json
@@ -0,0 +1,48 @@
+{
+ "name": "escodegen",
+ "description": "ECMAScript code generator",
+ "homepage": "http://github.com/Constellation/escodegen.html",
+ "main": "escodegen.js",
+ "bin": {
+ "esgenerate": "./bin/esgenerate.js",
+ "escodegen": "./bin/escodegen.js"
+ },
+ "version": "0.0.22",
+ "engines": {
+ "node": ">=0.4.0"
+ },
+ "maintainers": [
+ {
+ "name": "Yusuke Suzuki",
+ "email": "utatane.tea@gmail.com",
+ "web": "http://github.com/Constellation"
+ }
+ ],
+ "repository": {
+ "type": "git",
+ "url": "http://github.com/Constellation/escodegen.git"
+ },
+ "dependencies": {
+ "estraverse": "~0.0.4",
+ "esprima": "~1.0.2"
+ },
+ "optionalDependencies": {},
+ "devDependencies": {
+ "esprima-moz": "*",
+ "browserify": "*",
+ "q": "*",
+ "bower": "*",
+ "semver": "*"
+ },
+ "licenses": [
+ {
+ "type": "BSD",
+ "url": "http://github.com/Constellation/escodegen/raw/master/LICENSE.BSD"
+ }
+ ],
+ "scripts": {
+ "test": "node test/run.js",
+ "release": "node tools/release.js",
+ "build": "(echo '// Generated by browserify'; ./node_modules/.bin/browserify -i source-map tools/entry-point.js) > escodegen.browser.js"
+ }
+}
\ No newline at end of file
diff --git a/escodegen.browser.js b/escodegen.browser.js
index 27313ec..4418571 100644
--- a/escodegen.browser.js
+++ b/escodegen.browser.js
@@ -842,6 +842,67 @@
return result;
}
+ // Generate valid RegExp expression.
+ // This function is based on https://github.com/Constellation/iv Engine
+
+ function escapeRegExpCharacter(ch, previousIsBackslash) {
+ // not handling '\' and handling \u2028 or \u2029 to unicode escape sequence
+ if ((ch & ~1) === 0x2028) {
+ return (previousIsBackslash ? 'u' : '\\u') + ((ch === 0x2028) ? '2028' : '2029');
+ } else if (ch === 10 || ch === 13) { // \n, \r
+ return (previousIsBackslash ? '' : '\\') + ((ch === 10) ? 'n' : 'r');
+ }
+ return String.fromCharCode(ch);
+ }
+
+ function generateRegExp(reg) {
+ var match, result, flags, i, iz, ch, characterInBrack, previousIsBackslash;
+
+ result = reg.toString();
+
+ if (reg.source) {
+ // extract flag from toString result
+ match = result.match(/\/([^/]*)$/);
+ if (!match) {
+ return result;
+ }
+
+ flags = match[1];
+ result = '';
+
+ characterInBrack = false;
+ previousIsBackslash = false;
+ for (i = 0, iz = reg.source.length; i < iz; ++i) {
+ ch = reg.source.charCodeAt(i);
+
+ if (!previousIsBackslash) {
+ if (characterInBrack) {
+ if (ch === 93) { // ]
+ characterInBrack = false;
+ }
+ } else {
+ if (ch === 47) { // /
+ result += '\\';
+ } else if (ch === 91) { // [
+ characterInBrack = true;
+ }
+ }
+ result += escapeRegExpCharacter(ch, previousIsBackslash);
+ previousIsBackslash = ch === 92; // \
+ } else {
+ // if new RegExp("\\\n') is provided, create /\n/
+ result += escapeRegExpCharacter(ch, previousIsBackslash);
+ // prevent like /\\[/]/
+ previousIsBackslash = false;
+ }
+ }
+
+ return '/' + result + '/' + flags;
+ }
+
+ return result;
+ }
+
function escapeAllowedCharacter(ch, next) {
var code = ch.charCodeAt(0), hex = code.toString(16), result = '\\';
@@ -1427,8 +1488,10 @@
}), ']');
} else {
if (expr.object.type === Syntax.Literal && typeof expr.object.value === 'number') {
- if (result.indexOf('.') < 0) {
- if (!/[eExX]/.test(result) && !(result.length >= 2 && result[0] === '0')) {
+ fragment = toSourceNode(result).toString();
+ if (fragment.indexOf('.') < 0) {
+ if (!/[eExX]/.test(fragment) &&
+ !(fragment.length >= 2 && fragment.charCodeAt(0) === 48)) { // '0'
result.push('.');
}
}
@@ -1747,7 +1810,12 @@
break;
}
- result = expr.value.toString();
+ if (typeof expr.value === 'boolean') {
+ result = expr.value ? 'true' : 'false';
+ break;
+ }
+
+ result = generateRegExp(expr.value);
break;
case Syntax.ComprehensionExpression:
@@ -1930,7 +1998,8 @@
})];
// 12.4 '{', 'function' is not allowed in this position.
// wrap expression with parentheses
- if (result.toString().charAt(0) === '{' || (result.toString().slice(0, 8) === 'function' && " (".indexOf(result.toString().charAt(8)) >= 0) || (directive && directiveContext && stmt.expression.type === Syntax.Literal && typeof stmt.expression.value === 'string')) {
+ fragment = toSourceNode(result).toString();
+ if (fragment.charAt(0) === '{' || (fragment.slice(0, 8) === 'function' && " (".indexOf(fragment.charAt(8)) >= 0) || (directive && directiveContext && stmt.expression.type === Syntax.Literal && typeof stmt.expression.value === 'string')) {
result = ['(', result, ')' + semicolon];
} else {
result.push(semicolon);
diff --git a/package.json b/package.json
index 8ac18fd..b45d947 100644
--- a/package.json
+++ b/package.json
@@ -7,7 +7,7 @@
"esgenerate": "./bin/esgenerate.js",
"escodegen": "./bin/escodegen.js"
},
- "version": "0.0.22-dev",
+ "version": "0.0.22",
"engines": {
"node": ">=0.4.0"
},
@@ -47,4 +47,4 @@
"release": "node tools/release.js",
"build": "(echo '// Generated by browserify'; ./node_modules/.bin/browserify -i source-map tools/entry-point.js) > escodegen.browser.js"
}
-}
+}
\ No newline at end of file