i18next-scanner
Advanced tools
Comparing version 2.0.4 to 2.1.0
@@ -31,2 +31,4 @@ 'use strict'; | ||
var _jsxParser = require('./jsx-parser'); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
@@ -120,2 +122,5 @@ | ||
// Parser | ||
module.exports.Parser = _parser2.default; | ||
module.exports.Parser = _parser2.default; | ||
// jsxToText | ||
module.exports.jsxToText = _jsxParser.jsxToText; |
@@ -7,3 +7,4 @@ 'use strict'; | ||
exports.parseJSX = parseJSX; | ||
exports.default = jsxToText; | ||
exports.astToText = astToText; | ||
exports.jsxToText = jsxToText; | ||
@@ -10,0 +11,0 @@ var _htmlparser = require('htmlparser2'); |
@@ -18,52 +18,12 @@ 'use strict'; | ||
var _isArray = require('lodash/isArray'); | ||
var _chalk = require('chalk'); | ||
var _isArray2 = _interopRequireDefault(_isArray); | ||
var _chalk2 = _interopRequireDefault(_chalk); | ||
var _isFunction = require('lodash/isFunction'); | ||
var _esprima = require('esprima'); | ||
var _isFunction2 = _interopRequireDefault(_isFunction); | ||
var _lodash = require('lodash'); | ||
var _isPlainObject = require('lodash/isPlainObject'); | ||
var _lodash2 = _interopRequireDefault(_lodash); | ||
var _isPlainObject2 = _interopRequireDefault(_isPlainObject); | ||
var _isUndefined = require('lodash/isUndefined'); | ||
var _isUndefined2 = _interopRequireDefault(_isUndefined); | ||
var _isString = require('lodash/isString'); | ||
var _isString2 = _interopRequireDefault(_isString); | ||
var _flatten = require('lodash/flatten'); | ||
var _flatten2 = _interopRequireDefault(_flatten); | ||
var _union = require('lodash/union'); | ||
var _union2 = _interopRequireDefault(_union); | ||
var _get = require('lodash/get'); | ||
var _get2 = _interopRequireDefault(_get); | ||
var _set = require('lodash/set'); | ||
var _set2 = _interopRequireDefault(_set); | ||
var _escapeRegExp = require('lodash/escapeRegExp'); | ||
var _escapeRegExp2 = _interopRequireDefault(_escapeRegExp); | ||
var _includes = require('lodash/includes'); | ||
var _includes2 = _interopRequireDefault(_includes); | ||
var _trim = require('lodash/trim'); | ||
var _trim2 = _interopRequireDefault(_trim); | ||
var _esprima = require('esprima'); | ||
var _parse = require('parse5'); | ||
@@ -83,4 +43,2 @@ | ||
var _jsxParser2 = _interopRequireDefault(_jsxParser); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
@@ -181,30 +139,30 @@ | ||
// Attribute | ||
if ((0, _isUndefined2.default)((0, _get2.default)(options, 'attr.list'))) { | ||
(0, _set2.default)(options, 'attr.list', defaults.attr.list); | ||
if (_lodash2.default.isUndefined(_lodash2.default.get(options, 'attr.list'))) { | ||
_lodash2.default.set(options, 'attr.list', defaults.attr.list); | ||
} | ||
if ((0, _isUndefined2.default)((0, _get2.default)(options, 'attr.extensions'))) { | ||
(0, _set2.default)(options, 'attr.extensions', defaults.attr.extensions); | ||
if (_lodash2.default.isUndefined(_lodash2.default.get(options, 'attr.extensions'))) { | ||
_lodash2.default.set(options, 'attr.extensions', defaults.attr.extensions); | ||
} | ||
// Function | ||
if ((0, _isUndefined2.default)((0, _get2.default)(options, 'func.list'))) { | ||
(0, _set2.default)(options, 'func.list', defaults.func.list); | ||
if (_lodash2.default.isUndefined(_lodash2.default.get(options, 'func.list'))) { | ||
_lodash2.default.set(options, 'func.list', defaults.func.list); | ||
} | ||
// Resource | ||
if ((0, _isUndefined2.default)((0, _get2.default)(options, 'func.extensions'))) { | ||
(0, _set2.default)(options, 'func.extensions', defaults.func.extensions); | ||
if (_lodash2.default.isUndefined(_lodash2.default.get(options, 'func.extensions'))) { | ||
_lodash2.default.set(options, 'func.extensions', defaults.func.extensions); | ||
} | ||
if ((0, _isUndefined2.default)((0, _get2.default)(options, 'resource.loadPath'))) { | ||
(0, _set2.default)(options, 'resource.loadPath', defaults.resource.loadPath); | ||
if (_lodash2.default.isUndefined(_lodash2.default.get(options, 'resource.loadPath'))) { | ||
_lodash2.default.set(options, 'resource.loadPath', defaults.resource.loadPath); | ||
} | ||
if ((0, _isUndefined2.default)((0, _get2.default)(options, 'resource.savePath'))) { | ||
(0, _set2.default)(options, 'resource.savePath', defaults.resource.savePath); | ||
if (_lodash2.default.isUndefined(_lodash2.default.get(options, 'resource.savePath'))) { | ||
_lodash2.default.set(options, 'resource.savePath', defaults.resource.savePath); | ||
} | ||
if ((0, _isUndefined2.default)((0, _get2.default)(options, 'resource.jsonIndent'))) { | ||
(0, _set2.default)(options, 'resource.jsonIndent', defaults.resource.jsonIndent); | ||
if (_lodash2.default.isUndefined(_lodash2.default.get(options, 'resource.jsonIndent'))) { | ||
_lodash2.default.set(options, 'resource.jsonIndent', defaults.resource.jsonIndent); | ||
} | ||
// Accept both nsseparator or nsSeparator | ||
if (!(0, _isUndefined2.default)(options.nsseparator)) { | ||
if (!_lodash2.default.isUndefined(options.nsseparator)) { | ||
options.nsSeparator = options.nsseparator; | ||
@@ -214,3 +172,3 @@ delete options.nsseparator; | ||
// Allowed only string or false | ||
if (!(0, _isString2.default)(options.nsSeparator)) { | ||
if (!_lodash2.default.isString(options.nsSeparator)) { | ||
options.nsSeparator = false; | ||
@@ -220,3 +178,3 @@ } | ||
// Accept both keyseparator or keySeparator | ||
if (!(0, _isUndefined2.default)(options.keyseparator)) { | ||
if (!_lodash2.default.isUndefined(options.keyseparator)) { | ||
options.keySeparator = options.keyseparator; | ||
@@ -226,11 +184,11 @@ delete options.keyseparator; | ||
// Allowed only string or false | ||
if (!(0, _isString2.default)(options.keySeparator)) { | ||
if (!_lodash2.default.isString(options.keySeparator)) { | ||
options.keySeparator = false; | ||
} | ||
if (!(0, _isArray2.default)(options.ns)) { | ||
if (!_lodash2.default.isArray(options.ns)) { | ||
options.ns = [options.ns]; | ||
} | ||
options.ns = (0, _union2.default)((0, _flatten2.default)(options.ns.concat(options.defaultNs))); | ||
options.ns = _lodash2.default.union(_lodash2.default.flatten(options.ns.concat(options.defaultNs))); | ||
@@ -270,10 +228,10 @@ return options; | ||
_this.resScan[lng][ns] = {}; | ||
try { | ||
var stat = _fs2.default.statSync(resPath); | ||
if (stat.isFile()) { | ||
if (_fs2.default.existsSync(resPath)) { | ||
_this.resStore[lng][ns] = JSON.parse(_fs2.default.readFileSync(resPath, 'utf-8')); | ||
} | ||
} catch (err) { | ||
_this.log('Unable to load ' + JSON.stringify(resPath)); | ||
_this.log('i18next-scanner: Unable to load resource file ' + _chalk2.default.yellow(JSON.stringify(resPath)) + ': lng=' + lng + ', ns=' + ns); | ||
_this.log(err); | ||
} | ||
@@ -283,3 +241,3 @@ }); | ||
this.log('Parser: options=' + JSON.stringify(this.options)); | ||
this.log('i18next-scanner: options=' + JSON.stringify(this.options, null, 2)); | ||
} | ||
@@ -309,4 +267,4 @@ | ||
var regex = { | ||
lng: new RegExp((0, _escapeRegExp2.default)(options.interpolation.prefix + 'lng' + options.interpolation.suffix), 'g'), | ||
ns: new RegExp((0, _escapeRegExp2.default)(options.interpolation.prefix + 'ns' + options.interpolation.suffix), 'g') | ||
lng: new RegExp(_lodash2.default.escapeRegExp(options.interpolation.prefix + 'lng' + options.interpolation.suffix), 'g'), | ||
ns: new RegExp(_lodash2.default.escapeRegExp(options.interpolation.prefix + 'ns' + options.interpolation.suffix), 'g') | ||
}; | ||
@@ -321,4 +279,4 @@ | ||
var regex = { | ||
lng: new RegExp((0, _escapeRegExp2.default)(options.interpolation.prefix + 'lng' + options.interpolation.suffix), 'g'), | ||
ns: new RegExp((0, _escapeRegExp2.default)(options.interpolation.prefix + 'ns' + options.interpolation.suffix), 'g') | ||
lng: new RegExp(_lodash2.default.escapeRegExp(options.interpolation.prefix + 'lng' + options.interpolation.suffix), 'g'), | ||
ns: new RegExp(_lodash2.default.escapeRegExp(options.interpolation.prefix + 'ns' + options.interpolation.suffix), 'g') | ||
}; | ||
@@ -342,3 +300,3 @@ | ||
if ((0, _isFunction2.default)(opts)) { | ||
if (_lodash2.default.isFunction(opts)) { | ||
customHandler = opts; | ||
@@ -367,5 +325,5 @@ opts = {}; | ||
var key = (0, _trim2.default)(r[1]); // Remove leading and trailing whitespace | ||
var key = _lodash2.default.trim(r[1]); // Remove leading and trailing whitespace | ||
var firstChar = key[0]; | ||
if ((0, _includes2.default)(['\'', '"'], firstChar)) { | ||
if (_lodash2.default.includes(['\'', '"'], firstChar)) { | ||
// Remove first and last character | ||
@@ -408,3 +366,3 @@ key = key.slice(1, -1); | ||
var syntax = (0, _esprima.parse)('(' + code + ')'); | ||
var props = (0, _get2.default)(syntax, 'body[0].expression.properties') || []; | ||
var props = _lodash2.default.get(syntax, 'body[0].expression.properties') || []; | ||
// http://i18next.com/docs/options/ | ||
@@ -414,3 +372,3 @@ var supportedOptions = ['defaultValue', 'count', 'context', 'ns']; | ||
props.forEach(function (prop) { | ||
if ((0, _includes2.default)(supportedOptions, prop.key.name)) { | ||
if (_lodash2.default.includes(supportedOptions, prop.key.name)) { | ||
if (prop.value.type === 'Literal') { | ||
@@ -429,3 +387,3 @@ options[prop.key.name] = prop.value.value; | ||
} catch (err) { | ||
_this2.log('Unable to parse code "' + code + '"'); | ||
_this2.log('i18next-scanner: Unable to parse code "' + code + '"'); | ||
_this2.log(err); | ||
@@ -464,3 +422,3 @@ } | ||
if ((0, _isFunction2.default)(opts)) { | ||
if (_lodash2.default.isFunction(opts)) { | ||
setter = opts; | ||
@@ -472,6 +430,6 @@ opts = {}; | ||
while (r = re.exec(content)) { | ||
var _key2 = (0, _trim2.default)(r[1]); | ||
var fragment = (0, _trim2.default)(r[2]); | ||
var _key2 = _lodash2.default.trim(r[1]); | ||
var fragment = _lodash2.default.trim(r[2]); | ||
fragment = fragment.replace(/\s+/g, ' '); | ||
var defaultValue = (0, _jsxParser2.default)(fragment); | ||
var defaultValue = (0, _jsxParser.jsxToText)(fragment); | ||
var _options = { defaultValue: defaultValue }; | ||
@@ -494,3 +452,3 @@ setter(_key2, _options); | ||
if ((0, _isFunction2.default)(opts)) { | ||
if (_lodash2.default.isFunction(opts)) { | ||
setter = opts; | ||
@@ -509,3 +467,3 @@ opts = {}; | ||
var parseAttributeValue = function parseAttributeValue(key) { | ||
key = (0, _trim2.default)(key); | ||
key = _lodash2.default.trim(key); | ||
if (key.length === 0) { | ||
@@ -557,3 +515,3 @@ return; | ||
if ((0, _isPlainObject2.default)(key)) { | ||
if (_lodash2.default.isPlainObject(key)) { | ||
opts = key; | ||
@@ -580,3 +538,3 @@ key = undefined; | ||
if (!(0, _isUndefined2.default)(key)) { | ||
if (!_lodash2.default.isUndefined(key)) { | ||
var ns = this.options.defaultNs; | ||
@@ -592,3 +550,3 @@ | ||
if ((0, _isString2.default)(this.options.nsSeparator) && key.indexOf(this.options.nsSeparator) > -1) { | ||
if (_lodash2.default.isString(this.options.nsSeparator) && key.indexOf(this.options.nsSeparator) > -1) { | ||
var parts = key.split(this.options.nsSeparator); | ||
@@ -600,3 +558,3 @@ | ||
var keys = (0, _isString2.default)(this.options.keySeparator) ? key.split(this.options.keySeparator) : [key]; | ||
var keys = _lodash2.default.isString(this.options.keySeparator) ? key.split(this.options.keySeparator) : [key]; | ||
var lng = opts.lng ? opts.lng : this.options.fallbackLng; | ||
@@ -636,3 +594,3 @@ var namespaces = resStore[lng] || {}; | ||
// Backward compatibility | ||
if ((0, _isString2.default)(options)) { | ||
if (_lodash2.default.isString(options)) { | ||
var _defaultValue = options; | ||
@@ -649,3 +607,3 @@ options = { | ||
console.assert((0, _isString2.default)(ns) && !!ns.length, 'ns is not a valid string', ns); | ||
console.assert(_lodash2.default.isString(ns) && !!ns.length, 'ns is not a valid string', ns); | ||
@@ -660,3 +618,3 @@ // http://i18next.com/translate/keyBasedFallback/ | ||
if ((0, _isString2.default)(nsSeparator) && key.indexOf(nsSeparator) > -1) { | ||
if (_lodash2.default.isString(nsSeparator) && key.indexOf(nsSeparator) > -1) { | ||
var parts = key.split(nsSeparator); | ||
@@ -678,3 +636,3 @@ | ||
var keys = (0, _isString2.default)(keySeparator) ? key.split(keySeparator) : [key]; | ||
var keys = _lodash2.default.isString(keySeparator) ? key.split(keySeparator) : [key]; | ||
@@ -685,5 +643,5 @@ lngs.forEach(function (lng) { | ||
if (!(0, _isPlainObject2.default)(resLoad)) { | ||
if (!_lodash2.default.isPlainObject(resLoad)) { | ||
// Skip undefined namespace | ||
_this3.log('The namespace "' + ns + '" does not exist:', { key: key, options: options }); | ||
_this3.log('i18next-scanner: The namespace ' + _chalk2.default.yellow(JSON.stringify(ns)) + ' does not exist:', { key: key, options: options }); | ||
return; | ||
@@ -727,6 +685,6 @@ } | ||
} | ||
if ((0, _isUndefined2.default)(options.context)) { | ||
if (_lodash2.default.isUndefined(options.context)) { | ||
return false; | ||
} | ||
return (0, _isFunction2.default)(context) ? context(lng, ns, key, options) : !!context; | ||
return _lodash2.default.isFunction(context) ? context(lng, ns, key, options) : !!context; | ||
}(); | ||
@@ -739,6 +697,6 @@ | ||
} | ||
if ((0, _isUndefined2.default)(options.count)) { | ||
if (_lodash2.default.isUndefined(options.count)) { | ||
return false; | ||
} | ||
return (0, _isFunction2.default)(plural) ? plural(lng, ns, key, options) : !!plural; | ||
return _lodash2.default.isFunction(plural) ? plural(lng, ns, key, options) : !!plural; | ||
}(); | ||
@@ -773,5 +731,5 @@ | ||
// Fallback to `defaultValue` | ||
resLoad[resKey] = (0, _isFunction2.default)(defaultValue) ? defaultValue(lng, ns, key, options) : defaultValue; | ||
resLoad[resKey] = _lodash2.default.isFunction(defaultValue) ? defaultValue(lng, ns, key, options) : defaultValue; | ||
} | ||
_this3.log('Added a new translation key { %s: %s } to %s', JSON.stringify(resKey), JSON.stringify(resLoad[resKey]), JSON.stringify(_this3.formatResourceLoadPath(lng, ns))); | ||
_this3.log('i18next-scanner: Added a new translation key { ' + _chalk2.default.yellow(JSON.stringify(resKey)) + ': ' + _chalk2.default.yellow(JSON.stringify(resLoad[resKey])) + ' } to ' + _chalk2.default.yellow(JSON.stringify(_this3.formatResourceLoadPath(lng, ns)))); | ||
} | ||
@@ -778,0 +736,0 @@ |
{ | ||
"name": "i18next-scanner", | ||
"version": "2.0.4", | ||
"version": "2.1.0", | ||
"description": "Scan your code, extract translation keys/values, and merge them into i18n resource files.", | ||
@@ -14,2 +14,5 @@ "homepage": "https://github.com/i18next/i18next-scanner", | ||
], | ||
"bin": { | ||
"i18next-scanner": "./bin/cli.js" | ||
}, | ||
"main": "lib/index.js", | ||
@@ -48,2 +51,3 @@ "scripts": { | ||
"esprima": "^4.0.0", | ||
"gulp-sort": "^2.0.0", | ||
"htmlparser2": "^3.9.2", | ||
@@ -63,2 +67,3 @@ "lodash": "^4.17.4", | ||
"babel-preset-stage-0": "^6.24.1", | ||
"chalk": "^2.3.0", | ||
"coveralls": "^2.13.1", | ||
@@ -65,0 +70,0 @@ "eslint": "^4.10.0", |
@@ -51,8 +51,99 @@ # i18next-scanner [![build status](https://travis-ci.org/i18next/i18next-scanner.svg?branch=master)](https://travis-ci.org/i18next/i18next-scanner) [![Coverage Status](https://coveralls.io/repos/i18next/i18next-scanner/badge.svg?branch=master&service=github)](https://coveralls.io/github/i18next/i18next-scanner?branch=master) | ||
## Installation | ||
``` | ||
```sh | ||
npm install --save-dev i18next-scanner | ||
``` | ||
or | ||
```sh | ||
npm install -g i18next-scanner | ||
``` | ||
## Usage | ||
### CLI Usage | ||
```sh | ||
$ i18next-scanner | ||
Usage: i18next-scanner [options] <file ...> | ||
Options: | ||
-V, --version output the version number | ||
--config <config> Path to the config file (default: i18next-scanner.config.js) | ||
--output <path> Path to the output directory (default: .) | ||
-h, --help output usage information | ||
Examples: | ||
$ i18next-scanner --config i18next-scanner.config.js --output /path/to/output 'src/**/*.{js,jsx}' | ||
$ i18next-scanner --config i18next-scanner.config.js 'src/**/*.{js,jsx}' | ||
$ i18next-scanner '/path/to/src/app.js' '/path/to/assets/index.html' | ||
``` | ||
Globbing patterns are supported for specifying file paths: | ||
* `*` matches any number of characters, but not `/` | ||
* `?` matches a single character, but not `/` | ||
* `**` matches any number of characters, including `/`, as long as it's the only thing in a path part | ||
* `{}` allows for a comma-separated list of "or" expressions | ||
* `!` at the beginning of a pattern will negate the match | ||
#### Examples | ||
* [examples/i18next-scanner.config.js](https://github.com/i18next/i18next-scanner/blob/master/examples/i18next-scanner.config.js) | ||
```js | ||
var fs = require('fs'); | ||
var chalk = require('chalk'); | ||
module.exports = { | ||
options: { | ||
debug: true, | ||
func: { | ||
list: ['i18next.t', 'i18n.t'] | ||
}, | ||
lngs: ['en','de'], | ||
ns: [ | ||
'locale', | ||
'resource' | ||
], | ||
defaultNs: 'resource', | ||
defaultValue: '__STRING_NOT_TRANSLATED__', | ||
resource: { | ||
loadPath: 'i18n/{{lng}}/{{ns}}.json', | ||
savePath: 'i18n/{{lng}}/{{ns}}.json' | ||
}, | ||
nsSeparator: false, // namespace separator | ||
keySeparator: false, // key separator | ||
interpolation: { | ||
prefix: '{{', | ||
suffix: '}}' | ||
} | ||
}, | ||
transform: function customTransform(file, enc, done) { | ||
"use strict"; | ||
const parser = this.parser; | ||
const content = fs.readFileSync(file.path, enc); | ||
let count = 0; | ||
parser.parseFuncFromString(content, { list: ['i18next._', 'i18next.__'] }, (key, options) => { | ||
parser.set(key, Object.assign({}, options, { | ||
nsSeparator: false, | ||
keySeparator: false | ||
})); | ||
++count; | ||
}); | ||
if (count > 0) { | ||
console.log(`i18next-scanner: count=${chalk.cyan(count)}, file=${chalk.yellow(JSON.stringify(file.relative))}`); | ||
} | ||
done(); | ||
} | ||
}; | ||
``` | ||
### Standard API | ||
@@ -59,0 +150,0 @@ ```js |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
59785
701
9
18
792
+ Addedgulp-sort@^2.0.0
+ Addedgulp-sort@2.0.0(transitive)