From ba2da2b7b8126924b10911b7d44c61e946b1a6c0 Mon Sep 17 00:00:00 2001 From: Christopher Williams Date: Wed, 31 Jan 2018 13:20:03 -0500 Subject: [PATCH 01/10] Start trying to use babylon/babel-generator/babel-types/babel-traverse to replace require and imports using hyperloop, rather than a regexp looking only for requires --- android/hooks/package.json | 4 + android/hooks/tasks/scan-references-task.js | 204 ++++++++++++++------ iphone/hooks/hyperloop.js | 1 + 3 files changed, 150 insertions(+), 59 deletions(-) diff --git a/android/hooks/package.json b/android/hooks/package.json index c41c96b3..2d7166ff 100644 --- a/android/hooks/package.json +++ b/android/hooks/package.json @@ -12,7 +12,11 @@ "appc-tasks": "^1.0.1", "async": "^1.5.0", "babel-core": "^6.25.0", + "babel-generator": "^6.26.0", "babel-preset-minify": "^0.2.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", "chalk": "^1.1.1", "ejs": "^2.3.4", "findit": "^2.0.0", diff --git a/android/hooks/tasks/scan-references-task.js b/android/hooks/tasks/scan-references-task.js index 7ae12a64..f3f18db5 100644 --- a/android/hooks/tasks/scan-references-task.js +++ b/android/hooks/tasks/scan-references-task.js @@ -3,6 +3,10 @@ const fs = require('fs-extra'); const IncrementalFileTask = require('appc-tasks').IncrementalFileTask; const path = require('path'); +const babylon = require('babylon'); +const t = require('babel-types'); +const generate = require('babel-generator').default; +const traverse = require('babel-traverse').default; const REFERENCES_FILENAME = 'references.json'; @@ -208,56 +212,117 @@ class ScanReferencesTask extends IncrementalFileTask { return null; } - let originalSource = fs.readFileSync(file, 'UTF-8'); - let modifiedSource = originalSource; + const originalSource = fs.readFileSync(file, 'UTF-8'); let usedClasses = []; - const requireRegex = /require\s*\(\s*[\\"']+([\w_/-\\.\\*]+)[\\"']+\s*\)/ig; + // FIXME Use babylon to parse the files and traverse teh AST looking for require calls and imports! + // + // For typical require calls: + // Look for CallExpression with callee Identifier whose name property is "require" + // + // For imports like this: import { AlertDialog, Builder, Activity } from 'android.app.*'; + // Look for ImportDeclaration whose 'source' property is a Literal with 'value' property holds the package name ('android.app.*') + // 'specifiers' property is an array holding multiple elements of type ImportSpecifier + // Each has an 'imported' and 'local' property is an Identifier whose 'name' is the imported class name ("AlertDialog", "Builder", "Activity") + // Variant on this may be: import { AlertDialog as MyLocalName } where 'imported' would be 'AlertDialog', 'local' would be 'MyLocalName' + // + // import * as OnClickListener from "android.content.DialogInterface.OnClickListener"; + // Look for ImportDeclaration whose 'source' property is a Literal with 'value' property holds the full class name ("android.content.DialogInterface.OnClickListener") + // specifiers property is an array holding one element: an ImportNamespaceSpecifier whose 'local' property is an Identifier whose 'name' is the import class name ("OnClickListener") + // + // import OnClickListener from "android.content.DialogInterface.OnClickListener"; + // Look for ImportDeclaration whose 'source' property is a Literal with value property holds the full class name ("android.content.DialogInterface.OnClickListener") + // specifiers property is an array holding one element: an ImportDefaultSpecifier whose 'local' property is an Identifier whose 'name' is the import class name ("OnClickListener") + // + // import 'module-name'; + // This can be ignored in our case as nothing is imported locally, so basically it's like a require with no assign, imported only for running/side-effects. + + const classOrPackageRegexp = /[\w_/-\\.\\*]+/ig; this._logger.trace('Searching for hyperloop requires in: ' + file); - let requireMatch; - while ((requireMatch = requireRegex.exec(originalSource)) !== null) { - let requireStatement = requireMatch[0]; - let className = requireMatch[1]; - - // Is this a Java type we found in the JARs/APIs? - this._logger.trace('Checking require for: ' + className); - - // Look for requires using wildcard package names and assume all types under that namespace! - if (className.indexOf('.*') == className.length - 2) { - const packageRegexp = new RegExp('^' + className.replace('.', '\\.').replace('*', '[A-Z]+[a-zA-Z0-9]+') + '$'); - let validPackage = false; - // Check that it's a valid package name and search for all the classes directly under that package! - for (let mClass in this.metabase.classes) { - if (mClass.match(packageRegexp)) { - usedClasses.push(mClass); - validPackage = true; + const HyperloopVisitor = { + // ES5-style require calls + CallExpression: function(p) { + const theString = p.node.arguments[0]; + let requireMatch; + if (p.get('callee').isIdentifier({name: 'require'}) && // Is this a require call? + theString && types.isStringLiteral(theString) && // Is the 1st param a literal string? + (requireMatch = theString.value.match(classOrPackageRegexp)) !== null) // Is it a hyperloop require? + ) { + // Found a valid require... + const className = requireMatch[0]; + + // Is this a Java type we found in the JARs/APIs? + this._logger.trace('Checking require for: ' + className); + + // Look for requires using wildcard package names and assume all types under that namespace! + if (className.indexOf('.*') == className.length - 2) { + const used = this.detectUsedClasses(className); + if (used.length > 0) { + usedClasses = usedClasses.concat(used); // add to our full listing + const packageName = className.slice(0, className.length - 2); // drop the .* ending + // Replace required with hacked version! + p.replaceWith( + t.callExpression(p.node.callee, [t.stringLiteral('hyperloop/' + packageName)]) + ); + } + } else { + // single type + const validatedClassName = this.validateTypeName(className); + if (validatedClassName) { + usedClasses.push(validatedClassName); + // Looks like it's a Java type, so let's hack it and add it to our list! + // replace the require to point to our generated file path + // Replace required with hacked version! + p.replaceWith( + t.callExpression(p.node.callee, [t.stringLiteral('hyperloop/' + validatedClassName)]) + ); + } } } - if (validPackage) { - const ref = 'hyperloop/' + className.slice(0, className.length - 2); // drop the .* ending - let str = 'require(\'' + ref + '\')'; - modifiedSource = this.replaceAll(modifiedSource, requireStatement, str); - } - } else { - // single type - let lastIndex; - let type = this.metabase.classes[className]; - if (!type) { - // fallback for using dot notation to refer to nested class - lastIndex = className.lastIndexOf('.'); - className = className.slice(0, lastIndex) + '$' + className.slice(lastIndex + 1); - type = this.metabase.classes[className]; - if (!type) { - continue; + }, + // ES6+-style imports + ImportDeclaration: function(p) { + const theString = p.node.source; + let requireMatch; + if (theString && types.isStringLiteral(theString) && // module name is a string literal + (requireMatch = theString.value.match(classOrPackageRegexp)) !== null) // Is it a hyperloop require? + ) { + // Found an import that acts the same as a require... + const className = requireMatch[0]; + // Is this a Java type we found in the JARs/APIs? + this._logger.trace('Checking require for: ' + className); + + // Look for requires using wildcard package names and assume all types under that namespace! + if (className.indexOf('.*') == className.length - 2) { + const used = this.detectUsedClasses(className); + if (used.length > 0) { + usedClasses = usedClasses.concat(used); // add to our full listing + const packageName = className.slice(0, className.length - 2); // drop the .* ending + // Replace required with hacked version! + p.replaceWith( + t.importDeclaration(p.node.specifiers, [t.stringLiteral('hyperloop/' + packageName)]) + ); + } + } else { + // single type + const validatedClassName = this.validateTypeName(className); + if (validatedClassName) { + usedClasses.push(validatedClassName); + // Looks like it's a Java type, so let's hack it and add it to our list! + // replace the require to point to our generated file path + // Replace required with hacked version! + p.replaceWith( + t.importDeclaration(p.node.specifiers, [t.stringLiteral('hyperloop/' + validatedClassName)]) + ); + } } } - // Looks like it's a Java type, so let's hack it and add it to our list! - // replace the require to point to our generated file path - const ref = 'hyperloop/' + className; - let str = 'require(\'' + ref + '\')'; - modifiedSource = this.replaceAll(modifiedSource, requireStatement, str); - usedClasses.push(className); } - } + }; + + // Now traverse the AST and generate modified source + const ast = babylon.parse(originalSource, { sourceFilename: file, sourceType: 'module' }); + traverse(ast, HyperloopVisitor); + const modifiedSource = generate(ast, {}).code; return { usedClasses: usedClasses, @@ -266,25 +331,46 @@ class ScanReferencesTask extends IncrementalFileTask { } /** - * Replaces all occurrences of needle in haystack - * - * @param {String} haystack The string to search in - * @param {String} needle String that should be replaced - * @param {String} replaceStr String used to replace all occurrences of needle - * @return {String} New string which has all occurrences of needle replaced + * Given a java package import/require, returns the array of all types underneath that package. + * Returns empty array is there are no types (which means the package import is invalid). + * @param {String} packageName The java package name + * @return {String[]} Array of type names living under the package. */ - replaceAll(haystack, needle, replaceStr) { - const length = needle.length; - let newBuffer = haystack; - let index = -1; - - while ((index = newBuffer.indexOf(needle)) >= 0) { - const before = newBuffer.substring(0, index); - const after = newBuffer.substring(index + length); - newBuffer = before + replaceStr + after; + detectUsedClasses(packageName) { + const usedClasses = []; + // Look for wildcard package names and assume all types under that namespace! + const packageRegexp = new RegExp('^' + packageName.replace('.', '\\.').replace('*', '[A-Z]+[a-zA-Z0-9]+') + '$'); + // Search for all the classes directly under that package! + for (let mClass in this.metabase.classes) { + if (mClass.match(packageRegexp)) { + usedClasses.push(mClass); + } } - return newBuffer; + return usedClasses; + } + + /** + * Given a possible single type name, tries to look up the name used by hyperloop and return it. + * In most cases they're the same. If it's a nested class the name may change slightly. + * If the type can't be foudn in the metabase, we return null. + * @param {String} className origin type name + * @return {String|null} name used by hyperloop internally. + */ + validateTypeName(className) { + // single type + let type = this.metabase.classes[className]; + if (!type) { + // fallback for using dot notation to refer to nested class + const lastIndex = className.lastIndexOf('.'); + className = className.slice(0, lastIndex) + '$' + className.slice(lastIndex + 1); + type = this.metabase.classes[className]; + if (!type) { + return null; + } + } + // Return valid type name + return className; } } diff --git a/iphone/hooks/hyperloop.js b/iphone/hooks/hyperloop.js index f0dcba1c..8967dda7 100644 --- a/iphone/hooks/hyperloop.js +++ b/iphone/hooks/hyperloop.js @@ -434,6 +434,7 @@ HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(sourceFilename, // get the result source code in case it was transformed and replace all system framework // require() calls with the Hyperloop layer + // FIXME: Use babylon to parse and look for both require and imports! var newContents = (this.parserState.getSourceCode() || contents).replace( /require\s*\(\s*[\\"']+([\w_/\-\\.]+)[\\"']+\s*\)/ig, function (orig, match) { From 7034e942a2f7176ffed74b59cd63715d60bf7d71 Mon Sep 17 00:00:00 2001 From: Christopher Williams Date: Wed, 31 Jan 2018 14:25:17 -0500 Subject: [PATCH 02/10] Get tests passing, add tests for imports. --- .gitignore | 2 + android/hooks/tasks/scan-references-task.js | 37 ++++++----- .../hooks/test/scan-references-task.spec.js | 66 ++++++++++++++----- 3 files changed, 71 insertions(+), 34 deletions(-) diff --git a/.gitignore b/.gitignore index 5e43de7b..0326b5fb 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,5 @@ windows/hooks/hyperloop-init.js # Coverage directory and nyc output coverage .nyc_output + +junit_report.xml diff --git a/android/hooks/tasks/scan-references-task.js b/android/hooks/tasks/scan-references-task.js index f3f18db5..81f2a9a7 100644 --- a/android/hooks/tasks/scan-references-task.js +++ b/android/hooks/tasks/scan-references-task.js @@ -214,8 +214,7 @@ class ScanReferencesTask extends IncrementalFileTask { const originalSource = fs.readFileSync(file, 'UTF-8'); let usedClasses = []; - // FIXME Use babylon to parse the files and traverse teh AST looking for require calls and imports! - // + // For typical require calls: // Look for CallExpression with callee Identifier whose name property is "require" // @@ -238,24 +237,26 @@ class ScanReferencesTask extends IncrementalFileTask { const classOrPackageRegexp = /[\w_/-\\.\\*]+/ig; this._logger.trace('Searching for hyperloop requires in: ' + file); + const logger = this.logger; + const self = this; const HyperloopVisitor = { // ES5-style require calls CallExpression: function(p) { const theString = p.node.arguments[0]; let requireMatch; if (p.get('callee').isIdentifier({name: 'require'}) && // Is this a require call? - theString && types.isStringLiteral(theString) && // Is the 1st param a literal string? - (requireMatch = theString.value.match(classOrPackageRegexp)) !== null) // Is it a hyperloop require? + theString && t.isStringLiteral(theString) && // Is the 1st param a literal string? + (requireMatch = theString.value.match(classOrPackageRegexp)) !== null // Is it a hyperloop require? ) { // Found a valid require... const className = requireMatch[0]; // Is this a Java type we found in the JARs/APIs? - this._logger.trace('Checking require for: ' + className); + logger.trace('Checking require for: ' + className); // Look for requires using wildcard package names and assume all types under that namespace! if (className.indexOf('.*') == className.length - 2) { - const used = this.detectUsedClasses(className); + const used = self.detectUsedClasses(className); if (used.length > 0) { usedClasses = usedClasses.concat(used); // add to our full listing const packageName = className.slice(0, className.length - 2); // drop the .* ending @@ -266,12 +267,10 @@ class ScanReferencesTask extends IncrementalFileTask { } } else { // single type - const validatedClassName = this.validateTypeName(className); + const validatedClassName = self.validateTypeName(className); if (validatedClassName) { - usedClasses.push(validatedClassName); // Looks like it's a Java type, so let's hack it and add it to our list! - // replace the require to point to our generated file path - // Replace required with hacked version! + usedClasses.push(validatedClassName); p.replaceWith( t.callExpression(p.node.callee, [t.stringLiteral('hyperloop/' + validatedClassName)]) ); @@ -283,35 +282,37 @@ class ScanReferencesTask extends IncrementalFileTask { ImportDeclaration: function(p) { const theString = p.node.source; let requireMatch; - if (theString && types.isStringLiteral(theString) && // module name is a string literal - (requireMatch = theString.value.match(classOrPackageRegexp)) !== null) // Is it a hyperloop require? + if (theString && t.isStringLiteral(theString) && // module name is a string literal + (requireMatch = theString.value.match(classOrPackageRegexp)) !== null // Is it a hyperloop require? ) { // Found an import that acts the same as a require... const className = requireMatch[0]; // Is this a Java type we found in the JARs/APIs? - this._logger.trace('Checking require for: ' + className); + logger.trace('Checking require for: ' + className); // Look for requires using wildcard package names and assume all types under that namespace! if (className.indexOf('.*') == className.length - 2) { - const used = this.detectUsedClasses(className); + const used = self.detectUsedClasses(className); // TODO pass along the specifiers to narrow the used class listing! if (used.length > 0) { usedClasses = usedClasses.concat(used); // add to our full listing + // FIXME: Validate that the types listed in the specifiers exist underneath the package! + // If we pass in the specifiers, we can probably just check that the returned array length === the specifiers length const packageName = className.slice(0, className.length - 2); // drop the .* ending // Replace required with hacked version! p.replaceWith( - t.importDeclaration(p.node.specifiers, [t.stringLiteral('hyperloop/' + packageName)]) + t.importDeclaration(p.node.specifiers, t.stringLiteral('hyperloop/' + packageName)) ); } } else { // single type - const validatedClassName = this.validateTypeName(className); - if (validatedClassName) { + const validatedClassName = self.validateTypeName(className); + if (validatedClassName) { // FIXME: If name is invalid/can't be found, should we raise an error? usedClasses.push(validatedClassName); // Looks like it's a Java type, so let's hack it and add it to our list! // replace the require to point to our generated file path // Replace required with hacked version! p.replaceWith( - t.importDeclaration(p.node.specifiers, [t.stringLiteral('hyperloop/' + validatedClassName)]) + t.importDeclaration(p.node.specifiers, t.stringLiteral('hyperloop/' + validatedClassName)) ); } } diff --git a/android/hooks/test/scan-references-task.spec.js b/android/hooks/test/scan-references-task.spec.js index 0b684e36..d7fc90af 100644 --- a/android/hooks/test/scan-references-task.spec.js +++ b/android/hooks/test/scan-references-task.spec.js @@ -17,7 +17,7 @@ const noopBunyanLogger = { let task = null; let testReferenceMetadata = { usedClasses: [ 'android.app.Activity' ], - replacedContent: 'require(\'hyperloop/android.app.Activity\');' + replacedContent: 'require("hyperloop/android.app.Activity");' }; chai.use(chaiAsPromised); @@ -31,11 +31,14 @@ describe('ScanReferencesTask', () => { }, 'input': { 'activity-type.js': 'require("android.app.Activity");', + 'activity-type-import.js': 'import Activity from "android.app.Activity";', 'context-type.js': 'require("android.content.Context");', + 'context-type-import.js': 'import * as Context from "android.content.Context";', 'non-existing-type.js': 'require("does.not.exists");', 'package-require.js': 'require("android.app.*");', + 'package-import.js': 'import { Activity } from "android.app.*";', 'non-existing-package.js': 'require("does.not.exists.*");', - 'nested-type.js': 'require("hyperloop.test.NestedClass");' + 'nested-type.js': 'require("hyperloop.test.NestedClass");', }, 'output': { 'references.json': JSON.stringify({ @@ -122,7 +125,7 @@ describe('ScanReferencesTask', () => { task.addInputDirectory('input'); let scanFileExpectations = sinon.mock(task).expects('scanFileForHyperloopRequires'); - scanFileExpectations.exactly(6); + scanFileExpectations.exactly(9); return expect(task.doFullTaskRun().then(() => { scanFileExpectations.verify(); })).eventually.be.fulfilled; @@ -233,7 +236,7 @@ describe('ScanReferencesTask', () => { expect(task.references).to.be.a('map').that.has.key(pathAndFilename); expect(task.references.get(pathAndFilename)).to.be.deep.equal({ usedClasses: [ 'android.app.Activity' ], - replacedContent: 'require(\'hyperloop/android.app.Activity\');' + replacedContent: 'require("hyperloop/android.app.Activity");' }); }); }); @@ -275,7 +278,17 @@ describe('ScanReferencesTask', () => { expect(result.usedClasses).to.be.an('array'); expect(result.usedClasses).to.have.lengthOf(1); expect(result.usedClasses).to.include('android.app.Activity'); - expect(result.replacedContent).to.be.equal('require(\'hyperloop/android.app\');'); + expect(result.replacedContent).to.be.equal('require("hyperloop/android.app");'); + }); + + it('should find and replace imports of native packages', () => { + let pathAndFilename = path.join('input', 'package-import.js'); + let result = task.extractAndReplaceHyperloopRequires(pathAndFilename); + expect(result).to.be.not.null; + expect(result.usedClasses).to.be.an('array'); + expect(result.usedClasses).to.have.lengthOf(1); + expect(result.usedClasses).to.include('android.app.Activity'); + expect(result.replacedContent).to.be.equal('import { Activity } from "hyperloop/android.app";'); }); it('should ignore requires to non-existing native packages', () => { @@ -292,7 +305,27 @@ describe('ScanReferencesTask', () => { expect(result.usedClasses).to.be.an('array'); expect(result.usedClasses).to.have.lengthOf(1); expect(result.usedClasses).to.include('android.app.Activity'); - expect(result.replacedContent).to.be.equal('require(\'hyperloop/android.app.Activity\');'); + expect(result.replacedContent).to.be.equal('require("hyperloop/android.app.Activity");'); + }); + + it('should find and replace imports to native types', () => { + let pathAndFilename = path.join('input', 'activity-type-import.js'); + let result = task.extractAndReplaceHyperloopRequires(pathAndFilename); + expect(result).to.be.not.null; + expect(result.usedClasses).to.be.an('array'); + expect(result.usedClasses).to.have.lengthOf(1); + expect(result.usedClasses).to.include('android.app.Activity'); + expect(result.replacedContent).to.be.equal('import Activity from "hyperloop/android.app.Activity";'); + }); + + it('should find and replace aliased imports to native types', () => { + let pathAndFilename = path.join('input', 'context-type-import.js'); + let result = task.extractAndReplaceHyperloopRequires(pathAndFilename); + expect(result).to.be.not.null; + expect(result.usedClasses).to.be.an('array'); + expect(result.usedClasses).to.have.lengthOf(1); + expect(result.usedClasses).to.include('android.content.Context'); + expect(result.replacedContent).to.be.equal('import * as Context from "hyperloop/android.content.Context";'); }); it('should ignore requires to non-existing native types ', () => { @@ -309,17 +342,18 @@ describe('ScanReferencesTask', () => { expect(result.usedClasses).to.be.an('array'); expect(result.usedClasses).to.have.lengthOf(1); expect(result.usedClasses).to.include('hyperloop.test$NestedClass'); - expect(result.replacedContent).to.be.equal('require(\'hyperloop/hyperloop.test$NestedClass\');'); + expect(result.replacedContent).to.be.equal('require("hyperloop/hyperloop.test$NestedClass");'); }); }); - describe('replaceAll', () => { - it('should replace all occurrences of a string', () => { - let needle = 'aa'; - let haystack = 'aaabcbaabea'; - let replaceWith = 'z'; - let replacedString = 'zabcbzbea'; - expect(task.replaceAll(haystack, needle, replaceWith)).to.be.equal(replacedString); - }); - }); + // TODO Add tests for detectUsedClasses and validateTypeName? + // describe('replaceAll', () => { + // it('should replace all occurrences of a string', () => { + // let needle = 'aa'; + // let haystack = 'aaabcbaabea'; + // let replaceWith = 'z'; + // let replacedString = 'zabcbzbea'; + // expect(task.replaceAll(haystack, needle, replaceWith)).to.be.equal(replacedString); + // }); + // }); }); From 8ff58fa7887bf8a37bbc315c6fcc2c3620a23c3a Mon Sep 17 00:00:00 2001 From: Christopher Williams Date: Thu, 1 Feb 2018 14:04:07 -0500 Subject: [PATCH 03/10] Try to get iOS require/imports working via babylon. There's a big disconnect witht he metabase module's acron-based parser, though. We really need to combine the code and use one parser pass using babylon. --- iphone/hooks/hyperloop.js | 262 +++++++++++++++++++++++++-------- iphone/hooks/package-lock.json | 232 ++++++++++++++++++++++++++++- iphone/hooks/package.json | 4 + 3 files changed, 437 insertions(+), 61 deletions(-) diff --git a/iphone/hooks/hyperloop.js b/iphone/hooks/hyperloop.js index 8967dda7..17f86bdb 100644 --- a/iphone/hooks/hyperloop.js +++ b/iphone/hooks/hyperloop.js @@ -32,6 +32,11 @@ var path = require('path'), HL = chalk.magenta.inverse('Hyperloop'), semver = require('semver'); +const babylon = require('babylon'); +const t = require('babel-types'); +const generate = require('babel-generator').default; +const traverse = require('babel-traverse').default; + /** * The Hyperloop builder object. Contains the build logic and state. * @class @@ -92,6 +97,23 @@ HyperloopiOSBuilder.prototype.copyResource = function (builder, callback) { } }; +/** + * called for each JS resource to process them + */ +HyperloopiOSBuilder.prototype.compileJsFile = function (builder, callback) { + try { + const obj = builder.args[0]; + const contents = obj.contents; + const originalSource = obj.original; + const from = builder.args[1]; + const to = builder.args[2]; + + this.patchJSFile(obj, from, callback); + } catch (e) { + callback(e); + } +}; + /** * The main build logic. * @param {Function} callback - A function to call after the logic finishes. @@ -411,19 +433,25 @@ HyperloopiOSBuilder.prototype.detectSwiftVersion = function detectSwiftVersion(c /** * Re-write generated JS source + * @param {Object} obj - JS object holding data about the file + * @param {String} obj.contents - current source code for the file + * @param {String} obj.original - original source of the file + * @param {String} sourceFilename - path to original JS file + * @param {String} destinationFilename - path to destination JS file + * @param {Function} cb - callback function */ -HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(sourceFilename, destinationFilename, cb) { - // look for any require which matches our hyperloop system frameworks - var contents = fs.readFileSync(destinationFilename).toString(); - +HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(obj, sourceFilename, destinationFilename, cb) { + var contents = obj.contents; // skip empty content if (!contents.length) { return cb(); } + // look for any require which matches our hyperloop system frameworks + // parse the contents // TODO: move all the regex require stuff into the parser - this.parserState = hm.generate.parseFromBuffer(contents, destinationFilename, this.parserState || undefined); + this.parserState = hm.generate.parseFromBuffer(contents, sourceFilename, this.parserState || undefined); // empty AST if (!this.parserState) { @@ -434,74 +462,186 @@ HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(sourceFilename, // get the result source code in case it was transformed and replace all system framework // require() calls with the Hyperloop layer - // FIXME: Use babylon to parse and look for both require and imports! - var newContents = (this.parserState.getSourceCode() || contents).replace( - /require\s*\(\s*[\\"']+([\w_/\-\\.]+)[\\"']+\s*\)/ig, - function (orig, match) { - // hyperloop includes will always have a slash - var tok = match.split('/'); - var pkg = tok[0]; - - if (pkg === 'alloy' || pkg.charAt(0) === '.' || pkg.charAt(0) === '/') { - return orig; - } + const requireRegexp = /[\w_/\-\\.]+/ig; + const self = this; + const HyperloopVisitor = { + // ES5-style require calls + CallExpression: function(p) { + const theString = p.node.arguments[0]; + let requireMatch; + if (p.get('callee').isIdentifier({name: 'require'}) && // Is this a require call? + theString && t.isStringLiteral(theString) && // Is the 1st param a literal string? + (requireMatch = theString.value.match(requireRegexp)) !== null // Is it a hyperloop require? + ) { + // hyperloop includes will always have a slash + const tok = requireMatch[0].split('/'); + const pkg = tok[0]; + + // is it a normal js require or from alloy? do nothing... + if (pkg === 'alloy' || pkg.charAt(0) === '.' || pkg.charAt(0) === '/') { + return; + } - // if we use something like require("UIKit") - // that should require the helper such as require("UIKit/UIKit"); - var className = tok[1] || pkg; - var framework = this.frameworks.get(pkg); - var include = framework && framework.typeMap[className]; - var isBuiltin = pkg === 'Titanium'; - - // if the framework is not found, then check if it was possibly mispelled - if (!framework && !isBuiltin) { - var pkgSoundEx = soundEx(pkg); - var maybes = Array.from(this.frameworks.keys()).filter(function (frameworkName) { - return soundEx(frameworkName) === pkgSoundEx; - }); + // if we use something like require("UIKit") + // that should require the helper such as require("UIKit/UIKit"); + const className = tok[1] || pkg; + const framework = self.frameworks.get(pkg); + const include = framework && framework.typeMap[className]; + const isBuiltin = pkg === 'Titanium'; + + logger.trace('Checking require for: ' + pkg.toLowerCase() + '/' + className.toLowerCase()); + + // if the framework is not found, then check if it was possibly mispelled + if (!framework && !isBuiltin) { + const pkgSoundEx = soundEx(pkg); + const maybes = Array.from(self.frameworks.keys()).filter(function (frameworkName) { + return soundEx(frameworkName) === pkgSoundEx; + }); - if (maybes.length) { - this.logger.warn('The iOS framework "' + pkg + '" could not be found. Are you trying to use ' + - maybes.map(function (s) { return '"' + s + '"'; }).join(' or ') + ' instead? (' + relPath + ')'); + if (maybes.length) { + self.logger.warn('The iOS framework "' + pkg + '" could not be found. Are you trying to use ' + + maybes.map(function (s) { return '"' + s + '"'; }).join(' or ') + ' instead? (' + relPath + ')'); + } + // don't inject anything + return; } - return orig; - } + // remember any used frameworks + if (!isBuiltin) { + self.usedFrameworks.set(pkg, self.frameworks.get(pkg)); + } - // remember any used frameworks - if (!isBuiltin) { - this.usedFrameworks.set(pkg, this.frameworks.get(pkg)); - } + // if we haven't found it by now, then we try to help before failing + if (!include && className !== pkg && !isBuiltin) { + const classNameSoundEx = soundEx(className); - // if we haven't found it by now, then we try to help before failing - if (!include && className !== pkg && !isBuiltin) { - var classNameSoundEx = soundEx(className); + self.frameworks.forEach(frameworkMetadata => { + if (frameworkMetadata.typeMap[className]) { + throw new Error('Are you trying to use the iOS class "' + className + '" located in the framework "' + frameworkMetadata.name + '", not in "' + pkg + '"? (' + relPath + ')'); + } - this.frameworks.forEach(frameworkMetadata => { - if (frameworkMetadata.typeMap[className]) { - throw new Error('Are you trying to use the iOS class "' + className + '" located in the framework "' + frameworkMetadata.name + '", not in "' + pkg + '"? (' + relPath + ')'); + if (soundEx(frameworkMetadata.name) === classNameSoundEx) { + throw new Error('The iOS class "' + className + '" could not be found in the framework "' + pkg + '". Are you trying to use "' + frameworkMetadata.name + '" instead? (' + relPath+ ')'); + } + }, self); + + throw new Error('The iOS class "' + className + '" could not be found in the framework "' + pkg + '". (' + relPath + ')'); + } + + const ref = 'hyperloop/' + pkg.toLowerCase() + '/' + className.toLowerCase(); + self.references[ref] = 1; + + if (include) { + // record our includes in which case we found a match + self.includes[include] = 1; + } + + // replace the require to point to our generated file path + p.replaceWith( + t.callExpression(p.node.callee, [t.stringLiteral('/' + ref)]) + ); + } + }, + // ES6+-style imports + ImportDeclaration: function(p) { + const theString = p.node.source; + const replacements = []; + let requireMatch; + if (theString && t.isStringLiteral(theString) && // module name is a string literal + (requireMatch = theString.value.match(requireRegexp)) !== null // Is it a hyperloop require? + ) { + // hyperloop includes will always have a slash + const tok = requireMatch[0].split('/'); + const pkg = tok[0]; + + // is it a normal js require or from alloy? do nothing... + if (pkg === 'alloy' || pkg.charAt(0) === '.' || pkg.charAt(0) === '/') { + return; + } + const isBuiltin = pkg === 'Titanium'; + const framework = self.frameworks.get(pkg); + + // if the framework is not found, then check if it was possibly mispelled + if (!framework && !isBuiltin) { + const pkgSoundEx = soundEx(pkg); + const maybes = Array.from(self.frameworks.keys()).filter(function (frameworkName) { + return soundEx(frameworkName) === pkgSoundEx; + }); + + if (maybes.length) { + self.logger.warn('The iOS framework "' + pkg + '" could not be found. Are you trying to use ' + + maybes.map(function (s) { return '"' + s + '"'; }).join(' or ') + ' instead? (' + relPath + ')'); } + // don't inject anything + return; + } - if (soundEx(frameworkMetadata.name) === classNameSoundEx) { - throw new Error('The iOS class "' + className + '" could not be found in the framework "' + pkg + '". Are you trying to use "' + frameworkMetadata.name + '" instead? (' + relPath+ ')'); + // remember any used frameworks + if (!isBuiltin) { + self.usedFrameworks.set(pkg, self.frameworks.get(pkg)); + } + + p.node.specifiers.each(function (spec) { + // import UIView from 'UIKit/UIView'; spec.imported is undefined and tok[1] holds className + // import { UIView } from 'UIKit'; spec.imported.name == 'UIView' + const className = (spec.imported ? spec.imported.name : tok[1]); + // What if they did: + // import UIView from 'UIKit'; ? className would be null here. Technically this is bad import anyways + // as it should be: import UIKit from 'UIKit/UIKit'; or import { UIView } from 'UIKit'; + // FIXME: Should we bomb out with an error saying it's ambiguous import? + const include = framework && framework.typeMap[className]; + logger.trace('Checking import for: ' + pkg.toLowerCase() + '/' + className.toLowerCase()); + + // if we haven't found it by now, then we try to help before failing + if (!include && className !== pkg && !isBuiltin) { + const classNameSoundEx = soundEx(className); + + self.frameworks.forEach(frameworkMetadata => { + if (frameworkMetadata.typeMap[className]) { + throw new Error('Are you trying to use the iOS class "' + className + '" located in the framework "' + frameworkMetadata.name + '", not in "' + pkg + '"? (' + relPath + ')'); + } + + if (soundEx(frameworkMetadata.name) === classNameSoundEx) { + throw new Error('The iOS class "' + className + '" could not be found in the framework "' + pkg + '". Are you trying to use "' + frameworkMetadata.name + '" instead? (' + relPath+ ')'); + } + }, self); + + throw new Error('The iOS class "' + className + '" could not be found in the framework "' + pkg + '". (' + relPath + ')'); } - }, this); - throw new Error('The iOS class "' + className + '" could not be found in the framework "' + pkg + '". (' + relPath + ')'); - } + const ref = 'hyperloop/' + pkg.toLowerCase() + '/' + className.toLowerCase(); + self.references[ref] = 1; + + if (include) { + // record our includes in which case we found a match + self.includes[include] = 1; + } - var ref = 'hyperloop/' + pkg.toLowerCase() + '/' + className.toLowerCase(); - this.references[ref] = 1; + // replace the require to point to our generated file path + // FIXME: what are the specifiers in this case? + // Single specifier that is: + // t.importDefaultSpecifier(local) == import local from 'mod-name'; + // t.importNamespaceSpecifier(local) == import * as local from 'mod-name'; + replacements.push(t.importDeclaration([t.importDefaultSpecifier(spec.local)], t.stringLiteral('/' + ref))); + }); - if (include) { - // record our includes in which case we found a match - this.includes[include] = 1; + // Apply replacements + if (replacements.length == 1) { + p.replaceWith(replacements[0]); + } else { + // + p.replaceWithMultiple(replacements); + } } + } + }; - // replace the require to point to our generated file path - return "require('/" + ref + "')"; - }.bind(this)); + const ast = babylon.parse(contents, { sourceFilename: sourceFilename, sourceType: 'module' }); + traverse(ast, HyperloopVisitor); + let newContents = generate(ast, {}).code; + // TODO: Remove once we combine the custom acorn-based parser and the babylon parser above! + // Or maybe it can go now? The migration stuff is noted that it could be removed in 3.0.0... var needMigration = this.parserState.state.needMigration; if (needMigration.length > 0) { this.needMigration[sourceFilename] = needMigration; @@ -516,7 +656,9 @@ HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(sourceFilename, cb(); } else { this.logger.debug('Writing ' + chalk.cyan(destinationFilename)); - fs.writeFile(destinationFilename, newContents, cb); + // modify the contents stored int he state object passed thorugh the hook, + // so that SDK CLI can use new contents for minification/transpilation + obj.contents = newContents; } }; @@ -936,8 +1078,8 @@ HyperloopiOSBuilder.prototype.wireupBuildHooks = function wireupBuildHooks() { pre: this.hookUpdateXcodeProject.bind(this) }); - this.cli.on('build.ios.copyResource', { - post: this.copyResource.bind(this) + this.cli.on('build.ios.compileJsFile', { + pre: this.compileJsFile.bind(this) }); this.cli.on('build.pre.build', { diff --git a/iphone/hooks/package-lock.json b/iphone/hooks/package-lock.json index bf469573..3e63926c 100644 --- a/iphone/hooks/package-lock.json +++ b/iphone/hooks/package-lock.json @@ -1,9 +1,136 @@ { "name": "hyperloop", - "version": "2.0.0", + "version": "0.0.0-PLACEHOLDER", "lockfileVersion": 1, "requires": true, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.4", + "source-map": "0.5.7", + "trim-right": "1.0.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "2.5.3", + "regenerator-runtime": "0.11.1" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "requires": { + "repeating": "2.0.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, "findit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz", @@ -19,11 +146,50 @@ "universalify": "0.1.1" } }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "requires": { + "loose-envify": "1.3.1" + } + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -32,6 +198,70 @@ "graceful-fs": "4.1.11" } }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "3.0.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "1.0.2" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, "universalify": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", diff --git a/iphone/hooks/package.json b/iphone/hooks/package.json index 499c1d62..4c05bcf9 100644 --- a/iphone/hooks/package.json +++ b/iphone/hooks/package.json @@ -21,6 +21,10 @@ } ], "dependencies": { + "babel-generator": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", "findit": "^2.0.0", "fs-extra": "^4.0.2" } From 551d80f3582adac05d06666c2b22085d28ef1ceb Mon Sep 17 00:00:00 2001 From: Christopher Williams Date: Thu, 1 Feb 2018 16:54:48 -0500 Subject: [PATCH 04/10] Start hacking out the generate apis from the private metabase npm package into the hyperloop hook code. --- .eslintrc | 13 + .../lib => iphone/hooks}/generate/block.js | 0 .../lib => iphone/hooks}/generate/class.js | 2 +- .../hooks}/generate/code-generator.js | 0 .../lib => iphone/hooks}/generate/custom.js | 25 +- .../lib => iphone/hooks}/generate/index.js | 54 +- .../lib => iphone/hooks}/generate/module.js | 0 .../lib => iphone/hooks}/generate/struct.js | 0 .../generate}/templates/builtins/titanium.js | 0 .../hooks/generate}/templates/class.ejs | 0 .../hooks/generate}/templates/custom.m.ejs | 0 .../hooks/generate}/templates/module.ejs | 0 .../hooks/generate}/templates/module.m.ejs | 0 .../hooks/generate}/templates/struct.ejs | 0 .../lib => iphone/hooks}/generate/util.js | 2 +- iphone/hooks/hyperloop.js | 36 +- iphone/hooks/package-lock.json | 91 +- iphone/hooks/package.json | 8 +- package-lock.json | 1359 ++++++++++++++++- package.json | 4 + .../hyperloop-ios-metabase/lib/generate.js | 51 - packages/hyperloop-ios-metabase/lib/index.js | 4 +- .../hyperloop-ios-metabase/lib/metabase.js | 2 +- packages/hyperloop-ios-metabase/lib/swift.js | 2 +- packages/hyperloop-ios-metabase/lib/util.js | 87 ++ packages/hyperloop-ios-metabase/package.json | 5 - 26 files changed, 1595 insertions(+), 150 deletions(-) create mode 100644 .eslintrc rename {packages/hyperloop-ios-metabase/lib => iphone/hooks}/generate/block.js (100%) rename {packages/hyperloop-ios-metabase/lib => iphone/hooks}/generate/class.js (98%) rename {packages/hyperloop-ios-metabase/lib => iphone/hooks}/generate/code-generator.js (100%) rename {packages/hyperloop-ios-metabase/lib => iphone/hooks}/generate/custom.js (98%) rename {packages/hyperloop-ios-metabase/lib => iphone/hooks}/generate/index.js (90%) rename {packages/hyperloop-ios-metabase/lib => iphone/hooks}/generate/module.js (100%) rename {packages/hyperloop-ios-metabase/lib => iphone/hooks}/generate/struct.js (100%) rename {packages/hyperloop-ios-metabase => iphone/hooks/generate}/templates/builtins/titanium.js (100%) rename {packages/hyperloop-ios-metabase => iphone/hooks/generate}/templates/class.ejs (100%) rename {packages/hyperloop-ios-metabase => iphone/hooks/generate}/templates/custom.m.ejs (100%) rename {packages/hyperloop-ios-metabase => iphone/hooks/generate}/templates/module.ejs (100%) rename {packages/hyperloop-ios-metabase => iphone/hooks/generate}/templates/module.m.ejs (100%) rename {packages/hyperloop-ios-metabase => iphone/hooks/generate}/templates/struct.ejs (100%) rename {packages/hyperloop-ios-metabase/lib => iphone/hooks}/generate/util.js (99%) delete mode 100644 packages/hyperloop-ios-metabase/lib/generate.js create mode 100644 packages/hyperloop-ios-metabase/lib/util.js diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 00000000..59a166f9 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,13 @@ +{ + "extends": [ "axway/env-node", "axway/+mocha"], + "globals": { + "Ti": false + }, + "parserOptions": { + "ecmaVersion": 2015, + "sourceType": "script" + }, + "rules": { + "strict": ["error", "global"] + }, +} diff --git a/packages/hyperloop-ios-metabase/lib/generate/block.js b/iphone/hooks/generate/block.js similarity index 100% rename from packages/hyperloop-ios-metabase/lib/generate/block.js rename to iphone/hooks/generate/block.js diff --git a/packages/hyperloop-ios-metabase/lib/generate/class.js b/iphone/hooks/generate/class.js similarity index 98% rename from packages/hyperloop-ios-metabase/lib/generate/class.js rename to iphone/hooks/generate/class.js index b19c893a..6bee8617 100644 --- a/packages/hyperloop-ios-metabase/lib/generate/class.js +++ b/iphone/hooks/generate/class.js @@ -3,7 +3,7 @@ * Copyright (c) 2015 by Appcelerator, Inc. */ var util = require('./util'), - swift = require('../swift'); + swift = require('hyperloop-metabase').swift; function makeClass (json, cls, state) { var entry = { diff --git a/packages/hyperloop-ios-metabase/lib/generate/code-generator.js b/iphone/hooks/generate/code-generator.js similarity index 100% rename from packages/hyperloop-ios-metabase/lib/generate/code-generator.js rename to iphone/hooks/generate/code-generator.js diff --git a/packages/hyperloop-ios-metabase/lib/generate/custom.js b/iphone/hooks/generate/custom.js similarity index 98% rename from packages/hyperloop-ios-metabase/lib/generate/custom.js rename to iphone/hooks/generate/custom.js index a9e70ae7..db96c00b 100644 --- a/packages/hyperloop-ios-metabase/lib/generate/custom.js +++ b/iphone/hooks/generate/custom.js @@ -1,16 +1,19 @@ /** * Hyperloop Metabase Generator - * Copyright (c) 2015 by Appcelerator, Inc. + * Copyright (c) 2015-2018 by Appcelerator, Inc. */ -var acorn = require('acorn'), - fs = require('fs'), +'use strict'; +var fs = require('fs'), path = require('path'), util = require('util'), utillib = require('./util'), - walk = require('walk-ast'), - escodegen = require('escodegen'), classgen = require('./class'); +const babylon = require('babylon'); +const t = require('babel-types'); +const generate = require('babel-generator').default; +const traverse = require('babel-traverse').default; + function Parser () { } @@ -591,9 +594,15 @@ Parser.prototype.parse = function (buf, fn, state) { // turn it into a buffer buf = buf.toString(); - var ast = acorn.parse(buf, { ecmaVersion: 6, locations: true }), - mutated, + const ast = babylon.parse(buf, { sourceFilename: fn, sourceType: 'module' }); + var mutated, prop; + const ASTWalker = { + + }; + traverse(ast, ASTWalker); + + walk(ast, function (node) { // console.log(node.type); @@ -670,7 +679,7 @@ Parser.prototype.parse = function (buf, fn, state) { var code; // re-generate if it changed, otherwise we can skip and use original content if (mutated) { - code = escodegen.generate(ast); + code = generate(ast, {}).code; } return new ParserState(state, code); diff --git a/packages/hyperloop-ios-metabase/lib/generate/index.js b/iphone/hooks/generate/index.js similarity index 90% rename from packages/hyperloop-ios-metabase/lib/generate/index.js rename to iphone/hooks/generate/index.js index 3c50c985..47ff8050 100644 --- a/packages/hyperloop-ios-metabase/lib/generate/index.js +++ b/iphone/hooks/generate/index.js @@ -1,17 +1,18 @@ /** * Hyperloop Metabase Generator - * Copyright (c) 2015 by Appcelerator, Inc. + * Copyright (c) 2015-2018 by Appcelerator, Inc. */ -var fs = require('fs-extra'), - path = require('path'), - async = require('async'), - genclass = require('./class'), - genmodule = require('./module'), - genstruct = require('./struct'), - genblock = require('./block'), - gencustom = require('./custom'), - CodeGenerator = require('./code-generator'), - util = require('./util'); +'use strict'; +const fs = require('fs-extra'); +const path = require('path'); +const async = require('async'); +const genclass = require('./class'); +const genmodule = require('./module'); +const genstruct = require('./struct'); +const genblock = require('./block'); +const gencustom = require('./custom'); +const CodeGenerator = require('./code-generator'); +const util = require('./util'); function makeModule (modules, e, state) { if (e.framework) { @@ -305,20 +306,6 @@ function generateFromJSON (name, json, state, callback, includes) { }); } -/** - * generate - */ -function generate (name, dir, fn, custom, callback) { - if (arguments.length !== 5) { - throw new Error('update usage'); - } - fs.readFile(fn, function (err, buf) { - if (err) { return callback(err); } - // turn it into JSON - return generateFromJSON(name, dir, JSON.parse(buf), custom, callback); - }); -} - /** * parse from a buffer */ @@ -327,23 +314,6 @@ function parseBuffer(buf, fn, state) { return parser.parse(buf, fn, state); } -/** - * parse a file - */ -function parse (fn, state) { - return parseBuffer(fs.readFileSync(fn), fn, state); -} - -/** - * generate an empty state object - */ -function generateState() { - return new gencustom.ParserState(); -} - -exports.generate = generate; exports.generateFromJSON = generateFromJSON; -exports.parse = parse; exports.parseFromBuffer = parseBuffer; -exports.generateState = generateState; exports.CodeGenerator = CodeGenerator; diff --git a/packages/hyperloop-ios-metabase/lib/generate/module.js b/iphone/hooks/generate/module.js similarity index 100% rename from packages/hyperloop-ios-metabase/lib/generate/module.js rename to iphone/hooks/generate/module.js diff --git a/packages/hyperloop-ios-metabase/lib/generate/struct.js b/iphone/hooks/generate/struct.js similarity index 100% rename from packages/hyperloop-ios-metabase/lib/generate/struct.js rename to iphone/hooks/generate/struct.js diff --git a/packages/hyperloop-ios-metabase/templates/builtins/titanium.js b/iphone/hooks/generate/templates/builtins/titanium.js similarity index 100% rename from packages/hyperloop-ios-metabase/templates/builtins/titanium.js rename to iphone/hooks/generate/templates/builtins/titanium.js diff --git a/packages/hyperloop-ios-metabase/templates/class.ejs b/iphone/hooks/generate/templates/class.ejs similarity index 100% rename from packages/hyperloop-ios-metabase/templates/class.ejs rename to iphone/hooks/generate/templates/class.ejs diff --git a/packages/hyperloop-ios-metabase/templates/custom.m.ejs b/iphone/hooks/generate/templates/custom.m.ejs similarity index 100% rename from packages/hyperloop-ios-metabase/templates/custom.m.ejs rename to iphone/hooks/generate/templates/custom.m.ejs diff --git a/packages/hyperloop-ios-metabase/templates/module.ejs b/iphone/hooks/generate/templates/module.ejs similarity index 100% rename from packages/hyperloop-ios-metabase/templates/module.ejs rename to iphone/hooks/generate/templates/module.ejs diff --git a/packages/hyperloop-ios-metabase/templates/module.m.ejs b/iphone/hooks/generate/templates/module.m.ejs similarity index 100% rename from packages/hyperloop-ios-metabase/templates/module.m.ejs rename to iphone/hooks/generate/templates/module.m.ejs diff --git a/packages/hyperloop-ios-metabase/templates/struct.ejs b/iphone/hooks/generate/templates/struct.ejs similarity index 100% rename from packages/hyperloop-ios-metabase/templates/struct.ejs rename to iphone/hooks/generate/templates/struct.ejs diff --git a/packages/hyperloop-ios-metabase/lib/generate/util.js b/iphone/hooks/generate/util.js similarity index 99% rename from packages/hyperloop-ios-metabase/lib/generate/util.js rename to iphone/hooks/generate/util.js index 0ba0747e..4406c473 100644 --- a/packages/hyperloop-ios-metabase/lib/generate/util.js +++ b/iphone/hooks/generate/util.js @@ -29,7 +29,7 @@ var path = require('path'), function generateTemplate (type, detail) { var render = templates[type]; if (!render) { - var template = path.join(__dirname, '..', '..', 'templates', type + '.ejs'); + var template = path.join(__dirname, 'templates', type + '.ejs'); var content = fs.readFileSync(template).toString(); render = ejs.compile(content); templates[type] = render; diff --git a/iphone/hooks/hyperloop.js b/iphone/hooks/hyperloop.js index 17f86bdb..8edbfd26 100644 --- a/iphone/hooks/hyperloop.js +++ b/iphone/hooks/hyperloop.js @@ -10,32 +10,34 @@ module.exports = HyperloopiOSBuilder; // set this to enforce a ios-min-version -var IOS_MIN = '8.0'; +const IOS_MIN = '8.0'; // set this to enforce a minimum Titanium SDK -var TI_MIN = '7.0.0'; +const TI_MIN = '7.0.0'; // set the iOS SDK minium -var IOS_SDK_MIN = '9.0'; +const IOS_SDK_MIN = '9.0'; // enum for ios javascript core -var coreLib = { +const coreLib = { JSCore: 'libhyperloop-jscore.a', TiCore: 'libhyperloop-ticore.a' }; -var path = require('path'), - exec = require('child_process').exec, - hm = require('hyperloop-metabase'), - ModuleMetadata = hm.metabase.ModuleMetadata, - fs = require('fs-extra'), - crypto = require('crypto'), - chalk = hm.chalk, - async = hm.async, - HL = chalk.magenta.inverse('Hyperloop'), - semver = require('semver'); +const path = require('path'); +const exec = require('child_process').exec; +const hm = require('hyperloop-metabase'); +const metabase = hm.metabase; +const ModuleMetadata = metabase.ModuleMetadata; +const fs = require('fs-extra'); +const crypto = require('crypto'); +const chalk = require('chalk'); +const async = require('async'); +const HL = chalk.magenta.inverse('Hyperloop'); +const semver = require('semver'); const babylon = require('babylon'); const t = require('babel-types'); const generate = require('babel-generator').default; const traverse = require('babel-traverse').default; +const generator = require('./generate'); /** * The Hyperloop builder object. Contains the build logic and state. @@ -451,7 +453,7 @@ HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(obj, sourceFile // parse the contents // TODO: move all the regex require stuff into the parser - this.parserState = hm.generate.parseFromBuffer(contents, sourceFilename, this.parserState || undefined); + this.parserState = generator.parseFromBuffer(contents, sourceFilename, this.parserState || undefined); // empty AST if (!this.parserState) { @@ -974,7 +976,7 @@ HyperloopiOSBuilder.prototype.generateStubs = function generateStubs(callback) { // now generate the stubs this.logger.debug('Generating stubs'); var started = Date.now(); - hm.generate.generateFromJSON( + generator.generateFromJSON( this.builder.tiapp.name, this.metabase, this.parserState, @@ -983,7 +985,7 @@ HyperloopiOSBuilder.prototype.generateStubs = function generateStubs(callback) { return callback(err); } - var codeGenerator = new hm.generate.CodeGenerator(sourceSet, modules, this); + var codeGenerator = new generator.CodeGenerator(sourceSet, modules, this); codeGenerator.generate(this.hyperloopJSDir); var duration = Date.now() - started; diff --git a/iphone/hooks/package-lock.json b/iphone/hooks/package-lock.json index 3e63926c..64d6c15f 100644 --- a/iphone/hooks/package-lock.json +++ b/iphone/hooks/package-lock.json @@ -10,9 +10,20 @@ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "1.9.1" + } + }, + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "requires": { + "lodash": "4.17.4" + } }, "babel-code-frame": { "version": "6.26.0", @@ -22,6 +33,30 @@ "chalk": "1.1.3", "esutils": "2.0.2", "js-tokens": "3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } } }, "babel-generator": { @@ -89,17 +124,28 @@ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "requires": { - "ansi-styles": "2.2.1", + "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "supports-color": "4.5.0" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "requires": { + "color-name": "1.1.3" } }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, "core-js": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", @@ -121,6 +167,11 @@ "repeating": "2.0.1" } }, + "ejs": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", + "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -137,9 +188,9 @@ "integrity": "sha1-ZQnwEmr0wXhVHPqZOU4DLhOk1W4=" }, "fs-extra": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", - "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", "requires": { "graceful-fs": "4.1.11", "jsonfile": "4.0.0", @@ -164,6 +215,11 @@ "ansi-regex": "2.1.1" } }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, "invariant": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", @@ -248,9 +304,12 @@ } }, "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "requires": { + "has-flag": "2.0.0" + } }, "to-fast-properties": { "version": "1.0.3", diff --git a/iphone/hooks/package.json b/iphone/hooks/package.json index 4c05bcf9..a024409b 100644 --- a/iphone/hooks/package.json +++ b/iphone/hooks/package.json @@ -21,11 +21,15 @@ } ], "dependencies": { + "async": "^2.6.0", "babel-generator": "^6.26.0", "babel-traverse": "^6.26.0", "babel-types": "^6.26.0", "babylon": "^6.18.0", + "chalk": "^2.3.0", + "ejs": "^2.5.7", "findit": "^2.0.0", - "fs-extra": "^4.0.2" - } + "fs-extra": "^4.0.3" + }, + "devDependencies": {} } diff --git a/package-lock.json b/package-lock.json index c49e6dc7..6a768714 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,12 +4,223 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "acorn": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.0.tgz", + "integrity": "sha512-bkLTrtPfRASTxDXFaih7SbeYSsQ8MjrqCQKMrgZ4Hc7kYI//WVU6rDTAIqVrAudjgMFQEGthYfodtaw8dTRJrg==" + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" + } + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=" + }, + "ansi-escapes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "requires": { + "sprintf-js": "1.0.3" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, "async": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", "dev": true }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "1.9.1" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, "colors": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", @@ -18,7 +229,7 @@ }, "commander": { "version": "2.9.0", - "resolved": "http://registry.ecd.axway.int:8081/artifactory/api/npm/registry-npm/commander/-/commander-2.9.0.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", "dev": true, "requires": { @@ -33,6 +244,347 @@ } } }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "eslint": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.16.0.tgz", + "integrity": "sha512-YVXV4bDhNoHHcv0qzU4Meof7/P26B4EuaktMi5L1Tnt52Aov85KmYA8c5D+xyZr/BkhvwUqr011jDSD/QTULxg==", + "requires": { + "ajv": "5.5.2", + "babel-code-frame": "6.26.0", + "chalk": "2.3.0", + "concat-stream": "1.6.0", + "cross-spawn": "5.1.0", + "debug": "3.1.0", + "doctrine": "2.1.0", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "1.0.0", + "espree": "3.5.2", + "esquery": "1.0.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", + "glob": "7.1.2", + "globals": "11.3.0", + "ignore": "3.3.7", + "imurmurhash": "0.1.4", + "inquirer": "3.3.0", + "is-resolvable": "1.1.0", + "js-yaml": "3.10.0", + "json-stable-stringify-without-jsonify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "7.0.0", + "progress": "2.0.0", + "require-uncached": "1.0.3", + "semver": "5.3.0", + "strip-ansi": "4.0.0", + "strip-json-comments": "2.0.1", + "table": "4.0.2", + "text-table": "0.2.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "2.0.2" + } + } + } + }, + "eslint-config-axway": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/eslint-config-axway/-/eslint-config-axway-2.0.11.tgz", + "integrity": "sha512-XODwUjS7P+qaI/1mQKNSuKFIYzPlRrchI3F9ulTwY9O66XERYr9CJjSze7O1lOmflXgYChjmDo18kymySsSykg==", + "dev": true, + "requires": { + "eslint-plugin-import": "2.8.0", + "eslint-plugin-security": "1.4.0", + "find-root": "1.1.0", + "semver": "5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + } + } + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "requires": { + "debug": "2.6.9", + "resolve": "1.5.0" + } + }, + "eslint-module-utils": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", + "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "pkg-dir": "1.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", + "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", + "dev": true, + "requires": { + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.3.2", + "eslint-module-utils": "2.1.1", + "has": "1.0.1", + "lodash.cond": "4.5.2", + "minimatch": "3.0.4", + "read-pkg-up": "2.0.0" + } + }, + "eslint-plugin-security": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.4.0.tgz", + "integrity": "sha512-xlS7P2PLMXeqfhyf3NpqbvbnW04kN8M9NtmhpR3XGyOvt/vNKS7XPXT5EDbwKW9vCjWH4PpfQvgD/+JgN0VJKA==", + "dev": true, + "requires": { + "safe-regex": "1.1.0" + } + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "requires": { + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==" + }, + "espree": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", + "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", + "requires": { + "acorn": "5.4.0", + "acorn-jsx": "3.0.1" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "requires": { + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "external-editor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", + "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.19", + "tmp": "0.0.33" + } + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "requires": { + "flat-cache": "1.3.0", + "object-assign": "4.1.1" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, "fs-extra": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.0.0.tgz", @@ -60,6 +612,321 @@ } } }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "globals": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz", + "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==" + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "requires": { + "ansi-escapes": "3.0.0", + "chalk": "2.3.0", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.1.0", + "figures": "2.0.0", + "lodash": "4.17.4", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "requires": { + "is-path-inside": "1.0.1" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + } + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "dev": true + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, "node-appc": { "version": "0.2.21", "resolved": "https://registry.npmjs.org/node-appc/-/node-appc-0.2.21.tgz", @@ -473,6 +1340,222 @@ } } }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.3.0", + "validate-npm-package-license": "3.0.1" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "1.1.0" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.2.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, "request": { "version": "2.27.0", "resolved": "https://registry.npmjs.org/request/-/request-2.27.0.tgz", @@ -657,12 +1740,205 @@ } } }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "7.1.2" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "requires": { + "rx-lite": "4.0.8" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, "semver": { "version": "5.3.0", - "resolved": "http://registry.ecd.axway.int:8081/artifactory/api/npm/registry-npm/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "requires": { + "is-fullwidth-code-point": "2.0.0" + } + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", "dev": true }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "requires": { + "ajv": "5.5.2", + "ajv-keywords": "2.1.1", + "chalk": "2.3.0", + "lodash": "4.17.4", + "slice-ansi": "1.0.0", + "string-width": "2.1.1" + } + }, "temp": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/temp/-/temp-0.6.0.tgz", @@ -699,6 +1975,16 @@ } } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, "titanium": { "version": "git://github.com/appcelerator/titanium.git#b871ba474bc6f604f2681a2d850156503031c36b", "dev": true, @@ -1712,6 +2998,73 @@ } } } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "1.1.2" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "requires": { + "isexe": "2.0.0" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "requires": { + "mkdirp": "0.5.1" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" } } } diff --git a/package.json b/package.json index d929a57c..8356b09b 100644 --- a/package.json +++ b/package.json @@ -40,11 +40,15 @@ "async": "~0.9.0", "colors": "~0.6.2", "commander": "*", + "eslint-config-axway": "^2.0.11", "fs-extra": "~2.0.0", "node-appc": "0.2.21", "request": "~2.27.0", "semver": "^5.1.0", "temp": "~0.6.0", "titanium": "git://github.com/appcelerator/titanium.git#master" + }, + "dependencies": { + "eslint": "^4.16.0" } } diff --git a/packages/hyperloop-ios-metabase/lib/generate.js b/packages/hyperloop-ios-metabase/lib/generate.js deleted file mode 100644 index ba26640b..00000000 --- a/packages/hyperloop-ios-metabase/lib/generate.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Hyperloop Metabase Generator - * Copyright (c) 2015 by Appcelerator, Inc. - */ -var gen = require('./generate/index'); - -// for testing -if (module.id === ".") { - // var fs = require('fs'); - // !fs.existsSync('build') && fs.mkdirSync('build'); - // !fs.existsSync('build/hyperloop') && fs.mkdirSync('build/hyperloop'); - // - // fs.writeFileSync('build/hyperloop/example.js', '\n'+ - // '(function() {var MyClass=Hyperloop.defineClass("MyClass","UIView");\n' + - // 'MyClass.addMethod({\n'+ - // 'selector:"drawRect:", encoding:"v@:{CGRect={CGPoint=dd}{CGSize=dd}}", callback:function() { },\n' + - // '})\n' + - // 'MyClass.addMethod({\n'+ - // 'selector:"foo", encoding:"@@:", callback:function() { }\n' + - // '})\n' + - // 'MyClass.addMethod({\n'+ - // 'selector:"charstar", encoding:"*@:", callback:function() { }\n' + - // '})\n' + - // 'MyClass.addMethod({\n'+ - // 'selector:"intpointer", encoding:"^i@:", callback:function() { }\n' + - // '})\n' + - // 'MyClass.addMethod({\n'+ - // 'signature:"foo:bar:", arguments:["float","int"], callback:function() { }\n' + - // '})\n' + - // 'MyClass.addMethod({\n'+ - // 'selector:"float", encoding:"f@:", callback:function() { }\n' + - // '})' + - // '})();'); - // - // fs.writeFileSync('build/hyperloop/example2.js', '\n'+ - // '(function() {var MyClass2=Hyperloop.defineClass("MyClass2","UILabel");\n' + - // 'MyClass2.addMethod({\n'+ - // 'selector:"drawRect:", encoding:"v@:{CGRect={CGPoint=dd}{CGSize=dd}}", callback:function() { },\n' + - // '})\n' + - // '})();'); - // - // var state = gen.parse('build/hyperloop/example.js'); - // state = gen.parse('build/hyperloop/example2.js', state); - var state = gen.generateState(); - gen.generate('hyperloop', 'build/hyperloop', 'build/metabase-9.0-iphonesimulator-f0220749b5e279c3aee5b7a9a0c9437b.json', state, function (err) { - if (err) { - console.error(err); - process.exit(1); - } - }); -} diff --git a/packages/hyperloop-ios-metabase/lib/index.js b/packages/hyperloop-ios-metabase/lib/index.js index f1accd9a..562c22e0 100644 --- a/packages/hyperloop-ios-metabase/lib/index.js +++ b/packages/hyperloop-ios-metabase/lib/index.js @@ -3,6 +3,6 @@ * Copyright (c) 2015 by Appcelerator, Inc. */ -exports.generate = require('./generate/'); exports.metabase = require('./metabase'); -exports.util = require('./generate/util'); +exports.swift = require('./swift'); +exports.util = require('./util'); diff --git a/packages/hyperloop-ios-metabase/lib/metabase.js b/packages/hyperloop-ios-metabase/lib/metabase.js index fea9ab45..7c35d97e 100644 --- a/packages/hyperloop-ios-metabase/lib/metabase.js +++ b/packages/hyperloop-ios-metabase/lib/metabase.js @@ -13,7 +13,7 @@ var spawn = require('child_process').spawn, semver = require('semver'), crypto = require('crypto'), chalk = require('chalk'), - util = require('./generate/util'), + util = require('./util'), swiftlilb = require('./swift'), binary = path.join(__dirname, '..', 'bin', 'metabase'); diff --git a/packages/hyperloop-ios-metabase/lib/swift.js b/packages/hyperloop-ios-metabase/lib/swift.js index a907410b..dc898ea4 100644 --- a/packages/hyperloop-ios-metabase/lib/swift.js +++ b/packages/hyperloop-ios-metabase/lib/swift.js @@ -4,7 +4,7 @@ */ var fs = require('fs'), util = require('util'), - utillib = require('./generate/util'), + utillib = require('./util'), spawn = require('child_process').spawn; /** diff --git a/packages/hyperloop-ios-metabase/lib/util.js b/packages/hyperloop-ios-metabase/lib/util.js new file mode 100644 index 00000000..c6b07640 --- /dev/null +++ b/packages/hyperloop-ios-metabase/lib/util.js @@ -0,0 +1,87 @@ +/** + * Hyperloop Metabase Generator + * Copyright (c) 2015 by Appcelerator, Inc. + */ +var chalk = require('chalk'), + logger = { + info: function () { + console.log.apply(console, arguments); + }, + debug: function () { + console.log.apply(console, arguments); + }, + trace: function () { + console.log.apply(console, arguments); + }, + warn: function () { + console.log.apply(console, arguments); + }, + error: function () { + console.error.apply(console, arguments); + } + }; + + +function createLogger(log, level) { + log[level] && (logger[level] = function () { + var args = Array.prototype.slice.call(arguments); + log[level].call(log, chalk.magenta.inverse('[Hyperloop]') + ' ' + args.join(' ')); + }); +} + +function setLog (logFn) { + ['info','debug','warn','error','trace'].forEach(function (level) { + createLogger(logFn, level); + }); +} + +exports.setLog = setLog; + +Object.defineProperty(exports, 'logger', { + get: function () { + return logger; + } +}); + + +function isPrimitive(type) { + switch (type) { + case 'i': + case 'c': + case 'd': + case 'f': + case 'B': + case 's': + case 'l': + case 'q': + case 'L': + case 'Q': + case 'I': + case 'S': + case 'C': + case 'int': + case 'uint': + case 'unsigned int': + case 'long': + case 'ulong': + case 'unsigned long': + case 'ulonglong': + case 'unsigned long long': + case 'long long': + case 'long_long': + case 'double': + case 'short': + case 'ushort': + case 'unsigned short': + case 'float': + case 'bool': + case 'uchar': + case 'unsigned char': + case 'char': + case 'char_s': + case 'constant_array': + return true; + } + return false; +} +exports.isPrimitive = isPrimitive; diff --git a/packages/hyperloop-ios-metabase/package.json b/packages/hyperloop-ios-metabase/package.json index a2c7c999..139cd6fb 100644 --- a/packages/hyperloop-ios-metabase/package.json +++ b/packages/hyperloop-ios-metabase/package.json @@ -34,15 +34,10 @@ "should": "^7.0.2" }, "dependencies": { - "acorn": "^2.4.0", "async": "^1.4.2", "chalk": "^1.1.1", - "ejs": "^2.3.4", - "escodegen": "^1.7.0", "plist": "^1.1.0", - "rewire": "^2.5.2", "semver": "^5.0.3", - "walk-ast": "0.0.2", "fs-extra": "^2.0.0" } } From 4e1593f3f455d98f935b95b2b4f8af9c90504be2 Mon Sep 17 00:00:00 2001 From: Christopher Williams Date: Mon, 5 Feb 2018 13:05:10 -0500 Subject: [PATCH 05/10] Try to use bablyon/babel to traverse AST in generate/custom.js --- iphone/hooks/generate/custom.js | 188 ++--- package-lock.json | 1314 ++++++------------------------- package.json | 5 +- 3 files changed, 287 insertions(+), 1220 deletions(-) diff --git a/iphone/hooks/generate/custom.js b/iphone/hooks/generate/custom.js index db96c00b..510421cf 100644 --- a/iphone/hooks/generate/custom.js +++ b/iphone/hooks/generate/custom.js @@ -595,86 +595,72 @@ Parser.prototype.parse = function (buf, fn, state) { buf = buf.toString(); const ast = babylon.parse(buf, { sourceFilename: fn, sourceType: 'module' }); - var mutated, - prop; + let mutated = false; const ASTWalker = { - - }; - traverse(ast, ASTWalker); - - - - walk(ast, function (node) { - // console.log(node.type); - node.loc.filename = fn; - - // do symbol detection first - switch (node.type) { - case 'ExpressionStatement': { - node.expression && addSymbolReference(state, node.expression, 'getter'); - break; + ExpressionStatement: function(p) { + p.node.expression && addSymbolReference(state, p.node.expression, 'getter'); + }, + CallExpression: function(p) { + // do symbol detection first + addSymbolReference(state, p.node.callee, 'getter'); + if (p.node.callee.property) { + const prop = p.node.callee.property.name; + isValidSymbol(prop) && (state.References.functions[prop] = (state.References.functions[prop] || 0) + 1); } - case 'CallExpression': { - addSymbolReference(state, node.callee, 'getter'); - if (node.callee.property) { - prop = node.callee.property.name; - isValidSymbol(prop) && (state.References.functions[prop] = (state.References.functions[prop] || 0) + 1); - } - if (node.arguments && node.arguments.length) { - node.arguments.forEach(function (arg) { - addSymbolReference(state, arg, 'getter'); - }); - } - if (node.callee.name) { - prop = node.callee.name; - isValidSymbol(prop) && (state.References.functions[prop] = (state.References.functions[prop] || 0) + 1); - } - addMigrationHelpIfNeeded(state, node); - break; + if (p.node.arguments && p.node.arguments.length) { + p.node.arguments.forEach(function (arg) { + addSymbolReference(state, arg, 'getter'); + }); } - case 'VariableDeclaration': { - // console.log(util.inspect(node, {colors:true, depth:10})); - if (node.declarations && node.declarations.length) { - node.declarations.forEach(function (decl) { - decl.init && addSymbolReference(state, decl.init, 'getter'); - }); - } - break; + if (p.node.callee.name) { + const prop = p.node.callee.name; + isValidSymbol(prop) && (state.References.functions[prop] = (state.References.functions[prop] || 0) + 1); } - case 'MemberExpression': { - if (!/^(AssignmentExpression|CallExpression|ExpressionStatement|VariableDeclaration)$/.test(node.parentNode.type)) { - addSymbolReference(state, node, 'getter'); - addMigrationHelpIfNeeded(state, node); + addMigrationHelpIfNeeded(state, p.node); + + if (isHyperloopMethodCall(node, 'defineClass')) { + if (p.parent.type !== 'VariableDeclaration') { + throw new JSParseError('Hyperloop.defineClass must return a class definition into a variable', p.node); } - break; - } - case 'AssignmentExpression': { - addSymbolReference(state, node.left, 'setter'); - addSymbolReference(state, node.right, 'getter'); - break; + var classSpec = makeHyperloopClassFromCall(state, p.node); + if (classSpec.name in state.classesByName) { + throw new JSParseError('Hyperloop.defineClass cannot define multiple classes with the same name "' + classSpec.name + '"', p.node); + } + if (classSpec.variable in state.classesByVariable) { + throw new JSParseError('Hyperloop.defineClass cannot define multiple classes with the same variable name "' + classSpec.variable + '"', p.node); + } + state.classesByName[classSpec.name] = classSpec; + state.classesByVariable[classSpec.variable] = classSpec; + } else if (isHyperloopAddMethodCall(p.node, state)) { + mutated = true; + p.replaceWith(addHyperloopMethodToClass(p.node, state)); } - default: break; - } - if (isHyperloopMethodCall(node, 'defineClass')) { - if (node.parentNode.type !== 'VariableDeclaration') { - throw new JSParseError('Hyperloop.defineClass must return a class definition into a variable', node); + }, + VariableDeclaration: function(p) { + // console.log(util.inspect(node, {colors:true, depth:10})); + if (p.node.declarations && p.node.declarations.length) { + p.node.declarations.forEach(function (decl) { + decl.init && addSymbolReference(state, decl.init, 'getter'); + }); } - var classSpec = makeHyperloopClassFromCall(state, node); - if (classSpec.name in state.classesByName) { - throw new JSParseError('Hyperloop.defineClass cannot define multiple classes with the same name "' + classSpec.name + '"', node); + }, + MemberExpression: function(p) { + if (!/^(AssignmentExpression|CallExpression|ExpressionStatement|VariableDeclaration)$/.test(p.parent.type)) { + addSymbolReference(state, p.node, 'getter'); + addMigrationHelpIfNeeded(state, p.node); } - if (classSpec.variable in state.classesByVariable) { - throw new JSParseError('Hyperloop.defineClass cannot define multiple classes with the same variable name "' + classSpec.variable + '"', node); + }, + AssignmentExpression: function(p) { + addSymbolReference(state, p.node.left, 'setter'); + addSymbolReference(state, p.node.right, 'getter'); + }, + Identifier: function(p) { + if (isHyperloopReferenced(p.node, state)) { + // just record } - state.classesByName[classSpec.name] = classSpec; - state.classesByVariable[classSpec.variable] = classSpec; - } else if (isHyperloopAddMethodCall(node, state)) { - mutated = true; - return addHyperloopMethodToClass(node, state); - } else if (isHyperloopReferenced(node, state)) { - // just record } - }); + }; + traverse(ast, ASTWalker); var code; // re-generate if it changed, otherwise we can skip and use original content @@ -713,7 +699,7 @@ function isHyperloopAddMethodCall (node, state) { function isHyperloopReferenced (node, state) { if (node.type === 'Identifier' && node.name in state.classesByVariable) { - if (!isHyperloopAddMethodCall(node.parentNode && node.parentNode.parentNode, state)) { + if (!isHyperloopAddMethodCall(node.parent && node.parent.parent, state)) { var classDef = state.classesByVariable[node.name]; state.referencedClasses[classDef.name] = (state.referencedClasses[classDef.name] || 0) + 1; } @@ -801,7 +787,7 @@ function makeHyperloopClassFromCall (state, node) { classSpec.extends = toJSObject(program, node.arguments[1], 'NSObject'); classSpec.implements = toJSObject(program, node.arguments[2]); var declarationNode = null; - node.parentNode.declarations.forEach(function(declNode) { + node.parent.declarations.forEach(function(declNode) { if (declNode.init === node) { declarationNode = declNode; } @@ -830,7 +816,7 @@ function makeHyperloopClassFromCall (state, node) { function findProgramNode (node) { var parent = node; while (parent && parent.type !== 'Program') { - parent = parent.parentNode; + parent = parent.parent; } return parent; } @@ -942,56 +928,14 @@ function addHyperloopMethodToClass (node, state) { })[0]; // update the properties - node.arguments[0].properties = [ - { - type: 'Property', - loc: node.loc, - key: { - loc: node.loc, - type: 'Identifier', - name: 'selector' - }, - value: { - loc: node.loc, - type: 'Literal', - value: methodSpec.selector, - raw: "'" + methodSpec.selector + "'" - } - }, - { - type: 'Property', - loc: node.loc, - key: { - loc: node.loc, - type: 'Identifier', - name: 'encoding' - }, - value: { - loc: node.loc, - type: 'Literal', - value: methodSpec.encoding, - raw: "'" + methodSpec.encoding + "'" - } - }, - { - type: 'Property', - loc: node.loc, - key: { - loc: node.loc, - type: 'Identifier', - name: 'instance' - }, - value: { - loc: node.loc, - type: 'Literal', - value: methodSpec.instance, - raw: methodSpec.instance - } - }, + // node.arguments[0] == ObjectExpression, with properties == [ObjectProperty, ObjectProperty] + node.arguments[0] = t.objectExpression([ + t.objectProperty(t.identifier('selector'), t.stringLiteral(methodSpec.selector)), + t.objectProperty(t.identifier('encoding'), t.stringLiteral(methodSpec.encoding)), + t.objectProperty(t.identifier('instance'), t.booleanLiteral(methodSpec.instance)), callback - ]; - - return node; + ]); + return t.callExpression(node.callee, node.arguments); } module.exports = Parser; diff --git a/package-lock.json b/package-lock.json index 6a768714..09d3b5b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,12 +7,14 @@ "acorn": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.0.tgz", - "integrity": "sha512-bkLTrtPfRASTxDXFaih7SbeYSsQ8MjrqCQKMrgZ4Hc7kYI//WVU6rDTAIqVrAudjgMFQEGthYfodtaw8dTRJrg==" + "integrity": "sha512-bkLTrtPfRASTxDXFaih7SbeYSsQ8MjrqCQKMrgZ4Hc7kYI//WVU6rDTAIqVrAudjgMFQEGthYfodtaw8dTRJrg==", + "dev": true }, "acorn-jsx": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, "requires": { "acorn": "3.3.0" }, @@ -20,7 +22,8 @@ "acorn": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true } } }, @@ -28,6 +31,7 @@ "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, "requires": { "co": "4.6.0", "fast-deep-equal": "1.0.0", @@ -38,27 +42,32 @@ "ajv-keywords": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=" + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true }, "ansi-escapes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==" + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "dev": true }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true }, "argparse": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, "requires": { "sprintf-js": "1.0.3" } @@ -67,6 +76,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, "requires": { "array-uniq": "1.0.3" } @@ -74,12 +84,14 @@ "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true }, "async": { "version": "0.9.2", @@ -91,6 +103,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, "requires": { "chalk": "1.1.3", "esutils": "2.0.2", @@ -101,6 +114,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, "requires": { "ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", @@ -113,6 +127,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -122,12 +137,14 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -143,6 +160,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, "requires": { "callsites": "0.2.0" } @@ -150,12 +168,14 @@ "callsites": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true }, "chalk": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", @@ -166,6 +186,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, "requires": { "color-convert": "1.9.1" } @@ -174,6 +195,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, "requires": { "has-flag": "2.0.0" } @@ -183,17 +205,20 @@ "chardet": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true }, "circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, "requires": { "restore-cursor": "2.0.0" } @@ -201,17 +226,20 @@ "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true }, "color-convert": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, "requires": { "color-name": "1.1.3" } @@ -219,7 +247,8 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "colors": { "version": "0.6.2", @@ -247,12 +276,14 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "concat-stream": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, "requires": { "inherits": "2.0.3", "readable-stream": "2.3.3", @@ -268,12 +299,14 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, "requires": { "lru-cache": "4.1.1", "shebang-command": "1.2.0", @@ -292,12 +325,14 @@ "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true }, "del": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, "requires": { "globby": "5.0.0", "is-path-cwd": "1.0.0", @@ -330,12 +365,14 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "eslint": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.16.0.tgz", - "integrity": "sha512-YVXV4bDhNoHHcv0qzU4Meof7/P26B4EuaktMi5L1Tnt52Aov85KmYA8c5D+xyZr/BkhvwUqr011jDSD/QTULxg==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.17.0.tgz", + "integrity": "sha512-AyxBUCANU/o/xC0ijGMKavo5Ls3oK6xykiOITlMdjFjrKOsqLrA7Nf5cnrDgcKrHzBirclAZt63XO7YZlVUPwA==", + "dev": true, "requires": { "ajv": "5.5.2", "babel-code-frame": "6.26.0", @@ -380,6 +417,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, "requires": { "ms": "2.0.0" } @@ -388,6 +426,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, "requires": { "esutils": "2.0.2" } @@ -465,6 +504,7 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, "requires": { "esrecurse": "4.2.0", "estraverse": "4.2.0" @@ -473,12 +513,14 @@ "eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==" + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true }, "espree": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", + "dev": true, "requires": { "acorn": "5.4.0", "acorn-jsx": "3.0.1" @@ -487,12 +529,14 @@ "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true }, "esquery": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, "requires": { "estraverse": "4.2.0" } @@ -501,6 +545,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, "requires": { "estraverse": "4.2.0", "object-assign": "4.1.1" @@ -509,17 +554,20 @@ "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true }, "external-editor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "dev": true, "requires": { "chardet": "0.4.2", "iconv-lite": "0.4.19", @@ -529,22 +577,26 @@ "fast-deep-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, "requires": { "escape-string-regexp": "1.0.5" } @@ -553,6 +605,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, "requires": { "flat-cache": "1.3.0", "object-assign": "4.1.1" @@ -578,6 +631,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, "requires": { "circular-json": "0.3.3", "del": "2.2.2", @@ -615,7 +669,8 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "function-bind": { "version": "1.1.1", @@ -626,12 +681,14 @@ "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -644,12 +701,14 @@ "globals": { "version": "11.3.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz", - "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==" + "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==", + "dev": true }, "globby": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, "requires": { "array-union": "1.0.2", "arrify": "1.0.1", @@ -662,7 +721,8 @@ "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true }, "has": { "version": "1.0.1", @@ -677,6 +737,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -684,7 +745,8 @@ "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true }, "hosted-git-info": { "version": "2.5.0", @@ -695,22 +757,26 @@ "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true }, "ignore": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==" + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -719,12 +785,14 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, "requires": { "ansi-escapes": "3.0.0", "chalk": "2.3.0", @@ -760,17 +828,20 @@ "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true }, "is-path-in-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, "requires": { "is-path-inside": "1.0.1" } @@ -779,6 +850,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, "requires": { "path-is-inside": "1.0.2" } @@ -786,32 +858,38 @@ "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true }, "is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true }, "js-yaml": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "dev": true, "requires": { "argparse": "1.0.9", "esprima": "4.0.0" @@ -820,17 +898,20 @@ "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, "requires": { "prelude-ls": "1.1.2", "type-check": "0.3.2" @@ -869,7 +950,8 @@ "lodash": { "version": "4.17.4", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true }, "lodash.cond": { "version": "4.5.2", @@ -881,6 +963,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" @@ -889,12 +972,14 @@ "mimic-fn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "dev": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "1.1.8" } @@ -902,12 +987,14 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "requires": { "minimist": "0.0.8" } @@ -915,17 +1002,20 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true }, "node-appc": { "version": "0.2.21", @@ -1355,12 +1445,14 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1.0.2" } @@ -1369,6 +1461,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, "requires": { "mimic-fn": "1.1.0" } @@ -1377,6 +1470,7 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, "requires": { "deep-is": "0.1.3", "fast-levenshtein": "2.0.6", @@ -1389,7 +1483,8 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true }, "p-limit": { "version": "1.2.0", @@ -1436,12 +1531,14 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true }, "path-parse": { "version": "1.0.5", @@ -1461,17 +1558,20 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, "requires": { "pinkie": "2.0.4" } @@ -1488,27 +1588,32 @@ "pluralize": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true }, "process-nextick-args": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true }, "progress": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=" + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true }, "read-pkg": { "version": "2.0.0", @@ -1546,6 +1651,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", @@ -1744,6 +1850,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, "requires": { "caller-path": "0.1.0", "resolve-from": "1.0.1" @@ -1761,12 +1868,14 @@ "resolve-from": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, "requires": { "onetime": "2.0.1", "signal-exit": "3.0.2" @@ -1782,6 +1891,7 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, "requires": { "glob": "7.1.2" } @@ -1790,6 +1900,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, "requires": { "is-promise": "2.1.0" } @@ -1797,12 +1908,14 @@ "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true }, "rx-lite-aggregates": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, "requires": { "rx-lite": "4.0.8" } @@ -1810,7 +1923,8 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true }, "safe-regex": { "version": "1.1.0", @@ -1824,12 +1938,14 @@ "semver": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, "requires": { "shebang-regex": "1.0.0" } @@ -1837,17 +1953,20 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true }, "slice-ansi": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0" } @@ -1876,12 +1995,14 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -1891,6 +2012,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, "requires": { "safe-buffer": "5.1.1" } @@ -1899,6 +2021,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { "ansi-regex": "3.0.0" }, @@ -1906,7 +2029,8 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true } } }, @@ -1919,17 +2043,20 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true }, "table": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, "requires": { "ajv": "5.5.2", "ajv-keywords": "2.1.1", @@ -1978,1031 +2105,20 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "titanium": { - "version": "git://github.com/appcelerator/titanium.git#b871ba474bc6f604f2681a2d850156503031c36b", - "dev": true, - "requires": { - "adm-zip": "0.4.7", - "async": "2.1.2", - "colors": "1.1.2", - "fields": "0.1.24", - "fs-extra": "2.0.0", - "humanize": "0.0.9", - "longjohn": "0.2.11", - "moment": "2.16.0", - "node-appc": "0.2.41", - "request": "2.79.0", - "semver": "5.3.0", - "sprintf": "0.1.5", - "temp": "0.8.3", - "winston": "1.1.2" - }, - "dependencies": { - "adm-zip": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz", - "integrity": "sha1-hgbCy/HEJs6MjsABdER/1Jtur8E=", - "dev": true - }, - "async": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.1.2.tgz", - "integrity": "sha1-YSpKtF70KnDN6Aa62G7m2wR+g4U=", - "dev": true, - "requires": { - "lodash": "4.17.4" - }, - "dependencies": { - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - } - } - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, - "fields": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/fields/-/fields-0.1.24.tgz", - "integrity": "sha1-vtk7HCUh9HBf52T0IJJn/f2J9dM=", - "dev": true, - "requires": { - "colors": "0.6.2", - "keypress": "0.2.1", - "sprintf": "0.1.5" - }, - "dependencies": { - "colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", - "dev": true - }, - "keypress": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.2.1.tgz", - "integrity": "sha1-HoBFQlABjbrUw/6USX1uZ7YmnHc=", - "dev": true - } - } - }, - "humanize": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/humanize/-/humanize-0.0.9.tgz", - "integrity": "sha1-GZT/rs3+nEQe0r2sdFK3u0yeQaQ=", - "dev": true - }, - "longjohn": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/longjohn/-/longjohn-0.2.11.tgz", - "integrity": "sha1-g3NqFa5fSHEbYlFT6YAS8t5lnmk=", - "dev": true, - "requires": { - "source-map-support": "0.3.2" - }, - "dependencies": { - "source-map-support": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.3.2.tgz", - "integrity": "sha1-c31ckB4LeP21OspxPSTyPMuxC+E=", - "dev": true, - "requires": { - "source-map": "0.1.32" - }, - "dependencies": { - "source-map": { - "version": "0.1.32", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", - "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - }, - "dependencies": { - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - } - } - } - } - } - } - }, - "moment": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.16.0.tgz", - "integrity": "sha1-848sl8mImw7hj8bMOS4eRDrS2o4=", - "dev": true - }, - "node-appc": { - "version": "0.2.41", - "resolved": "https://registry.npmjs.org/node-appc/-/node-appc-0.2.41.tgz", - "integrity": "sha1-9oz1rLYHxJA+L2MCQ4Oulbof3FI=", - "dev": true, - "requires": { - "adm-zip": "0.4.7", - "async": "2.1.4", - "colors": "1.1.2", - "diff": "3.2.0", - "node-uuid": "1.4.7", - "optimist": "0.6.1", - "request": "2.79.0", - "semver": "5.3.0", - "sprintf": "0.1.5", - "temp": "0.8.3", - "uglify-js": "2.7.5", - "wrench": "1.5.9", - "xmldom": "0.1.27" - }, - "dependencies": { - "async": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz", - "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=", - "dev": true, - "requires": { - "lodash": "4.17.4" - }, - "dependencies": { - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - } - } - }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", - "dev": true - }, - "node-uuid": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", - "integrity": "sha1-baWhdmjEs91ZYjvaEc9/pMH2Cm8=", - "dev": true - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "0.0.10", - "wordwrap": "0.0.3" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } - } - }, - "uglify-js": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.5.tgz", - "integrity": "sha1-RhLAx7qu4rp8SH3kkErhIgefLKg=", - "dev": true, - "requires": { - "async": "0.2.10", - "source-map": "0.5.6", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - }, - "dependencies": { - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - }, - "dependencies": { - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", - "dev": true - } - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - } - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - } - } - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "0.1.4" - }, - "dependencies": { - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", - "dev": true - } - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - } - } - } - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - } - } - } - } - }, - "wrench": { - "version": "1.5.9", - "resolved": "https://registry.npmjs.org/wrench/-/wrench-1.5.9.tgz", - "integrity": "sha1-QRaRxjqbJTGxcAJnJ5veyiOyFCo=", - "dev": true - }, - "xmldom": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", - "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", - "dev": true - } - } - }, - "request": { - "version": "2.79.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", - "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", - "dev": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.11.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "2.0.6", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "qs": "6.3.2", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.4.3", - "uuid": "3.0.1" - }, - "dependencies": { - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true - }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - }, - "dependencies": { - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - } - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - }, - "dependencies": { - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - } - } - }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "commander": "2.9.0", - "is-my-json-valid": "2.16.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "is-my-json-valid": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", - "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", - "dev": true, - "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" - }, - "dependencies": { - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "1.0.2" - }, - "dependencies": { - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - } - } - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - }, - "dependencies": { - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - } - } - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.1" - }, - "dependencies": { - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true - }, - "jsprim": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", - "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "extsprintf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "verror": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", - "dev": true, - "requires": { - "extsprintf": "1.0.2" - } - } - } - }, - "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "dev": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - } - } - } - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", - "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", - "dev": true, - "requires": { - "mime-db": "1.27.0" - }, - "dependencies": { - "mime-db": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", - "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", - "dev": true - } - } - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "qs": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", - "dev": true - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true - }, - "tough-cookie": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", - "dev": true, - "requires": { - "punycode": "1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true - }, - "uuid": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", - "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", - "dev": true - } - } - }, - "sprintf": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/sprintf/-/sprintf-0.1.5.tgz", - "integrity": "sha1-j4PjmpMXwaUCy324BQ5Rxnn27c8=", - "dev": true - }, - "temp": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", - "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2", - "rimraf": "2.2.8" - }, - "dependencies": { - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true - } - } - }, - "winston": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/winston/-/winston-1.1.2.tgz", - "integrity": "sha1-aO3Xaf951PlSjPDl2AAhqt5nSAw=", - "dev": true, - "requires": { - "async": "1.0.0", - "colors": "1.0.3", - "cycle": "1.0.3", - "eyes": "0.1.8", - "isstream": "0.1.2", - "pkginfo": "0.3.1", - "stack-trace": "0.0.10" - }, - "dependencies": { - "async": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", - "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=", - "dev": true - }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - }, - "cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", - "dev": true - }, - "eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "pkginfo": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=", - "dev": true - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - } - } - } - } + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, "requires": { "os-tmpdir": "1.0.2" } @@ -3011,6 +2127,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, "requires": { "prelude-ls": "1.1.2" } @@ -3018,12 +2135,14 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "validate-npm-package-license": { "version": "3.0.1", @@ -3039,6 +2158,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, "requires": { "isexe": "2.0.0" } @@ -3046,17 +2166,20 @@ "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "write": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, "requires": { "mkdirp": "0.5.1" } @@ -3064,7 +2187,8 @@ "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true } } } diff --git a/package.json b/package.json index 8356b09b..ebe3f9d2 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "async": "~0.9.0", "colors": "~0.6.2", "commander": "*", + "eslint": "^4.17.0", "eslint-config-axway": "^2.0.11", "fs-extra": "~2.0.0", "node-appc": "0.2.21", @@ -48,7 +49,5 @@ "temp": "~0.6.0", "titanium": "git://github.com/appcelerator/titanium.git#master" }, - "dependencies": { - "eslint": "^4.16.0" - } + "dependencies": {} } From 0e055c171d4e6e20c5520fde41b2ea6ba0ed2506 Mon Sep 17 00:00:00 2001 From: Christopher Williams Date: Mon, 5 Feb 2018 15:40:05 -0500 Subject: [PATCH 06/10] Working version for ios --- iphone/hooks/generate/custom.js | 115 ++++++++++++++++++++++---------- iphone/hooks/generate/index.js | 2 +- iphone/hooks/hyperloop.js | 23 ++----- 3 files changed, 86 insertions(+), 54 deletions(-) diff --git a/iphone/hooks/generate/custom.js b/iphone/hooks/generate/custom.js index 510421cf..f9eaa0d1 100644 --- a/iphone/hooks/generate/custom.js +++ b/iphone/hooks/generate/custom.js @@ -618,11 +618,11 @@ Parser.prototype.parse = function (buf, fn, state) { } addMigrationHelpIfNeeded(state, p.node); - if (isHyperloopMethodCall(node, 'defineClass')) { - if (p.parent.type !== 'VariableDeclaration') { + if (isHyperloopMethodCall(p.node, 'defineClass')) { + if (p.parent.type !== 'VariableDeclaration' && p.parent.type !== 'VariableDeclarator') { throw new JSParseError('Hyperloop.defineClass must return a class definition into a variable', p.node); } - var classSpec = makeHyperloopClassFromCall(state, p.node); + var classSpec = makeHyperloopClassFromCall(state, p); if (classSpec.name in state.classesByName) { throw new JSParseError('Hyperloop.defineClass cannot define multiple classes with the same name "' + classSpec.name + '"', p.node); } @@ -633,11 +633,10 @@ Parser.prototype.parse = function (buf, fn, state) { state.classesByVariable[classSpec.variable] = classSpec; } else if (isHyperloopAddMethodCall(p.node, state)) { mutated = true; - p.replaceWith(addHyperloopMethodToClass(p.node, state)); + addHyperloopMethodToClass(p, state); } }, VariableDeclaration: function(p) { - // console.log(util.inspect(node, {colors:true, depth:10})); if (p.node.declarations && p.node.declarations.length) { p.node.declarations.forEach(function (decl) { decl.init && addSymbolReference(state, decl.init, 'getter'); @@ -655,7 +654,7 @@ Parser.prototype.parse = function (buf, fn, state) { addSymbolReference(state, p.node.right, 'getter'); }, Identifier: function(p) { - if (isHyperloopReferenced(p.node, state)) { + if (isHyperloopReferenced(p, state)) { // just record } } @@ -671,7 +670,7 @@ Parser.prototype.parse = function (buf, fn, state) { return new ParserState(state, code); }; -function isHyperloopMethodCall (node, method) { +function isHyperloopMethodCall(node, method) { return node && node.type === 'CallExpression' && node.callee && @@ -684,7 +683,7 @@ function isHyperloopMethodCall (node, method) { node.callee.property.name === method; } -function isHyperloopAddMethodCall (node, state) { +function isHyperloopAddMethodCall(node, state) { return node && node.type === 'CallExpression' && node.callee && @@ -697,16 +696,30 @@ function isHyperloopAddMethodCall (node, state) { node.callee.object.name in state.classesByVariable; } -function isHyperloopReferenced (node, state) { +/** + * [isHyperloopReferenced description] + * @param {Object} p Babylon AST node path + * @param {[type]} state [description] + * @return {Boolean} [description] + */ +function isHyperloopReferenced(p, state) { + const node = p.node; if (node.type === 'Identifier' && node.name in state.classesByVariable) { - if (!isHyperloopAddMethodCall(node.parent && node.parent.parent, state)) { + if (!isHyperloopAddMethodCall(p.parent && p.parentPath.parent, state)) { var classDef = state.classesByVariable[node.name]; state.referencedClasses[classDef.name] = (state.referencedClasses[classDef.name] || 0) + 1; } } } -function findVariableDefinition (program, name, def) { +/** + * [findVariableDefinition description] + * @param {Object} program Babylon AST node for the program/file + * @param {String} name variable name + * @param {String} def default value + * @return {String} [description] + */ +function findVariableDefinition(program, name, def) { var body = program.body; for (var c = 0; c < body.length; c++) { var node = body[c]; @@ -725,10 +738,22 @@ function findVariableDefinition (program, name, def) { throw new JSParseError('could not find variable "' + name + '"', program); } -function toJSObject (ref, node, def) { +/** + * [toJSObject description] + * @param {Object} ref Babylon AST node for program/file + * @param {Object} node Babylon AST node + * @param {String|Object|Number} def default value + * @return {String|Object|Number} [description] + */ +function toJSObject(ref, node, def) { if (node) { switch (node.type) { - case 'Literal': { + case 'Literal': // ESTree + case 'StringLiteral': // Babylon replacements... + case 'NumericLiteral': + case 'BooleanLiteral': + case 'NullLiteral': + case 'RegExpLiteral': { return node.value; } case 'ArrayExpression': { @@ -763,7 +788,7 @@ function toJSObject (ref, node, def) { return !+right; } } - return eval (op + right); + return eval(op + right); } } throw new JSParseError("Not sure what to do with this node: " + node.type, node); @@ -776,25 +801,36 @@ function toJSObject (ref, node, def) { * example call: * * var MyUIView = Hyperloop.defineClass('MyUIView', 'UIView', ['Foo']); + * @param {Object} state + * @param {Object} p - Babylon Path: https://github.com/thejameskyle/babel-handbook/blob/master/translations/en/plugin-handbook.md#toc-paths */ -function makeHyperloopClassFromCall (state, node) { - var classSpec = {}; +function makeHyperloopClassFromCall(state, p) { + const node = p.node; if (node.arguments.length < 1) { throw new JSParseError('Hyperloop.defineClass requires at least 1 argument "className"', node); } - var program = findProgramNode(node); + + const program = findProgramNode(p); + + const classSpec = {}; classSpec.name = toJSObject(program, node.arguments[0]); classSpec.extends = toJSObject(program, node.arguments[1], 'NSObject'); classSpec.implements = toJSObject(program, node.arguments[2]); - var declarationNode = null; - node.parent.declarations.forEach(function(declNode) { - if (declNode.init === node) { - declarationNode = declNode; - } - }); + + let declarationNode = null; + if (p.parent.type === 'VariableDeclarator') { + declarationNode = p.parent; + } else { // VariableDeclaration is parent + p.parent.declarations.forEach(function(declNode) { + if (declNode.init === node) { + declarationNode = declNode; + } + }); + } if (declarationNode === null) { throw new JSParseError('Unable determine designated variable for Hyperloop.defineClass call.'); } + classSpec.variable = declarationNode.id.name; classSpec.location = node.loc; classSpec.importClasses = {}; @@ -813,12 +849,16 @@ function makeHyperloopClassFromCall (state, node) { return classSpec; } -function findProgramNode (node) { - var parent = node; - while (parent && parent.type !== 'Program') { - parent = parent.parent; - } - return parent; +/** + * [findProgramNode description] + * @param {Object} nodePath Babylon AST path for a given node + * @return {Node} Node for the Program + */ +function findProgramNode(nodePath) { + const programPath = nodePath.findParent(function(p) { + return p.isProgram(); + }); + return programPath.node; } function encodeFriendlyType (type, imports) { @@ -859,14 +899,20 @@ function encodeFriendlyType (type, imports) { } } -function addHyperloopMethodToClass (node, state) { +/** + * [addHyperloopMethodToClass description] + * @param {Object} p Babylon AST node path + * @param {[type]} state [description] + */ +function addHyperloopMethodToClass(p, state) { + const node = p.node; var name = node.callee.object.name; var classSpec = state.classesByVariable[name]; classSpec.methods = classSpec.methods || {}; if (!node.arguments || !node.arguments.length) { throw new JSParseError('addMethod requires at least 1 argument (methodSpec)', node); } - var methodSpec = toJSObject(findProgramNode(node), node.arguments[0]); + var methodSpec = toJSObject(findProgramNode(p), node.arguments[0]); // allow signature instead of selector: // signature: 'tableView:heightForRowAtIndexPath:', @@ -928,14 +974,13 @@ function addHyperloopMethodToClass (node, state) { })[0]; // update the properties - // node.arguments[0] == ObjectExpression, with properties == [ObjectProperty, ObjectProperty] - node.arguments[0] = t.objectExpression([ + node.arguments[0].properties = [ t.objectProperty(t.identifier('selector'), t.stringLiteral(methodSpec.selector)), t.objectProperty(t.identifier('encoding'), t.stringLiteral(methodSpec.encoding)), t.objectProperty(t.identifier('instance'), t.booleanLiteral(methodSpec.instance)), callback - ]); - return t.callExpression(node.callee, node.arguments); + ]; + return node; } module.exports = Parser; diff --git a/iphone/hooks/generate/index.js b/iphone/hooks/generate/index.js index 47ff8050..99e81ac0 100644 --- a/iphone/hooks/generate/index.js +++ b/iphone/hooks/generate/index.js @@ -127,7 +127,7 @@ function processProtocolInheritance (protocols) { } function generateBuiltins (json, callback) { - var dir = path.join(__dirname, '..', '..', 'templates', 'builtins'); + var dir = path.join(__dirname, 'templates', 'builtins'); fs.readdir(dir, function (err, files) { if (err) { return callback(err); } async.eachSeries(files, function (fn, cb) { diff --git a/iphone/hooks/hyperloop.js b/iphone/hooks/hyperloop.js index 8edbfd26..fac83c97 100644 --- a/iphone/hooks/hyperloop.js +++ b/iphone/hooks/hyperloop.js @@ -88,29 +88,16 @@ function HyperloopiOSBuilder(logger, config, cli, appc, hyperloopConfig, builder hm.util.setLog(builder.logger); } -/** - * called for each JS resource to process them - */ -HyperloopiOSBuilder.prototype.copyResource = function (builder, callback) { - try { - this.patchJSFile(builder.args[0], builder.args[1], callback); - } catch (e) { - callback(e); - } -}; - /** * called for each JS resource to process them */ HyperloopiOSBuilder.prototype.compileJsFile = function (builder, callback) { try { const obj = builder.args[0]; - const contents = obj.contents; - const originalSource = obj.original; const from = builder.args[1]; const to = builder.args[2]; - this.patchJSFile(obj, from, callback); + this.patchJSFile(obj, from, to, callback); } catch (e) { callback(e); } @@ -491,7 +478,7 @@ HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(obj, sourceFile const include = framework && framework.typeMap[className]; const isBuiltin = pkg === 'Titanium'; - logger.trace('Checking require for: ' + pkg.toLowerCase() + '/' + className.toLowerCase()); + self.logger.trace('Checking require for: ' + pkg.toLowerCase() + '/' + className.toLowerCase()); // if the framework is not found, then check if it was possibly mispelled if (!framework && !isBuiltin) { @@ -583,7 +570,7 @@ HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(obj, sourceFile self.usedFrameworks.set(pkg, self.frameworks.get(pkg)); } - p.node.specifiers.each(function (spec) { + p.node.specifiers.forEach(function (spec) { // import UIView from 'UIKit/UIView'; spec.imported is undefined and tok[1] holds className // import { UIView } from 'UIKit'; spec.imported.name == 'UIView' const className = (spec.imported ? spec.imported.name : tok[1]); @@ -592,7 +579,7 @@ HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(obj, sourceFile // as it should be: import UIKit from 'UIKit/UIKit'; or import { UIView } from 'UIKit'; // FIXME: Should we bomb out with an error saying it's ambiguous import? const include = framework && framework.typeMap[className]; - logger.trace('Checking import for: ' + pkg.toLowerCase() + '/' + className.toLowerCase()); + self.logger.trace('Checking import for: ' + pkg.toLowerCase() + '/' + className.toLowerCase()); // if we haven't found it by now, then we try to help before failing if (!include && className !== pkg && !isBuiltin) { @@ -655,13 +642,13 @@ HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(obj, sourceFile if (contents === newContents) { this.logger.debug('No change, skipping ' + chalk.cyan(destinationFilename)); - cb(); } else { this.logger.debug('Writing ' + chalk.cyan(destinationFilename)); // modify the contents stored int he state object passed thorugh the hook, // so that SDK CLI can use new contents for minification/transpilation obj.contents = newContents; } + cb(); }; /** From 642dcf75a811bca9abe236786f3e945de77eb2e6 Mon Sep 17 00:00:00 2001 From: Christopher Williams Date: Mon, 5 Feb 2018 16:03:06 -0500 Subject: [PATCH 07/10] A little cleanup. Don't replace the 'original' source in the compileJsFile callback data for Android, just the 'contents'. --- android/hooks/hyperloop.js | 12 +++++----- iphone/hooks/generate/block.js | 14 +++++++----- iphone/hooks/generate/class.js | 11 ++++----- iphone/hooks/generate/code-generator.js | 8 +++---- iphone/hooks/generate/custom.js | 30 ++++++++++++------------- iphone/hooks/generate/index.js | 12 +++++----- iphone/hooks/generate/module.js | 13 ++++++----- iphone/hooks/generate/struct.js | 11 ++++----- iphone/hooks/hyperloop.js | 11 ++++----- 9 files changed, 61 insertions(+), 61 deletions(-) diff --git a/android/hooks/hyperloop.js b/android/hooks/hyperloop.js index 2337a347..35cfec0a 100644 --- a/android/hooks/hyperloop.js +++ b/android/hooks/hyperloop.js @@ -150,14 +150,12 @@ exports.cliVersion = '>=3.2'; cli.on('build.android.compileJsFile', { priority: 99999, pre: function (data, finished) { - var fn = data.args[1]; - if (files[fn]) { - data.args[0]['original'] = files[fn]; - data.args[0]['contents'] = files[fn]; - finished(); - } else { - finished(); + var filename = data.args[1]; // source filename + if (files[filename]) { + // modify the source code for the given file to our manipulated contents + data.args[0].contents = files[filename]; } + finished(); } }); diff --git a/iphone/hooks/generate/block.js b/iphone/hooks/generate/block.js index 7aaa472d..0721c1fc 100644 --- a/iphone/hooks/generate/block.js +++ b/iphone/hooks/generate/block.js @@ -2,7 +2,8 @@ * Hyperloop Metabase Generator * Copyright (c) 2015 by Appcelerator, Inc. */ -var util = require('./util'); +'use strict'; +const util = require('./util'); function getBlockAsReturnVariable (name, block) { var i = block.indexOf('(^)'); @@ -10,7 +11,7 @@ function getBlockAsReturnVariable (name, block) { } //FIXME this needs to be refactored along with the method above -function generateBlockCallback (state, json, block, arg, tab, define) { +function generateBlockCallback(state, json, block, arg, tab, define) { // TODO: do we need to wrap the callback in a managed object and then // JS protect/unprotect? // see http://thirdcog.eu/pwcblocks/#objcblocks @@ -39,11 +40,11 @@ function generateBlockCallback (state, json, block, arg, tab, define) { /** * return a suitable (and unique )method name for a block signature */ -function generateBlockMethodName (signature) { +function generateBlockMethodName(signature) { return 'Block_' + util.generateSafeSymbol(signature); } -function getType (state, json, arg, argname, obj) { +function getType(state, json, arg, argname, obj) { switch (arg.value) { case 'ObjectType': case 'KeyType': @@ -59,7 +60,7 @@ function getType (state, json, arg, argname, obj) { } } -function addImport (state, json, type, value, encoding) { +function addImport(state, json, type, value, encoding) { switch (type) { case 'id': case 'objc_pointer': @@ -85,7 +86,8 @@ function addImport (state, json, type, value, encoding) { } } -function generateBlockWrapper (state, json, block) { +// TODO: Move to template! +function generateBlockWrapper(state, json, block) { var code = [], argnames = []; var name = generateBlockMethodName(block.signature); code.push('+ (id) ' + name + ':(KrollCallback *) callback {'); diff --git a/iphone/hooks/generate/class.js b/iphone/hooks/generate/class.js index 6bee8617..ec3dc69d 100644 --- a/iphone/hooks/generate/class.js +++ b/iphone/hooks/generate/class.js @@ -1,11 +1,12 @@ /** * Hyperloop Metabase Generator - * Copyright (c) 2015 by Appcelerator, Inc. + * Copyright (c) 2015-2018 by Appcelerator, Inc. */ -var util = require('./util'), - swift = require('hyperloop-metabase').swift; +'use strict'; +const util = require('./util'); +const swift = require('hyperloop-metabase').swift; -function makeClass (json, cls, state) { +function makeClass(json, cls, state) { var entry = { class: { name: cls.name, @@ -127,7 +128,7 @@ function isClassProperty(propertyMetadata) { /** * Generates the source template data for a class file */ -function generate (json, cls, state) { +function generate(json, cls, state) { return makeClass(json, cls, state); } diff --git a/iphone/hooks/generate/code-generator.js b/iphone/hooks/generate/code-generator.js index 5c145ab7..57d4fbf2 100644 --- a/iphone/hooks/generate/code-generator.js +++ b/iphone/hooks/generate/code-generator.js @@ -2,10 +2,10 @@ 'use strict'; -var chalk = require('chalk'); -var fs = require('fs-extra'); -var path = require('path'); -var util = require('./util'); +const chalk = require('chalk'); +const fs = require('fs-extra'); +const path = require('path'); +const util = require('./util'); /** * A generator for Hyperloop source code files diff --git a/iphone/hooks/generate/custom.js b/iphone/hooks/generate/custom.js index f9eaa0d1..6771615f 100644 --- a/iphone/hooks/generate/custom.js +++ b/iphone/hooks/generate/custom.js @@ -3,26 +3,25 @@ * Copyright (c) 2015-2018 by Appcelerator, Inc. */ 'use strict'; -var fs = require('fs'), - path = require('path'), - util = require('util'), - utillib = require('./util'), - classgen = require('./class'); - +const fs = require('fs'); +const path = require('path'); +const util = require('util'); +const utillib = require('./util'); +const classgen = require('./class'); const babylon = require('babylon'); const t = require('babel-types'); const generate = require('babel-generator').default; const traverse = require('babel-traverse').default; -function Parser () { +function Parser() { } -function ParserState (state, code) { +function ParserState(state, code) { this.state = state || {}; this.code = code || ''; } -function JSParseError (message, node) { +function JSParseError(message, node) { this.line = (node.loc || node.location).start.line; this.column = (node.loc || node.location).start.column; this.filename = (node.loc || node.location).filename; @@ -66,7 +65,7 @@ ParserState.prototype.getReferences = function () { return this.state.References; }; -function count (str, find) { +function count(str, find) { var re = new RegExp(find, 'g'); var found = str.match(re); return found && found.length || 0; @@ -85,7 +84,7 @@ function decodeStruct(str, offset) { return str; } -function getEncoding (state, metabase, imports, str, index) { +function getEncoding(state, metabase, imports, str, index) { var ch = str.charAt(index), skip, enc, @@ -225,7 +224,7 @@ function getEncoding (state, metabase, imports, str, index) { throw new Error("unknown encoding " + str + ' start at index ' + index); } -function parseEncoding (state, metabase, imports, encoding) { +function parseEncoding(state, metabase, imports, encoding) { var i = encoding.indexOf('@:'); var rt = encoding.substring(0, i); var argtypes = encoding.substring(i + 2); @@ -241,11 +240,12 @@ function parseEncoding (state, metabase, imports, encoding) { }; } -function generateIdentifier (selector, instance, cls) { +function generateIdentifier(selector, instance, cls) { return utillib.generateSafeSymbol(cls.name + '_' + selector + '_' + (instance ? '1': '0')); } -function generateMethod (state, metabase, imports, cls, classDef, selector, encoding, instance, body) { +// FIXME: Move this out to a template? +function generateMethod(state, metabase, imports, cls, classDef, selector, encoding, instance, body) { var details = parseEncoding(state, metabase, imports, encoding), argnames = selector.split(':'), code = [], @@ -861,7 +861,7 @@ function findProgramNode(nodePath) { return programPath.node; } -function encodeFriendlyType (type, imports) { +function encodeFriendlyType(type, imports) { switch (type) { case 'long': return 'l'; case 'int': return 'i'; diff --git a/iphone/hooks/generate/index.js b/iphone/hooks/generate/index.js index 99e81ac0..2642c873 100644 --- a/iphone/hooks/generate/index.js +++ b/iphone/hooks/generate/index.js @@ -14,7 +14,7 @@ const gencustom = require('./custom'); const CodeGenerator = require('./code-generator'); const util = require('./util'); -function makeModule (modules, e, state) { +function makeModule(modules, e, state) { if (e.framework) { if (!(e.framework in modules)) { modules[e.framework] = { @@ -34,7 +34,7 @@ function makeModule (modules, e, state) { } } -function merge (src, dest) { +function merge(src, dest) { if (src) { dest = dest || {}; for (var k in src) { @@ -54,7 +54,7 @@ function merge (src, dest) { * @param {String} proto The protocol to look for in parent classes * @return {bool} True if protocol already implemented in a parent class, false otherwise. */ -function isProtocolImplementedBySuperClass (json, cls, proto) { +function isProtocolImplementedBySuperClass(json, cls, proto) { var parentClass = cls && cls.superclass; while (parentClass) { if (parentClass.protocols && parentClass.protocols.indexOf(proto) !== -1) { @@ -73,7 +73,7 @@ function isProtocolImplementedBySuperClass (json, cls, proto) { * * @param {Object} protocols Object with protocols from the metabase */ -function processProtocolInheritance (protocols) { +function processProtocolInheritance(protocols) { var mergedProtocols = []; /** * Recursively merges a protocol with all it's inherited protocols @@ -126,7 +126,7 @@ function processProtocolInheritance (protocols) { }); } -function generateBuiltins (json, callback) { +function generateBuiltins(json, callback) { var dir = path.join(__dirname, 'templates', 'builtins'); fs.readdir(dir, function (err, files) { if (err) { return callback(err); } @@ -137,7 +137,7 @@ function generateBuiltins (json, callback) { }); } -function generateFromJSON (name, json, state, callback, includes) { +function generateFromJSON(name, json, state, callback, includes) { // set the name of the app in the state object state.appName = name; diff --git a/iphone/hooks/generate/module.js b/iphone/hooks/generate/module.js index 9b24becf..2a69b3c5 100644 --- a/iphone/hooks/generate/module.js +++ b/iphone/hooks/generate/module.js @@ -1,12 +1,13 @@ /** * Hyperloop Metabase Generator - * Copyright (c) 2015 by Appcelerator, Inc. + * Copyright (c) 2015-2018 by Appcelerator, Inc. */ -var util = require('./util'), - path = require('path'), - fs = require('fs'); +'use strict'; +const util = require('./util'); +const path = require('path'); +const fs = require('fs'); -function makeModule (json, module, state) { +function makeModule(json, module, state) { var entry = { class: { name: module.name, @@ -65,7 +66,7 @@ function makeModule (json, module, state) { * Generates the source template data for a module file and it's module * objective-c class */ -function generate (json, mod, state) { +function generate(json, mod, state) { // for now, skip non frameworks if (mod.framework.indexOf('/') >= 0 || mod.customSource) { return; } // generate the objective-c module diff --git a/iphone/hooks/generate/struct.js b/iphone/hooks/generate/struct.js index dbdc0eb6..30963d42 100644 --- a/iphone/hooks/generate/struct.js +++ b/iphone/hooks/generate/struct.js @@ -1,10 +1,11 @@ /** * Hyperloop Metabase Generator - * Copyright (c) 2015 by Appcelerator, Inc. + * Copyright (c) 2015-2018 by Appcelerator, Inc. */ -var util = require('./util'); +'use strict'; +const util = require('./util'); -function generateStructField (state, json, prop, index) { +function generateStructField(state, json, prop, index) { var result = {name:prop.name}; var sep = util.repeat('\t', 4); result.getter = '\t' + util.generateFieldGetter(state, json, prop, index); @@ -12,7 +13,7 @@ function generateStructField (state, json, prop, index) { return result; } -function makeStruct (json, struct) { +function makeStruct(json, struct) { var entry = { class: { name: struct.name, @@ -60,7 +61,7 @@ function makeStruct (json, struct) { /** * Generates the source template data for a struct file */ -function generate (json, struct) { +function generate(json, struct) { return makeStruct(json, struct); } diff --git a/iphone/hooks/hyperloop.js b/iphone/hooks/hyperloop.js index fac83c97..da1d4e40 100644 --- a/iphone/hooks/hyperloop.js +++ b/iphone/hooks/hyperloop.js @@ -439,7 +439,8 @@ HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(obj, sourceFile // look for any require which matches our hyperloop system frameworks // parse the contents - // TODO: move all the regex require stuff into the parser + // TODO: move all the HyperloopVisitor require/import manipulation into the parser call right here + // Otherwise we do two parser/ast-traversal/generation passes! this.parserState = generator.parseFromBuffer(contents, sourceFilename, this.parserState || undefined); // empty AST @@ -447,7 +448,7 @@ HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(obj, sourceFile return cb(); } - var relPath = path.relative(this.resourcesDir, destinationFilename); + const relPath = path.relative(this.resourcesDir, destinationFilename); // get the result source code in case it was transformed and replace all system framework // require() calls with the Hyperloop layer @@ -606,11 +607,7 @@ HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(obj, sourceFile self.includes[include] = 1; } - // replace the require to point to our generated file path - // FIXME: what are the specifiers in this case? - // Single specifier that is: - // t.importDefaultSpecifier(local) == import local from 'mod-name'; - // t.importNamespaceSpecifier(local) == import * as local from 'mod-name'; + // replace the import to point to our generated file path replacements.push(t.importDeclaration([t.importDefaultSpecifier(spec.local)], t.stringLiteral('/' + ref))); }); From d6272d5315c1428d7a7917ebab12f37f8a416446 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hans=20Kn=C3=B6chel?= Date: Sun, 11 Feb 2018 13:22:03 +0100 Subject: [PATCH 08/10] Trigger new build --- iphone/hooks/generate/custom.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iphone/hooks/generate/custom.js b/iphone/hooks/generate/custom.js index 6771615f..4952d406 100644 --- a/iphone/hooks/generate/custom.js +++ b/iphone/hooks/generate/custom.js @@ -749,7 +749,7 @@ function toJSObject(ref, node, def) { if (node) { switch (node.type) { case 'Literal': // ESTree - case 'StringLiteral': // Babylon replacements... + case 'StringLiteral': // Babylon replacements case 'NumericLiteral': case 'BooleanLiteral': case 'NullLiteral': From 5ec20116fad2c69bc0f78ffb354b49d21f3444f1 Mon Sep 17 00:00:00 2001 From: Christopher Williams Date: Wed, 14 Mar 2018 12:52:09 -0400 Subject: [PATCH 09/10] When on SDKs < 7.1, hook on build.ios.copyResource and write the modified contents to file. On SDK 7.1+, hook on build.ios.compileJsFile and modify the contents in-memory. --- iphone/hooks/hyperloop.js | 124 +++++++++++++++++++++++++++----------- 1 file changed, 88 insertions(+), 36 deletions(-) diff --git a/iphone/hooks/hyperloop.js b/iphone/hooks/hyperloop.js index da1d4e40..1970e697 100644 --- a/iphone/hooks/hyperloop.js +++ b/iphone/hooks/hyperloop.js @@ -13,6 +13,8 @@ module.exports = HyperloopiOSBuilder; const IOS_MIN = '8.0'; // set this to enforce a minimum Titanium SDK const TI_MIN = '7.0.0'; +// Min SDK to use the newer build.ios.compileJsFile hook +const COMPILE_JS_FILE_HOOK_SDK_MIN = '7.1.0'; // set the iOS SDK minium const IOS_SDK_MIN = '9.0'; // enum for ios javascript core @@ -83,16 +85,56 @@ function HyperloopiOSBuilder(logger, config, cli, appc, hyperloopConfig, builder this.cocoaPodsProducts = []; this.headers = null; this.needMigration = {}; + this.useCopyResourceHook = false; // boolean flag to determine which CLi hook to use based on SDK version // set our CLI logger hm.util.setLog(builder.logger); } +/** + * called for each resource to process them + */ +HyperloopiOSBuilder.prototype.copyResource = function (builder, callback) { + try { + // Use this variant of the hook on SDK 7.0.2 and lower + if (!this.useCopyResourceHook) { + return callback(); + } + const from = builder.args[0]; + const to = builder.args[1]; + const contents = fs.readFileSync(to).toString(); + const obj = { + contents: contents, + original: contents + }; + + this.patchJSFile(obj, from, to, function (err) { + if (err) { + return callback(err); + } + + // Only write if contents changed + if (contents !== obj.contents) { + fs.writeFile(to, obj.contents, callback); + } else { + callback(); + } + }); + } catch (e) { + callback(e); + } +}; + /** * called for each JS resource to process them */ HyperloopiOSBuilder.prototype.compileJsFile = function (builder, callback) { try { + // use this variant of the hook on SDK 7.1+ + if (this.useCopyResourceHook) { + return callback(); + } + const obj = builder.args[0]; const from = builder.args[1]; const to = builder.args[2]; @@ -207,6 +249,10 @@ HyperloopiOSBuilder.prototype.setup = function setup() { // create a temporary hyperloop directory fs.ensureDirSync(this.hyperloopBuildDir); + if (!this.appc.version.gte(this.builder.titaniumSdkVersion, COMPILE_JS_FILE_HOOK_SDK_MIN)) { + this.useCopyResourceHook = true; + } + // update to use the correct libhyperloop based on which JS engine is configured this.builder.nativeLibModules.some(function (mod) { if (mod.id === 'hyperloop') { @@ -290,7 +336,7 @@ HyperloopiOSBuilder.prototype.processThirdPartyFrameworks = function processThir function arrayifyAndResolve(it) { if (it) { - return (Array.isArray(it) ? it : [it]).map(function (name) { + return (Array.isArray(it) ? it : [ it ]).map(function (name) { return path.resolve(projectDir, name); }); } @@ -307,7 +353,7 @@ HyperloopiOSBuilder.prototype.processThirdPartyFrameworks = function processThir return next(); } - hm.metabase.generateUserFrameworksMetadata(builder.frameworks, hyperloopBuildDir, function(err, modules) { + hm.metabase.generateUserFrameworksMetadata(builder.frameworks, hyperloopBuildDir, function (err, modules) { if (err) { return next(err); } @@ -430,7 +476,7 @@ HyperloopiOSBuilder.prototype.detectSwiftVersion = function detectSwiftVersion(c * @param {Function} cb - callback function */ HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(obj, sourceFilename, destinationFilename, cb) { - var contents = obj.contents; + const contents = obj.contents; // skip empty content if (!contents.length) { return cb(); @@ -456,12 +502,12 @@ HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(obj, sourceFile const self = this; const HyperloopVisitor = { // ES5-style require calls - CallExpression: function(p) { + CallExpression: function (p) { const theString = p.node.arguments[0]; let requireMatch; - if (p.get('callee').isIdentifier({name: 'require'}) && // Is this a require call? - theString && t.isStringLiteral(theString) && // Is the 1st param a literal string? - (requireMatch = theString.value.match(requireRegexp)) !== null // Is it a hyperloop require? + if (p.get('callee').isIdentifier({ name: 'require' }) // Is this a require call? + && theString && t.isStringLiteral(theString) // Is the 1st param a literal string? + && (requireMatch = theString.value.match(requireRegexp)) !== null // Is it a hyperloop require? ) { // hyperloop includes will always have a slash const tok = requireMatch[0].split('/'); @@ -489,8 +535,8 @@ HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(obj, sourceFile }); if (maybes.length) { - self.logger.warn('The iOS framework "' + pkg + '" could not be found. Are you trying to use ' + - maybes.map(function (s) { return '"' + s + '"'; }).join(' or ') + ' instead? (' + relPath + ')'); + self.logger.warn('The iOS framework "' + pkg + '" could not be found. Are you trying to use ' + + maybes.map(function (s) { return '"' + s + '"'; }).join(' or ') + ' instead? (' + relPath + ')'); } // don't inject anything return; @@ -511,7 +557,7 @@ HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(obj, sourceFile } if (soundEx(frameworkMetadata.name) === classNameSoundEx) { - throw new Error('The iOS class "' + className + '" could not be found in the framework "' + pkg + '". Are you trying to use "' + frameworkMetadata.name + '" instead? (' + relPath+ ')'); + throw new Error('The iOS class "' + className + '" could not be found in the framework "' + pkg + '". Are you trying to use "' + frameworkMetadata.name + '" instead? (' + relPath + ')'); } }, self); @@ -528,17 +574,17 @@ HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(obj, sourceFile // replace the require to point to our generated file path p.replaceWith( - t.callExpression(p.node.callee, [t.stringLiteral('/' + ref)]) + t.callExpression(p.node.callee, [ t.stringLiteral('/' + ref) ]) ); } }, // ES6+-style imports - ImportDeclaration: function(p) { + ImportDeclaration: function (p) { const theString = p.node.source; const replacements = []; let requireMatch; - if (theString && t.isStringLiteral(theString) && // module name is a string literal - (requireMatch = theString.value.match(requireRegexp)) !== null // Is it a hyperloop require? + if (theString && t.isStringLiteral(theString) // module name is a string literal + && (requireMatch = theString.value.match(requireRegexp)) !== null // Is it a hyperloop require? ) { // hyperloop includes will always have a slash const tok = requireMatch[0].split('/'); @@ -559,8 +605,8 @@ HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(obj, sourceFile }); if (maybes.length) { - self.logger.warn('The iOS framework "' + pkg + '" could not be found. Are you trying to use ' + - maybes.map(function (s) { return '"' + s + '"'; }).join(' or ') + ' instead? (' + relPath + ')'); + self.logger.warn('The iOS framework "' + pkg + '" could not be found. Are you trying to use ' + + maybes.map(function (s) { return '"' + s + '"'; }).join(' or ') + ' instead? (' + relPath + ')'); } // don't inject anything return; @@ -592,7 +638,7 @@ HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(obj, sourceFile } if (soundEx(frameworkMetadata.name) === classNameSoundEx) { - throw new Error('The iOS class "' + className + '" could not be found in the framework "' + pkg + '". Are you trying to use "' + frameworkMetadata.name + '" instead? (' + relPath+ ')'); + throw new Error('The iOS class "' + className + '" could not be found in the framework "' + pkg + '". Are you trying to use "' + frameworkMetadata.name + '" instead? (' + relPath + ')'); } }, self); @@ -608,7 +654,7 @@ HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(obj, sourceFile } // replace the import to point to our generated file path - replacements.push(t.importDeclaration([t.importDefaultSpecifier(spec.local)], t.stringLiteral('/' + ref))); + replacements.push(t.importDeclaration([ t.importDefaultSpecifier(spec.local) ], t.stringLiteral('/' + ref))); }); // Apply replacements @@ -632,7 +678,7 @@ HyperloopiOSBuilder.prototype.patchJSFile = function patchJSFile(obj, sourceFile if (needMigration.length > 0) { this.needMigration[sourceFilename] = needMigration; - needMigration.forEach(function(token) { + needMigration.forEach(function (token) { newContents = newContents.replace(token.objectName + '.' + token.methodName + '()', token.objectName + '.' + token.methodName); }); } @@ -724,7 +770,7 @@ HyperloopiOSBuilder.prototype.generateSourceFiles = function generateSourceFiles var cocoaPodsRoot = this.cocoaPodsBuildSettings.PODS_ROOT; var cocoaPodsConfigurationBuildDir = path.join(this.builder.projectDir, 'build/iphone/build/Products', this.builder.xcodeTarget + '-' + this.builder.xcodeTargetOS); var paths = source.split(' '); - paths.forEach(function(path) { + paths.forEach(function (path) { if (path === '$(inherited)') { return; } @@ -745,10 +791,10 @@ HyperloopiOSBuilder.prototype.generateSourceFiles = function generateSourceFiles this.logger.warn('Defining third-party sources and frameworks in appc.js via the \'thirdparty\' section has been deprecated in Hyperloop 2.2.0 and will be removed in 4.0.0. The preferred way to provide third-party sources is either via dropping frameworks into the project\'s platform/ios folder or by using CocoaPods.'); this.headers = []; - Object.keys(this.hyperloopConfig.ios.thirdparty).forEach(function(frameworkName) { + Object.keys(this.hyperloopConfig.ios.thirdparty).forEach(function (frameworkName) { var thirdPartyFrameworkConfig = this.hyperloopConfig.ios.thirdparty[frameworkName]; - var headerPaths = Array.isArray(thirdPartyFrameworkConfig.header) ? thirdPartyFrameworkConfig.header : [thirdPartyFrameworkConfig.header]; - headerPaths.forEach(function(headerPath) { + var headerPaths = Array.isArray(thirdPartyFrameworkConfig.header) ? thirdPartyFrameworkConfig.header : [ thirdPartyFrameworkConfig.header ]; + headerPaths.forEach(function (headerPath) { var searchPath = path.resolve(this.builder.projectDir, headerPath); extraHeaderSearchPaths.push(searchPath); extraFrameworkSearchPaths.push(searchPath); @@ -757,7 +803,7 @@ HyperloopiOSBuilder.prototype.generateSourceFiles = function generateSourceFiles }, this); } if (this.builder.frameworks) { - Object.keys(this.builder.frameworks).forEach(function(frameworkName) { + Object.keys(this.builder.frameworks).forEach(function (frameworkName) { var frameworkInfo = this.builder.frameworks[frameworkName]; extraFrameworkSearchPaths.push(path.dirname(frameworkInfo.path)); }, this); @@ -851,8 +897,8 @@ HyperloopiOSBuilder.prototype.normalizeFrameworks = function normalizeFrameworks if (entryName[0] === '/' && headerToFrameworkMap[entryName]) { var normalizedFrameworkName = headerToFrameworkMap[entryName]; var frameworkBlocks = this.metabase.blocks[normalizedFrameworkName] || []; - frameworkBlocks = frameworkBlocks.concat(this.metabase.blocks[entryName].filter(function(block) { - return frameworkBlocks.every(function(existingBlock) { + frameworkBlocks = frameworkBlocks.concat(this.metabase.blocks[entryName].filter(function (block) { + return frameworkBlocks.every(function (existingBlock) { return existingBlock.signature !== block.signature; }); })); @@ -1064,6 +1110,12 @@ HyperloopiOSBuilder.prototype.wireupBuildHooks = function wireupBuildHooks() { pre: this.hookUpdateXcodeProject.bind(this) }); + // To be removed once we no longer support SDK < 7.1 + this.cli.on('build.ios.copyResource', { + pre: this.copyResource.bind(this) + }); + + // For SDK 7.1+ this.cli.on('build.ios.compileJsFile', { pre: this.compileJsFile.bind(this) }); @@ -1105,7 +1157,7 @@ HyperloopiOSBuilder.prototype.updateXcodeProject = function updateXcodeProject() var thirdPartyFrameworksUsed = false; if (this.hyperloopConfig.ios.thirdparty) { var usedFrameworkNames = Array.from(this.usedFrameworks.keys()); - thirdPartyFrameworksUsed = Object.keys(this.hyperloopConfig.ios.thirdparty).some(function(thirdPartyFramework) { + thirdPartyFrameworksUsed = Object.keys(this.hyperloopConfig.ios.thirdparty).some(function (thirdPartyFramework) { return usedFrameworkNames.some(function (usedFrameworkName) { return usedFrameworkName === thirdPartyFramework; }, this); @@ -1197,7 +1249,7 @@ HyperloopiOSBuilder.prototype.updateXcodeProject = function updateXcodeProject() fileRef_comment: frameworkPackageName }; if (!frameworkMetadata.isAvailable(this.sdkInfo.minVersion)) { - xobjs.PBXBuildFile[buildFileUuid].settings = {ATTRIBUTES: ['Weak']}; + xobjs.PBXBuildFile[buildFileUuid].settings = { ATTRIBUTES: [ 'Weak' ] }; } xobjs.PBXBuildFile[buildFileUuid + '_comment'] = frameworkPackageName + ' in Frameworks'; @@ -1242,7 +1294,7 @@ HyperloopiOSBuilder.prototype.updateXcodeProject = function updateXcodeProject() } if (!Array.isArray(source)) { - source = [source]; + source = [ source ]; } groups[framework] || (groups[framework] = {}); @@ -1375,7 +1427,7 @@ HyperloopiOSBuilder.prototype.updateXcodeProject = function updateXcodeProject() isa: 'PBXBuildFile', fileRef: fileRefUuid, fileRef_comment: name, - settings: {COMPILER_FLAGS : '"-fobjc-arc"' } + settings: { COMPILER_FLAGS: '"-fobjc-arc"' } }; xobjs.PBXBuildFile[buildFileUuid + '_comment'] = name + ' in Sources'; @@ -1421,7 +1473,7 @@ HyperloopiOSBuilder.prototype.updateXcodeProject = function updateXcodeProject() } if (this.hasCustomShellScriptBuildPhases()) { - this.hyperloopConfig.ios.xcodebuild.scripts.forEach(function(buildPhaseOptions) { + this.hyperloopConfig.ios.xcodebuild.scripts.forEach(function (buildPhaseOptions) { if (!buildPhaseOptions.name || !buildPhaseOptions.shellScript) { throw new Error('Your appc.js contains an invalid shell script build phase. Please specify at least a "name" and the "shellScript" to run.'); } @@ -1528,7 +1580,7 @@ HyperloopiOSBuilder.prototype.hookRemoveFiles = function hookRemoveFiles(data) { } if (this.hasCocoaPods) { var productsDirectory = path.resolve(this.builder.xcodeAppDir, '..'); - this.cocoaPodsProducts.forEach(function(product) { + this.cocoaPodsProducts.forEach(function (product) { this.builder.unmarkBuildDirFiles(path.join(productsDirectory, product)); }.bind(this)); } @@ -1544,7 +1596,8 @@ HyperloopiOSBuilder.prototype.hookXcodebuild = function hookXcodebuild(data) { var substrRegExp = /(?:[^\s"]+|"[^"]*")+/g; function splitValue(value) { - var part, parts = []; + var part, + parts = []; while ((part = substrRegExp.exec(value)) !== null) { parts.push(part[0].replace(quotesRegExp, '$1')); } @@ -1610,9 +1663,8 @@ HyperloopiOSBuilder.prototype.hookXcodebuild = function hookXcodebuild(data) { addParam('HEADER_SEARCH_PATHS', header); addParam('FRAMEWORK_SEARCH_PATHS', header); }); - //For some reason, when using ticore and having custom headers, the original header search path goes missing. - //FIX ME - if(!this.builder.tiapp.ios['use-jscore-framework']) { + // FIXME: For some reason, when using ticore and having custom headers, the original header search path goes missing. + if (!this.builder.tiapp.ios['use-jscore-framework']) { addParam('HEADER_SEARCH_PATHS', 'headers'); } } From 0b595c63967f9effc2f0fb3f07da2d5757bc995a Mon Sep 17 00:00:00 2001 From: Christopher Williams Date: Mon, 19 Mar 2018 13:55:57 -0400 Subject: [PATCH 10/10] Hook on build.ios.copyResource as a 'post' hook, not 'pre'! --- iphone/hooks/hyperloop.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iphone/hooks/hyperloop.js b/iphone/hooks/hyperloop.js index 1970e697..5ed9d12d 100644 --- a/iphone/hooks/hyperloop.js +++ b/iphone/hooks/hyperloop.js @@ -1112,7 +1112,7 @@ HyperloopiOSBuilder.prototype.wireupBuildHooks = function wireupBuildHooks() { // To be removed once we no longer support SDK < 7.1 this.cli.on('build.ios.copyResource', { - pre: this.copyResource.bind(this) + post: this.copyResource.bind(this) }); // For SDK 7.1+