Socket
Socket
Sign inDemoInstall

i18next-scanner

Package Overview
Dependencies
Maintainers
1
Versions
92
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

i18next-scanner - npm Package Compare versions

Comparing version 2.0.4 to 2.1.0

7

lib/index.js

@@ -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;

3

lib/jsx-parser.js

@@ -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

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc