locutus 2.0.29 → 2.0.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/_util/util.js CHANGED
@@ -7,10 +7,10 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
7
7
  var globby = require('globby');
8
8
  var path = require('path');
9
9
  var fs = require('fs');
10
+ var fsPromises = fs.promises;
10
11
  var async = require('async');
11
12
  var YAML = require('js-yaml');
12
- var mkdirp = require('mkdirp');
13
- var debug = require('depurar')('locutus');
13
+ var debug = require('debug')('locutus:utils');
14
14
  var indentString = require('indent-string');
15
15
  var _ = require('lodash');
16
16
  var esprima = require('esprima');
@@ -187,13 +187,13 @@ var Util = function () {
187
187
  langTitle += ' in JavaScript';
188
188
 
189
189
  var langData = Object.assign({}, this.langDefaults[params.language], {
190
- warning: 'This file is auto generated by `npm run web:inject`, do not edit by hand',
190
+ warning: 'This file is auto generated by `yarn web:inject`, do not edit by hand',
191
191
  type: 'language',
192
192
  layout: 'language',
193
193
  language: params.language,
194
194
  title: langTitle
195
195
  });
196
- this._injectwebBuffer[langIndexPath] = '---' + '\n' + YAML.safeDump(langData).trim() + '\n' + '---' + '\n';
196
+ this._injectwebBuffer[langIndexPath] = '---' + '\n' + YAML.dump(langData).trim() + '\n' + '---' + '\n';
197
197
  }
198
198
 
199
199
  if (!this._injectwebBuffer[catIndexPath]) {
@@ -204,14 +204,14 @@ var Util = function () {
204
204
  catTitle += ' in JavaScript';
205
205
 
206
206
  var catData = {
207
- warning: 'This file is auto generated by `npm run web:inject`, do not edit by hand',
207
+ warning: 'This file is auto generated by `yarn web:inject`, do not edit by hand',
208
208
  type: 'category',
209
209
  layout: 'category',
210
210
  language: params.language,
211
211
  category: params.category,
212
212
  title: catTitle
213
213
  };
214
- this._injectwebBuffer[catIndexPath] = '---' + '\n' + YAML.safeDump(catData).trim() + '\n' + '---' + '\n';
214
+ this._injectwebBuffer[catIndexPath] = '---' + '\n' + YAML.dump(catData).trim() + '\n' + '---' + '\n';
215
215
  }
216
216
 
217
217
  var functionTitle = this.langDefaults[params.language].function_title_template.replace(/\[language]/g, this.langDefaults[params.language].human).replace(/\[category]/g, params.category).replace(/\[function]/g, params.func_name).replace(/\[functiondashed]/g, params.func_name.replace(/_/g, '-'));
@@ -219,7 +219,7 @@ var Util = function () {
219
219
  var functionDescription = this.langDefaults[params.language].function_description_template.replace(/\[language]/g, this.langDefaults[params.language].human).replace(/\[category]/g, params.category).replace(/\[function]/g, params.func_name).replace(/\[functiondashed]/g, params.func_name.replace(/_/g, '-'));
220
220
 
221
221
  var funcData = {
222
- warning: 'This file is auto generated by `npm run web:inject`, do not edit by hand',
222
+ warning: 'This file is auto generated by `yarn web:inject`, do not edit by hand',
223
223
  examples: (params.headKeys.example || []).map(function (lines, i) {
224
224
  return lines.join('\n');
225
225
  }),
@@ -246,11 +246,11 @@ var Util = function () {
246
246
  funcData.alias.push('/functions/' + params.func_name + '/');
247
247
  }
248
248
 
249
- var buf = '---' + '\n' + YAML.safeDump(funcData).trim() + '\n' + '---' + '\n';
249
+ var buf = '---' + '\n' + YAML.dump(funcData).trim() + '\n' + '---' + '\n';
250
250
 
251
251
  buf += '{% codeblock lang:javascript %}' + params.code + '{% endcodeblock %}';
252
252
 
253
- mkdirp(path.dirname(funcPath)).then(function () {
253
+ fsPromises.mkdir(path.dirname(funcPath), { recursive: true }).then(function () {
254
254
  fs.writeFile(funcPath, buf, 'utf-8', cb);
255
255
  }, function (err) {
256
256
  throw new Error('Could not mkdir for ' + funcPath + '. ' + err);
@@ -278,7 +278,7 @@ var Util = function () {
278
278
 
279
279
  var basename = path.basename(params.filepath);
280
280
  var subdir = path.dirname(params.filepath);
281
- var testpath = this.__test + '/languages/' + subdir + '/test-' + basename;
281
+ var testpath = this.__test + '/generated/' + subdir + '/test-' + basename;
282
282
  var testdir = path.dirname(testpath);
283
283
  var relativeSrcForTestDir = path.relative(testdir, self.__src);
284
284
  var relativeTestFileForRoot = path.relative(self.__root, testpath);
@@ -298,8 +298,11 @@ var Util = function () {
298
298
 
299
299
  var codez = [];
300
300
 
301
- codez.push('// warning: This file is auto generated by `npm run build:tests`');
301
+ codez.push('// warning: This file is auto generated by `yarn build:tests`');
302
302
  codez.push('// Do not edit by hand!');
303
+ codez.push('');
304
+ codez.push('\'use strict\'');
305
+ codez.push('');
303
306
 
304
307
  // Add globals
305
308
  for (var global in self.globals) {
@@ -377,7 +380,7 @@ var Util = function () {
377
380
  var code = codez.join('\n');
378
381
 
379
382
  // Write to disk
380
- mkdirp(testdir).then(function () {
383
+ fsPromises.mkdir(testdir, { recursive: true }).then(function () {
381
384
  debug('writing: ' + testpath);
382
385
  fs.writeFile(testpath, code, 'utf-8', cb);
383
386
  }, function (err) {
package/_util/util.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/_util/util.js"],"names":["globby","require","path","fs","async","YAML","mkdirp","debug","indentString","_","esprima","Util","argv","__src","dirname","__dirname","__root","__test","globals","pattern","concurrency","authorKeys","langDefaults","c","order","function_title_template","human","packageType","inspiration_urls","function_description_template","golang","python","ruby","php","alias","allowSkip","indexOf","_reindexBuffer","_injectwebBuffer","cb","self","_runFunctionOnAll","_injectwebOne","err","indexHtml","writeFileSync","_reindexOne","indexJs","requires","sort","join","_writetestOne","runFunc","q","queue","fullpath","callback","_load","bind","params","files","sync","push","drain","filepath","dir","basefile","basename","module","line","authors","forEach","key","headKeys","flattenDeep","langPath","language","langIndexPath","catPath","category","catIndexPath","funcPath","func_name","langTitle","langData","Object","assign","warning","type","layout","title","safeDump","trim","catTitle","catData","functionTitle","replace","functionDescription","funcData","examples","example","map","lines","i","returns","dependencies","notes","note","description","function","permalink","buf","code","then","writeFile","Error","name","relativeSrcForTest","JSON","stringify","subdir","testpath","testdir","relativeSrcForTestDir","relative","relativeTestFileForRoot","testProps","test","describeSkip","codez","global","_addRequire","length","humanIndex","parseInt","itSkip","body","testExpected","j","fileOrName","requesterParams","substr","msg","readFile","_opener","_parse","depCodePath","loaded","_findDependencies","parts","split","shift","codepath","pop","ast","parseScript","comment","loc","range","moduleExports","filter","node","leftArg","expression","left","rightArg","right","object","property","id","exp","funcName","funcParams","p","funcLoc","firstFuncBodyElementLoc","headComments","comments","start","end","value","_headKeys","func_arguments","headLines","keys","match","dmatch","val","num","exports"],"mappings":"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","file":"util.js","sourcesContent":["const globby = require('globby')\nconst path = require('path')\nconst fs = require('fs')\nconst async = require('async')\nconst YAML = require('js-yaml')\nconst mkdirp = require('mkdirp')\nconst debug = require('depurar')('locutus')\nconst indentString = require('indent-string')\nconst _ = require('lodash')\nconst esprima = require('esprima')\n\nclass Util {\n constructor(argv) {\n if (!argv) {\n argv = []\n }\n this.__src = path.dirname(__dirname)\n this.__root = path.dirname(path.dirname(__dirname))\n this.__test = path.dirname(path.dirname(__dirname)) + '/test'\n\n this.globals = {}\n\n this.pattern = [this.__src + '/**/**/*.js', '!**/index.js', '!**/_util/**']\n this.concurrency = 8\n this.authorKeys = [\n 'original by',\n 'improved by',\n 'reimplemented by',\n 'parts by',\n 'bugfixed by',\n 'revised by',\n 'input by',\n ]\n\n this.langDefaults = {\n c: {\n order: 1,\n function_title_template: \"[language]'s [category].[function] in JavaScript\",\n human: 'C',\n packageType: 'header file',\n inspiration_urls: [\n '<a href=\"https://en.cppreference.com/w/c/numeric/math\">the C math.h documentation</a>',\n '<a href=\"https://sourceware.org/git/?p=glibc.git;a=tree;f=math;hb=HEAD\">the C math.h source</a>',\n ],\n function_description_template:\n 'Here’s what our current JavaScript equivalent to <a href=\"https://en.cppreference.com/w/c/numeric/[category]/[function]\">[language]\\'s [function] found in the [category].h header file</a> looks like.',\n },\n golang: {\n order: 2,\n function_title_template: \"[language]'s [category].[function] in JavaScript\",\n human: 'Go',\n packageType: 'package',\n inspiration_urls: [\n '<a href=\"https://golang.org/pkg/strings/\">Go strings documentation</a>',\n '<a href=\"https://golang.org/src/strings/strings.go\">Go strings source</a>',\n '<a href=\"https://golang.org/src/strings/example_test.go\">Go strings examples source</a>',\n '<a href=\"https://gophersjs.com\">GopherJS</a>',\n ],\n function_description_template:\n 'Here’s what our current JavaScript equivalent to <a href=\"https://golang.org/pkg/[category]/#[function]\">[language]\\'s [category].[function]</a> looks like.',\n },\n python: {\n order: 3,\n function_title_template: \"[language]'s [category].[function] in JavaScript\",\n human: 'Python',\n packageType: 'module',\n inspiration_urls: [\n '<a href=\"https://docs.python.org/3/library/string.html\">the Python 3 standard library string page</a>',\n ],\n function_description_template:\n 'Here’s what our current JavaScript equivalent to <a href=\"https://docs.python.org/3/library/[category].html#[category].[function]\">[language]\\'s [category].[function]</a> looks like.',\n },\n ruby: {\n order: 4,\n function_title_template: \"[language]'s [category].[function] in JavaScript\",\n human: 'Ruby',\n packageType: 'module',\n inspiration_urls: ['<a href=\"https://ruby-doc.org/core-2.2.2/Math.html\">the Ruby core documentation</a>'],\n function_description_template:\n 'Here’s what our current JavaScript equivalent to <a href=\"https://ruby-doc.org/core-2.2.2/[category].html#method-c-[function]\">[language]\\'s [category].[function]</a> looks like.',\n },\n php: {\n order: 5,\n function_title_template: \"[language]'s [function] in JavaScript\",\n human: 'PHP',\n packageType: 'extension',\n inspiration_urls: [\n '<a href=\"https://php.net/manual/en/book.strings.php\">the PHP string documentation</a>',\n '<a href=\"https://github.com/php/php-src/blob/master/ext/standard/string.c#L5338\">the PHP string source</a>',\n '<a href=\"https://github.com/php/php-src/blob/master/ext/standard/tests/strings/str_pad_variation1.phpt\">a PHP str_pad test</a>',\n ],\n function_description_template:\n 'Here’s what our current JavaScript equivalent to <a href=\"https://php.net/manual/en/function.[functiondashed].php\">[language]\\'s [function]</a> looks like.',\n alias: [\n '/categories/',\n '/categories/array/',\n '/categories/bc/',\n '/categories/ctype/',\n '/categories/datetime/',\n '/categories/exec/',\n '/categories/filesystem/',\n '/categories/funchand/',\n '/categories/i18n/',\n '/categories/index/',\n '/categories/info/',\n '/categories/json/',\n '/categories/math/',\n '/categories/misc/',\n '/categories/net/',\n '/categories/network/',\n '/categories/pcre/',\n '/categories/strings/',\n '/categories/url/',\n '/categories/var/',\n '/categories/xdiff/',\n '/categories/xml/',\n '/functions/index/',\n '/functions/',\n '/packages/',\n '/packages/index/',\n ],\n },\n }\n\n this.allowSkip = argv.indexOf('--noskip') === -1\n\n this._reindexBuffer = {}\n this._injectwebBuffer = {}\n }\n\n injectweb(cb) {\n const self = this\n this._runFunctionOnAll(this._injectwebOne, function (err) {\n if (err) {\n return cb(err)\n }\n for (const indexHtml in self._injectwebBuffer) {\n debug('writing: ' + indexHtml)\n fs.writeFileSync(indexHtml, self._injectwebBuffer[indexHtml], 'utf-8')\n }\n })\n }\n\n reindex(cb) {\n const self = this\n self._reindexBuffer = {}\n self._runFunctionOnAll(self._reindexOne, function (err) {\n if (err) {\n return cb(err)\n }\n for (const indexJs in self._reindexBuffer) {\n const requires = self._reindexBuffer[indexJs]\n requires.sort()\n debug('writing: ' + indexJs)\n fs.writeFileSync(indexJs, requires.join('\\n') + '\\n', 'utf-8')\n }\n })\n }\n\n writetests(cb) {\n this._runFunctionOnAll(this._writetestOne, cb)\n }\n\n _runFunctionOnAll(runFunc, cb) {\n const self = this\n\n const q = async.queue(function (fullpath, callback) {\n self._load.bind(self, fullpath, {}, function (err, params) {\n if (err) {\n return callback(err)\n }\n\n runFunc.bind(self, params, callback)()\n })()\n }, self.concurrency)\n\n debug({\n pattern: self.pattern,\n })\n const files = globby.sync(self.pattern)\n\n q.push(files)\n\n q.drain = cb\n }\n\n _reindexOne(params, cb) {\n const fullpath = this.__src + '/' + params.filepath\n const dir = path.dirname(fullpath)\n const basefile = path.basename(fullpath, '.js')\n const indexJs = dir + '/index.js'\n\n let module = basefile\n if (basefile === 'Index2') {\n module = 'Index'\n }\n\n if (!this._reindexBuffer[indexJs]) {\n this._reindexBuffer[indexJs] = []\n }\n\n const line = 'module.exports.' + module + \" = require('./\" + basefile + \"')\"\n this._reindexBuffer[indexJs].push(line)\n return cb(null)\n }\n\n _injectwebOne(params, cb) {\n const authors = {}\n this.authorKeys.forEach(function (key) {\n if (params.headKeys[key]) {\n authors[key] = _.flattenDeep(params.headKeys[key])\n }\n })\n\n const langPath = [this.__root, '/website/source/', params.language].join('')\n\n const langIndexPath = langPath + '/index.html'\n const catPath = langPath + '/' + params.category\n const catIndexPath = catPath + '/' + 'index.html'\n const funcPath = catPath + '/' + params.func_name + '.html'\n\n if (!this._injectwebBuffer[langIndexPath]) {\n let langTitle = ''\n langTitle += this.langDefaults[params.language].human + ' '\n langTitle += this.langDefaults[params.language].packageType + 's '\n langTitle += ' in JavaScript'\n\n const langData = Object.assign({}, this.langDefaults[params.language], {\n warning: 'This file is auto generated by `npm run web:inject`, do not edit by hand',\n type: 'language',\n layout: 'language',\n language: params.language,\n title: langTitle,\n })\n this._injectwebBuffer[langIndexPath] = '---' + '\\n' + YAML.safeDump(langData).trim() + '\\n' + '---' + '\\n'\n }\n\n if (!this._injectwebBuffer[catIndexPath]) {\n let catTitle = ''\n catTitle += this.langDefaults[params.language].human + \"'s \"\n catTitle += params.category + ' '\n catTitle += this.langDefaults[params.language].packageType + ' '\n catTitle += ' in JavaScript'\n\n const catData = {\n warning: 'This file is auto generated by `npm run web:inject`, do not edit by hand',\n type: 'category',\n layout: 'category',\n language: params.language,\n category: params.category,\n title: catTitle,\n }\n this._injectwebBuffer[catIndexPath] = '---' + '\\n' + YAML.safeDump(catData).trim() + '\\n' + '---' + '\\n'\n }\n\n const functionTitle = this.langDefaults[params.language].function_title_template\n .replace(/\\[language]/g, this.langDefaults[params.language].human)\n .replace(/\\[category]/g, params.category)\n .replace(/\\[function]/g, params.func_name)\n .replace(/\\[functiondashed]/g, params.func_name.replace(/_/g, '-'))\n\n const functionDescription = this.langDefaults[params.language].function_description_template\n .replace(/\\[language]/g, this.langDefaults[params.language].human)\n .replace(/\\[category]/g, params.category)\n .replace(/\\[function]/g, params.func_name)\n .replace(/\\[functiondashed]/g, params.func_name.replace(/_/g, '-'))\n\n const funcData = {\n warning: 'This file is auto generated by `npm run web:inject`, do not edit by hand',\n examples: (params.headKeys.example || []).map(function (lines, i) {\n return lines.join('\\n')\n }),\n returns: (params.headKeys.returns || []).map(function (lines, i) {\n return lines.join('\\n')\n }),\n dependencies: [],\n authors: authors || {},\n notes: (params.headKeys.note || []).map(function (lines, i) {\n return lines.join('\\n')\n }),\n type: 'function',\n layout: 'function',\n title: functionTitle,\n description: functionDescription,\n function: params.func_name,\n category: params.category,\n language: params.language,\n permalink: params.language + '/' + params.category + '/' + params.func_name + '/',\n alias: [\n '/functions/' + params.language + '/' + params.func_name + '/',\n '/functions/' + params.category + '/' + params.func_name + '/',\n '/' + params.language + '/' + params.func_name + '/',\n ],\n }\n\n if (params.language === 'php') {\n funcData.alias.push('/functions/' + params.func_name + '/')\n }\n\n let buf = '---' + '\\n' + YAML.safeDump(funcData).trim() + '\\n' + '---' + '\\n'\n\n buf += `{% codeblock lang:javascript %}${params.code}{% endcodeblock %}`\n\n mkdirp(path.dirname(funcPath)).then(\n function () {\n fs.writeFile(funcPath, buf, 'utf-8', cb)\n },\n function (err) {\n throw new Error('Could not mkdir for ' + funcPath + '. ' + err)\n },\n )\n }\n\n _addRequire(name, relativeSrcForTest) {\n return [\n 'var ',\n name,\n \" = require('\",\n relativeSrcForTest,\n \"') // eslint-disable-line no-unused-vars,camelcase\",\n ].join('')\n }\n\n _writetestOne(params, cb) {\n const self = this\n\n if (!params.func_name) {\n throw new Error('No func_name in ' + JSON.stringify(params))\n }\n if (!params.headKeys) {\n throw new Error('No headKeys in ' + params.func_name)\n }\n if (!params.headKeys.example) {\n throw new Error('No example in ' + params.func_name)\n }\n\n const basename = path.basename(params.filepath)\n const subdir = path.dirname(params.filepath)\n const testpath = this.__test + '/languages/' + subdir + '/test-' + basename\n const testdir = path.dirname(testpath)\n const relativeSrcForTestDir = path.relative(testdir, self.__src)\n const relativeTestFileForRoot = path.relative(self.__root, testpath)\n\n // console.log(relativeSrcForTestDir)\n // process.exit(1)\n\n let testProps = ''\n if (params.headKeys.test) {\n testProps = params.headKeys.test[0][0]\n }\n\n let describeSkip = ''\n if (self.allowSkip && testProps.indexOf('skip-all') !== -1) {\n describeSkip = '.skip'\n }\n\n const codez = []\n\n codez.push('// warning: This file is auto generated by `npm run build:tests`')\n codez.push('// Do not edit by hand!')\n\n // Add globals\n for (const global in self.globals) {\n codez.push('var ' + global + ' = ' + self.globals[global])\n }\n\n // Set timezone for testing dates\n // Not ideal: https://stackoverflow.com/questions/8083410/how-to-set-default-timezone-in-node-js\n codez.push(\"process.env.TZ = 'UTC'\")\n\n codez.push('var ' + 'expect' + \" = require('chai').expect\")\n\n // Add language-wide dependencies\n // @todo: It would be great if we could remove this\n if (params.language === 'php') {\n codez.push(self._addRequire('ini_set', relativeSrcForTestDir + '/' + 'php/info/ini_set'))\n codez.push(self._addRequire('ini_get', relativeSrcForTestDir + '/' + 'php/info/ini_get'))\n if (params.func_name === 'localeconv') {\n codez.push(self._addRequire('setlocale', relativeSrcForTestDir + '/' + 'php/strings/setlocale'))\n }\n if (params.func_name === 'i18n_loc_get_default') {\n codez.push(\n self._addRequire('i18n_loc_set_default', relativeSrcForTestDir + '/' + 'php/i18n/i18n_loc_set_default'),\n )\n }\n }\n\n // Add the main function to test\n codez.push(self._addRequire(params.func_name, relativeSrcForTestDir + '/' + params.filepath))\n\n codez.push('')\n\n codez.push(\n [\n 'describe',\n describeSkip,\n \"('src/\",\n params.filepath,\n ' (tested in ',\n relativeTestFileForRoot,\n \")', function () {\",\n ].join(''),\n )\n\n // Run each example\n for (const i in params.headKeys.example) {\n if (!params.headKeys.returns[i] || !params.headKeys.returns[i].length) {\n throw new Error('There is no return for example ' + i, test, params)\n }\n\n const humanIndex = parseInt(i, 10) + 1\n let itSkip = ''\n if (self.allowSkip && testProps.indexOf('skip-' + humanIndex) !== -1) {\n itSkip = '.skip'\n }\n\n codez.push([' it', itSkip, \"('should pass example \", humanIndex, \"', function (done) {\"].join(''))\n\n const body = []\n\n const testExpected = params.headKeys.returns[i].join('\\n')\n\n body.push('var expected = ' + testExpected)\n\n // Execute line by line (see date.js why)\n // We need result be the last result of the example code\n for (const j in params.headKeys.example[i]) {\n if (parseInt(j, 10) === params.headKeys.example[i].length - 1) {\n // last action gets saved\n body.push('var result = ' + params.headKeys.example[i][j].replace('var $result = ', ''))\n } else {\n body.push(params.headKeys.example[i][j])\n }\n }\n\n body.push('expect(result).to.deep.equal(expected)')\n body.push('done()')\n\n codez.push(indentString(body.join('\\n'), ' ', 4))\n\n codez.push(' })')\n }\n\n codez.push('})')\n codez.push('')\n\n const code = codez.join('\\n')\n\n // Write to disk\n mkdirp(testdir).then(\n function () {\n debug('writing: ' + testpath)\n fs.writeFile(testpath, code, 'utf-8', cb)\n },\n function (err) {\n throw new Error(err)\n },\n )\n }\n\n // Environment-specific file opener. function name needs to\n // be translated to code. The difficulty is in finding the\n // category.\n _opener(fileOrName, requesterParams, cb) {\n const self = this\n let pattern\n\n const language = requesterParams.language || '*'\n\n if (path.basename(fileOrName, '.js').indexOf('.') !== -1) {\n // periods in the basename, like: unicode.utf8.RuneCountInString or strings.sprintf\n pattern = self.__src + '/' + language + '/' + fileOrName.replace(/\\./g, '/') + '.js'\n } else if (fileOrName.indexOf('/') === -1) {\n // no slashes, like: sprintf\n pattern = self.__src + '/' + language + '/*/' + fileOrName + '.js'\n } else if (fileOrName.substr(0, 1) === '/') {\n // absolute path, like: /Users/john/code/locutus/php/strings/sprintf.js\n pattern = fileOrName\n } else {\n // relative path, like: php/strings/sprintf.js\n pattern = self.__src + '/' + fileOrName\n }\n\n pattern = pattern.replace('golang/strings/Index.js', 'golang/strings/Index2.js')\n debug('loading: ' + pattern)\n const files = globby.sync(pattern, {})\n\n if (files.length !== 1) {\n const msg = `Found ${files.length} occurances of ${fileOrName} via pattern: ${pattern}`\n return cb(new Error(msg))\n }\n\n const filepath = files[0]\n\n if (path.basename(filepath) === 'index.js') {\n return cb(null)\n }\n\n if (!filepath) {\n return cb(new Error('Could not find ' + pattern))\n }\n\n fs.readFile(filepath, 'utf-8', function (err, code) {\n if (err) {\n return cb(new Error('Error while opening ' + filepath + '. ' + err))\n }\n return cb(null, filepath, code)\n })\n }\n\n _load(fileOrName, requesterParams, cb) {\n const self = this\n self._opener(fileOrName, requesterParams, function (err, fullpath, code) {\n if (err) {\n return cb(err)\n }\n\n const filepath = path.relative(self.__src, fullpath)\n self._parse(filepath, code, cb)\n })\n }\n\n _findDependencies(fileOrName, requesterParams, dependencies, cb) {\n const self = this\n\n if (!requesterParams.headKeys['depends on'] || !requesterParams.headKeys['depends on'].length) {\n if (cb) {\n cb(null, {})\n }\n return\n }\n\n let i\n let depCodePath\n let loaded = 0\n for (i in requesterParams.headKeys['depends on']) {\n depCodePath = requesterParams.headKeys['depends on'][i][0]\n\n self._load(depCodePath, requesterParams, function (err, params) {\n if (err) {\n return cb(err)\n }\n\n dependencies[depCodePath] = params\n self._findDependencies(depCodePath, params, dependencies)\n\n if (cb && ++loaded === requesterParams.headKeys['depends on'].length) {\n cb(null, dependencies)\n }\n })\n }\n }\n\n _parse(filepath, code, cb) {\n if (!code) {\n return cb(new Error('Unable to parse ' + filepath + '. Received no code'))\n }\n\n if (filepath.indexOf('/') === -1) {\n return cb(new Error(\"Parse only accepts relative filepaths. Received: '\" + filepath + \"'\"))\n }\n\n const parts = filepath.split('/')\n const language = parts.shift()\n const codepath = parts.join('.')\n const name = parts.pop()\n const category = parts.join('.')\n\n const ast = esprima.parseScript(code, { comment: true, loc: true, range: true })\n\n // find module.exports in the code\n const moduleExports = ast.body.filter((node) => {\n try {\n const leftArg = node.expression.left\n const rightArg = node.expression.right\n\n return (\n leftArg.object.name === 'module' &&\n leftArg.property.name === 'exports' &&\n rightArg.type === 'FunctionExpression' &&\n rightArg.id.type === 'Identifier' &&\n !!rightArg.id.name\n )\n } catch (err) {\n return false\n }\n })\n\n // if file contains more than one export, fail\n if (moduleExports.length !== 1) {\n return cb(Error(`File ${filepath} is allowed to contain exactly one module.exports`))\n }\n\n // get the only export\n const exp = moduleExports[0]\n\n // look for function name and param list\n const funcName = exp.expression.right.id.name\n const funcParams = exp.expression.right.params.map((p) => p.name)\n\n // remember the lines where the function is defined\n const funcLoc = exp.expression.right.loc\n\n // since comments are not included in the AST\n // but are offered in ast.comments\n // remember the location of first function body statement/expression\n const firstFuncBodyElementLoc = exp.expression.right.body.body[0].loc\n\n // get all line comments which are located between function signature definition\n // and first function body element\n const headComments = ast.comments\n .filter(\n (c) =>\n c.type === 'Line' &&\n c.loc.start.line >= funcLoc.start.line &&\n c.loc.end.line <= firstFuncBodyElementLoc.start.line,\n )\n .map((c) => c.value.trim())\n\n if (headComments.length === 0) {\n const msg = `Unable to parse ${filepath}. Did not find any comments in function definition`\n return cb(new Error(msg))\n }\n\n const headKeys = this._headKeys(headComments)\n\n const params = {\n headKeys,\n name,\n filepath,\n codepath,\n code,\n language,\n category,\n func_name: funcName,\n func_arguments: funcParams,\n }\n\n this._findDependencies(filepath, params, {}, function (err, dependencies) {\n if (err) {\n return cb(err)\n }\n\n params.dependencies = dependencies\n return cb(null, params)\n })\n }\n\n _headKeys(headLines) {\n let i\n const keys = {}\n let match = []\n let dmatch = []\n let key = ''\n let val = ''\n let num = 0\n\n for (i in headLines) {\n if (!(match = headLines[i].match(/^\\s*\\W?\\s*([a-z 0-9]+)\\s*:\\s*(.*)\\s*$/))) {\n continue\n }\n key = match[1]\n val = match[2]\n\n if ((dmatch = key.match(/^(\\w+)\\s+(\\d+)$/))) {\n // Things like examples and notes can be grouped\n key = dmatch[1]\n num = dmatch[2] - 1\n } else {\n num = 0\n }\n\n if (!keys[key]) {\n keys[key] = []\n }\n if (!keys[key][num]) {\n keys[key][num] = []\n }\n keys[key][num].push(val)\n }\n\n return keys\n }\n}\n\nmodule.exports = Util\n"]}
1
+ {"version":3,"sources":["../../src/_util/util.js"],"names":["globby","require","path","fs","fsPromises","promises","async","YAML","debug","indentString","_","esprima","Util","argv","__src","dirname","__dirname","__root","__test","globals","pattern","concurrency","authorKeys","langDefaults","c","order","function_title_template","human","packageType","inspiration_urls","function_description_template","golang","python","ruby","php","alias","allowSkip","indexOf","_reindexBuffer","_injectwebBuffer","cb","self","_runFunctionOnAll","_injectwebOne","err","indexHtml","writeFileSync","_reindexOne","indexJs","requires","sort","join","_writetestOne","runFunc","q","queue","fullpath","callback","_load","bind","params","files","sync","push","drain","filepath","dir","basefile","basename","module","line","authors","forEach","key","headKeys","flattenDeep","langPath","language","langIndexPath","catPath","category","catIndexPath","funcPath","func_name","langTitle","langData","Object","assign","warning","type","layout","title","dump","trim","catTitle","catData","functionTitle","replace","functionDescription","funcData","examples","example","map","lines","i","returns","dependencies","notes","note","description","function","permalink","buf","code","mkdir","recursive","then","writeFile","Error","name","relativeSrcForTest","JSON","stringify","subdir","testpath","testdir","relativeSrcForTestDir","relative","relativeTestFileForRoot","testProps","test","describeSkip","codez","global","_addRequire","length","humanIndex","parseInt","itSkip","body","testExpected","j","fileOrName","requesterParams","substr","msg","readFile","_opener","_parse","depCodePath","loaded","_findDependencies","parts","split","shift","codepath","pop","ast","parseScript","comment","loc","range","moduleExports","filter","node","leftArg","expression","left","rightArg","right","object","property","id","exp","funcName","funcParams","p","funcLoc","firstFuncBodyElementLoc","headComments","comments","start","end","value","_headKeys","func_arguments","headLines","keys","match","dmatch","val","num","exports"],"mappings":"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","file":"util.js","sourcesContent":["const globby = require('globby')\nconst path = require('path')\nconst fs = require('fs')\nconst fsPromises = fs.promises\nconst async = require('async')\nconst YAML = require('js-yaml')\nconst debug = require('debug')('locutus:utils')\nconst indentString = require('indent-string')\nconst _ = require('lodash')\nconst esprima = require('esprima')\n\nclass Util {\n constructor(argv) {\n if (!argv) {\n argv = []\n }\n this.__src = path.dirname(__dirname)\n this.__root = path.dirname(path.dirname(__dirname))\n this.__test = path.dirname(path.dirname(__dirname)) + '/test'\n\n this.globals = {}\n\n this.pattern = [this.__src + '/**/**/*.js', '!**/index.js', '!**/_util/**']\n this.concurrency = 8\n this.authorKeys = [\n 'original by',\n 'improved by',\n 'reimplemented by',\n 'parts by',\n 'bugfixed by',\n 'revised by',\n 'input by',\n ]\n\n this.langDefaults = {\n c: {\n order: 1,\n function_title_template: \"[language]'s [category].[function] in JavaScript\",\n human: 'C',\n packageType: 'header file',\n inspiration_urls: [\n '<a href=\"https://en.cppreference.com/w/c/numeric/math\">the C math.h documentation</a>',\n '<a href=\"https://sourceware.org/git/?p=glibc.git;a=tree;f=math;hb=HEAD\">the C math.h source</a>',\n ],\n function_description_template:\n 'Here’s what our current JavaScript equivalent to <a href=\"https://en.cppreference.com/w/c/numeric/[category]/[function]\">[language]\\'s [function] found in the [category].h header file</a> looks like.',\n },\n golang: {\n order: 2,\n function_title_template: \"[language]'s [category].[function] in JavaScript\",\n human: 'Go',\n packageType: 'package',\n inspiration_urls: [\n '<a href=\"https://golang.org/pkg/strings/\">Go strings documentation</a>',\n '<a href=\"https://golang.org/src/strings/strings.go\">Go strings source</a>',\n '<a href=\"https://golang.org/src/strings/example_test.go\">Go strings examples source</a>',\n '<a href=\"https://gophersjs.com\">GopherJS</a>',\n ],\n function_description_template:\n 'Here’s what our current JavaScript equivalent to <a href=\"https://golang.org/pkg/[category]/#[function]\">[language]\\'s [category].[function]</a> looks like.',\n },\n python: {\n order: 3,\n function_title_template: \"[language]'s [category].[function] in JavaScript\",\n human: 'Python',\n packageType: 'module',\n inspiration_urls: [\n '<a href=\"https://docs.python.org/3/library/string.html\">the Python 3 standard library string page</a>',\n ],\n function_description_template:\n 'Here’s what our current JavaScript equivalent to <a href=\"https://docs.python.org/3/library/[category].html#[category].[function]\">[language]\\'s [category].[function]</a> looks like.',\n },\n ruby: {\n order: 4,\n function_title_template: \"[language]'s [category].[function] in JavaScript\",\n human: 'Ruby',\n packageType: 'module',\n inspiration_urls: ['<a href=\"https://ruby-doc.org/core-2.2.2/Math.html\">the Ruby core documentation</a>'],\n function_description_template:\n 'Here’s what our current JavaScript equivalent to <a href=\"https://ruby-doc.org/core-2.2.2/[category].html#method-c-[function]\">[language]\\'s [category].[function]</a> looks like.',\n },\n php: {\n order: 5,\n function_title_template: \"[language]'s [function] in JavaScript\",\n human: 'PHP',\n packageType: 'extension',\n inspiration_urls: [\n '<a href=\"https://php.net/manual/en/book.strings.php\">the PHP string documentation</a>',\n '<a href=\"https://github.com/php/php-src/blob/master/ext/standard/string.c#L5338\">the PHP string source</a>',\n '<a href=\"https://github.com/php/php-src/blob/master/ext/standard/tests/strings/str_pad_variation1.phpt\">a PHP str_pad test</a>',\n ],\n function_description_template:\n 'Here’s what our current JavaScript equivalent to <a href=\"https://php.net/manual/en/function.[functiondashed].php\">[language]\\'s [function]</a> looks like.',\n alias: [\n '/categories/',\n '/categories/array/',\n '/categories/bc/',\n '/categories/ctype/',\n '/categories/datetime/',\n '/categories/exec/',\n '/categories/filesystem/',\n '/categories/funchand/',\n '/categories/i18n/',\n '/categories/index/',\n '/categories/info/',\n '/categories/json/',\n '/categories/math/',\n '/categories/misc/',\n '/categories/net/',\n '/categories/network/',\n '/categories/pcre/',\n '/categories/strings/',\n '/categories/url/',\n '/categories/var/',\n '/categories/xdiff/',\n '/categories/xml/',\n '/functions/index/',\n '/functions/',\n '/packages/',\n '/packages/index/',\n ],\n },\n }\n\n this.allowSkip = argv.indexOf('--noskip') === -1\n\n this._reindexBuffer = {}\n this._injectwebBuffer = {}\n }\n\n injectweb(cb) {\n const self = this\n this._runFunctionOnAll(this._injectwebOne, function (err) {\n if (err) {\n return cb(err)\n }\n for (const indexHtml in self._injectwebBuffer) {\n debug('writing: ' + indexHtml)\n fs.writeFileSync(indexHtml, self._injectwebBuffer[indexHtml], 'utf-8')\n }\n })\n }\n\n reindex(cb) {\n const self = this\n self._reindexBuffer = {}\n self._runFunctionOnAll(self._reindexOne, function (err) {\n if (err) {\n return cb(err)\n }\n for (const indexJs in self._reindexBuffer) {\n const requires = self._reindexBuffer[indexJs]\n requires.sort()\n debug('writing: ' + indexJs)\n fs.writeFileSync(indexJs, requires.join('\\n') + '\\n', 'utf-8')\n }\n })\n }\n\n writetests(cb) {\n this._runFunctionOnAll(this._writetestOne, cb)\n }\n\n _runFunctionOnAll(runFunc, cb) {\n const self = this\n\n const q = async.queue(function (fullpath, callback) {\n self._load.bind(self, fullpath, {}, function (err, params) {\n if (err) {\n return callback(err)\n }\n\n runFunc.bind(self, params, callback)()\n })()\n }, self.concurrency)\n\n debug({\n pattern: self.pattern,\n })\n const files = globby.sync(self.pattern)\n\n q.push(files)\n\n q.drain = cb\n }\n\n _reindexOne(params, cb) {\n const fullpath = this.__src + '/' + params.filepath\n const dir = path.dirname(fullpath)\n const basefile = path.basename(fullpath, '.js')\n const indexJs = dir + '/index.js'\n\n let module = basefile\n if (basefile === 'Index2') {\n module = 'Index'\n }\n\n if (!this._reindexBuffer[indexJs]) {\n this._reindexBuffer[indexJs] = []\n }\n\n const line = 'module.exports.' + module + \" = require('./\" + basefile + \"')\"\n this._reindexBuffer[indexJs].push(line)\n return cb(null)\n }\n\n _injectwebOne(params, cb) {\n const authors = {}\n this.authorKeys.forEach(function (key) {\n if (params.headKeys[key]) {\n authors[key] = _.flattenDeep(params.headKeys[key])\n }\n })\n\n const langPath = [this.__root, '/website/source/', params.language].join('')\n\n const langIndexPath = langPath + '/index.html'\n const catPath = langPath + '/' + params.category\n const catIndexPath = catPath + '/' + 'index.html'\n const funcPath = catPath + '/' + params.func_name + '.html'\n\n if (!this._injectwebBuffer[langIndexPath]) {\n let langTitle = ''\n langTitle += this.langDefaults[params.language].human + ' '\n langTitle += this.langDefaults[params.language].packageType + 's '\n langTitle += ' in JavaScript'\n\n const langData = Object.assign({}, this.langDefaults[params.language], {\n warning: 'This file is auto generated by `yarn web:inject`, do not edit by hand',\n type: 'language',\n layout: 'language',\n language: params.language,\n title: langTitle,\n })\n this._injectwebBuffer[langIndexPath] = '---' + '\\n' + YAML.dump(langData).trim() + '\\n' + '---' + '\\n'\n }\n\n if (!this._injectwebBuffer[catIndexPath]) {\n let catTitle = ''\n catTitle += this.langDefaults[params.language].human + \"'s \"\n catTitle += params.category + ' '\n catTitle += this.langDefaults[params.language].packageType + ' '\n catTitle += ' in JavaScript'\n\n const catData = {\n warning: 'This file is auto generated by `yarn web:inject`, do not edit by hand',\n type: 'category',\n layout: 'category',\n language: params.language,\n category: params.category,\n title: catTitle,\n }\n this._injectwebBuffer[catIndexPath] = '---' + '\\n' + YAML.dump(catData).trim() + '\\n' + '---' + '\\n'\n }\n\n const functionTitle = this.langDefaults[params.language].function_title_template\n .replace(/\\[language]/g, this.langDefaults[params.language].human)\n .replace(/\\[category]/g, params.category)\n .replace(/\\[function]/g, params.func_name)\n .replace(/\\[functiondashed]/g, params.func_name.replace(/_/g, '-'))\n\n const functionDescription = this.langDefaults[params.language].function_description_template\n .replace(/\\[language]/g, this.langDefaults[params.language].human)\n .replace(/\\[category]/g, params.category)\n .replace(/\\[function]/g, params.func_name)\n .replace(/\\[functiondashed]/g, params.func_name.replace(/_/g, '-'))\n\n const funcData = {\n warning: 'This file is auto generated by `yarn web:inject`, do not edit by hand',\n examples: (params.headKeys.example || []).map(function (lines, i) {\n return lines.join('\\n')\n }),\n returns: (params.headKeys.returns || []).map(function (lines, i) {\n return lines.join('\\n')\n }),\n dependencies: [],\n authors: authors || {},\n notes: (params.headKeys.note || []).map(function (lines, i) {\n return lines.join('\\n')\n }),\n type: 'function',\n layout: 'function',\n title: functionTitle,\n description: functionDescription,\n function: params.func_name,\n category: params.category,\n language: params.language,\n permalink: params.language + '/' + params.category + '/' + params.func_name + '/',\n alias: [\n '/functions/' + params.language + '/' + params.func_name + '/',\n '/functions/' + params.category + '/' + params.func_name + '/',\n '/' + params.language + '/' + params.func_name + '/',\n ],\n }\n\n if (params.language === 'php') {\n funcData.alias.push('/functions/' + params.func_name + '/')\n }\n\n let buf = '---' + '\\n' + YAML.dump(funcData).trim() + '\\n' + '---' + '\\n'\n\n buf += `{% codeblock lang:javascript %}${params.code}{% endcodeblock %}`\n\n fsPromises.mkdir(path.dirname(funcPath), { recursive: true }).then(\n function () {\n fs.writeFile(funcPath, buf, 'utf-8', cb)\n },\n function (err) {\n throw new Error('Could not mkdir for ' + funcPath + '. ' + err)\n },\n )\n }\n\n _addRequire(name, relativeSrcForTest) {\n return [\n 'var ',\n name,\n \" = require('\",\n relativeSrcForTest,\n \"') // eslint-disable-line no-unused-vars,camelcase\",\n ].join('')\n }\n\n _writetestOne(params, cb) {\n const self = this\n\n if (!params.func_name) {\n throw new Error('No func_name in ' + JSON.stringify(params))\n }\n if (!params.headKeys) {\n throw new Error('No headKeys in ' + params.func_name)\n }\n if (!params.headKeys.example) {\n throw new Error('No example in ' + params.func_name)\n }\n\n const basename = path.basename(params.filepath)\n const subdir = path.dirname(params.filepath)\n const testpath = this.__test + '/generated/' + subdir + '/test-' + basename\n const testdir = path.dirname(testpath)\n const relativeSrcForTestDir = path.relative(testdir, self.__src)\n const relativeTestFileForRoot = path.relative(self.__root, testpath)\n\n // console.log(relativeSrcForTestDir)\n // process.exit(1)\n\n let testProps = ''\n if (params.headKeys.test) {\n testProps = params.headKeys.test[0][0]\n }\n\n let describeSkip = ''\n if (self.allowSkip && testProps.indexOf('skip-all') !== -1) {\n describeSkip = '.skip'\n }\n\n const codez = []\n\n codez.push('// warning: This file is auto generated by `yarn build:tests`')\n codez.push('// Do not edit by hand!')\n codez.push('')\n codez.push(`'use strict'`)\n codez.push('')\n\n // Add globals\n for (const global in self.globals) {\n codez.push('var ' + global + ' = ' + self.globals[global])\n }\n\n // Set timezone for testing dates\n // Not ideal: https://stackoverflow.com/questions/8083410/how-to-set-default-timezone-in-node-js\n codez.push(\"process.env.TZ = 'UTC'\")\n\n codez.push('var ' + 'expect' + \" = require('chai').expect\")\n\n // Add language-wide dependencies\n // @todo: It would be great if we could remove this\n if (params.language === 'php') {\n codez.push(self._addRequire('ini_set', relativeSrcForTestDir + '/' + 'php/info/ini_set'))\n codez.push(self._addRequire('ini_get', relativeSrcForTestDir + '/' + 'php/info/ini_get'))\n if (params.func_name === 'localeconv') {\n codez.push(self._addRequire('setlocale', relativeSrcForTestDir + '/' + 'php/strings/setlocale'))\n }\n if (params.func_name === 'i18n_loc_get_default') {\n codez.push(\n self._addRequire('i18n_loc_set_default', relativeSrcForTestDir + '/' + 'php/i18n/i18n_loc_set_default'),\n )\n }\n }\n\n // Add the main function to test\n codez.push(self._addRequire(params.func_name, relativeSrcForTestDir + '/' + params.filepath))\n\n codez.push('')\n\n codez.push(\n [\n 'describe',\n describeSkip,\n \"('src/\",\n params.filepath,\n ' (tested in ',\n relativeTestFileForRoot,\n \")', function () {\",\n ].join(''),\n )\n\n // Run each example\n for (const i in params.headKeys.example) {\n if (!params.headKeys.returns[i] || !params.headKeys.returns[i].length) {\n throw new Error('There is no return for example ' + i, test, params)\n }\n\n const humanIndex = parseInt(i, 10) + 1\n let itSkip = ''\n if (self.allowSkip && testProps.indexOf('skip-' + humanIndex) !== -1) {\n itSkip = '.skip'\n }\n\n codez.push([' it', itSkip, \"('should pass example \", humanIndex, \"', function (done) {\"].join(''))\n\n const body = []\n\n const testExpected = params.headKeys.returns[i].join('\\n')\n\n body.push('var expected = ' + testExpected)\n\n // Execute line by line (see date.js why)\n // We need result be the last result of the example code\n for (const j in params.headKeys.example[i]) {\n if (parseInt(j, 10) === params.headKeys.example[i].length - 1) {\n // last action gets saved\n body.push('var result = ' + params.headKeys.example[i][j].replace('var $result = ', ''))\n } else {\n body.push(params.headKeys.example[i][j])\n }\n }\n\n body.push('expect(result).to.deep.equal(expected)')\n body.push('done()')\n\n codez.push(indentString(body.join('\\n'), ' ', 4))\n\n codez.push(' })')\n }\n\n codez.push('})')\n codez.push('')\n\n const code = codez.join('\\n')\n\n // Write to disk\n fsPromises.mkdir(testdir, { recursive: true }).then(\n function () {\n debug('writing: ' + testpath)\n fs.writeFile(testpath, code, 'utf-8', cb)\n },\n function (err) {\n throw new Error(err)\n },\n )\n }\n\n // Environment-specific file opener. function name needs to\n // be translated to code. The difficulty is in finding the\n // category.\n _opener(fileOrName, requesterParams, cb) {\n const self = this\n let pattern\n\n const language = requesterParams.language || '*'\n\n if (path.basename(fileOrName, '.js').indexOf('.') !== -1) {\n // periods in the basename, like: unicode.utf8.RuneCountInString or strings.sprintf\n pattern = self.__src + '/' + language + '/' + fileOrName.replace(/\\./g, '/') + '.js'\n } else if (fileOrName.indexOf('/') === -1) {\n // no slashes, like: sprintf\n pattern = self.__src + '/' + language + '/*/' + fileOrName + '.js'\n } else if (fileOrName.substr(0, 1) === '/') {\n // absolute path, like: /Users/john/code/locutus/php/strings/sprintf.js\n pattern = fileOrName\n } else {\n // relative path, like: php/strings/sprintf.js\n pattern = self.__src + '/' + fileOrName\n }\n\n pattern = pattern.replace('golang/strings/Index.js', 'golang/strings/Index2.js')\n debug('loading: ' + pattern)\n const files = globby.sync(pattern, {})\n\n if (files.length !== 1) {\n const msg = `Found ${files.length} occurances of ${fileOrName} via pattern: ${pattern}`\n return cb(new Error(msg))\n }\n\n const filepath = files[0]\n\n if (path.basename(filepath) === 'index.js') {\n return cb(null)\n }\n\n if (!filepath) {\n return cb(new Error('Could not find ' + pattern))\n }\n\n fs.readFile(filepath, 'utf-8', function (err, code) {\n if (err) {\n return cb(new Error('Error while opening ' + filepath + '. ' + err))\n }\n return cb(null, filepath, code)\n })\n }\n\n _load(fileOrName, requesterParams, cb) {\n const self = this\n self._opener(fileOrName, requesterParams, function (err, fullpath, code) {\n if (err) {\n return cb(err)\n }\n\n const filepath = path.relative(self.__src, fullpath)\n self._parse(filepath, code, cb)\n })\n }\n\n _findDependencies(fileOrName, requesterParams, dependencies, cb) {\n const self = this\n\n if (!requesterParams.headKeys['depends on'] || !requesterParams.headKeys['depends on'].length) {\n if (cb) {\n cb(null, {})\n }\n return\n }\n\n let i\n let depCodePath\n let loaded = 0\n for (i in requesterParams.headKeys['depends on']) {\n depCodePath = requesterParams.headKeys['depends on'][i][0]\n\n self._load(depCodePath, requesterParams, function (err, params) {\n if (err) {\n return cb(err)\n }\n\n dependencies[depCodePath] = params\n self._findDependencies(depCodePath, params, dependencies)\n\n if (cb && ++loaded === requesterParams.headKeys['depends on'].length) {\n cb(null, dependencies)\n }\n })\n }\n }\n\n _parse(filepath, code, cb) {\n if (!code) {\n return cb(new Error('Unable to parse ' + filepath + '. Received no code'))\n }\n\n if (filepath.indexOf('/') === -1) {\n return cb(new Error(\"Parse only accepts relative filepaths. Received: '\" + filepath + \"'\"))\n }\n\n const parts = filepath.split('/')\n const language = parts.shift()\n const codepath = parts.join('.')\n const name = parts.pop()\n const category = parts.join('.')\n\n const ast = esprima.parseScript(code, { comment: true, loc: true, range: true })\n\n // find module.exports in the code\n const moduleExports = ast.body.filter((node) => {\n try {\n const leftArg = node.expression.left\n const rightArg = node.expression.right\n\n return (\n leftArg.object.name === 'module' &&\n leftArg.property.name === 'exports' &&\n rightArg.type === 'FunctionExpression' &&\n rightArg.id.type === 'Identifier' &&\n !!rightArg.id.name\n )\n } catch (err) {\n return false\n }\n })\n\n // if file contains more than one export, fail\n if (moduleExports.length !== 1) {\n return cb(Error(`File ${filepath} is allowed to contain exactly one module.exports`))\n }\n\n // get the only export\n const exp = moduleExports[0]\n\n // look for function name and param list\n const funcName = exp.expression.right.id.name\n const funcParams = exp.expression.right.params.map((p) => p.name)\n\n // remember the lines where the function is defined\n const funcLoc = exp.expression.right.loc\n\n // since comments are not included in the AST\n // but are offered in ast.comments\n // remember the location of first function body statement/expression\n const firstFuncBodyElementLoc = exp.expression.right.body.body[0].loc\n\n // get all line comments which are located between function signature definition\n // and first function body element\n const headComments = ast.comments\n .filter(\n (c) =>\n c.type === 'Line' &&\n c.loc.start.line >= funcLoc.start.line &&\n c.loc.end.line <= firstFuncBodyElementLoc.start.line,\n )\n .map((c) => c.value.trim())\n\n if (headComments.length === 0) {\n const msg = `Unable to parse ${filepath}. Did not find any comments in function definition`\n return cb(new Error(msg))\n }\n\n const headKeys = this._headKeys(headComments)\n\n const params = {\n headKeys,\n name,\n filepath,\n codepath,\n code,\n language,\n category,\n func_name: funcName,\n func_arguments: funcParams,\n }\n\n this._findDependencies(filepath, params, {}, function (err, dependencies) {\n if (err) {\n return cb(err)\n }\n\n params.dependencies = dependencies\n return cb(null, params)\n })\n }\n\n _headKeys(headLines) {\n let i\n const keys = {}\n let match = []\n let dmatch = []\n let key = ''\n let val = ''\n let num = 0\n\n for (i in headLines) {\n if (!(match = headLines[i].match(/^\\s*\\W?\\s*([a-z 0-9]+)\\s*:\\s*(.*)\\s*$/))) {\n continue\n }\n key = match[1]\n val = match[2]\n\n if ((dmatch = key.match(/^(\\w+)\\s+(\\d+)$/))) {\n // Things like examples and notes can be grouped\n key = dmatch[1]\n num = dmatch[2] - 1\n } else {\n num = 0\n }\n\n if (!keys[key]) {\n keys[key] = []\n }\n if (!keys[key][num]) {\n keys[key][num] = []\n }\n keys[key][num].push(val)\n }\n\n return keys\n }\n}\n\nmodule.exports = Util\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "locutus",
3
- "version": "2.0.29",
3
+ "version": "2.0.31",
4
4
  "description": "Locutus other languages' standard libraries to JavaScript for fun and educational purposes",
5
5
  "keywords": [
6
6
  "php",
@@ -30,21 +30,22 @@
30
30
  "browser:watch": "budo test/browser/app.js --live --serve test/browser/bundle.js",
31
31
  "build:dist": "babel src --out-dir dist --source-maps && cp package.json dist/",
32
32
  "build:indices": "babel-node src/_util/cli.js reindex",
33
- "build:tests:noskip": "rimraf test/languages && babel-node src/_util/cli.js writetests --noskip",
34
- "build:tests": "rimraf test/languages && babel-node src/_util/cli.js writetests",
33
+ "build:tests:noskip": "rimraf test/generated && babel-node src/_util/cli.js writetests --noskip",
34
+ "build:tests": "rimraf test/generated && babel-node src/_util/cli.js writetests",
35
35
  "build": "npm-run-all 'build:*'",
36
36
  "injectweb": "rimraf website/source/{c,golang,php,python,ruby} && babel-node src/_util/cli.js injectweb",
37
37
  "fix:js": "DEBUG=eslint:cli-engine eslint --fix --quiet --ext .js,.jsx,.ts,.tsx .",
38
38
  "fix:formatting": "env DEBUG=prettier prettier --write .",
39
+ "fix:markdown": "remark {README,CONTRIBUTING}.md --output && prettier --write {README,CONTRIBUTING}.md",
39
40
  "fix": "npm-run-all --serial 'fix:**'",
40
41
  "lint:formatting": "prettier --check .",
41
42
  "lint:js": "eslint --ext .js,.jsx,.ts,.tsx .",
42
43
  "lint": "npm-run-all --parallel 'lint:**'",
43
44
  "playground:start": "cd test/browser && babel-node server.js",
44
- "test:languages:noskip": "yarn build:tests:noskip && cross-env DEBUG='locutus:*' mocha --compilers js:babel-register --reporter spec --recursive test/languages --grep \"${TEST_GREP:-}\"",
45
- "test:languages": "yarn build:tests && cross-env DEBUG='locutus:*' mocha --compilers js:babel-register --reporter spec --recursive test/languages --grep \"${TEST_GREP:-}\"",
45
+ "test:languages:noskip": "yarn build:tests:noskip && cross-env DEBUG='locutus:*' mocha --require babel-register --reporter spec 'src/**/*.mocha.js' 'test/**/test-*.js'",
46
+ "test:languages": "yarn build:tests && cross-env DEBUG='locutus:*' mocha --require babel-register --reporter spec 'src/**/*.mocha.js' 'test/**/test-*.js'",
46
47
  "test:module": "babel-node test/module/module.js",
47
- "test:util": "mocha --compilers js:babel-register --reporter spec test/util/",
48
+ "test:util": "mocha --require babel-register --reporter spec test/util/",
48
49
  "test": "npm-run-all test:languages test:util test:module",
49
50
  "website:install": "cd website && yarn",
50
51
  "website:deploy": "cd website && yarn deploy",
@@ -66,10 +67,10 @@
66
67
  "babel-preset-es2015": "6.24.1",
67
68
  "babel-register": "6.26.0",
68
69
  "browserify": "17.0.0",
69
- "budo": "11.6.4",
70
- "chai": "3.5.0",
70
+ "budo": "11.8.4",
71
+ "chai": "4",
71
72
  "cross-env": "7.0.3",
72
- "depurar": "0.3.0",
73
+ "debug": "^4.3.4",
73
74
  "es6-promise": "4.2.8",
74
75
  "eslint": "8.57.0",
75
76
  "eslint-config-prettier": "^9.1.0",
@@ -82,19 +83,20 @@
82
83
  "esprima": "4.0.1",
83
84
  "globby": "4.1.0",
84
85
  "indent-string": "2.1.0",
85
- "js-yaml": "3.14.1",
86
+ "js-yaml": "4.1.0",
86
87
  "lodash": "4.17.21",
87
- "mkdirp": "1.0.4",
88
- "mocha": "5.2.0",
88
+ "mocha": "10.4.0",
89
89
  "npm-run-all": "^4.1.5",
90
90
  "prettier": "^3.2.5",
91
91
  "prettier-plugin-packagejson": "^2.4.14",
92
- "rimraf": "3.0.2"
92
+ "remark-cli": "^12.0.0",
93
+ "remark-toc": "^9.0.0",
94
+ "rimraf": "5.0.5"
93
95
  },
94
96
  "packageManager": "yarn@4.0.1+sha224.ca5d6f5a8aecd0801adc32f775675b01961bdc2383867d36f4732a0a",
95
97
  "engines": {
96
98
  "node": ">= 10",
97
- "yarn": "4.0.1"
99
+ "yarn": ">= 1"
98
100
  },
99
101
  "readmeFilename": "README.md"
100
102
  }
@@ -17,6 +17,8 @@ module.exports = function array_multisort(arr) {
17
17
  // example 3: var $president = [ 39, 6, 5, 10, 4, 35, 2 ]
18
18
  // example 3: array_multisort($firstnames, 'SORT_DESC', 'SORT_STRING', $lastnames, 'SORT_ASC', 'SORT_STRING', $president, 'SORT_NUMERIC')
19
19
  // returns 3: true
20
+ // example 4: array_multisort(["productIds[]", "_"], 'SORT_ASC', ["productIds[]=977385529", "_=1502965788347"])
21
+ // returns 4: true
20
22
  // note 1: flags: Translation table for sort arguments.
21
23
  // note 1: Each argument turns on certain bits in the flag byte through addition.
22
24
  // note 1: bits: HGFE DCBA
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/php/array/array_multisort.js"],"names":["module","exports","array_multisort","arr","g","i","j","k","l","sal","vkey","elIndex","lastSorts","tmpArray","zlast","sortFlag","thingsToSort","nLastSort","lastSort","args","arguments","flags","SORT_REGULAR","SORT_NUMERIC","SORT_STRING","SORT_ASC","SORT_DESC","sortDuplicator","a","b","shift","sortFunctions","push","sortArrs","sortKeys","Object","prototype","toString","call","hasOwnProperty","arrMainLength","length","sortComponents","argl","lFlag","pop","splice","sFunction","slice","sort","concat"],"mappings":"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","file":"array_multisort.js","sourcesContent":["module.exports = function array_multisort(arr) {\n // discuss at: https://locutus.io/php/array_multisort/\n // original by: Theriault (https://github.com/Theriault)\n // improved by: Oleg Andreyev (https://github.com/oleg-andreyev)\n // example 1: array_multisort([1, 2, 1, 2, 1, 2], [1, 2, 3, 4, 5, 6])\n // returns 1: true\n // example 2: var $characters = {A: 'Edward', B: 'Locke', C: 'Sabin', D: 'Terra', E: 'Edward'}\n // example 2: var $jobs = {A: 'Warrior', B: 'Thief', C: 'Monk', D: 'Mage', E: 'Knight'}\n // example 2: array_multisort($characters, 'SORT_DESC', 'SORT_STRING', $jobs, 'SORT_ASC', 'SORT_STRING')\n // returns 2: true\n // example 3: var $lastnames = [ 'Carter','Adams','Monroe','Tyler','Madison','Kennedy','Adams']\n // example 3: var $firstnames = ['James', 'John' ,'James', 'John', 'James', 'John', 'John']\n // example 3: var $president = [ 39, 6, 5, 10, 4, 35, 2 ]\n // example 3: array_multisort($firstnames, 'SORT_DESC', 'SORT_STRING', $lastnames, 'SORT_ASC', 'SORT_STRING', $president, 'SORT_NUMERIC')\n // returns 3: true\n // note 1: flags: Translation table for sort arguments.\n // note 1: Each argument turns on certain bits in the flag byte through addition.\n // note 1: bits: HGFE DCBA\n // note 1: args: Holds pointer to arguments for reassignment\n\n let g\n let i\n let j\n let k\n let l\n let sal\n let vkey\n let elIndex\n let lastSorts\n let tmpArray\n let zlast\n\n const sortFlag = [0]\n const thingsToSort = []\n let nLastSort = []\n let lastSort = []\n // possibly redundant\n const args = arguments\n\n const flags = {\n SORT_REGULAR: 16,\n SORT_NUMERIC: 17,\n SORT_STRING: 18,\n SORT_ASC: 32,\n SORT_DESC: 40,\n }\n\n const sortDuplicator = function (a, b) {\n return nLastSort.shift()\n }\n\n const sortFunctions = [\n [\n function (a, b) {\n lastSort.push(a > b ? 1 : a < b ? -1 : 0)\n return a > b ? 1 : a < b ? -1 : 0\n },\n function (a, b) {\n lastSort.push(b > a ? 1 : b < a ? -1 : 0)\n return b > a ? 1 : b < a ? -1 : 0\n },\n ],\n [\n function (a, b) {\n lastSort.push(a - b)\n return a - b\n },\n function (a, b) {\n lastSort.push(b - a)\n return b - a\n },\n ],\n [\n function (a, b) {\n lastSort.push(a + '' > b + '' ? 1 : a + '' < b + '' ? -1 : 0)\n return a + '' > b + '' ? 1 : a + '' < b + '' ? -1 : 0\n },\n function (a, b) {\n lastSort.push(b + '' > a + '' ? 1 : b + '' < a + '' ? -1 : 0)\n return b + '' > a + '' ? 1 : b + '' < a + '' ? -1 : 0\n },\n ],\n ]\n\n const sortArrs = [[]]\n\n const sortKeys = [[]]\n\n // Store first argument into sortArrs and sortKeys if an Object.\n // First Argument should be either a Javascript Array or an Object,\n // otherwise function would return FALSE like in PHP\n if (Object.prototype.toString.call(arr) === '[object Array]') {\n sortArrs[0] = arr\n } else if (arr && typeof arr === 'object') {\n for (i in arr) {\n if (arr.hasOwnProperty(i)) {\n sortKeys[0].push(i)\n sortArrs[0].push(arr[i])\n }\n }\n } else {\n return false\n }\n\n // arrMainLength: Holds the length of the first array.\n // All other arrays must be of equal length, otherwise function would return FALSE like in PHP\n // sortComponents: Holds 2 indexes per every section of the array\n // that can be sorted. As this is the start, the whole array can be sorted.\n const arrMainLength = sortArrs[0].length\n let sortComponents = [0, arrMainLength]\n\n // Loop through all other arguments, checking lengths and sort flags\n // of arrays and adding them to the above variables.\n const argl = arguments.length\n for (j = 1; j < argl; j++) {\n if (Object.prototype.toString.call(arguments[j]) === '[object Array]') {\n sortArrs[j] = arguments[j]\n sortFlag[j] = 0\n if (arguments[j].length !== arrMainLength) {\n return false\n }\n } else if (arguments[j] && typeof arguments[j] === 'object') {\n sortKeys[j] = []\n sortArrs[j] = []\n sortFlag[j] = 0\n for (i in arguments[j]) {\n if (arguments[j].hasOwnProperty(i)) {\n sortKeys[j].push(i)\n sortArrs[j].push(arguments[j][i])\n }\n }\n if (sortArrs[j].length !== arrMainLength) {\n return false\n }\n } else if (typeof arguments[j] === 'string') {\n const lFlag = sortFlag.pop()\n // Keep extra parentheses around latter flags check\n // to avoid minimization leading to CDATA closer\n if (typeof flags[arguments[j]] === 'undefined' || ((flags[arguments[j]] >>> 4) & (lFlag >>> 4)) > 0) {\n return false\n }\n sortFlag.push(lFlag + flags[arguments[j]])\n } else {\n return false\n }\n }\n\n for (i = 0; i !== arrMainLength; i++) {\n thingsToSort.push(true)\n }\n\n // Sort all the arrays....\n for (i in sortArrs) {\n if (sortArrs.hasOwnProperty(i)) {\n lastSorts = []\n tmpArray = []\n elIndex = 0\n nLastSort = []\n lastSort = []\n\n // If there are no sortComponents, then no more sorting is neeeded.\n // Copy the array back to the argument.\n if (sortComponents.length === 0) {\n if (Object.prototype.toString.call(arguments[i]) === '[object Array]') {\n args[i] = sortArrs[i]\n } else {\n for (k in arguments[i]) {\n if (arguments[i].hasOwnProperty(k)) {\n delete arguments[i][k]\n }\n }\n sal = sortArrs[i].length\n for (j = 0, vkey = 0; j < sal; j++) {\n vkey = sortKeys[i][j]\n args[i][vkey] = sortArrs[i][j]\n }\n }\n sortArrs.splice(i, 1)\n sortKeys.splice(i, 1)\n continue\n }\n\n // Sort function for sorting. Either sorts asc or desc, regular/string or numeric.\n let sFunction = sortFunctions[sortFlag[i] & 3][(sortFlag[i] & 8) > 0 ? 1 : 0]\n\n // Sort current array.\n for (l = 0; l !== sortComponents.length; l += 2) {\n tmpArray = sortArrs[i].slice(sortComponents[l], sortComponents[l + 1] + 1)\n tmpArray.sort(sFunction)\n // Is there a better way to copy an array in Javascript?\n lastSorts[l] = [].concat(lastSort)\n elIndex = sortComponents[l]\n for (g in tmpArray) {\n if (tmpArray.hasOwnProperty(g)) {\n sortArrs[i][elIndex] = tmpArray[g]\n elIndex++\n }\n }\n }\n\n // Duplicate the sorting of the current array on future arrays.\n sFunction = sortDuplicator\n for (j in sortArrs) {\n if (sortArrs.hasOwnProperty(j)) {\n if (sortArrs[j] === sortArrs[i]) {\n continue\n }\n for (l = 0; l !== sortComponents.length; l += 2) {\n tmpArray = sortArrs[j].slice(sortComponents[l], sortComponents[l + 1] + 1)\n // alert(l + ':' + nLastSort);\n nLastSort = [].concat(lastSorts[l])\n tmpArray.sort(sFunction)\n elIndex = sortComponents[l]\n for (g in tmpArray) {\n if (tmpArray.hasOwnProperty(g)) {\n sortArrs[j][elIndex] = tmpArray[g]\n elIndex++\n }\n }\n }\n }\n }\n\n // Duplicate the sorting of the current array on array keys\n for (j in sortKeys) {\n if (sortKeys.hasOwnProperty(j)) {\n for (l = 0; l !== sortComponents.length; l += 2) {\n tmpArray = sortKeys[j].slice(sortComponents[l], sortComponents[l + 1] + 1)\n nLastSort = [].concat(lastSorts[l])\n tmpArray.sort(sFunction)\n elIndex = sortComponents[l]\n for (g in tmpArray) {\n if (tmpArray.hasOwnProperty(g)) {\n sortKeys[j][elIndex] = tmpArray[g]\n elIndex++\n }\n }\n }\n }\n }\n\n // Generate the next sortComponents\n zlast = null\n sortComponents = []\n for (j in sortArrs[i]) {\n if (sortArrs[i].hasOwnProperty(j)) {\n if (!thingsToSort[j]) {\n if (sortComponents.length & 1) {\n sortComponents.push(j - 1)\n }\n zlast = null\n continue\n }\n if (!(sortComponents.length & 1)) {\n if (zlast !== null) {\n if (sortArrs[i][j] === zlast) {\n sortComponents.push(j - 1)\n } else {\n thingsToSort[j] = false\n }\n }\n zlast = sortArrs[i][j]\n } else {\n if (sortArrs[i][j] !== zlast) {\n sortComponents.push(j - 1)\n zlast = sortArrs[i][j]\n }\n }\n }\n }\n\n if (sortComponents.length & 1) {\n sortComponents.push(j)\n }\n if (Object.prototype.toString.call(arguments[i]) === '[object Array]') {\n args[i] = sortArrs[i]\n } else {\n for (j in arguments[i]) {\n if (arguments[i].hasOwnProperty(j)) {\n delete arguments[i][j]\n }\n }\n\n sal = sortArrs[i].length\n for (j = 0, vkey = 0; j < sal; j++) {\n vkey = sortKeys[i][j]\n args[i][vkey] = sortArrs[i][j]\n }\n }\n sortArrs.splice(i, 1)\n sortKeys.splice(i, 1)\n }\n }\n return true\n}\n"]}
1
+ {"version":3,"sources":["../../../src/php/array/array_multisort.js"],"names":["module","exports","array_multisort","arr","g","i","j","k","l","sal","vkey","elIndex","lastSorts","tmpArray","zlast","sortFlag","thingsToSort","nLastSort","lastSort","args","arguments","flags","SORT_REGULAR","SORT_NUMERIC","SORT_STRING","SORT_ASC","SORT_DESC","sortDuplicator","a","b","shift","sortFunctions","push","sortArrs","sortKeys","Object","prototype","toString","call","hasOwnProperty","arrMainLength","length","sortComponents","argl","lFlag","pop","splice","sFunction","slice","sort","concat"],"mappings":"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","file":"array_multisort.js","sourcesContent":["module.exports = function array_multisort(arr) {\n // discuss at: https://locutus.io/php/array_multisort/\n // original by: Theriault (https://github.com/Theriault)\n // improved by: Oleg Andreyev (https://github.com/oleg-andreyev)\n // example 1: array_multisort([1, 2, 1, 2, 1, 2], [1, 2, 3, 4, 5, 6])\n // returns 1: true\n // example 2: var $characters = {A: 'Edward', B: 'Locke', C: 'Sabin', D: 'Terra', E: 'Edward'}\n // example 2: var $jobs = {A: 'Warrior', B: 'Thief', C: 'Monk', D: 'Mage', E: 'Knight'}\n // example 2: array_multisort($characters, 'SORT_DESC', 'SORT_STRING', $jobs, 'SORT_ASC', 'SORT_STRING')\n // returns 2: true\n // example 3: var $lastnames = [ 'Carter','Adams','Monroe','Tyler','Madison','Kennedy','Adams']\n // example 3: var $firstnames = ['James', 'John' ,'James', 'John', 'James', 'John', 'John']\n // example 3: var $president = [ 39, 6, 5, 10, 4, 35, 2 ]\n // example 3: array_multisort($firstnames, 'SORT_DESC', 'SORT_STRING', $lastnames, 'SORT_ASC', 'SORT_STRING', $president, 'SORT_NUMERIC')\n // returns 3: true\n // example 4: array_multisort([\"productIds[]\", \"_\"], 'SORT_ASC', [\"productIds[]=977385529\", \"_=1502965788347\"])\n // returns 4: true\n // note 1: flags: Translation table for sort arguments.\n // note 1: Each argument turns on certain bits in the flag byte through addition.\n // note 1: bits: HGFE DCBA\n // note 1: args: Holds pointer to arguments for reassignment\n\n let g\n let i\n let j\n let k\n let l\n let sal\n let vkey\n let elIndex\n let lastSorts\n let tmpArray\n let zlast\n\n const sortFlag = [0]\n const thingsToSort = []\n let nLastSort = []\n let lastSort = []\n // possibly redundant\n const args = arguments\n\n const flags = {\n SORT_REGULAR: 16,\n SORT_NUMERIC: 17,\n SORT_STRING: 18,\n SORT_ASC: 32,\n SORT_DESC: 40,\n }\n\n const sortDuplicator = function (a, b) {\n return nLastSort.shift()\n }\n\n const sortFunctions = [\n [\n function (a, b) {\n lastSort.push(a > b ? 1 : a < b ? -1 : 0)\n return a > b ? 1 : a < b ? -1 : 0\n },\n function (a, b) {\n lastSort.push(b > a ? 1 : b < a ? -1 : 0)\n return b > a ? 1 : b < a ? -1 : 0\n },\n ],\n [\n function (a, b) {\n lastSort.push(a - b)\n return a - b\n },\n function (a, b) {\n lastSort.push(b - a)\n return b - a\n },\n ],\n [\n function (a, b) {\n lastSort.push(a + '' > b + '' ? 1 : a + '' < b + '' ? -1 : 0)\n return a + '' > b + '' ? 1 : a + '' < b + '' ? -1 : 0\n },\n function (a, b) {\n lastSort.push(b + '' > a + '' ? 1 : b + '' < a + '' ? -1 : 0)\n return b + '' > a + '' ? 1 : b + '' < a + '' ? -1 : 0\n },\n ],\n ]\n\n const sortArrs = [[]]\n\n const sortKeys = [[]]\n\n // Store first argument into sortArrs and sortKeys if an Object.\n // First Argument should be either a Javascript Array or an Object,\n // otherwise function would return FALSE like in PHP\n if (Object.prototype.toString.call(arr) === '[object Array]') {\n sortArrs[0] = arr\n } else if (arr && typeof arr === 'object') {\n for (i in arr) {\n if (arr.hasOwnProperty(i)) {\n sortKeys[0].push(i)\n sortArrs[0].push(arr[i])\n }\n }\n } else {\n return false\n }\n\n // arrMainLength: Holds the length of the first array.\n // All other arrays must be of equal length, otherwise function would return FALSE like in PHP\n // sortComponents: Holds 2 indexes per every section of the array\n // that can be sorted. As this is the start, the whole array can be sorted.\n const arrMainLength = sortArrs[0].length\n let sortComponents = [0, arrMainLength]\n\n // Loop through all other arguments, checking lengths and sort flags\n // of arrays and adding them to the above variables.\n const argl = arguments.length\n for (j = 1; j < argl; j++) {\n if (Object.prototype.toString.call(arguments[j]) === '[object Array]') {\n sortArrs[j] = arguments[j]\n sortFlag[j] = 0\n if (arguments[j].length !== arrMainLength) {\n return false\n }\n } else if (arguments[j] && typeof arguments[j] === 'object') {\n sortKeys[j] = []\n sortArrs[j] = []\n sortFlag[j] = 0\n for (i in arguments[j]) {\n if (arguments[j].hasOwnProperty(i)) {\n sortKeys[j].push(i)\n sortArrs[j].push(arguments[j][i])\n }\n }\n if (sortArrs[j].length !== arrMainLength) {\n return false\n }\n } else if (typeof arguments[j] === 'string') {\n const lFlag = sortFlag.pop()\n // Keep extra parentheses around latter flags check\n // to avoid minimization leading to CDATA closer\n if (typeof flags[arguments[j]] === 'undefined' || ((flags[arguments[j]] >>> 4) & (lFlag >>> 4)) > 0) {\n return false\n }\n sortFlag.push(lFlag + flags[arguments[j]])\n } else {\n return false\n }\n }\n\n for (i = 0; i !== arrMainLength; i++) {\n thingsToSort.push(true)\n }\n\n // Sort all the arrays....\n for (i in sortArrs) {\n if (sortArrs.hasOwnProperty(i)) {\n lastSorts = []\n tmpArray = []\n elIndex = 0\n nLastSort = []\n lastSort = []\n\n // If there are no sortComponents, then no more sorting is neeeded.\n // Copy the array back to the argument.\n if (sortComponents.length === 0) {\n if (Object.prototype.toString.call(arguments[i]) === '[object Array]') {\n args[i] = sortArrs[i]\n } else {\n for (k in arguments[i]) {\n if (arguments[i].hasOwnProperty(k)) {\n delete arguments[i][k]\n }\n }\n sal = sortArrs[i].length\n for (j = 0, vkey = 0; j < sal; j++) {\n vkey = sortKeys[i][j]\n args[i][vkey] = sortArrs[i][j]\n }\n }\n sortArrs.splice(i, 1)\n sortKeys.splice(i, 1)\n continue\n }\n\n // Sort function for sorting. Either sorts asc or desc, regular/string or numeric.\n let sFunction = sortFunctions[sortFlag[i] & 3][(sortFlag[i] & 8) > 0 ? 1 : 0]\n\n // Sort current array.\n for (l = 0; l !== sortComponents.length; l += 2) {\n tmpArray = sortArrs[i].slice(sortComponents[l], sortComponents[l + 1] + 1)\n tmpArray.sort(sFunction)\n // Is there a better way to copy an array in Javascript?\n lastSorts[l] = [].concat(lastSort)\n elIndex = sortComponents[l]\n for (g in tmpArray) {\n if (tmpArray.hasOwnProperty(g)) {\n sortArrs[i][elIndex] = tmpArray[g]\n elIndex++\n }\n }\n }\n\n // Duplicate the sorting of the current array on future arrays.\n sFunction = sortDuplicator\n for (j in sortArrs) {\n if (sortArrs.hasOwnProperty(j)) {\n if (sortArrs[j] === sortArrs[i]) {\n continue\n }\n for (l = 0; l !== sortComponents.length; l += 2) {\n tmpArray = sortArrs[j].slice(sortComponents[l], sortComponents[l + 1] + 1)\n // alert(l + ':' + nLastSort);\n nLastSort = [].concat(lastSorts[l])\n tmpArray.sort(sFunction)\n elIndex = sortComponents[l]\n for (g in tmpArray) {\n if (tmpArray.hasOwnProperty(g)) {\n sortArrs[j][elIndex] = tmpArray[g]\n elIndex++\n }\n }\n }\n }\n }\n\n // Duplicate the sorting of the current array on array keys\n for (j in sortKeys) {\n if (sortKeys.hasOwnProperty(j)) {\n for (l = 0; l !== sortComponents.length; l += 2) {\n tmpArray = sortKeys[j].slice(sortComponents[l], sortComponents[l + 1] + 1)\n nLastSort = [].concat(lastSorts[l])\n tmpArray.sort(sFunction)\n elIndex = sortComponents[l]\n for (g in tmpArray) {\n if (tmpArray.hasOwnProperty(g)) {\n sortKeys[j][elIndex] = tmpArray[g]\n elIndex++\n }\n }\n }\n }\n }\n\n // Generate the next sortComponents\n zlast = null\n sortComponents = []\n for (j in sortArrs[i]) {\n if (sortArrs[i].hasOwnProperty(j)) {\n if (!thingsToSort[j]) {\n if (sortComponents.length & 1) {\n sortComponents.push(j - 1)\n }\n zlast = null\n continue\n }\n if (!(sortComponents.length & 1)) {\n if (zlast !== null) {\n if (sortArrs[i][j] === zlast) {\n sortComponents.push(j - 1)\n } else {\n thingsToSort[j] = false\n }\n }\n zlast = sortArrs[i][j]\n } else {\n if (sortArrs[i][j] !== zlast) {\n sortComponents.push(j - 1)\n zlast = sortArrs[i][j]\n }\n }\n }\n }\n\n if (sortComponents.length & 1) {\n sortComponents.push(j)\n }\n if (Object.prototype.toString.call(arguments[i]) === '[object Array]') {\n args[i] = sortArrs[i]\n } else {\n for (j in arguments[i]) {\n if (arguments[i].hasOwnProperty(j)) {\n delete arguments[i][j]\n }\n }\n\n sal = sortArrs[i].length\n for (j = 0, vkey = 0; j < sal; j++) {\n vkey = sortKeys[i][j]\n args[i][vkey] = sortArrs[i][j]\n }\n }\n sortArrs.splice(i, 1)\n sortKeys.splice(i, 1)\n }\n }\n return true\n}\n"]}
@@ -432,6 +432,28 @@ var formats = {
432
432
  }
433
433
  },
434
434
 
435
+ oracledate: {
436
+ regex: /^(\d{2})-([A-Z]{3})-(\d{2})$/i,
437
+ name: 'd-M-y',
438
+ callback: function callback(match, day, monthText, year) {
439
+ var month = {
440
+ JAN: 0,
441
+ FEB: 1,
442
+ MAR: 2,
443
+ APR: 3,
444
+ MAY: 4,
445
+ JUN: 5,
446
+ JUL: 6,
447
+ AUG: 7,
448
+ SEP: 8,
449
+ OCT: 9,
450
+ NOV: 10,
451
+ DEC: 11
452
+ }[monthText.toUpperCase()];
453
+ return this.ymd(2000 + parseInt(year, 10), month, parseInt(day, 10));
454
+ }
455
+ },
456
+
435
457
  timeLong12: {
436
458
  regex: RegExp('^' + reHour12 + '[:.]' + reMinute + '[:.]' + reSecondlz + reSpaceOpt + reMeridian, 'i'),
437
459
  name: 'timelong12',
@@ -1248,6 +1270,8 @@ module.exports = function strtotime(str, now) {
1248
1270
  // returns 5: 1241418600
1249
1271
  // example 6: strtotime('2009-05-04 08:30:00 YWT')
1250
1272
  // returns 6: 1241454600
1273
+ // example 7: strtotime('10-JUL-17')
1274
+ // returns 7: 1499644800
1251
1275
 
1252
1276
  if (now == null) {
1253
1277
  now = Math.floor(Date.now() / 1000);
@@ -1258,7 +1282,7 @@ module.exports = function strtotime(str, now) {
1258
1282
  // if multiple rules match the same string, the first match wins
1259
1283
  var rules = [formats.yesterday, formats.now, formats.noon, formats.midnightOrToday, formats.tomorrow, formats.timestamp, formats.firstOrLastDay, formats.backOrFrontOf,
1260
1284
  // formats.weekdayOf, // not yet implemented
1261
- formats.timeTiny12, formats.timeShort12, formats.timeLong12, formats.mssqltime, formats.timeShort24, formats.timeLong24, formats.iso8601long, formats.gnuNoColon, formats.iso8601noColon, formats.americanShort, formats.american, formats.iso8601date4, formats.iso8601dateSlash, formats.dateSlash, formats.gnuDateShortOrIso8601date2, formats.gnuDateShorter, formats.dateFull, formats.pointedDate4, formats.pointedDate2, formats.dateNoDay, formats.dateNoDayRev, formats.dateTextual, formats.dateNoYear, formats.dateNoYearRev, formats.dateNoColon, formats.xmlRpc, formats.xmlRpcNoColon, formats.soap, formats.wddx, formats.exif, formats.pgydotd, formats.isoWeekDay, formats.pgTextShort, formats.pgTextReverse, formats.clf, formats.year4, formats.ago, formats.dayText, formats.relativeTextWeek, formats.relativeText, formats.monthFullOrMonthAbbr, formats.tzCorrection, formats.tzAbbr, formats.dateShortWithTimeShort12, formats.dateShortWithTimeLong12, formats.dateShortWithTimeShort, formats.dateShortWithTimeLong, formats.relative, formats.whitespace];
1285
+ formats.timeTiny12, formats.timeShort12, formats.timeLong12, formats.mssqltime, formats.oracledate, formats.timeShort24, formats.timeLong24, formats.iso8601long, formats.gnuNoColon, formats.iso8601noColon, formats.americanShort, formats.american, formats.iso8601date4, formats.iso8601dateSlash, formats.dateSlash, formats.gnuDateShortOrIso8601date2, formats.gnuDateShorter, formats.dateFull, formats.pointedDate4, formats.pointedDate2, formats.dateNoDay, formats.dateNoDayRev, formats.dateTextual, formats.dateNoYear, formats.dateNoYearRev, formats.dateNoColon, formats.xmlRpc, formats.xmlRpcNoColon, formats.soap, formats.wddx, formats.exif, formats.pgydotd, formats.isoWeekDay, formats.pgTextShort, formats.pgTextReverse, formats.clf, formats.year4, formats.ago, formats.dayText, formats.relativeTextWeek, formats.relativeText, formats.monthFullOrMonthAbbr, formats.tzCorrection, formats.tzAbbr, formats.dateShortWithTimeShort12, formats.dateShortWithTimeLong12, formats.dateShortWithTimeShort, formats.dateShortWithTimeLong, formats.relative, formats.whitespace];
1262
1286
 
1263
1287
  var result = Object.create(resultProto);
1264
1288