mirror of
https://github.com/apache/cordova-android.git
synced 2025-02-20 23:56:20 +08:00
CB-14145 commit updated node_modules in 7.1.x only
(installed by npm@6.1.0)
This commit is contained in:
parent
3071bb313f
commit
6758793f09
46
node_modules/abbrev/LICENSE
generated
vendored
Normal file
46
node_modules/abbrev/LICENSE
generated
vendored
Normal file
@ -0,0 +1,46 @@
|
||||
This software is dual-licensed under the ISC and MIT licenses.
|
||||
You may use this software under EITHER of the following licenses.
|
||||
|
||||
----------
|
||||
|
||||
The ISC License
|
||||
|
||||
Copyright (c) Isaac Z. Schlueter and Contributors
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
|
||||
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
----------
|
||||
|
||||
Copyright Isaac Z. Schlueter and Contributors
|
||||
All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
files (the "Software"), to deal in the Software without
|
||||
restriction, including without limitation the rights to use,
|
||||
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
23
node_modules/abbrev/README.md
generated
vendored
Normal file
23
node_modules/abbrev/README.md
generated
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
# abbrev-js
|
||||
|
||||
Just like [ruby's Abbrev](http://apidock.com/ruby/Abbrev).
|
||||
|
||||
Usage:
|
||||
|
||||
var abbrev = require("abbrev");
|
||||
abbrev("foo", "fool", "folding", "flop");
|
||||
|
||||
// returns:
|
||||
{ fl: 'flop'
|
||||
, flo: 'flop'
|
||||
, flop: 'flop'
|
||||
, fol: 'folding'
|
||||
, fold: 'folding'
|
||||
, foldi: 'folding'
|
||||
, foldin: 'folding'
|
||||
, folding: 'folding'
|
||||
, foo: 'foo'
|
||||
, fool: 'fool'
|
||||
}
|
||||
|
||||
This is handy for command-line scripts, or other cases where you want to be able to accept shorthands.
|
61
node_modules/abbrev/abbrev.js
generated
vendored
Normal file
61
node_modules/abbrev/abbrev.js
generated
vendored
Normal file
@ -0,0 +1,61 @@
|
||||
module.exports = exports = abbrev.abbrev = abbrev
|
||||
|
||||
abbrev.monkeyPatch = monkeyPatch
|
||||
|
||||
function monkeyPatch () {
|
||||
Object.defineProperty(Array.prototype, 'abbrev', {
|
||||
value: function () { return abbrev(this) },
|
||||
enumerable: false, configurable: true, writable: true
|
||||
})
|
||||
|
||||
Object.defineProperty(Object.prototype, 'abbrev', {
|
||||
value: function () { return abbrev(Object.keys(this)) },
|
||||
enumerable: false, configurable: true, writable: true
|
||||
})
|
||||
}
|
||||
|
||||
function abbrev (list) {
|
||||
if (arguments.length !== 1 || !Array.isArray(list)) {
|
||||
list = Array.prototype.slice.call(arguments, 0)
|
||||
}
|
||||
for (var i = 0, l = list.length, args = [] ; i < l ; i ++) {
|
||||
args[i] = typeof list[i] === "string" ? list[i] : String(list[i])
|
||||
}
|
||||
|
||||
// sort them lexicographically, so that they're next to their nearest kin
|
||||
args = args.sort(lexSort)
|
||||
|
||||
// walk through each, seeing how much it has in common with the next and previous
|
||||
var abbrevs = {}
|
||||
, prev = ""
|
||||
for (var i = 0, l = args.length ; i < l ; i ++) {
|
||||
var current = args[i]
|
||||
, next = args[i + 1] || ""
|
||||
, nextMatches = true
|
||||
, prevMatches = true
|
||||
if (current === next) continue
|
||||
for (var j = 0, cl = current.length ; j < cl ; j ++) {
|
||||
var curChar = current.charAt(j)
|
||||
nextMatches = nextMatches && curChar === next.charAt(j)
|
||||
prevMatches = prevMatches && curChar === prev.charAt(j)
|
||||
if (!nextMatches && !prevMatches) {
|
||||
j ++
|
||||
break
|
||||
}
|
||||
}
|
||||
prev = current
|
||||
if (j === cl) {
|
||||
abbrevs[current] = current
|
||||
continue
|
||||
}
|
||||
for (var a = current.substr(0, j) ; j <= cl ; j ++) {
|
||||
abbrevs[a] = current
|
||||
a += current.charAt(j)
|
||||
}
|
||||
}
|
||||
return abbrevs
|
||||
}
|
||||
|
||||
function lexSort (a, b) {
|
||||
return a === b ? 0 : a > b ? 1 : -1
|
||||
}
|
56
node_modules/abbrev/package.json
generated
vendored
Normal file
56
node_modules/abbrev/package.json
generated
vendored
Normal file
@ -0,0 +1,56 @@
|
||||
{
|
||||
"_from": "abbrev@1",
|
||||
"_id": "abbrev@1.1.1",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
|
||||
"_location": "/abbrev",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "range",
|
||||
"registry": true,
|
||||
"raw": "abbrev@1",
|
||||
"name": "abbrev",
|
||||
"escapedName": "abbrev",
|
||||
"rawSpec": "1",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "1"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/nopt"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
|
||||
"_shasum": "f8f2c887ad10bf67f634f005b6987fed3179aac8",
|
||||
"_spec": "abbrev@1",
|
||||
"_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/nopt",
|
||||
"author": {
|
||||
"name": "Isaac Z. Schlueter",
|
||||
"email": "i@izs.me"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/isaacs/abbrev-js/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"deprecated": false,
|
||||
"description": "Like ruby's abbrev module, but in js",
|
||||
"devDependencies": {
|
||||
"tap": "^10.1"
|
||||
},
|
||||
"files": [
|
||||
"abbrev.js"
|
||||
],
|
||||
"homepage": "https://github.com/isaacs/abbrev-js#readme",
|
||||
"license": "ISC",
|
||||
"main": "abbrev.js",
|
||||
"name": "abbrev",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+ssh://git@github.com/isaacs/abbrev-js.git"
|
||||
},
|
||||
"scripts": {
|
||||
"postpublish": "git push origin --all; git push origin --tags",
|
||||
"postversion": "npm publish",
|
||||
"preversion": "npm test",
|
||||
"test": "tap test.js --100"
|
||||
},
|
||||
"version": "1.1.1"
|
||||
}
|
8
node_modules/android-versions/.jshintignore
generated
vendored
Normal file
8
node_modules/android-versions/.jshintignore
generated
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
.git/
|
||||
node_modules/
|
||||
coverage/
|
||||
build/
|
||||
assets/
|
||||
dist/
|
||||
docs/
|
||||
tests/
|
28
node_modules/android-versions/.jshintrc
generated
vendored
Normal file
28
node_modules/android-versions/.jshintrc
generated
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
{
|
||||
"indent": 2,
|
||||
"forin": true,
|
||||
"noarg": true,
|
||||
"bitwise": true,
|
||||
"nonew": true,
|
||||
"strict": true,
|
||||
|
||||
"browser": true,
|
||||
"devel": true,
|
||||
"node": false,
|
||||
"jquery": false,
|
||||
"esnext": false,
|
||||
"moz": false,
|
||||
"es3": false,
|
||||
|
||||
"asi": true,
|
||||
|
||||
"eqnull": true,
|
||||
"debug": true,
|
||||
"boss": true,
|
||||
"evil": true,
|
||||
"loopfunc": true,
|
||||
"laxbreak": true,
|
||||
|
||||
"unused": true,
|
||||
"undef": true
|
||||
}
|
3
node_modules/android-versions/.travis.yml
generated
vendored
Normal file
3
node_modules/android-versions/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- "6.1.0"
|
87
node_modules/android-versions/README.md
generated
vendored
Normal file
87
node_modules/android-versions/README.md
generated
vendored
Normal file
@ -0,0 +1,87 @@
|
||||
Android Versions
|
||||
================
|
||||
|
||||
A node module to get Android versions by API level, NDK level, semantic version, or version name.
|
||||
|
||||
Versions are referenced from [source.android.com/source/build-numbers.html](https://source.android.com/source/build-numbers.html#platform-code-names-versions-api-levels-and-ndk-releases). The version for "Current Development Build" (`"CUR_DEVELOPMENT"`) is not included in the list of `VERSIONS`.
|
||||
|
||||
[![NPM version][npm-image]][npm-url]
|
||||
[![build status][travis-image]][travis-url]
|
||||
|
||||
[npm-image]: https://img.shields.io/npm/v/android-versions.svg?style=flat-square
|
||||
[npm-url]: https://npmjs.org/package/android-versions
|
||||
[travis-image]: https://img.shields.io/travis/dvoiss/android-versions.svg?style=flat-square
|
||||
[travis-url]: https://travis-ci.org/dvoiss/android-versions
|
||||
|
||||
## Install
|
||||
|
||||
```bash
|
||||
# NPM
|
||||
npm install android-versions --save
|
||||
# YARN
|
||||
yarn add android-versions
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
View the tests for more advanced usage.
|
||||
|
||||
```javascript
|
||||
const android = require('android-versions')
|
||||
```
|
||||
|
||||
#### Get by API level:
|
||||
```javascript
|
||||
console.log(android.get(23))
|
||||
|
||||
=> { api: 23, ndk: 8, semver: "6.0", name: "Marshmallow", versionCode: "M" }
|
||||
```
|
||||
|
||||
#### Get by version:
|
||||
|
||||
```javascript
|
||||
console.log(android.get("2.3.3"))
|
||||
|
||||
=> { api: 10, ndk: 5, semver: "2.3.3", name: "Gingerbread", versionCode: "GINGERBREAD_MR1" }
|
||||
```
|
||||
|
||||
#### Get all by predicate:
|
||||
|
||||
```
|
||||
android.getAll((version) => {
|
||||
return version.ndk > 5 && version.api < 15
|
||||
}).map((version) => version.versionCode)
|
||||
|
||||
=> [ "HONEYCOMB_MR1", "HONEYCOMB_MR2", "ICE_CREAM_SANDWICH" ]
|
||||
```
|
||||
|
||||
#### Access a specific version with all info:
|
||||
|
||||
```
|
||||
android.LOLLIPOP
|
||||
|
||||
=> { api: 21, ndk: 8, semver: "5.0", name: "Lollipop", versionCode: "LOLLIPOP" }
|
||||
```
|
||||
|
||||
#### Access the complete reference of Android versions with all info:
|
||||
|
||||
```javascript
|
||||
android.VERSIONS
|
||||
|
||||
=> {
|
||||
BASE: { api: 1, ndk: 0, semver: "1.0", name: "(no code name)", versionCode: "BASE" },
|
||||
...
|
||||
N: { api: 24, ndk: 8, semver: "7.0", name: "Nougat", versionCode: "N" }
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
## Test
|
||||
|
||||
```bash
|
||||
npm run test
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
154
node_modules/android-versions/index.js
generated
vendored
Normal file
154
node_modules/android-versions/index.js
generated
vendored
Normal file
@ -0,0 +1,154 @@
|
||||
/**
|
||||
* Copyright (c) 2016, David Voiss <davidvoiss@gmail.com>
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any purpose
|
||||
* with or without fee is hereby granted, provided that the above copyright notice
|
||||
* and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
* FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
||||
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
||||
* THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* jshint node: true */
|
||||
"use strict";
|
||||
|
||||
/**
|
||||
* A module to get Android versions by API level, NDK level, semantic version, or version name.
|
||||
*
|
||||
* Versions are referenced from here:
|
||||
* {@link https://source.android.com/source/build-numbers.html#platform-code-names-versions-api-levels-and-ndk-releases}
|
||||
* {@link https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/Build.java}
|
||||
*
|
||||
* The version for "Current Development Build" ("CUR_DEVELOPMENT") is not included.
|
||||
*
|
||||
* @module android-versions
|
||||
*/
|
||||
|
||||
var VERSIONS = {
|
||||
BASE: { api: 1, ndk: 0, semver: "1.0", name: "(no code name)", versionCode: "BASE" },
|
||||
BASE_1_1: { api: 2, ndk: 0, semver: "1.1", name: "(no code name)", versionCode: "BASE_1_1" },
|
||||
CUPCAKE: { api: 3, ndk: 1, semver: "1.5", name: "Cupcake", versionCode: "CUPCAKE" },
|
||||
DONUT: { api: 4, ndk: 2, semver: "1.6", name: "Donut", versionCode: "DONUT" },
|
||||
ECLAIR: { api: 5, ndk: 2, semver: "2.0", name: "Eclair", versionCode: "ECLAIR" },
|
||||
ECLAIR_0_1: { api: 6, ndk: 2, semver: "2.0.1", name: "Eclair", versionCode: "ECLAIR_0_1" },
|
||||
ECLAIR_MR1: { api: 7, ndk: 3, semver: "2.1", name: "Eclair", versionCode: "ECLAIR_MR1" },
|
||||
FROYO: { api: 8, ndk: 4, semver: "2.2.x", name: "Froyo", versionCode: "FROYO" },
|
||||
GINGERBREAD: { api: 9, ndk: 5, semver: "2.3.0 - 2.3.2", name: "Gingerbread", versionCode: "GINGERBREAD" },
|
||||
GINGERBREAD_MR1: { api: 10, ndk: 5, semver: "2.3.3 - 2.3.7", name: "Gingerbread", versionCode: "GINGERBREAD_MR1" },
|
||||
HONEYCOMB: { api: 11, ndk: 5, semver: "3.0", name: "Honeycomb", versionCode: "HONEYCOMB" },
|
||||
HONEYCOMB_MR1: { api: 12, ndk: 6, semver: "3.1", name: "Honeycomb", versionCode: "HONEYCOMB_MR1" },
|
||||
HONEYCOMB_MR2: { api: 13, ndk: 6, semver: "3.2.x", name: "Honeycomb", versionCode: "HONEYCOMB_MR2" },
|
||||
ICE_CREAM_SANDWICH: { api: 14, ndk: 7, semver: "4.0.1 - 4.0.2", name: "Ice Cream Sandwich", versionCode: "ICE_CREAM_SANDWICH" },
|
||||
ICE_CREAM_SANDWICH_MR1: { api: 15, ndk: 8, semver: "4.0.3 - 4.0.4", name: "Ice Cream Sandwich", versionCode: "ICE_CREAM_SANDWICH_MR1" },
|
||||
JELLY_BEAN: { api: 16, ndk: 8, semver: "4.1.x", name: "Jellybean", versionCode: "JELLY_BEAN" },
|
||||
JELLY_BEAN_MR1: { api: 17, ndk: 8, semver: "4.2.x", name: "Jellybean", versionCode: "JELLY_BEAN_MR1" },
|
||||
JELLY_BEAN_MR2: { api: 18, ndk: 8, semver: "4.3.x", name: "Jellybean", versionCode: "JELLY_BEAN_MR2" },
|
||||
KITKAT: { api: 19, ndk: 8, semver: "4.4.0 - 4.4.4", name: "KitKat", versionCode: "KITKAT" },
|
||||
KITKAT_WATCH: { api: 20, ndk: 8, semver: "4.4", name: "KitKat Watch", versionCode: "KITKAT_WATCH" },
|
||||
LOLLIPOP: { api: 21, ndk: 8, semver: "5.0", name: "Lollipop", versionCode: "LOLLIPOP" },
|
||||
LOLLIPOP_MR1: { api: 22, ndk: 8, semver: "5.1", name: "Lollipop", versionCode: "LOLLIPOP_MR1" },
|
||||
M: { api: 23, ndk: 8, semver: "6.0", name: "Marshmallow", versionCode: "M" },
|
||||
N: { api: 24, ndk: 8, semver: "7.0", name: "Nougat", versionCode: "N" },
|
||||
N_MR1: { api: 25, ndk: 8, semver: "7.1", name: "Nougat", versionCode: "N_MR1" },
|
||||
O: { api: 26, ndk: 8, semver: "8.0.0", name: "Oreo", versionCode: "O" },
|
||||
O_MR1: { api: 27, ndk: 8, semver: "8.1.0", name: "Oreo", versionCode: "O_MR1" }
|
||||
}
|
||||
|
||||
var semver = require('semver');
|
||||
|
||||
// semver format requires <major>.<minor>.<patch> but we allow just <major>.<minor> format.
|
||||
// Coerce <major>.<minor> to <major>.<minor>.0
|
||||
function formatSemver(semver) {
|
||||
if (semver.match(/^\d+.\d+$/)) {
|
||||
return semver + '.0'
|
||||
} else {
|
||||
return semver
|
||||
}
|
||||
}
|
||||
|
||||
// The default predicate compares against API level, semver, name, or code.
|
||||
function getFromDefaultPredicate(arg) {
|
||||
// Coerce arg to string for comparisons below.
|
||||
arg = arg.toString()
|
||||
|
||||
return getFromPredicate(function(version) {
|
||||
// Check API level before all else.
|
||||
if (arg === version.api.toString()) {
|
||||
return true
|
||||
}
|
||||
|
||||
let argSemver = formatSemver(arg);
|
||||
let versionSemver = formatSemver(version.semver);
|
||||
|
||||
if (semver.valid(argSemver) && semver.satisfies(argSemver, versionSemver)) {
|
||||
return true
|
||||
}
|
||||
|
||||
// Compare version name and code.
|
||||
return arg === version.name || arg === version.versionCode
|
||||
})
|
||||
}
|
||||
|
||||
// The function to allow passing a predicate.
|
||||
function getFromPredicate(predicate) {
|
||||
if (predicate === null) {
|
||||
return null
|
||||
}
|
||||
|
||||
return Object.keys(VERSIONS).filter(function(version) {
|
||||
return predicate(VERSIONS[version])
|
||||
}).map(function(key) { return VERSIONS[key] })
|
||||
}
|
||||
|
||||
/**
|
||||
* The Android version codes available as keys for easier look-up.
|
||||
*/
|
||||
Object.keys(VERSIONS).forEach(function(name) {
|
||||
exports[name] = VERSIONS[name]
|
||||
})
|
||||
|
||||
/**
|
||||
* The complete reference of Android versions for easier look-up.
|
||||
*/
|
||||
exports.VERSIONS = VERSIONS
|
||||
|
||||
/**
|
||||
* Retrieve a single Android version.
|
||||
*
|
||||
* @param {object | Function} arg - The value or predicate to use to retrieve values.
|
||||
*
|
||||
* @return {object} An object representing the version found or null if none found.
|
||||
*/
|
||||
exports.get = function(arg) {
|
||||
var result = exports.getAll(arg)
|
||||
|
||||
if (result === null || result.length === 0) {
|
||||
return null
|
||||
}
|
||||
|
||||
return result[0]
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve all Android versions that meet the criteria of the argument.
|
||||
*
|
||||
* @param {object | Function} arg - The value or predicate to use to retrieve values.
|
||||
*
|
||||
* @return {object} An object representing the version found or null if none found.
|
||||
*/
|
||||
exports.getAll = function(arg) {
|
||||
if (arg === null) {
|
||||
return null
|
||||
}
|
||||
|
||||
if (typeof arg === "function") {
|
||||
return getFromPredicate(arg)
|
||||
} else {
|
||||
return getFromDefaultPredicate(arg)
|
||||
}
|
||||
}
|
67
node_modules/android-versions/package.json
generated
vendored
Normal file
67
node_modules/android-versions/package.json
generated
vendored
Normal file
@ -0,0 +1,67 @@
|
||||
{
|
||||
"_from": "android-versions@1.3.0",
|
||||
"_id": "android-versions@1.3.0",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-d/i1G16Oaw/T1EvskUA7Oo1vIQVK/0ZlpQgZfYVBwg6v/9FBE3QV66g5N1/bTHpRml8tFLxh+KoTw5DokK9c+A==",
|
||||
"_location": "/android-versions",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "version",
|
||||
"registry": true,
|
||||
"raw": "android-versions@1.3.0",
|
||||
"name": "android-versions",
|
||||
"escapedName": "android-versions",
|
||||
"rawSpec": "1.3.0",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "1.3.0"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/android-versions/-/android-versions-1.3.0.tgz",
|
||||
"_shasum": "ce6f3eae2e165ce4ed49b89beb68014741093044",
|
||||
"_spec": "android-versions@1.3.0",
|
||||
"_where": "/Users/brodybits/Documents/cordova/cordova-android",
|
||||
"author": {
|
||||
"name": "dvoiss"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/dvoiss/android-versions/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"dependencies": {
|
||||
"semver": "^5.4.1"
|
||||
},
|
||||
"deprecated": false,
|
||||
"description": "Get the name, API level, version level, NDK level, or version code from any version of Android.",
|
||||
"devDependencies": {
|
||||
"jshint": "^2.9.2",
|
||||
"tape": "^4.6.0"
|
||||
},
|
||||
"homepage": "https://github.com/dvoiss/android-versions#readme",
|
||||
"keywords": [
|
||||
"android",
|
||||
"version",
|
||||
"versions",
|
||||
"ndk",
|
||||
"nougat",
|
||||
"marshmallow",
|
||||
"api",
|
||||
"level"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "index.js",
|
||||
"name": "android-versions",
|
||||
"pre-commit": [
|
||||
"jshint"
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/dvoiss/android-versions.git"
|
||||
},
|
||||
"scripts": {
|
||||
"jshint": "jshint .",
|
||||
"test": "tape tests/**/*.js"
|
||||
},
|
||||
"version": "1.3.0"
|
||||
}
|
118
node_modules/android-versions/tests/index.test.js
generated
vendored
Normal file
118
node_modules/android-versions/tests/index.test.js
generated
vendored
Normal file
@ -0,0 +1,118 @@
|
||||
"use strict";
|
||||
|
||||
var test = require('tape')
|
||||
var android = require('..')
|
||||
|
||||
test('get specific version by API level', (t) => {
|
||||
t.plan(1)
|
||||
t.equal(android.get(24).name, "Nougat")
|
||||
})
|
||||
|
||||
test('getAll versions by API level', (t) => {
|
||||
t.plan(1)
|
||||
t.equal(android.getAll(24)[0].name, "Nougat")
|
||||
})
|
||||
|
||||
test('get specific version by predicate', (t) => {
|
||||
t.plan(2)
|
||||
|
||||
var actual = android.get((version) => {
|
||||
return version.name.indexOf("on") !== -1
|
||||
})
|
||||
t.equal(actual.name, "Donut")
|
||||
|
||||
actual = android.get((version) => {
|
||||
return version.ndk > 5 && version.api < 15
|
||||
})
|
||||
t.equal(actual.versionCode, "HONEYCOMB_MR1")
|
||||
})
|
||||
|
||||
test('getAll versions by predicate', (t) => {
|
||||
t.plan(3)
|
||||
|
||||
var actual = android.getAll((version) => {
|
||||
return version.name.indexOf("on") !== -1
|
||||
}).map((version) => version.name)
|
||||
t.deepEqual(actual, ["Donut", "Honeycomb", "Honeycomb", "Honeycomb"])
|
||||
|
||||
actual = android.getAll((version) => {
|
||||
return version.ndk > 5 && version.api < 15
|
||||
}).map((version) => version.versionCode)
|
||||
t.deepEqual(actual, ["HONEYCOMB_MR1", "HONEYCOMB_MR2", "ICE_CREAM_SANDWICH"])
|
||||
|
||||
actual = android.getAll((version) => {
|
||||
return version.api > 22
|
||||
}).map((version) => version.versionCode)
|
||||
t.deepEqual(actual, ["M", "N", "N_MR1", "O", "O_MR1"])
|
||||
})
|
||||
|
||||
test('get version by semantic version', (t) => {
|
||||
t.plan(4)
|
||||
t.equal(android.get("6.0").versionCode, android.M.versionCode)
|
||||
t.equal(android.get("6.0.0").versionCode, android.M.versionCode)
|
||||
t.equal(android.get("2.3").versionCode, android.GINGERBREAD.versionCode)
|
||||
t.equal(android.get("2.3.3").versionCode, android.GINGERBREAD_MR1.versionCode)
|
||||
})
|
||||
|
||||
test('support version ranges', (t) => {
|
||||
t.plan(7);
|
||||
t.equal(android.get("4.4").versionCode, android.KITKAT.versionCode);
|
||||
t.equal(android.get("4.4.0").versionCode, android.KITKAT.versionCode);
|
||||
t.equal(android.get("4.4.1").versionCode, android.KITKAT.versionCode);
|
||||
t.equal(android.get("4.4.2").versionCode, android.KITKAT.versionCode);
|
||||
t.equal(android.get("4.4.3").versionCode, android.KITKAT.versionCode);
|
||||
t.equal(android.get("4.4.4").versionCode, android.KITKAT.versionCode);
|
||||
t.equal(android.get("4.4.5"), null);
|
||||
})
|
||||
|
||||
test('support x-ranges', (t) => {
|
||||
t.plan(12);
|
||||
t.equal(android.get("4.1").versionCode, android.JELLY_BEAN.versionCode);
|
||||
t.equal(android.get("4.1.0").versionCode, android.JELLY_BEAN.versionCode);
|
||||
t.equal(android.get("4.1.1").versionCode, android.JELLY_BEAN.versionCode);
|
||||
t.equal(android.get("4.1.2").versionCode, android.JELLY_BEAN.versionCode);
|
||||
t.equal(android.get("4.1.3").versionCode, android.JELLY_BEAN.versionCode);
|
||||
t.equal(android.get("4.1.4").versionCode, android.JELLY_BEAN.versionCode);
|
||||
t.equal(android.get("4.1.5").versionCode, android.JELLY_BEAN.versionCode);
|
||||
t.equal(android.get("4.1.6").versionCode, android.JELLY_BEAN.versionCode);
|
||||
t.equal(android.get("4.1.7").versionCode, android.JELLY_BEAN.versionCode);
|
||||
t.equal(android.get("4.1.8").versionCode, android.JELLY_BEAN.versionCode);
|
||||
t.equal(android.get("4.1.9").versionCode, android.JELLY_BEAN.versionCode);
|
||||
t.equal(android.get("4.1.10").versionCode, android.JELLY_BEAN.versionCode);
|
||||
});
|
||||
|
||||
test('access version codes object', (t) => {
|
||||
t.plan(1)
|
||||
t.ok(android.VERSIONS)
|
||||
})
|
||||
|
||||
test('access specific versions directly', (t) => {
|
||||
t.plan(27)
|
||||
t.ok(android.BASE)
|
||||
t.ok(android.BASE_1_1)
|
||||
t.ok(android.CUPCAKE)
|
||||
t.ok(android.DONUT)
|
||||
t.ok(android.ECLAIR)
|
||||
t.ok(android.ECLAIR_0_1)
|
||||
t.ok(android.ECLAIR_MR1)
|
||||
t.ok(android.FROYO)
|
||||
t.ok(android.GINGERBREAD)
|
||||
t.ok(android.GINGERBREAD_MR1)
|
||||
t.ok(android.HONEYCOMB)
|
||||
t.ok(android.HONEYCOMB_MR1)
|
||||
t.ok(android.HONEYCOMB_MR2)
|
||||
t.ok(android.ICE_CREAM_SANDWICH)
|
||||
t.ok(android.ICE_CREAM_SANDWICH_MR1)
|
||||
t.ok(android.JELLY_BEAN)
|
||||
t.ok(android.JELLY_BEAN_MR1)
|
||||
t.ok(android.JELLY_BEAN_MR2)
|
||||
t.ok(android.KITKAT)
|
||||
t.ok(android.KITKAT_WATCH)
|
||||
t.ok(android.LOLLIPOP)
|
||||
t.ok(android.LOLLIPOP_MR1)
|
||||
t.ok(android.M)
|
||||
t.ok(android.N)
|
||||
t.ok(android.N_MR1)
|
||||
t.ok(android.O)
|
||||
t.ok(android.O_MR1)
|
||||
})
|
4
node_modules/ansi/.jshintrc
generated
vendored
Normal file
4
node_modules/ansi/.jshintrc
generated
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"laxcomma": true,
|
||||
"asi": true
|
||||
}
|
1
node_modules/ansi/.npmignore
generated
vendored
Normal file
1
node_modules/ansi/.npmignore
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
node_modules
|
23
node_modules/ansi/History.md
generated
vendored
Normal file
23
node_modules/ansi/History.md
generated
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
|
||||
0.3.1 / 2016-01-14
|
||||
==================
|
||||
|
||||
* add MIT LICENSE file (#23, @kasicka)
|
||||
* preserve chaining after redundant style-method calls (#19, @drewblaisdell)
|
||||
* package: add "license" field (#16, @BenjaminTsai)
|
||||
|
||||
0.3.0 / 2014-05-09
|
||||
==================
|
||||
|
||||
* package: remove "test" script and "devDependencies"
|
||||
* package: remove "engines" section
|
||||
* pacakge: remove "bin" section
|
||||
* package: beautify
|
||||
* examples: remove `starwars` example (#15)
|
||||
* Documented goto, horizontalAbsolute, and eraseLine methods in README.md (#12, @Jammerwoch)
|
||||
* add `.jshintrc` file
|
||||
|
||||
< 0.3.0
|
||||
=======
|
||||
|
||||
* Prehistoric
|
24
node_modules/ansi/LICENSE
generated
vendored
Normal file
24
node_modules/ansi/LICENSE
generated
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
(The MIT License)
|
||||
|
||||
Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
files (the "Software"), to deal in the Software without
|
||||
restriction, including without limitation the rights to use,
|
||||
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
98
node_modules/ansi/README.md
generated
vendored
Normal file
98
node_modules/ansi/README.md
generated
vendored
Normal file
@ -0,0 +1,98 @@
|
||||
ansi.js
|
||||
=========
|
||||
### Advanced ANSI formatting tool for Node.js
|
||||
|
||||
`ansi.js` is a module for Node.js that provides an easy-to-use API for
|
||||
writing ANSI escape codes to `Stream` instances. ANSI escape codes are used to do
|
||||
fancy things in a terminal window, like render text in colors, delete characters,
|
||||
lines, the entire window, or hide and show the cursor, and lots more!
|
||||
|
||||
#### Features:
|
||||
|
||||
* 256 color support for the terminal!
|
||||
* Make a beep sound from your terminal!
|
||||
* Works with *any* writable `Stream` instance.
|
||||
* Allows you to move the cursor anywhere on the terminal window.
|
||||
* Allows you to delete existing contents from the terminal window.
|
||||
* Allows you to hide and show the cursor.
|
||||
* Converts CSS color codes and RGB values into ANSI escape codes.
|
||||
* Low-level; you are in control of when escape codes are used, it's not abstracted.
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
Install with `npm`:
|
||||
|
||||
``` bash
|
||||
$ npm install ansi
|
||||
```
|
||||
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
``` js
|
||||
var ansi = require('ansi')
|
||||
, cursor = ansi(process.stdout)
|
||||
|
||||
// You can chain your calls forever:
|
||||
cursor
|
||||
.red() // Set font color to red
|
||||
.bg.grey() // Set background color to grey
|
||||
.write('Hello World!') // Write 'Hello World!' to stdout
|
||||
.bg.reset() // Reset the bgcolor before writing the trailing \n,
|
||||
// to avoid Terminal glitches
|
||||
.write('\n') // And a final \n to wrap things up
|
||||
|
||||
// Rendering modes are persistent:
|
||||
cursor.hex('#660000').bold().underline()
|
||||
|
||||
// You can use the regular logging functions, text will be green:
|
||||
console.log('This is blood red, bold text')
|
||||
|
||||
// To reset just the foreground color:
|
||||
cursor.fg.reset()
|
||||
|
||||
console.log('This will still be bold')
|
||||
|
||||
// to go to a location (x,y) on the console
|
||||
// note: 1-indexed, not 0-indexed:
|
||||
cursor.goto(10, 5).write('Five down, ten over')
|
||||
|
||||
// to clear the current line:
|
||||
cursor.horizontalAbsolute(0).eraseLine().write('Starting again')
|
||||
|
||||
// to go to a different column on the current line:
|
||||
cursor.horizontalAbsolute(5).write('column five')
|
||||
|
||||
// Clean up after yourself!
|
||||
cursor.reset()
|
||||
```
|
||||
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
(The MIT License)
|
||||
|
||||
Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
'Software'), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
16
node_modules/ansi/examples/beep/index.js
generated
vendored
Executable file
16
node_modules/ansi/examples/beep/index.js
generated
vendored
Executable file
@ -0,0 +1,16 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Invokes the terminal "beep" sound once per second on every exact second.
|
||||
*/
|
||||
|
||||
process.title = 'beep'
|
||||
|
||||
var cursor = require('../../')(process.stdout)
|
||||
|
||||
function beep () {
|
||||
cursor.beep()
|
||||
setTimeout(beep, 1000 - (new Date()).getMilliseconds())
|
||||
}
|
||||
|
||||
setTimeout(beep, 1000 - (new Date()).getMilliseconds())
|
15
node_modules/ansi/examples/clear/index.js
generated
vendored
Executable file
15
node_modules/ansi/examples/clear/index.js
generated
vendored
Executable file
@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Like GNU ncurses "clear" command.
|
||||
* https://github.com/mscdex/node-ncurses/blob/master/deps/ncurses/progs/clear.c
|
||||
*/
|
||||
|
||||
process.title = 'clear'
|
||||
|
||||
function lf () { return '\n' }
|
||||
|
||||
require('../../')(process.stdout)
|
||||
.write(Array.apply(null, Array(process.stdout.getWindowSize()[1])).map(lf).join(''))
|
||||
.eraseData(2)
|
||||
.goto(1, 1)
|
32
node_modules/ansi/examples/cursorPosition.js
generated
vendored
Executable file
32
node_modules/ansi/examples/cursorPosition.js
generated
vendored
Executable file
@ -0,0 +1,32 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
var tty = require('tty')
|
||||
var cursor = require('../')(process.stdout)
|
||||
|
||||
// listen for the queryPosition report on stdin
|
||||
process.stdin.resume()
|
||||
raw(true)
|
||||
|
||||
process.stdin.once('data', function (b) {
|
||||
var match = /\[(\d+)\;(\d+)R$/.exec(b.toString())
|
||||
if (match) {
|
||||
var xy = match.slice(1, 3).reverse().map(Number)
|
||||
console.error(xy)
|
||||
}
|
||||
|
||||
// cleanup and close stdin
|
||||
raw(false)
|
||||
process.stdin.pause()
|
||||
})
|
||||
|
||||
|
||||
// send the query position request code to stdout
|
||||
cursor.queryPosition()
|
||||
|
||||
function raw (mode) {
|
||||
if (process.stdin.setRawMode) {
|
||||
process.stdin.setRawMode(mode)
|
||||
} else {
|
||||
tty.setRawMode(mode)
|
||||
}
|
||||
}
|
87
node_modules/ansi/examples/progress/index.js
generated
vendored
Normal file
87
node_modules/ansi/examples/progress/index.js
generated
vendored
Normal file
@ -0,0 +1,87 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
var assert = require('assert')
|
||||
, ansi = require('../../')
|
||||
|
||||
function Progress (stream, width) {
|
||||
this.cursor = ansi(stream)
|
||||
this.delta = this.cursor.newlines
|
||||
this.width = width | 0 || 10
|
||||
this.open = '['
|
||||
this.close = ']'
|
||||
this.complete = '█'
|
||||
this.incomplete = '_'
|
||||
|
||||
// initial render
|
||||
this.progress = 0
|
||||
}
|
||||
|
||||
Object.defineProperty(Progress.prototype, 'progress', {
|
||||
get: get
|
||||
, set: set
|
||||
, configurable: true
|
||||
, enumerable: true
|
||||
})
|
||||
|
||||
function get () {
|
||||
return this._progress
|
||||
}
|
||||
|
||||
function set (v) {
|
||||
this._progress = Math.max(0, Math.min(v, 100))
|
||||
|
||||
var w = this.width - this.complete.length - this.incomplete.length
|
||||
, n = w * (this._progress / 100) | 0
|
||||
, i = w - n
|
||||
, com = c(this.complete, n)
|
||||
, inc = c(this.incomplete, i)
|
||||
, delta = this.cursor.newlines - this.delta
|
||||
|
||||
assert.equal(com.length + inc.length, w)
|
||||
|
||||
if (delta > 0) {
|
||||
this.cursor.up(delta)
|
||||
this.delta = this.cursor.newlines
|
||||
}
|
||||
|
||||
this.cursor
|
||||
.horizontalAbsolute(0)
|
||||
.eraseLine(2)
|
||||
.fg.white()
|
||||
.write(this.open)
|
||||
.fg.grey()
|
||||
.bold()
|
||||
.write(com)
|
||||
.resetBold()
|
||||
.write(inc)
|
||||
.fg.white()
|
||||
.write(this.close)
|
||||
.fg.reset()
|
||||
.write('\n')
|
||||
}
|
||||
|
||||
function c (char, length) {
|
||||
return Array.apply(null, Array(length)).map(function () {
|
||||
return char
|
||||
}).join('')
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// Usage
|
||||
var width = parseInt(process.argv[2], 10) || process.stdout.getWindowSize()[0] / 2
|
||||
, p = new Progress(process.stdout, width)
|
||||
|
||||
;(function tick () {
|
||||
p.progress += Math.random() * 5
|
||||
p.cursor
|
||||
.eraseLine(2)
|
||||
.write('Progress: ')
|
||||
.bold().write(p.progress.toFixed(2))
|
||||
.write('%')
|
||||
.resetBold()
|
||||
.write('\n')
|
||||
if (p.progress < 100)
|
||||
setTimeout(tick, 100)
|
||||
})()
|
405
node_modules/ansi/lib/ansi.js
generated
vendored
Normal file
405
node_modules/ansi/lib/ansi.js
generated
vendored
Normal file
@ -0,0 +1,405 @@
|
||||
|
||||
/**
|
||||
* References:
|
||||
*
|
||||
* - http://en.wikipedia.org/wiki/ANSI_escape_code
|
||||
* - http://www.termsys.demon.co.uk/vtansi.htm
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var emitNewlineEvents = require('./newlines')
|
||||
, prefix = '\x1b[' // For all escape codes
|
||||
, suffix = 'm' // Only for color codes
|
||||
|
||||
/**
|
||||
* The ANSI escape sequences.
|
||||
*/
|
||||
|
||||
var codes = {
|
||||
up: 'A'
|
||||
, down: 'B'
|
||||
, forward: 'C'
|
||||
, back: 'D'
|
||||
, nextLine: 'E'
|
||||
, previousLine: 'F'
|
||||
, horizontalAbsolute: 'G'
|
||||
, eraseData: 'J'
|
||||
, eraseLine: 'K'
|
||||
, scrollUp: 'S'
|
||||
, scrollDown: 'T'
|
||||
, savePosition: 's'
|
||||
, restorePosition: 'u'
|
||||
, queryPosition: '6n'
|
||||
, hide: '?25l'
|
||||
, show: '?25h'
|
||||
}
|
||||
|
||||
/**
|
||||
* Rendering ANSI codes.
|
||||
*/
|
||||
|
||||
var styles = {
|
||||
bold: 1
|
||||
, italic: 3
|
||||
, underline: 4
|
||||
, inverse: 7
|
||||
}
|
||||
|
||||
/**
|
||||
* The negating ANSI code for the rendering modes.
|
||||
*/
|
||||
|
||||
var reset = {
|
||||
bold: 22
|
||||
, italic: 23
|
||||
, underline: 24
|
||||
, inverse: 27
|
||||
}
|
||||
|
||||
/**
|
||||
* The standard, styleable ANSI colors.
|
||||
*/
|
||||
|
||||
var colors = {
|
||||
white: 37
|
||||
, black: 30
|
||||
, blue: 34
|
||||
, cyan: 36
|
||||
, green: 32
|
||||
, magenta: 35
|
||||
, red: 31
|
||||
, yellow: 33
|
||||
, grey: 90
|
||||
, brightBlack: 90
|
||||
, brightRed: 91
|
||||
, brightGreen: 92
|
||||
, brightYellow: 93
|
||||
, brightBlue: 94
|
||||
, brightMagenta: 95
|
||||
, brightCyan: 96
|
||||
, brightWhite: 97
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates a Cursor instance based off the given `writable stream` instance.
|
||||
*/
|
||||
|
||||
function ansi (stream, options) {
|
||||
if (stream._ansicursor) {
|
||||
return stream._ansicursor
|
||||
} else {
|
||||
return stream._ansicursor = new Cursor(stream, options)
|
||||
}
|
||||
}
|
||||
module.exports = exports = ansi
|
||||
|
||||
/**
|
||||
* The `Cursor` class.
|
||||
*/
|
||||
|
||||
function Cursor (stream, options) {
|
||||
if (!(this instanceof Cursor)) {
|
||||
return new Cursor(stream, options)
|
||||
}
|
||||
if (typeof stream != 'object' || typeof stream.write != 'function') {
|
||||
throw new Error('a valid Stream instance must be passed in')
|
||||
}
|
||||
|
||||
// the stream to use
|
||||
this.stream = stream
|
||||
|
||||
// when 'enabled' is false then all the functions are no-ops except for write()
|
||||
this.enabled = options && options.enabled
|
||||
if (typeof this.enabled === 'undefined') {
|
||||
this.enabled = stream.isTTY
|
||||
}
|
||||
this.enabled = !!this.enabled
|
||||
|
||||
// then `buffering` is true, then `write()` calls are buffered in
|
||||
// memory until `flush()` is invoked
|
||||
this.buffering = !!(options && options.buffering)
|
||||
this._buffer = []
|
||||
|
||||
// controls the foreground and background colors
|
||||
this.fg = this.foreground = new Colorer(this, 0)
|
||||
this.bg = this.background = new Colorer(this, 10)
|
||||
|
||||
// defaults
|
||||
this.Bold = false
|
||||
this.Italic = false
|
||||
this.Underline = false
|
||||
this.Inverse = false
|
||||
|
||||
// keep track of the number of "newlines" that get encountered
|
||||
this.newlines = 0
|
||||
emitNewlineEvents(stream)
|
||||
stream.on('newline', function () {
|
||||
this.newlines++
|
||||
}.bind(this))
|
||||
}
|
||||
exports.Cursor = Cursor
|
||||
|
||||
/**
|
||||
* Helper function that calls `write()` on the underlying Stream.
|
||||
* Returns `this` instead of the write() return value to keep
|
||||
* the chaining going.
|
||||
*/
|
||||
|
||||
Cursor.prototype.write = function (data) {
|
||||
if (this.buffering) {
|
||||
this._buffer.push(arguments)
|
||||
} else {
|
||||
this.stream.write.apply(this.stream, arguments)
|
||||
}
|
||||
return this
|
||||
}
|
||||
|
||||
/**
|
||||
* Buffer `write()` calls into memory.
|
||||
*
|
||||
* @api public
|
||||
*/
|
||||
|
||||
Cursor.prototype.buffer = function () {
|
||||
this.buffering = true
|
||||
return this
|
||||
}
|
||||
|
||||
/**
|
||||
* Write out the in-memory buffer.
|
||||
*
|
||||
* @api public
|
||||
*/
|
||||
|
||||
Cursor.prototype.flush = function () {
|
||||
this.buffering = false
|
||||
var str = this._buffer.map(function (args) {
|
||||
if (args.length != 1) throw new Error('unexpected args length! ' + args.length);
|
||||
return args[0];
|
||||
}).join('');
|
||||
this._buffer.splice(0); // empty
|
||||
this.write(str);
|
||||
return this
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* The `Colorer` class manages both the background and foreground colors.
|
||||
*/
|
||||
|
||||
function Colorer (cursor, base) {
|
||||
this.current = null
|
||||
this.cursor = cursor
|
||||
this.base = base
|
||||
}
|
||||
exports.Colorer = Colorer
|
||||
|
||||
/**
|
||||
* Write an ANSI color code, ensuring that the same code doesn't get rewritten.
|
||||
*/
|
||||
|
||||
Colorer.prototype._setColorCode = function setColorCode (code) {
|
||||
var c = String(code)
|
||||
if (this.current === c) return
|
||||
this.cursor.enabled && this.cursor.write(prefix + c + suffix)
|
||||
this.current = c
|
||||
return this
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set up the positional ANSI codes.
|
||||
*/
|
||||
|
||||
Object.keys(codes).forEach(function (name) {
|
||||
var code = String(codes[name])
|
||||
Cursor.prototype[name] = function () {
|
||||
var c = code
|
||||
if (arguments.length > 0) {
|
||||
c = toArray(arguments).map(Math.round).join(';') + code
|
||||
}
|
||||
this.enabled && this.write(prefix + c)
|
||||
return this
|
||||
}
|
||||
})
|
||||
|
||||
/**
|
||||
* Set up the functions for the rendering ANSI codes.
|
||||
*/
|
||||
|
||||
Object.keys(styles).forEach(function (style) {
|
||||
var name = style[0].toUpperCase() + style.substring(1)
|
||||
, c = styles[style]
|
||||
, r = reset[style]
|
||||
|
||||
Cursor.prototype[style] = function () {
|
||||
if (this[name]) return this
|
||||
this.enabled && this.write(prefix + c + suffix)
|
||||
this[name] = true
|
||||
return this
|
||||
}
|
||||
|
||||
Cursor.prototype['reset' + name] = function () {
|
||||
if (!this[name]) return this
|
||||
this.enabled && this.write(prefix + r + suffix)
|
||||
this[name] = false
|
||||
return this
|
||||
}
|
||||
})
|
||||
|
||||
/**
|
||||
* Setup the functions for the standard colors.
|
||||
*/
|
||||
|
||||
Object.keys(colors).forEach(function (color) {
|
||||
var code = colors[color]
|
||||
|
||||
Colorer.prototype[color] = function () {
|
||||
this._setColorCode(this.base + code)
|
||||
return this.cursor
|
||||
}
|
||||
|
||||
Cursor.prototype[color] = function () {
|
||||
return this.foreground[color]()
|
||||
}
|
||||
})
|
||||
|
||||
/**
|
||||
* Makes a beep sound!
|
||||
*/
|
||||
|
||||
Cursor.prototype.beep = function () {
|
||||
this.enabled && this.write('\x07')
|
||||
return this
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves cursor to specific position
|
||||
*/
|
||||
|
||||
Cursor.prototype.goto = function (x, y) {
|
||||
x = x | 0
|
||||
y = y | 0
|
||||
this.enabled && this.write(prefix + y + ';' + x + 'H')
|
||||
return this
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the color.
|
||||
*/
|
||||
|
||||
Colorer.prototype.reset = function () {
|
||||
this._setColorCode(this.base + 39)
|
||||
return this.cursor
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets all ANSI formatting on the stream.
|
||||
*/
|
||||
|
||||
Cursor.prototype.reset = function () {
|
||||
this.enabled && this.write(prefix + '0' + suffix)
|
||||
this.Bold = false
|
||||
this.Italic = false
|
||||
this.Underline = false
|
||||
this.Inverse = false
|
||||
this.foreground.current = null
|
||||
this.background.current = null
|
||||
return this
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the foreground color with the given RGB values.
|
||||
* The closest match out of the 216 colors is picked.
|
||||
*/
|
||||
|
||||
Colorer.prototype.rgb = function (r, g, b) {
|
||||
var base = this.base + 38
|
||||
, code = rgb(r, g, b)
|
||||
this._setColorCode(base + ';5;' + code)
|
||||
return this.cursor
|
||||
}
|
||||
|
||||
/**
|
||||
* Same as `cursor.fg.rgb(r, g, b)`.
|
||||
*/
|
||||
|
||||
Cursor.prototype.rgb = function (r, g, b) {
|
||||
return this.foreground.rgb(r, g, b)
|
||||
}
|
||||
|
||||
/**
|
||||
* Accepts CSS color codes for use with ANSI escape codes.
|
||||
* For example: `#FF000` would be bright red.
|
||||
*/
|
||||
|
||||
Colorer.prototype.hex = function (color) {
|
||||
return this.rgb.apply(this, hex(color))
|
||||
}
|
||||
|
||||
/**
|
||||
* Same as `cursor.fg.hex(color)`.
|
||||
*/
|
||||
|
||||
Cursor.prototype.hex = function (color) {
|
||||
return this.foreground.hex(color)
|
||||
}
|
||||
|
||||
|
||||
// UTIL FUNCTIONS //
|
||||
|
||||
/**
|
||||
* Translates a 255 RGB value to a 0-5 ANSI RGV value,
|
||||
* then returns the single ANSI color code to use.
|
||||
*/
|
||||
|
||||
function rgb (r, g, b) {
|
||||
var red = r / 255 * 5
|
||||
, green = g / 255 * 5
|
||||
, blue = b / 255 * 5
|
||||
return rgb5(red, green, blue)
|
||||
}
|
||||
|
||||
/**
|
||||
* Turns rgb 0-5 values into a single ANSI color code to use.
|
||||
*/
|
||||
|
||||
function rgb5 (r, g, b) {
|
||||
var red = Math.round(r)
|
||||
, green = Math.round(g)
|
||||
, blue = Math.round(b)
|
||||
return 16 + (red*36) + (green*6) + blue
|
||||
}
|
||||
|
||||
/**
|
||||
* Accepts a hex CSS color code string (# is optional) and
|
||||
* translates it into an Array of 3 RGB 0-255 values, which
|
||||
* can then be used with rgb().
|
||||
*/
|
||||
|
||||
function hex (color) {
|
||||
var c = color[0] === '#' ? color.substring(1) : color
|
||||
, r = c.substring(0, 2)
|
||||
, g = c.substring(2, 4)
|
||||
, b = c.substring(4, 6)
|
||||
return [parseInt(r, 16), parseInt(g, 16), parseInt(b, 16)]
|
||||
}
|
||||
|
||||
/**
|
||||
* Turns an array-like object into a real array.
|
||||
*/
|
||||
|
||||
function toArray (a) {
|
||||
var i = 0
|
||||
, l = a.length
|
||||
, rtn = []
|
||||
for (; i<l; i++) {
|
||||
rtn.push(a[i])
|
||||
}
|
||||
return rtn
|
||||
}
|
71
node_modules/ansi/lib/newlines.js
generated
vendored
Normal file
71
node_modules/ansi/lib/newlines.js
generated
vendored
Normal file
@ -0,0 +1,71 @@
|
||||
|
||||
/**
|
||||
* Accepts any node Stream instance and hijacks its "write()" function,
|
||||
* so that it can count any newlines that get written to the output.
|
||||
*
|
||||
* When a '\n' byte is encountered, then a "newline" event will be emitted
|
||||
* on the stream, with no arguments. It is up to the listeners to determine
|
||||
* any necessary deltas required for their use-case.
|
||||
*
|
||||
* Ex:
|
||||
*
|
||||
* var cursor = ansi(process.stdout)
|
||||
* , ln = 0
|
||||
* process.stdout.on('newline', function () {
|
||||
* ln++
|
||||
* })
|
||||
*/
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var assert = require('assert')
|
||||
var NEWLINE = '\n'.charCodeAt(0)
|
||||
|
||||
function emitNewlineEvents (stream) {
|
||||
if (stream._emittingNewlines) {
|
||||
// already emitting newline events
|
||||
return
|
||||
}
|
||||
|
||||
var write = stream.write
|
||||
|
||||
stream.write = function (data) {
|
||||
// first write the data
|
||||
var rtn = write.apply(stream, arguments)
|
||||
|
||||
if (stream.listeners('newline').length > 0) {
|
||||
var len = data.length
|
||||
, i = 0
|
||||
// now try to calculate any deltas
|
||||
if (typeof data == 'string') {
|
||||
for (; i<len; i++) {
|
||||
processByte(stream, data.charCodeAt(i))
|
||||
}
|
||||
} else {
|
||||
// buffer
|
||||
for (; i<len; i++) {
|
||||
processByte(stream, data[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return rtn
|
||||
}
|
||||
|
||||
stream._emittingNewlines = true
|
||||
}
|
||||
module.exports = emitNewlineEvents
|
||||
|
||||
|
||||
/**
|
||||
* Processes an individual byte being written to a stream
|
||||
*/
|
||||
|
||||
function processByte (stream, b) {
|
||||
assert.equal(typeof b, 'number')
|
||||
if (b === NEWLINE) {
|
||||
stream.emit('newline')
|
||||
}
|
||||
}
|
55
node_modules/ansi/package.json
generated
vendored
Normal file
55
node_modules/ansi/package.json
generated
vendored
Normal file
@ -0,0 +1,55 @@
|
||||
{
|
||||
"_from": "ansi@^0.3.1",
|
||||
"_id": "ansi@0.3.1",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=",
|
||||
"_location": "/ansi",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "range",
|
||||
"registry": true,
|
||||
"raw": "ansi@^0.3.1",
|
||||
"name": "ansi",
|
||||
"escapedName": "ansi",
|
||||
"rawSpec": "^0.3.1",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "^0.3.1"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/cordova-common"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz",
|
||||
"_shasum": "0c42d4fb17160d5a9af1e484bace1c66922c1b21",
|
||||
"_spec": "ansi@^0.3.1",
|
||||
"_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/cordova-common",
|
||||
"author": {
|
||||
"name": "Nathan Rajlich",
|
||||
"email": "nathan@tootallnate.net",
|
||||
"url": "http://tootallnate.net"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/TooTallNate/ansi.js/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"deprecated": false,
|
||||
"description": "Advanced ANSI formatting tool for Node.js",
|
||||
"homepage": "https://github.com/TooTallNate/ansi.js#readme",
|
||||
"keywords": [
|
||||
"ansi",
|
||||
"formatting",
|
||||
"cursor",
|
||||
"color",
|
||||
"terminal",
|
||||
"rgb",
|
||||
"256",
|
||||
"stream"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "./lib/ansi.js",
|
||||
"name": "ansi",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/TooTallNate/ansi.js.git"
|
||||
},
|
||||
"version": "0.3.1"
|
||||
}
|
5
node_modules/balanced-match/.npmignore
generated
vendored
Normal file
5
node_modules/balanced-match/.npmignore
generated
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
test
|
||||
.gitignore
|
||||
.travis.yml
|
||||
Makefile
|
||||
example.js
|
21
node_modules/balanced-match/LICENSE.md
generated
vendored
Normal file
21
node_modules/balanced-match/LICENSE.md
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
(MIT)
|
||||
|
||||
Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
91
node_modules/balanced-match/README.md
generated
vendored
Normal file
91
node_modules/balanced-match/README.md
generated
vendored
Normal file
@ -0,0 +1,91 @@
|
||||
# balanced-match
|
||||
|
||||
Match balanced string pairs, like `{` and `}` or `<b>` and `</b>`. Supports regular expressions as well!
|
||||
|
||||
[](http://travis-ci.org/juliangruber/balanced-match)
|
||||
[](https://www.npmjs.org/package/balanced-match)
|
||||
|
||||
[](https://ci.testling.com/juliangruber/balanced-match)
|
||||
|
||||
## Example
|
||||
|
||||
Get the first matching pair of braces:
|
||||
|
||||
```js
|
||||
var balanced = require('balanced-match');
|
||||
|
||||
console.log(balanced('{', '}', 'pre{in{nested}}post'));
|
||||
console.log(balanced('{', '}', 'pre{first}between{second}post'));
|
||||
console.log(balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre { in{nest} } post'));
|
||||
```
|
||||
|
||||
The matches are:
|
||||
|
||||
```bash
|
||||
$ node example.js
|
||||
{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' }
|
||||
{ start: 3,
|
||||
end: 9,
|
||||
pre: 'pre',
|
||||
body: 'first',
|
||||
post: 'between{second}post' }
|
||||
{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' }
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
### var m = balanced(a, b, str)
|
||||
|
||||
For the first non-nested matching pair of `a` and `b` in `str`, return an
|
||||
object with those keys:
|
||||
|
||||
* **start** the index of the first match of `a`
|
||||
* **end** the index of the matching `b`
|
||||
* **pre** the preamble, `a` and `b` not included
|
||||
* **body** the match, `a` and `b` not included
|
||||
* **post** the postscript, `a` and `b` not included
|
||||
|
||||
If there's no match, `undefined` will be returned.
|
||||
|
||||
If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`.
|
||||
|
||||
### var r = balanced.range(a, b, str)
|
||||
|
||||
For the first non-nested matching pair of `a` and `b` in `str`, return an
|
||||
array with indexes: `[ <a index>, <b index> ]`.
|
||||
|
||||
If there's no match, `undefined` will be returned.
|
||||
|
||||
If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`.
|
||||
|
||||
## Installation
|
||||
|
||||
With [npm](https://npmjs.org) do:
|
||||
|
||||
```bash
|
||||
npm install balanced-match
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
(MIT)
|
||||
|
||||
Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
59
node_modules/balanced-match/index.js
generated
vendored
Normal file
59
node_modules/balanced-match/index.js
generated
vendored
Normal file
@ -0,0 +1,59 @@
|
||||
'use strict';
|
||||
module.exports = balanced;
|
||||
function balanced(a, b, str) {
|
||||
if (a instanceof RegExp) a = maybeMatch(a, str);
|
||||
if (b instanceof RegExp) b = maybeMatch(b, str);
|
||||
|
||||
var r = range(a, b, str);
|
||||
|
||||
return r && {
|
||||
start: r[0],
|
||||
end: r[1],
|
||||
pre: str.slice(0, r[0]),
|
||||
body: str.slice(r[0] + a.length, r[1]),
|
||||
post: str.slice(r[1] + b.length)
|
||||
};
|
||||
}
|
||||
|
||||
function maybeMatch(reg, str) {
|
||||
var m = str.match(reg);
|
||||
return m ? m[0] : null;
|
||||
}
|
||||
|
||||
balanced.range = range;
|
||||
function range(a, b, str) {
|
||||
var begs, beg, left, right, result;
|
||||
var ai = str.indexOf(a);
|
||||
var bi = str.indexOf(b, ai + 1);
|
||||
var i = ai;
|
||||
|
||||
if (ai >= 0 && bi > 0) {
|
||||
begs = [];
|
||||
left = str.length;
|
||||
|
||||
while (i >= 0 && !result) {
|
||||
if (i == ai) {
|
||||
begs.push(i);
|
||||
ai = str.indexOf(a, i + 1);
|
||||
} else if (begs.length == 1) {
|
||||
result = [ begs.pop(), bi ];
|
||||
} else {
|
||||
beg = begs.pop();
|
||||
if (beg < left) {
|
||||
left = beg;
|
||||
right = bi;
|
||||
}
|
||||
|
||||
bi = str.indexOf(b, i + 1);
|
||||
}
|
||||
|
||||
i = ai < bi && ai >= 0 ? ai : bi;
|
||||
}
|
||||
|
||||
if (begs.length) {
|
||||
result = [ left, right ];
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
77
node_modules/balanced-match/package.json
generated
vendored
Normal file
77
node_modules/balanced-match/package.json
generated
vendored
Normal file
@ -0,0 +1,77 @@
|
||||
{
|
||||
"_from": "balanced-match@^1.0.0",
|
||||
"_id": "balanced-match@1.0.0",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
|
||||
"_location": "/balanced-match",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "range",
|
||||
"registry": true,
|
||||
"raw": "balanced-match@^1.0.0",
|
||||
"name": "balanced-match",
|
||||
"escapedName": "balanced-match",
|
||||
"rawSpec": "^1.0.0",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "^1.0.0"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/brace-expansion"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
||||
"_shasum": "89b4d199ab2bee49de164ea02b89ce462d71b767",
|
||||
"_spec": "balanced-match@^1.0.0",
|
||||
"_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/brace-expansion",
|
||||
"author": {
|
||||
"name": "Julian Gruber",
|
||||
"email": "mail@juliangruber.com",
|
||||
"url": "http://juliangruber.com"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/juliangruber/balanced-match/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"dependencies": {},
|
||||
"deprecated": false,
|
||||
"description": "Match balanced character pairs, like \"{\" and \"}\"",
|
||||
"devDependencies": {
|
||||
"matcha": "^0.7.0",
|
||||
"tape": "^4.6.0"
|
||||
},
|
||||
"homepage": "https://github.com/juliangruber/balanced-match",
|
||||
"keywords": [
|
||||
"match",
|
||||
"regexp",
|
||||
"test",
|
||||
"balanced",
|
||||
"parse"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "index.js",
|
||||
"name": "balanced-match",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/juliangruber/balanced-match.git"
|
||||
},
|
||||
"scripts": {
|
||||
"bench": "make bench",
|
||||
"test": "make test"
|
||||
},
|
||||
"testling": {
|
||||
"files": "test/*.js",
|
||||
"browsers": [
|
||||
"ie/8..latest",
|
||||
"firefox/20..latest",
|
||||
"firefox/nightly",
|
||||
"chrome/25..latest",
|
||||
"chrome/canary",
|
||||
"opera/12..latest",
|
||||
"opera/next",
|
||||
"safari/5.1..latest",
|
||||
"ipad/6.0..latest",
|
||||
"iphone/6.0..latest",
|
||||
"android-browser/4.2..latest"
|
||||
]
|
||||
},
|
||||
"version": "1.0.0"
|
||||
}
|
21
node_modules/base64-js/LICENSE
generated
vendored
Normal file
21
node_modules/base64-js/LICENSE
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
32
node_modules/base64-js/README.md
generated
vendored
Normal file
32
node_modules/base64-js/README.md
generated
vendored
Normal file
@ -0,0 +1,32 @@
|
||||
base64-js
|
||||
=========
|
||||
|
||||
`base64-js` does basic base64 encoding/decoding in pure JS.
|
||||
|
||||
[](http://travis-ci.org/beatgammit/base64-js)
|
||||
|
||||
[](https://ci.testling.com/beatgammit/base64-js)
|
||||
|
||||
Many browsers already have base64 encoding/decoding functionality, but it is for text data, not all-purpose binary data.
|
||||
|
||||
Sometimes encoding/decoding binary data in the browser is useful, and that is what this module does.
|
||||
|
||||
## install
|
||||
|
||||
With [npm](https://npmjs.org) do:
|
||||
|
||||
`npm install base64-js`
|
||||
|
||||
## methods
|
||||
|
||||
`var base64 = require('base64-js')`
|
||||
|
||||
`base64` has three exposed functions, `byteLength`, `toByteArray` and `fromByteArray`, which both take a single argument.
|
||||
|
||||
* `byteLength` - Takes a base64 string and returns length of byte array
|
||||
* `toByteArray` - Takes a base64 string and returns a byte array
|
||||
* `fromByteArray` - Takes a byte array and returns a base64 string
|
||||
|
||||
## license
|
||||
|
||||
MIT
|
1
node_modules/base64-js/base64js.min.js
generated
vendored
Normal file
1
node_modules/base64-js/base64js.min.js
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
(function(r){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=r()}else if(typeof define==="function"&&define.amd){define([],r)}else{var e;if(typeof window!=="undefined"){e=window}else if(typeof global!=="undefined"){e=global}else if(typeof self!=="undefined"){e=self}else{e=this}e.base64js=r()}})(function(){var r,e,t;return function r(e,t,n){function o(i,a){if(!t[i]){if(!e[i]){var u=typeof require=="function"&&require;if(!a&&u)return u(i,!0);if(f)return f(i,!0);var d=new Error("Cannot find module '"+i+"'");throw d.code="MODULE_NOT_FOUND",d}var c=t[i]={exports:{}};e[i][0].call(c.exports,function(r){var t=e[i][1][r];return o(t?t:r)},c,c.exports,r,e,t,n)}return t[i].exports}var f=typeof require=="function"&&require;for(var i=0;i<n.length;i++)o(n[i]);return o}({"/":[function(r,e,t){"use strict";t.byteLength=c;t.toByteArray=v;t.fromByteArray=s;var n=[];var o=[];var f=typeof Uint8Array!=="undefined"?Uint8Array:Array;var i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(var a=0,u=i.length;a<u;++a){n[a]=i[a];o[i.charCodeAt(a)]=a}o["-".charCodeAt(0)]=62;o["_".charCodeAt(0)]=63;function d(r){var e=r.length;if(e%4>0){throw new Error("Invalid string. Length must be a multiple of 4")}return r[e-2]==="="?2:r[e-1]==="="?1:0}function c(r){return r.length*3/4-d(r)}function v(r){var e,t,n,i,a,u;var c=r.length;a=d(r);u=new f(c*3/4-a);n=a>0?c-4:c;var v=0;for(e=0,t=0;e<n;e+=4,t+=3){i=o[r.charCodeAt(e)]<<18|o[r.charCodeAt(e+1)]<<12|o[r.charCodeAt(e+2)]<<6|o[r.charCodeAt(e+3)];u[v++]=i>>16&255;u[v++]=i>>8&255;u[v++]=i&255}if(a===2){i=o[r.charCodeAt(e)]<<2|o[r.charCodeAt(e+1)]>>4;u[v++]=i&255}else if(a===1){i=o[r.charCodeAt(e)]<<10|o[r.charCodeAt(e+1)]<<4|o[r.charCodeAt(e+2)]>>2;u[v++]=i>>8&255;u[v++]=i&255}return u}function l(r){return n[r>>18&63]+n[r>>12&63]+n[r>>6&63]+n[r&63]}function h(r,e,t){var n;var o=[];for(var f=e;f<t;f+=3){n=(r[f]<<16)+(r[f+1]<<8)+r[f+2];o.push(l(n))}return o.join("")}function s(r){var e;var t=r.length;var o=t%3;var f="";var i=[];var a=16383;for(var u=0,d=t-o;u<d;u+=a){i.push(h(r,u,u+a>d?d:u+a))}if(o===1){e=r[t-1];f+=n[e>>2];f+=n[e<<4&63];f+="=="}else if(o===2){e=(r[t-2]<<8)+r[t-1];f+=n[e>>10];f+=n[e>>4&63];f+=n[e<<2&63];f+="="}i.push(f);return i.join("")}},{}]},{},[])("/")});
|
114
node_modules/base64-js/index.js
generated
vendored
Normal file
114
node_modules/base64-js/index.js
generated
vendored
Normal file
@ -0,0 +1,114 @@
|
||||
'use strict'
|
||||
|
||||
exports.byteLength = byteLength
|
||||
exports.toByteArray = toByteArray
|
||||
exports.fromByteArray = fromByteArray
|
||||
|
||||
var lookup = []
|
||||
var revLookup = []
|
||||
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
|
||||
|
||||
var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
|
||||
for (var i = 0, len = code.length; i < len; ++i) {
|
||||
lookup[i] = code[i]
|
||||
revLookup[code.charCodeAt(i)] = i
|
||||
}
|
||||
|
||||
revLookup['-'.charCodeAt(0)] = 62
|
||||
revLookup['_'.charCodeAt(0)] = 63
|
||||
|
||||
function placeHoldersCount (b64) {
|
||||
var len = b64.length
|
||||
if (len % 4 > 0) {
|
||||
throw new Error('Invalid string. Length must be a multiple of 4')
|
||||
}
|
||||
|
||||
// the number of equal signs (place holders)
|
||||
// if there are two placeholders, than the two characters before it
|
||||
// represent one byte
|
||||
// if there is only one, then the three characters before it represent 2 bytes
|
||||
// this is just a cheap hack to not do indexOf twice
|
||||
return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0
|
||||
}
|
||||
|
||||
function byteLength (b64) {
|
||||
// base64 is 4/3 + up to two characters of the original data
|
||||
return b64.length * 3 / 4 - placeHoldersCount(b64)
|
||||
}
|
||||
|
||||
function toByteArray (b64) {
|
||||
var i, j, l, tmp, placeHolders, arr
|
||||
var len = b64.length
|
||||
placeHolders = placeHoldersCount(b64)
|
||||
|
||||
arr = new Arr(len * 3 / 4 - placeHolders)
|
||||
|
||||
// if there are placeholders, only get up to the last complete 4 chars
|
||||
l = placeHolders > 0 ? len - 4 : len
|
||||
|
||||
var L = 0
|
||||
|
||||
for (i = 0, j = 0; i < l; i += 4, j += 3) {
|
||||
tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]
|
||||
arr[L++] = (tmp >> 16) & 0xFF
|
||||
arr[L++] = (tmp >> 8) & 0xFF
|
||||
arr[L++] = tmp & 0xFF
|
||||
}
|
||||
|
||||
if (placeHolders === 2) {
|
||||
tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)
|
||||
arr[L++] = tmp & 0xFF
|
||||
} else if (placeHolders === 1) {
|
||||
tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)
|
||||
arr[L++] = (tmp >> 8) & 0xFF
|
||||
arr[L++] = tmp & 0xFF
|
||||
}
|
||||
|
||||
return arr
|
||||
}
|
||||
|
||||
function tripletToBase64 (num) {
|
||||
return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
|
||||
}
|
||||
|
||||
function encodeChunk (uint8, start, end) {
|
||||
var tmp
|
||||
var output = []
|
||||
for (var i = start; i < end; i += 3) {
|
||||
tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
|
||||
output.push(tripletToBase64(tmp))
|
||||
}
|
||||
return output.join('')
|
||||
}
|
||||
|
||||
function fromByteArray (uint8) {
|
||||
var tmp
|
||||
var len = uint8.length
|
||||
var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
|
||||
var output = ''
|
||||
var parts = []
|
||||
var maxChunkLength = 16383 // must be multiple of 3
|
||||
|
||||
// go through the array every three bytes, we'll deal with trailing stuff later
|
||||
for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
|
||||
parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
|
||||
}
|
||||
|
||||
// pad the end with zeros, but make sure to not forget the extra bytes
|
||||
if (extraBytes === 1) {
|
||||
tmp = uint8[len - 1]
|
||||
output += lookup[tmp >> 2]
|
||||
output += lookup[(tmp << 4) & 0x3F]
|
||||
output += '=='
|
||||
} else if (extraBytes === 2) {
|
||||
tmp = (uint8[len - 2] << 8) + (uint8[len - 1])
|
||||
output += lookup[tmp >> 10]
|
||||
output += lookup[(tmp >> 4) & 0x3F]
|
||||
output += lookup[(tmp << 2) & 0x3F]
|
||||
output += '='
|
||||
}
|
||||
|
||||
parts.push(output)
|
||||
|
||||
return parts.join('')
|
||||
}
|
65
node_modules/base64-js/package.json
generated
vendored
Normal file
65
node_modules/base64-js/package.json
generated
vendored
Normal file
@ -0,0 +1,65 @@
|
||||
{
|
||||
"_from": "base64-js@1.2.0",
|
||||
"_id": "base64-js@1.2.0",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=",
|
||||
"_location": "/base64-js",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "version",
|
||||
"registry": true,
|
||||
"raw": "base64-js@1.2.0",
|
||||
"name": "base64-js",
|
||||
"escapedName": "base64-js",
|
||||
"rawSpec": "1.2.0",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "1.2.0"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/plist"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz",
|
||||
"_shasum": "a39992d723584811982be5e290bb6a53d86700f1",
|
||||
"_spec": "base64-js@1.2.0",
|
||||
"_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/plist",
|
||||
"author": {
|
||||
"name": "T. Jameson Little",
|
||||
"email": "t.jameson.little@gmail.com"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/beatgammit/base64-js/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"deprecated": false,
|
||||
"description": "Base64 encoding/decoding in pure JS",
|
||||
"devDependencies": {
|
||||
"benchmark": "^2.1.0",
|
||||
"browserify": "^13.0.0",
|
||||
"standard": "*",
|
||||
"tape": "4.x",
|
||||
"uglify-js": "^2.6.2"
|
||||
},
|
||||
"files": [
|
||||
"test",
|
||||
"index.js",
|
||||
"base64js.min.js"
|
||||
],
|
||||
"homepage": "https://github.com/beatgammit/base64-js",
|
||||
"keywords": [
|
||||
"base64"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "index.js",
|
||||
"name": "base64-js",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/beatgammit/base64-js.git"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "browserify -s base64js -r ./ | uglifyjs -m > base64js.min.js",
|
||||
"lint": "standard",
|
||||
"test": "npm run lint && npm run unit",
|
||||
"unit": "tape test/*.js"
|
||||
},
|
||||
"version": "1.2.0"
|
||||
}
|
24
node_modules/base64-js/test/big-data.js
generated
vendored
Normal file
24
node_modules/base64-js/test/big-data.js
generated
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
var test = require('tape')
|
||||
var b64 = require('../')
|
||||
|
||||
test('convert big data to base64', function (t) {
|
||||
var b64str, arr, i, length
|
||||
var big = new Uint8Array(64 * 1024 * 1024)
|
||||
for (i = 0, length = big.length; i < length; ++i) {
|
||||
big[i] = i % 256
|
||||
}
|
||||
b64str = b64.fromByteArray(big)
|
||||
arr = b64.toByteArray(b64str)
|
||||
t.ok(equal(arr, big))
|
||||
t.end()
|
||||
})
|
||||
|
||||
function equal (a, b) {
|
||||
var i
|
||||
var length = a.length
|
||||
if (length !== b.length) return false
|
||||
for (i = 0; i < length; ++i) {
|
||||
if (a[i] !== b[i]) return false
|
||||
}
|
||||
return true
|
||||
}
|
48
node_modules/base64-js/test/convert.js
generated
vendored
Normal file
48
node_modules/base64-js/test/convert.js
generated
vendored
Normal file
@ -0,0 +1,48 @@
|
||||
var test = require('tape')
|
||||
var b64 = require('../')
|
||||
var checks = [
|
||||
'a',
|
||||
'aa',
|
||||
'aaa',
|
||||
'hi',
|
||||
'hi!',
|
||||
'hi!!',
|
||||
'sup',
|
||||
'sup?',
|
||||
'sup?!'
|
||||
]
|
||||
|
||||
test('convert to base64 and back', function (t) {
|
||||
t.plan(checks.length * 2)
|
||||
|
||||
for (var i = 0; i < checks.length; i++) {
|
||||
var check = checks[i]
|
||||
var b64Str, arr, str
|
||||
|
||||
b64Str = b64.fromByteArray(map(check, function (char) { return char.charCodeAt(0) }))
|
||||
|
||||
arr = b64.toByteArray(b64Str)
|
||||
str = map(arr, function (byte) { return String.fromCharCode(byte) }).join('')
|
||||
|
||||
t.equal(check, str, 'Checked ' + check)
|
||||
t.equal(b64.byteLength(b64Str), arr.length, 'Checked length for ' + check)
|
||||
}
|
||||
})
|
||||
|
||||
function map (arr, callback) {
|
||||
var res = []
|
||||
var kValue, mappedValue
|
||||
|
||||
for (var k = 0, len = arr.length; k < len; k++) {
|
||||
if ((typeof arr === 'string' && !!arr.charAt(k))) {
|
||||
kValue = arr.charAt(k)
|
||||
mappedValue = callback(kValue, k, arr)
|
||||
res[k] = mappedValue
|
||||
} else if (typeof arr !== 'string' && k in arr) {
|
||||
kValue = arr[k]
|
||||
mappedValue = callback(kValue, k, arr)
|
||||
res[k] = mappedValue
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
18
node_modules/base64-js/test/url-safe.js
generated
vendored
Normal file
18
node_modules/base64-js/test/url-safe.js
generated
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
var test = require('tape')
|
||||
var b64 = require('../')
|
||||
|
||||
test('decode url-safe style base64 strings', function (t) {
|
||||
var expected = [0xff, 0xff, 0xbe, 0xff, 0xef, 0xbf, 0xfb, 0xef, 0xff]
|
||||
|
||||
var actual = b64.toByteArray('//++/++/++//')
|
||||
for (var i = 0; i < actual.length; i++) {
|
||||
t.equal(actual[i], expected[i])
|
||||
}
|
||||
|
||||
actual = b64.toByteArray('__--_--_--__')
|
||||
for (i = 0; i < actual.length; i++) {
|
||||
t.equal(actual[i], expected[i])
|
||||
}
|
||||
|
||||
t.end()
|
||||
})
|
2385
node_modules/big-integer/BigInteger.d.ts
generated
vendored
Normal file
2385
node_modules/big-integer/BigInteger.d.ts
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1308
node_modules/big-integer/BigInteger.js
generated
vendored
Normal file
1308
node_modules/big-integer/BigInteger.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1
node_modules/big-integer/BigInteger.min.js
generated
vendored
Normal file
1
node_modules/big-integer/BigInteger.min.js
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
24
node_modules/big-integer/LICENSE
generated
vendored
Normal file
24
node_modules/big-integer/LICENSE
generated
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
This is free and unencumbered software released into the public domain.
|
||||
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||
distribute this software, either in source code form or as a compiled
|
||||
binary, for any purpose, commercial or non-commercial, and by any
|
||||
means.
|
||||
|
||||
In jurisdictions that recognize copyright laws, the author or authors
|
||||
of this software dedicate any and all copyright interest in the
|
||||
software to the public domain. We make this dedication for the benefit
|
||||
of the public at large and to the detriment of our heirs and
|
||||
successors. We intend this dedication to be an overt act of
|
||||
relinquishment in perpetuity of all present and future rights to this
|
||||
software under copyright law.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
For more information, please refer to <http://unlicense.org>
|
570
node_modules/big-integer/README.md
generated
vendored
Normal file
570
node_modules/big-integer/README.md
generated
vendored
Normal file
@ -0,0 +1,570 @@
|
||||
# BigInteger.js [![Build Status][travis-img]][travis-url] [![Coverage Status][coveralls-img]][coveralls-url] [![Monthly Downloads][downloads-img]][downloads-url]
|
||||
|
||||
[travis-url]: https://travis-ci.org/peterolson/BigInteger.js
|
||||
[travis-img]: https://travis-ci.org/peterolson/BigInteger.js.svg?branch=master
|
||||
[coveralls-url]: https://coveralls.io/github/peterolson/BigInteger.js?branch=master
|
||||
[coveralls-img]: https://coveralls.io/repos/peterolson/BigInteger.js/badge.svg?branch=master&service=github
|
||||
[downloads-url]: https://www.npmjs.com/package/big-integer
|
||||
[downloads-img]: https://img.shields.io/npm/dm/big-integer.svg
|
||||
|
||||
**BigInteger.js** is an arbitrary-length integer library for Javascript, allowing arithmetic operations on integers of unlimited size, notwithstanding memory and time limitations.
|
||||
|
||||
## Installation
|
||||
|
||||
If you are using a browser, you can download [BigInteger.js from GitHub](http://peterolson.github.com/BigInteger.js/BigInteger.min.js) or just hotlink to it:
|
||||
|
||||
<script src="http://peterolson.github.com/BigInteger.js/BigInteger.min.js"></script>
|
||||
|
||||
If you are using node, you can install BigInteger with [npm](https://npmjs.org/).
|
||||
|
||||
npm install big-integer
|
||||
|
||||
Then you can include it in your code:
|
||||
|
||||
var bigInt = require("big-integer");
|
||||
|
||||
|
||||
## Usage
|
||||
### `bigInt(number, [base])`
|
||||
|
||||
You can create a bigInt by calling the `bigInt` function. You can pass in
|
||||
|
||||
- a string, which it will parse as an bigInt and throw an `"Invalid integer"` error if the parsing fails.
|
||||
- a Javascript number, which it will parse as an bigInt and throw an `"Invalid integer"` error if the parsing fails.
|
||||
- another bigInt.
|
||||
- nothing, and it will return `bigInt.zero`.
|
||||
|
||||
If you provide a second parameter, then it will parse `number` as a number in base `base`. Note that `base` can be any bigInt (even negative or zero). The letters "a-z" and "A-Z" will be interpreted as the numbers 10 to 35. Higher digits can be specified in angle brackets (`<` and `>`).
|
||||
|
||||
Examples:
|
||||
|
||||
var zero = bigInt();
|
||||
var ninetyThree = bigInt(93);
|
||||
var largeNumber = bigInt("75643564363473453456342378564387956906736546456235345");
|
||||
var googol = bigInt("1e100");
|
||||
var bigNumber = bigInt(largeNumber);
|
||||
|
||||
var maximumByte = bigInt("FF", 16);
|
||||
var fiftyFiveGoogol = bigInt("<55>0", googol);
|
||||
|
||||
Note that Javascript numbers larger than `9007199254740992` and smaller than `-9007199254740992` are not precisely represented numbers and will not produce exact results. If you are dealing with numbers outside that range, it is better to pass in strings.
|
||||
|
||||
### Method Chaining
|
||||
|
||||
Note that bigInt operations return bigInts, which allows you to chain methods, for example:
|
||||
|
||||
var salary = bigInt(dollarsPerHour).times(hoursWorked).plus(randomBonuses)
|
||||
|
||||
### Constants
|
||||
|
||||
There are three named constants already stored that you do not have to construct with the `bigInt` function yourself:
|
||||
|
||||
- `bigInt.one`, equivalent to `bigInt(1)`
|
||||
- `bigInt.zero`, equivalent to `bigInt(0)`
|
||||
- `bigInt.minusOne`, equivalent to `bigInt(-1)`
|
||||
|
||||
The numbers from -999 to 999 are also already prestored and can be accessed using `bigInt[index]`, for example:
|
||||
|
||||
- `bigInt[-999]`, equivalent to `bigInt(-999)`
|
||||
- `bigInt[256]`, equivalent to `bigInt(256)`
|
||||
|
||||
### Methods
|
||||
|
||||
#### `abs()`
|
||||
|
||||
Returns the absolute value of a bigInt.
|
||||
|
||||
- `bigInt(-45).abs()` => `45`
|
||||
- `bigInt(45).abs()` => `45`
|
||||
|
||||
#### `add(number)`
|
||||
|
||||
Performs addition.
|
||||
|
||||
- `bigInt(5).add(7)` => `12`
|
||||
|
||||
[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Addition)
|
||||
|
||||
#### `and(number)`
|
||||
|
||||
Performs the bitwise AND operation. The operands are treated as if they were represented using [two's complement representation](http://en.wikipedia.org/wiki/Two%27s_complement).
|
||||
|
||||
- `bigInt(6).and(3)` => `2`
|
||||
- `bigInt(6).and(-3)` => `4`
|
||||
|
||||
#### `bitLength()`
|
||||
|
||||
Returns the number of digits required to represent a bigInt in binary.
|
||||
|
||||
- `bigInt(5)` => `3` (since 5 is `101` in binary, which is three digits long)
|
||||
|
||||
#### `compare(number)`
|
||||
|
||||
Performs a comparison between two numbers. If the numbers are equal, it returns `0`. If the first number is greater, it returns `1`. If the first number is lesser, it returns `-1`.
|
||||
|
||||
- `bigInt(5).compare(5)` => `0`
|
||||
- `bigInt(5).compare(4)` => `1`
|
||||
- `bigInt(4).compare(5)` => `-1`
|
||||
|
||||
#### `compareAbs(number)`
|
||||
|
||||
Performs a comparison between the absolute value of two numbers.
|
||||
|
||||
- `bigInt(5).compareAbs(-5)` => `0`
|
||||
- `bigInt(5).compareAbs(4)` => `1`
|
||||
- `bigInt(4).compareAbs(-5)` => `-1`
|
||||
|
||||
#### `compareTo(number)`
|
||||
|
||||
Alias for the `compare` method.
|
||||
|
||||
#### `divide(number)`
|
||||
|
||||
Performs integer division, disregarding the remainder.
|
||||
|
||||
- `bigInt(59).divide(5)` => `11`
|
||||
|
||||
[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Division)
|
||||
|
||||
#### `divmod(number)`
|
||||
|
||||
Performs division and returns an object with two properties: `quotient` and `remainder`. The sign of the remainder will match the sign of the dividend.
|
||||
|
||||
- `bigInt(59).divmod(5)` => `{quotient: bigInt(11), remainder: bigInt(4) }`
|
||||
- `bigInt(-5).divmod(2)` => `{quotient: bigInt(-2), remainder: bigInt(-1) }`
|
||||
|
||||
[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Division)
|
||||
|
||||
#### `eq(number)`
|
||||
|
||||
Alias for the `equals` method.
|
||||
|
||||
#### `equals(number)`
|
||||
|
||||
Checks if two numbers are equal.
|
||||
|
||||
- `bigInt(5).equals(5)` => `true`
|
||||
- `bigInt(4).equals(7)` => `false`
|
||||
|
||||
#### `geq(number)`
|
||||
|
||||
Alias for the `greaterOrEquals` method.
|
||||
|
||||
|
||||
#### `greater(number)`
|
||||
|
||||
Checks if the first number is greater than the second.
|
||||
|
||||
- `bigInt(5).greater(6)` => `false`
|
||||
- `bigInt(5).greater(5)` => `false`
|
||||
- `bigInt(5).greater(4)` => `true`
|
||||
|
||||
#### `greaterOrEquals(number)`
|
||||
|
||||
Checks if the first number is greater than or equal to the second.
|
||||
|
||||
- `bigInt(5).greaterOrEquals(6)` => `false`
|
||||
- `bigInt(5).greaterOrEquals(5)` => `true`
|
||||
- `bigInt(5).greaterOrEquals(4)` => `true`
|
||||
|
||||
#### `gt(number)`
|
||||
|
||||
Alias for the `greater` method.
|
||||
|
||||
#### `isDivisibleBy(number)`
|
||||
|
||||
Returns `true` if the first number is divisible by the second number, `false` otherwise.
|
||||
|
||||
- `bigInt(999).isDivisibleBy(333)` => `true`
|
||||
- `bigInt(99).isDivisibleBy(5)` => `false`
|
||||
|
||||
#### `isEven()`
|
||||
|
||||
Returns `true` if the number is even, `false` otherwise.
|
||||
|
||||
- `bigInt(6).isEven()` => `true`
|
||||
- `bigInt(3).isEven()` => `false`
|
||||
|
||||
#### `isNegative()`
|
||||
|
||||
Returns `true` if the number is negative, `false` otherwise.
|
||||
Returns `false` for `0` and `-0`.
|
||||
|
||||
- `bigInt(-23).isNegative()` => `true`
|
||||
- `bigInt(50).isNegative()` => `false`
|
||||
|
||||
#### `isOdd()`
|
||||
|
||||
Returns `true` if the number is odd, `false` otherwise.
|
||||
|
||||
- `bigInt(13).isOdd()` => `true`
|
||||
- `bigInt(40).isOdd()` => `false`
|
||||
|
||||
#### `isPositive()`
|
||||
|
||||
Return `true` if the number is positive, `false` otherwise.
|
||||
Returns `false` for `0` and `-0`.
|
||||
|
||||
- `bigInt(54).isPositive()` => `true`
|
||||
- `bigInt(-1).isPositive()` => `false`
|
||||
|
||||
#### `isPrime()`
|
||||
|
||||
Returns `true` if the number is prime, `false` otherwise.
|
||||
|
||||
- `bigInt(5).isPrime()` => `true`
|
||||
- `bigInt(6).isPrime()` => `false`
|
||||
|
||||
#### `isProbablePrime([iterations])`
|
||||
|
||||
Returns `true` if the number is very likely to be prime, `false` otherwise.
|
||||
Argument is optional and determines the amount of iterations of the test (default: `5`). The more iterations, the lower chance of getting a false positive.
|
||||
This uses the [Fermat primality test](https://en.wikipedia.org/wiki/Fermat_primality_test).
|
||||
|
||||
- `bigInt(5).isProbablePrime()` => `true`
|
||||
- `bigInt(49).isProbablePrime()` => `false`
|
||||
- `bigInt(1729).isProbablePrime(50)` => `false`
|
||||
|
||||
Note that this function is not deterministic, since it relies on random sampling of factors, so the result for some numbers is not always the same. [Carmichael numbers](https://en.wikipedia.org/wiki/Carmichael_number) are particularly prone to give unreliable results.
|
||||
|
||||
For example, `bigInt(1729).isProbablePrime()` returns `false` about 76% of the time and `true` about 24% of the time. The correct result is `false`.
|
||||
|
||||
#### `isUnit()`
|
||||
|
||||
Returns `true` if the number is `1` or `-1`, `false` otherwise.
|
||||
|
||||
- `bigInt.one.isUnit()` => `true`
|
||||
- `bigInt.minusOne.isUnit()` => `true`
|
||||
- `bigInt(5).isUnit()` => `false`
|
||||
|
||||
#### `isZero()`
|
||||
|
||||
Return `true` if the number is `0` or `-0`, `false` otherwise.
|
||||
|
||||
- `bigInt.zero.isZero()` => `true`
|
||||
- `bigInt("-0").isZero()` => `true`
|
||||
- `bigInt(50).isZero()` => `false`
|
||||
|
||||
#### `leq(number)`
|
||||
|
||||
Alias for the `lesserOrEquals` method.
|
||||
|
||||
#### `lesser(number)`
|
||||
|
||||
Checks if the first number is lesser than the second.
|
||||
|
||||
- `bigInt(5).lesser(6)` => `true`
|
||||
- `bigInt(5).lesser(5)` => `false`
|
||||
- `bigInt(5).lesser(4)` => `false`
|
||||
|
||||
#### `lesserOrEquals(number)`
|
||||
|
||||
Checks if the first number is less than or equal to the second.
|
||||
|
||||
- `bigInt(5).lesserOrEquals(6)` => `true`
|
||||
- `bigInt(5).lesserOrEquals(5)` => `true`
|
||||
- `bigInt(5).lesserOrEquals(4)` => `false`
|
||||
|
||||
#### `lt(number)`
|
||||
|
||||
Alias for the `lesser` method.
|
||||
|
||||
#### `minus(number)`
|
||||
|
||||
Alias for the `subtract` method.
|
||||
|
||||
- `bigInt(3).minus(5)` => `-2`
|
||||
|
||||
[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Subtraction)
|
||||
|
||||
#### `mod(number)`
|
||||
|
||||
Performs division and returns the remainder, disregarding the quotient. The sign of the remainder will match the sign of the dividend.
|
||||
|
||||
- `bigInt(59).mod(5)` => `4`
|
||||
- `bigInt(-5).mod(2)` => `-1`
|
||||
|
||||
[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Division)
|
||||
|
||||
#### `modInv(mod)`
|
||||
|
||||
Finds the [multiplicative inverse](https://en.wikipedia.org/wiki/Modular_multiplicative_inverse) of the number modulo `mod`.
|
||||
|
||||
- `bigInt(3).modInv(11)` => `4`
|
||||
- `bigInt(42).modInv(2017)` => `1969`
|
||||
|
||||
#### `modPow(exp, mod)`
|
||||
|
||||
Takes the number to the power `exp` modulo `mod`.
|
||||
|
||||
- `bigInt(10).modPow(3, 30)` => `10`
|
||||
|
||||
#### `multiply(number)`
|
||||
|
||||
Performs multiplication.
|
||||
|
||||
- `bigInt(111).multiply(111)` => `12321`
|
||||
|
||||
[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Multiplication)
|
||||
|
||||
#### `neq(number)`
|
||||
|
||||
Alias for the `notEquals` method.
|
||||
|
||||
#### `next()`
|
||||
|
||||
Adds one to the number.
|
||||
|
||||
- `bigInt(6).next()` => `7`
|
||||
|
||||
#### `not()`
|
||||
|
||||
Performs the bitwise NOT operation. The operands are treated as if they were represented using [two's complement representation](http://en.wikipedia.org/wiki/Two%27s_complement).
|
||||
|
||||
- `bigInt(10).not()` => `-11`
|
||||
- `bigInt(0).not()` => `-1`
|
||||
|
||||
#### `notEquals(number)`
|
||||
|
||||
Checks if two numbers are not equal.
|
||||
|
||||
- `bigInt(5).notEquals(5)` => `false`
|
||||
- `bigInt(4).notEquals(7)` => `true`
|
||||
|
||||
#### `or(number)`
|
||||
|
||||
Performs the bitwise OR operation. The operands are treated as if they were represented using [two's complement representation](http://en.wikipedia.org/wiki/Two%27s_complement).
|
||||
|
||||
- `bigInt(13).or(10)` => `15`
|
||||
- `bigInt(13).or(-8)` => `-3`
|
||||
|
||||
#### `over(number)`
|
||||
|
||||
Alias for the `divide` method.
|
||||
|
||||
- `bigInt(59).over(5)` => `11`
|
||||
|
||||
[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Division)
|
||||
|
||||
#### `plus(number)`
|
||||
|
||||
Alias for the `add` method.
|
||||
|
||||
- `bigInt(5).plus(7)` => `12`
|
||||
|
||||
[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Addition)
|
||||
|
||||
#### `pow(number)`
|
||||
|
||||
Performs exponentiation. If the exponent is less than `0`, `pow` returns `0`. `bigInt.zero.pow(0)` returns `1`.
|
||||
|
||||
- `bigInt(16).pow(16)` => `18446744073709551616`
|
||||
|
||||
[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Exponentiation)
|
||||
|
||||
#### `prev(number)`
|
||||
|
||||
Subtracts one from the number.
|
||||
|
||||
- `bigInt(6).prev()` => `5`
|
||||
|
||||
#### `remainder(number)`
|
||||
|
||||
Alias for the `mod` method.
|
||||
|
||||
[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Division)
|
||||
|
||||
#### `shiftLeft(n)`
|
||||
|
||||
Shifts the number left by `n` places in its binary representation. If a negative number is provided, it will shift right. Throws an error if `n` is outside of the range `[-9007199254740992, 9007199254740992]`.
|
||||
|
||||
- `bigInt(8).shiftLeft(2)` => `32`
|
||||
- `bigInt(8).shiftLeft(-2)` => `2`
|
||||
|
||||
#### `shiftRight(n)`
|
||||
|
||||
Shifts the number right by `n` places in its binary representation. If a negative number is provided, it will shift left. Throws an error if `n` is outside of the range `[-9007199254740992, 9007199254740992]`.
|
||||
|
||||
- `bigInt(8).shiftRight(2)` => `2`
|
||||
- `bigInt(8).shiftRight(-2)` => `32`
|
||||
|
||||
#### `square()`
|
||||
|
||||
Squares the number
|
||||
|
||||
- `bigInt(3).square()` => `9`
|
||||
|
||||
[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Squaring)
|
||||
|
||||
#### `subtract(number)`
|
||||
|
||||
Performs subtraction.
|
||||
|
||||
- `bigInt(3).subtract(5)` => `-2`
|
||||
|
||||
[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Subtraction)
|
||||
|
||||
#### `times(number)`
|
||||
|
||||
Alias for the `multiply` method.
|
||||
|
||||
- `bigInt(111).times(111)` => `12321`
|
||||
|
||||
[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Multiplication)
|
||||
|
||||
#### `toArray(radix)`
|
||||
|
||||
Converts a bigInt into an object with the properties "value" and "isNegative." "Value" is an array of integers modulo the given radix. "isNegative" is a boolean that represents the sign of the result.
|
||||
|
||||
- `bigInt("1e9").toArray(10)` => {
|
||||
value: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||
isNegative: false
|
||||
}
|
||||
- `bigInt("1e9").toArray(16)` => {
|
||||
value: [3, 11, 9, 10, 12, 10, 0, 0],
|
||||
isNegative: false
|
||||
}
|
||||
- `bigInt(567890).toArray(100)` => {
|
||||
value: [56, 78, 90],
|
||||
isNegative: false
|
||||
}
|
||||
|
||||
Negative bases are supported.
|
||||
|
||||
- `bigInt(12345).toArray(-10)` => {
|
||||
value: [2, 8, 4, 6, 5],
|
||||
isNegative: false
|
||||
}
|
||||
|
||||
Base 1 and base -1 are also supported.
|
||||
|
||||
- `bigInt(-15).toArray(1)` => {
|
||||
value: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
||||
isNegative: true
|
||||
}
|
||||
- `bigInt(-15).toArray(-1)` => {
|
||||
value: [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
|
||||
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
|
||||
isNegative: false
|
||||
}
|
||||
|
||||
Base 0 is only allowed for the number zero.
|
||||
|
||||
- `bigInt(0).toArray(0)` => {
|
||||
value: [0],
|
||||
isNegative: false
|
||||
}
|
||||
- `bigInt(1).toArray(0)` => `Error: Cannot convert nonzero numbers to base 0.`
|
||||
|
||||
#### `toJSNumber()`
|
||||
|
||||
Converts a bigInt into a native Javascript number. Loses precision for numbers outside the range `[-9007199254740992, 9007199254740992]`.
|
||||
|
||||
- `bigInt("18446744073709551616").toJSNumber()` => `18446744073709552000`
|
||||
|
||||
#### `xor(number)`
|
||||
|
||||
Performs the bitwise XOR operation. The operands are treated as if they were represented using [two's complement representation](http://en.wikipedia.org/wiki/Two%27s_complement).
|
||||
|
||||
- `bigInt(12).xor(5)` => `9`
|
||||
- `bigInt(12).xor(-5)` => `-9`
|
||||
|
||||
### Static Methods
|
||||
|
||||
#### `fromArray(digits, base = 10, isNegative?)`
|
||||
|
||||
Constructs a bigInt from an array of digits in base `base`. The optional `isNegative` flag will make the number negative.
|
||||
|
||||
- `bigInt.fromArray([1, 2, 3, 4, 5], 10)` => `12345`
|
||||
- `bigInt.fromArray([1, 0, 0], 2, true)` => `-4`
|
||||
|
||||
#### `gcd(a, b)`
|
||||
|
||||
Finds the greatest common denominator of `a` and `b`.
|
||||
|
||||
- `bigInt.gcd(42,56)` => `14`
|
||||
|
||||
#### `isInstance(x)`
|
||||
|
||||
Returns `true` if `x` is a BigInteger, `false` otherwise.
|
||||
|
||||
- `bigInt.isInstance(bigInt(14))` => `true`
|
||||
- `bigInt.isInstance(14)` => `false`
|
||||
|
||||
#### `lcm(a,b)`
|
||||
|
||||
Finds the least common multiple of `a` and `b`.
|
||||
|
||||
- `bigInt.lcm(21, 6)` => `42`
|
||||
|
||||
#### `max(a,b)`
|
||||
|
||||
Returns the largest of `a` and `b`.
|
||||
|
||||
- `bigInt.max(77, 432)` => `432`
|
||||
|
||||
#### `min(a,b)`
|
||||
|
||||
Returns the smallest of `a` and `b`.
|
||||
|
||||
- `bigInt.min(77, 432)` => `77`
|
||||
|
||||
#### `randBetween(min, max)`
|
||||
|
||||
Returns a random number between `min` and `max`.
|
||||
|
||||
- `bigInt.randBetween("-1e100", "1e100")` => (for example) `8494907165436643479673097939554427056789510374838494147955756275846226209006506706784609314471378745`
|
||||
|
||||
|
||||
### Override Methods
|
||||
|
||||
#### `toString(radix = 10)`
|
||||
|
||||
Converts a bigInt to a string. There is an optional radix parameter (which defaults to 10) that converts the number to the given radix. Digits in the range `10-35` will use the letters `a-z`.
|
||||
|
||||
- `bigInt("1e9").toString()` => `"1000000000"`
|
||||
- `bigInt("1e9").toString(16)` => `"3b9aca00"`
|
||||
|
||||
**Note that arithmetical operators will trigger the `valueOf` function rather than the `toString` function.** When converting a bigInteger to a string, you should use the `toString` method or the `String` function instead of adding the empty string.
|
||||
|
||||
- `bigInt("999999999999999999").toString()` => `"999999999999999999"`
|
||||
- `String(bigInt("999999999999999999"))` => `"999999999999999999"`
|
||||
- `bigInt("999999999999999999") + ""` => `1000000000000000000`
|
||||
|
||||
Bases larger than 36 are supported. If a digit is greater than or equal to 36, it will be enclosed in angle brackets.
|
||||
|
||||
- `bigInt(567890).toString(100)` => `"<56><78><90>"`
|
||||
|
||||
Negative bases are also supported.
|
||||
|
||||
- `bigInt(12345).toString(-10)` => `"28465"`
|
||||
|
||||
Base 1 and base -1 are also supported.
|
||||
|
||||
- `bigInt(-15).toString(1)` => `"-111111111111111"`
|
||||
- `bigInt(-15).toString(-1)` => `"101010101010101010101010101010"`
|
||||
|
||||
Base 0 is only allowed for the number zero.
|
||||
|
||||
- `bigInt(0).toString(0)` => `0`
|
||||
- `bigInt(1).toString(0)` => `Error: Cannot convert nonzero numbers to base 0.`
|
||||
|
||||
[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#toString)
|
||||
|
||||
#### `valueOf()`
|
||||
|
||||
Converts a bigInt to a native Javascript number. This override allows you to use native arithmetic operators without explicit conversion:
|
||||
|
||||
- `bigInt("100") + bigInt("200") === 300; //true`
|
||||
|
||||
## Contributors
|
||||
|
||||
To contribute, just fork the project, make some changes, and submit a pull request. Please verify that the unit tests pass before submitting.
|
||||
|
||||
The unit tests are contained in the `spec/spec.js` file. You can run them locally by opening the `spec/SpecRunner.html` or file or running `npm test`. You can also [run the tests online from GitHub](http://peterolson.github.io/BigInteger.js/spec/SpecRunner.html).
|
||||
|
||||
There are performance benchmarks that can be viewed from the `benchmarks/index.html` page. You can [run them online from GitHub](http://peterolson.github.io/BigInteger.js/benchmark/).
|
||||
|
||||
## License
|
||||
|
||||
This project is public domain. For more details, read about the [Unlicense](http://unlicense.org/).
|
29
node_modules/big-integer/bower.json
generated
vendored
Normal file
29
node_modules/big-integer/bower.json
generated
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
{
|
||||
"name": "big-integer",
|
||||
"description": "An arbitrary length integer library for Javascript",
|
||||
"main": "./BigInteger.js",
|
||||
"authors": [
|
||||
"Peter Olson"
|
||||
],
|
||||
"license": "Unlicense",
|
||||
"keywords": [
|
||||
"math",
|
||||
"big",
|
||||
"bignum",
|
||||
"bigint",
|
||||
"biginteger",
|
||||
"integer",
|
||||
"arbitrary",
|
||||
"precision",
|
||||
"arithmetic"
|
||||
],
|
||||
"homepage": "https://github.com/peterolson/BigInteger.js",
|
||||
"ignore": [
|
||||
"**/.*",
|
||||
"node_modules",
|
||||
"bower_components",
|
||||
"test",
|
||||
"coverage",
|
||||
"tests"
|
||||
]
|
||||
}
|
80
node_modules/big-integer/package.json
generated
vendored
Normal file
80
node_modules/big-integer/package.json
generated
vendored
Normal file
@ -0,0 +1,80 @@
|
||||
{
|
||||
"_from": "big-integer@^1.6.7",
|
||||
"_id": "big-integer@1.6.32",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-ljKJdR3wk9thHfLj4DtrNiOSTxvGFaMjWrG4pW75juXC4j7+XuKJVFdg4kgFMYp85PVkO05dFMj2dk2xVsH4xw==",
|
||||
"_location": "/big-integer",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "range",
|
||||
"registry": true,
|
||||
"raw": "big-integer@^1.6.7",
|
||||
"name": "big-integer",
|
||||
"escapedName": "big-integer",
|
||||
"rawSpec": "^1.6.7",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "^1.6.7"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/bplist-parser"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.32.tgz",
|
||||
"_shasum": "5867458b25ecd5bcb36b627c30bb501a13c07e89",
|
||||
"_spec": "big-integer@^1.6.7",
|
||||
"_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/bplist-parser",
|
||||
"author": {
|
||||
"name": "Peter Olson",
|
||||
"email": "peter.e.c.olson+npm@gmail.com"
|
||||
},
|
||||
"bin": {},
|
||||
"bugs": {
|
||||
"url": "https://github.com/peterolson/BigInteger.js/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"contributors": [],
|
||||
"deprecated": false,
|
||||
"description": "An arbitrary length integer library for Javascript",
|
||||
"devDependencies": {
|
||||
"@types/lodash": "^4.14.109",
|
||||
"@types/node": "^7.0.65",
|
||||
"coveralls": "^2.11.4",
|
||||
"jasmine": "2.1.x",
|
||||
"jasmine-core": "^2.3.4",
|
||||
"karma": "^0.13.22",
|
||||
"karma-cli": "^1.0.1",
|
||||
"karma-coverage": "^0.4.2",
|
||||
"karma-jasmine": "^0.3.6",
|
||||
"karma-phantomjs-launcher": "^1.0.4",
|
||||
"lodash": "^4.17.4",
|
||||
"typescript": "^2.3.3",
|
||||
"uglifyjs": "^2.4.10"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.6"
|
||||
},
|
||||
"homepage": "https://github.com/peterolson/BigInteger.js#readme",
|
||||
"keywords": [
|
||||
"math",
|
||||
"big",
|
||||
"bignum",
|
||||
"bigint",
|
||||
"biginteger",
|
||||
"integer",
|
||||
"arbitrary",
|
||||
"precision",
|
||||
"arithmetic"
|
||||
],
|
||||
"license": "Unlicense",
|
||||
"main": "./BigInteger",
|
||||
"name": "big-integer",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+ssh://git@github.com/peterolson/BigInteger.js.git"
|
||||
},
|
||||
"scripts": {
|
||||
"minify": "uglifyjs BigInteger.js -o BigInteger.min.js",
|
||||
"test": "tsc && karma start my.conf.js && node spec/tsDefinitions.js"
|
||||
},
|
||||
"typings": "./BigInteger.d.ts",
|
||||
"version": "1.6.32"
|
||||
}
|
25
node_modules/big-integer/tsconfig.json
generated
vendored
Normal file
25
node_modules/big-integer/tsconfig.json
generated
vendored
Normal file
@ -0,0 +1,25 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"lib": [
|
||||
"es6"
|
||||
],
|
||||
"noImplicitAny": true,
|
||||
"noImplicitThis": true,
|
||||
"strictNullChecks": false,
|
||||
"baseUrl": "./",
|
||||
"moduleResolution": "node",
|
||||
"allowJs": true,
|
||||
"typeRoots": [
|
||||
"./"
|
||||
],
|
||||
"types": [
|
||||
"node"
|
||||
],
|
||||
"forceConsistentCasingInFileNames": true
|
||||
},
|
||||
"files": [
|
||||
"BigInteger.d.ts",
|
||||
"spec/tsDefinitions.ts"
|
||||
]
|
||||
}
|
8
node_modules/bplist-parser/.npmignore
generated
vendored
Normal file
8
node_modules/bplist-parser/.npmignore
generated
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
/build/*
|
||||
node_modules
|
||||
*.node
|
||||
*.sh
|
||||
*.swp
|
||||
.lock*
|
||||
npm-debug.log
|
||||
.idea
|
47
node_modules/bplist-parser/README.md
generated
vendored
Normal file
47
node_modules/bplist-parser/README.md
generated
vendored
Normal file
@ -0,0 +1,47 @@
|
||||
bplist-parser
|
||||
=============
|
||||
|
||||
Binary Mac OS X Plist (property list) parser.
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
$ npm install bplist-parser
|
||||
```
|
||||
|
||||
## Quick Examples
|
||||
|
||||
```javascript
|
||||
var bplist = require('bplist-parser');
|
||||
|
||||
bplist.parseFile('myPlist.bplist', function(err, obj) {
|
||||
if (err) throw err;
|
||||
|
||||
console.log(JSON.stringify(obj));
|
||||
});
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
(The MIT License)
|
||||
|
||||
Copyright (c) 2012 Near Infinity Corporation
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
357
node_modules/bplist-parser/bplistParser.js
generated
vendored
Normal file
357
node_modules/bplist-parser/bplistParser.js
generated
vendored
Normal file
@ -0,0 +1,357 @@
|
||||
'use strict';
|
||||
|
||||
// adapted from http://code.google.com/p/plist/source/browse/trunk/src/com/dd/plist/BinaryPropertyListParser.java
|
||||
|
||||
var fs = require('fs');
|
||||
var bigInt = require("big-integer");
|
||||
var debug = false;
|
||||
|
||||
exports.maxObjectSize = 100 * 1000 * 1000; // 100Meg
|
||||
exports.maxObjectCount = 32768;
|
||||
|
||||
// EPOCH = new SimpleDateFormat("yyyy MM dd zzz").parse("2001 01 01 GMT").getTime();
|
||||
// ...but that's annoying in a static initializer because it can throw exceptions, ick.
|
||||
// So we just hardcode the correct value.
|
||||
var EPOCH = 978307200000;
|
||||
|
||||
// UID object definition
|
||||
var UID = exports.UID = function(id) {
|
||||
this.UID = id;
|
||||
}
|
||||
|
||||
var parseFile = exports.parseFile = function (fileNameOrBuffer, callback) {
|
||||
function tryParseBuffer(buffer) {
|
||||
var err = null;
|
||||
var result;
|
||||
try {
|
||||
result = parseBuffer(buffer);
|
||||
} catch (ex) {
|
||||
err = ex;
|
||||
}
|
||||
callback(err, result);
|
||||
}
|
||||
|
||||
if (Buffer.isBuffer(fileNameOrBuffer)) {
|
||||
return tryParseBuffer(fileNameOrBuffer);
|
||||
} else {
|
||||
fs.readFile(fileNameOrBuffer, function (err, data) {
|
||||
if (err) { return callback(err); }
|
||||
tryParseBuffer(data);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
var parseBuffer = exports.parseBuffer = function (buffer) {
|
||||
var result = {};
|
||||
|
||||
// check header
|
||||
var header = buffer.slice(0, 'bplist'.length).toString('utf8');
|
||||
if (header !== 'bplist') {
|
||||
throw new Error("Invalid binary plist. Expected 'bplist' at offset 0.");
|
||||
}
|
||||
|
||||
// Handle trailer, last 32 bytes of the file
|
||||
var trailer = buffer.slice(buffer.length - 32, buffer.length);
|
||||
// 6 null bytes (index 0 to 5)
|
||||
var offsetSize = trailer.readUInt8(6);
|
||||
if (debug) {
|
||||
console.log("offsetSize: " + offsetSize);
|
||||
}
|
||||
var objectRefSize = trailer.readUInt8(7);
|
||||
if (debug) {
|
||||
console.log("objectRefSize: " + objectRefSize);
|
||||
}
|
||||
var numObjects = readUInt64BE(trailer, 8);
|
||||
if (debug) {
|
||||
console.log("numObjects: " + numObjects);
|
||||
}
|
||||
var topObject = readUInt64BE(trailer, 16);
|
||||
if (debug) {
|
||||
console.log("topObject: " + topObject);
|
||||
}
|
||||
var offsetTableOffset = readUInt64BE(trailer, 24);
|
||||
if (debug) {
|
||||
console.log("offsetTableOffset: " + offsetTableOffset);
|
||||
}
|
||||
|
||||
if (numObjects > exports.maxObjectCount) {
|
||||
throw new Error("maxObjectCount exceeded");
|
||||
}
|
||||
|
||||
// Handle offset table
|
||||
var offsetTable = [];
|
||||
|
||||
for (var i = 0; i < numObjects; i++) {
|
||||
var offsetBytes = buffer.slice(offsetTableOffset + i * offsetSize, offsetTableOffset + (i + 1) * offsetSize);
|
||||
offsetTable[i] = readUInt(offsetBytes, 0);
|
||||
if (debug) {
|
||||
console.log("Offset for Object #" + i + " is " + offsetTable[i] + " [" + offsetTable[i].toString(16) + "]");
|
||||
}
|
||||
}
|
||||
|
||||
// Parses an object inside the currently parsed binary property list.
|
||||
// For the format specification check
|
||||
// <a href="http://www.opensource.apple.com/source/CF/CF-635/CFBinaryPList.c">
|
||||
// Apple's binary property list parser implementation</a>.
|
||||
function parseObject(tableOffset) {
|
||||
var offset = offsetTable[tableOffset];
|
||||
var type = buffer[offset];
|
||||
var objType = (type & 0xF0) >> 4; //First 4 bits
|
||||
var objInfo = (type & 0x0F); //Second 4 bits
|
||||
switch (objType) {
|
||||
case 0x0:
|
||||
return parseSimple();
|
||||
case 0x1:
|
||||
return parseInteger();
|
||||
case 0x8:
|
||||
return parseUID();
|
||||
case 0x2:
|
||||
return parseReal();
|
||||
case 0x3:
|
||||
return parseDate();
|
||||
case 0x4:
|
||||
return parseData();
|
||||
case 0x5: // ASCII
|
||||
return parsePlistString();
|
||||
case 0x6: // UTF-16
|
||||
return parsePlistString(true);
|
||||
case 0xA:
|
||||
return parseArray();
|
||||
case 0xD:
|
||||
return parseDictionary();
|
||||
default:
|
||||
throw new Error("Unhandled type 0x" + objType.toString(16));
|
||||
}
|
||||
|
||||
function parseSimple() {
|
||||
//Simple
|
||||
switch (objInfo) {
|
||||
case 0x0: // null
|
||||
return null;
|
||||
case 0x8: // false
|
||||
return false;
|
||||
case 0x9: // true
|
||||
return true;
|
||||
case 0xF: // filler byte
|
||||
return null;
|
||||
default:
|
||||
throw new Error("Unhandled simple type 0x" + objType.toString(16));
|
||||
}
|
||||
}
|
||||
|
||||
function bufferToHexString(buffer) {
|
||||
var str = '';
|
||||
var i;
|
||||
for (i = 0; i < buffer.length; i++) {
|
||||
if (buffer[i] != 0x00) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (; i < buffer.length; i++) {
|
||||
var part = '00' + buffer[i].toString(16);
|
||||
str += part.substr(part.length - 2);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
function parseInteger() {
|
||||
var length = Math.pow(2, objInfo);
|
||||
if (length > 4) {
|
||||
var data = buffer.slice(offset + 1, offset + 1 + length);
|
||||
var str = bufferToHexString(data);
|
||||
return bigInt(str, 16);
|
||||
} if (length < exports.maxObjectSize) {
|
||||
return readUInt(buffer.slice(offset + 1, offset + 1 + length));
|
||||
} else {
|
||||
throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available.");
|
||||
}
|
||||
}
|
||||
|
||||
function parseUID() {
|
||||
var length = objInfo + 1;
|
||||
if (length < exports.maxObjectSize) {
|
||||
return new UID(readUInt(buffer.slice(offset + 1, offset + 1 + length)));
|
||||
} else {
|
||||
throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available.");
|
||||
}
|
||||
}
|
||||
|
||||
function parseReal() {
|
||||
var length = Math.pow(2, objInfo);
|
||||
if (length < exports.maxObjectSize) {
|
||||
var realBuffer = buffer.slice(offset + 1, offset + 1 + length);
|
||||
if (length === 4) {
|
||||
return realBuffer.readFloatBE(0);
|
||||
}
|
||||
else if (length === 8) {
|
||||
return realBuffer.readDoubleBE(0);
|
||||
}
|
||||
} else {
|
||||
throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available.");
|
||||
}
|
||||
}
|
||||
|
||||
function parseDate() {
|
||||
if (objInfo != 0x3) {
|
||||
console.error("Unknown date type :" + objInfo + ". Parsing anyway...");
|
||||
}
|
||||
var dateBuffer = buffer.slice(offset + 1, offset + 9);
|
||||
return new Date(EPOCH + (1000 * dateBuffer.readDoubleBE(0)));
|
||||
}
|
||||
|
||||
function parseData() {
|
||||
var dataoffset = 1;
|
||||
var length = objInfo;
|
||||
if (objInfo == 0xF) {
|
||||
var int_type = buffer[offset + 1];
|
||||
var intType = (int_type & 0xF0) / 0x10;
|
||||
if (intType != 0x1) {
|
||||
console.error("0x4: UNEXPECTED LENGTH-INT TYPE! " + intType);
|
||||
}
|
||||
var intInfo = int_type & 0x0F;
|
||||
var intLength = Math.pow(2, intInfo);
|
||||
dataoffset = 2 + intLength;
|
||||
if (intLength < 3) {
|
||||
length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
|
||||
} else {
|
||||
length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
|
||||
}
|
||||
}
|
||||
if (length < exports.maxObjectSize) {
|
||||
return buffer.slice(offset + dataoffset, offset + dataoffset + length);
|
||||
} else {
|
||||
throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available.");
|
||||
}
|
||||
}
|
||||
|
||||
function parsePlistString (isUtf16) {
|
||||
isUtf16 = isUtf16 || 0;
|
||||
var enc = "utf8";
|
||||
var length = objInfo;
|
||||
var stroffset = 1;
|
||||
if (objInfo == 0xF) {
|
||||
var int_type = buffer[offset + 1];
|
||||
var intType = (int_type & 0xF0) / 0x10;
|
||||
if (intType != 0x1) {
|
||||
console.err("UNEXPECTED LENGTH-INT TYPE! " + intType);
|
||||
}
|
||||
var intInfo = int_type & 0x0F;
|
||||
var intLength = Math.pow(2, intInfo);
|
||||
var stroffset = 2 + intLength;
|
||||
if (intLength < 3) {
|
||||
length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
|
||||
} else {
|
||||
length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
|
||||
}
|
||||
}
|
||||
// length is String length -> to get byte length multiply by 2, as 1 character takes 2 bytes in UTF-16
|
||||
length *= (isUtf16 + 1);
|
||||
if (length < exports.maxObjectSize) {
|
||||
var plistString = new Buffer(buffer.slice(offset + stroffset, offset + stroffset + length));
|
||||
if (isUtf16) {
|
||||
plistString = swapBytes(plistString);
|
||||
enc = "ucs2";
|
||||
}
|
||||
return plistString.toString(enc);
|
||||
} else {
|
||||
throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available.");
|
||||
}
|
||||
}
|
||||
|
||||
function parseArray() {
|
||||
var length = objInfo;
|
||||
var arrayoffset = 1;
|
||||
if (objInfo == 0xF) {
|
||||
var int_type = buffer[offset + 1];
|
||||
var intType = (int_type & 0xF0) / 0x10;
|
||||
if (intType != 0x1) {
|
||||
console.error("0xa: UNEXPECTED LENGTH-INT TYPE! " + intType);
|
||||
}
|
||||
var intInfo = int_type & 0x0F;
|
||||
var intLength = Math.pow(2, intInfo);
|
||||
arrayoffset = 2 + intLength;
|
||||
if (intLength < 3) {
|
||||
length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
|
||||
} else {
|
||||
length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
|
||||
}
|
||||
}
|
||||
if (length * objectRefSize > exports.maxObjectSize) {
|
||||
throw new Error("To little heap space available!");
|
||||
}
|
||||
var array = [];
|
||||
for (var i = 0; i < length; i++) {
|
||||
var objRef = readUInt(buffer.slice(offset + arrayoffset + i * objectRefSize, offset + arrayoffset + (i + 1) * objectRefSize));
|
||||
array[i] = parseObject(objRef);
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
function parseDictionary() {
|
||||
var length = objInfo;
|
||||
var dictoffset = 1;
|
||||
if (objInfo == 0xF) {
|
||||
var int_type = buffer[offset + 1];
|
||||
var intType = (int_type & 0xF0) / 0x10;
|
||||
if (intType != 0x1) {
|
||||
console.error("0xD: UNEXPECTED LENGTH-INT TYPE! " + intType);
|
||||
}
|
||||
var intInfo = int_type & 0x0F;
|
||||
var intLength = Math.pow(2, intInfo);
|
||||
dictoffset = 2 + intLength;
|
||||
if (intLength < 3) {
|
||||
length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
|
||||
} else {
|
||||
length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
|
||||
}
|
||||
}
|
||||
if (length * 2 * objectRefSize > exports.maxObjectSize) {
|
||||
throw new Error("To little heap space available!");
|
||||
}
|
||||
if (debug) {
|
||||
console.log("Parsing dictionary #" + tableOffset);
|
||||
}
|
||||
var dict = {};
|
||||
for (var i = 0; i < length; i++) {
|
||||
var keyRef = readUInt(buffer.slice(offset + dictoffset + i * objectRefSize, offset + dictoffset + (i + 1) * objectRefSize));
|
||||
var valRef = readUInt(buffer.slice(offset + dictoffset + (length * objectRefSize) + i * objectRefSize, offset + dictoffset + (length * objectRefSize) + (i + 1) * objectRefSize));
|
||||
var key = parseObject(keyRef);
|
||||
var val = parseObject(valRef);
|
||||
if (debug) {
|
||||
console.log(" DICT #" + tableOffset + ": Mapped " + key + " to " + val);
|
||||
}
|
||||
dict[key] = val;
|
||||
}
|
||||
return dict;
|
||||
}
|
||||
}
|
||||
|
||||
return [ parseObject(topObject) ];
|
||||
};
|
||||
|
||||
function readUInt(buffer, start) {
|
||||
start = start || 0;
|
||||
|
||||
var l = 0;
|
||||
for (var i = start; i < buffer.length; i++) {
|
||||
l <<= 8;
|
||||
l |= buffer[i] & 0xFF;
|
||||
}
|
||||
return l;
|
||||
}
|
||||
|
||||
// we're just going to toss the high order bits because javascript doesn't have 64-bit ints
|
||||
function readUInt64BE(buffer, start) {
|
||||
var data = buffer.slice(start, start + 8);
|
||||
return data.readUInt32BE(4, 8);
|
||||
}
|
||||
|
||||
function swapBytes(buffer) {
|
||||
var len = buffer.length;
|
||||
for (var i = 0; i < len; i += 2) {
|
||||
var a = buffer[i];
|
||||
buffer[i] = buffer[i+1];
|
||||
buffer[i+1] = a;
|
||||
}
|
||||
return buffer;
|
||||
}
|
58
node_modules/bplist-parser/package.json
generated
vendored
Normal file
58
node_modules/bplist-parser/package.json
generated
vendored
Normal file
@ -0,0 +1,58 @@
|
||||
{
|
||||
"_from": "bplist-parser@^0.1.0",
|
||||
"_id": "bplist-parser@0.1.1",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha1-1g1dzCDLptx+HymbNdPh+V2vuuY=",
|
||||
"_location": "/bplist-parser",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "range",
|
||||
"registry": true,
|
||||
"raw": "bplist-parser@^0.1.0",
|
||||
"name": "bplist-parser",
|
||||
"escapedName": "bplist-parser",
|
||||
"rawSpec": "^0.1.0",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "^0.1.0"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/cordova-common"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz",
|
||||
"_shasum": "d60d5dcc20cba6dc7e1f299b35d3e1f95dafbae6",
|
||||
"_spec": "bplist-parser@^0.1.0",
|
||||
"_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/cordova-common",
|
||||
"author": {
|
||||
"name": "Joe Ferner",
|
||||
"email": "joe.ferner@nearinfinity.com"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/nearinfinity/node-bplist-parser/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"dependencies": {
|
||||
"big-integer": "^1.6.7"
|
||||
},
|
||||
"deprecated": false,
|
||||
"description": "Binary plist parser.",
|
||||
"devDependencies": {
|
||||
"nodeunit": "~0.9.1"
|
||||
},
|
||||
"homepage": "https://github.com/nearinfinity/node-bplist-parser#readme",
|
||||
"keywords": [
|
||||
"bplist",
|
||||
"plist",
|
||||
"parser"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "bplistParser.js",
|
||||
"name": "bplist-parser",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/nearinfinity/node-bplist-parser.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "./node_modules/nodeunit/bin/nodeunit test"
|
||||
},
|
||||
"version": "0.1.1"
|
||||
}
|
BIN
node_modules/bplist-parser/test/airplay.bplist
generated
vendored
Normal file
BIN
node_modules/bplist-parser/test/airplay.bplist
generated
vendored
Normal file
Binary file not shown.
BIN
node_modules/bplist-parser/test/iTunes-small.bplist
generated
vendored
Normal file
BIN
node_modules/bplist-parser/test/iTunes-small.bplist
generated
vendored
Normal file
Binary file not shown.
BIN
node_modules/bplist-parser/test/int64.bplist
generated
vendored
Normal file
BIN
node_modules/bplist-parser/test/int64.bplist
generated
vendored
Normal file
Binary file not shown.
10
node_modules/bplist-parser/test/int64.xml
generated
vendored
Normal file
10
node_modules/bplist-parser/test/int64.xml
generated
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>zero</key>
|
||||
<integer>0</integer>
|
||||
<key>int64item</key>
|
||||
<integer>12345678901234567890</integer>
|
||||
</dict>
|
||||
</plist>
|
159
node_modules/bplist-parser/test/parseTest.js
generated
vendored
Normal file
159
node_modules/bplist-parser/test/parseTest.js
generated
vendored
Normal file
@ -0,0 +1,159 @@
|
||||
'use strict';
|
||||
|
||||
// tests are adapted from https://github.com/TooTallNate/node-plist
|
||||
|
||||
var path = require('path');
|
||||
var nodeunit = require('nodeunit');
|
||||
var bplist = require('../');
|
||||
|
||||
module.exports = {
|
||||
'iTunes Small': function (test) {
|
||||
var file = path.join(__dirname, "iTunes-small.bplist");
|
||||
var startTime1 = new Date();
|
||||
|
||||
bplist.parseFile(file, function (err, dicts) {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
|
||||
var endTime = new Date();
|
||||
console.log('Parsed "' + file + '" in ' + (endTime - startTime1) + 'ms');
|
||||
var dict = dicts[0];
|
||||
test.equal(dict['Application Version'], "9.0.3");
|
||||
test.equal(dict['Library Persistent ID'], "6F81D37F95101437");
|
||||
test.done();
|
||||
});
|
||||
},
|
||||
|
||||
'sample1': function (test) {
|
||||
var file = path.join(__dirname, "sample1.bplist");
|
||||
var startTime = new Date();
|
||||
|
||||
bplist.parseFile(file, function (err, dicts) {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
|
||||
var endTime = new Date();
|
||||
console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms');
|
||||
var dict = dicts[0];
|
||||
test.equal(dict['CFBundleIdentifier'], 'com.apple.dictionary.MySample');
|
||||
test.done();
|
||||
});
|
||||
},
|
||||
|
||||
'sample2': function (test) {
|
||||
var file = path.join(__dirname, "sample2.bplist");
|
||||
var startTime = new Date();
|
||||
|
||||
bplist.parseFile(file, function (err, dicts) {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
|
||||
var endTime = new Date();
|
||||
console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms');
|
||||
var dict = dicts[0];
|
||||
test.equal(dict['PopupMenu'][2]['Key'], "\n #import <Cocoa/Cocoa.h>\n\n#import <MacRuby/MacRuby.h>\n\nint main(int argc, char *argv[])\n{\n return macruby_main(\"rb_main.rb\", argc, argv);\n}\n");
|
||||
test.done();
|
||||
});
|
||||
},
|
||||
|
||||
'airplay': function (test) {
|
||||
var file = path.join(__dirname, "airplay.bplist");
|
||||
var startTime = new Date();
|
||||
|
||||
bplist.parseFile(file, function (err, dicts) {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
|
||||
var endTime = new Date();
|
||||
console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms');
|
||||
|
||||
var dict = dicts[0];
|
||||
test.equal(dict['duration'], 5555.0495000000001);
|
||||
test.equal(dict['position'], 4.6269989039999997);
|
||||
test.done();
|
||||
});
|
||||
},
|
||||
|
||||
'utf16': function (test) {
|
||||
var file = path.join(__dirname, "utf16.bplist");
|
||||
var startTime = new Date();
|
||||
|
||||
bplist.parseFile(file, function (err, dicts) {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
|
||||
var endTime = new Date();
|
||||
console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms');
|
||||
|
||||
var dict = dicts[0];
|
||||
test.equal(dict['CFBundleName'], 'sellStuff');
|
||||
test.equal(dict['CFBundleShortVersionString'], '2.6.1');
|
||||
test.equal(dict['NSHumanReadableCopyright'], '©2008-2012, sellStuff, Inc.');
|
||||
test.done();
|
||||
});
|
||||
},
|
||||
|
||||
'utf16chinese': function (test) {
|
||||
var file = path.join(__dirname, "utf16_chinese.plist");
|
||||
var startTime = new Date();
|
||||
|
||||
bplist.parseFile(file, function (err, dicts) {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
|
||||
var endTime = new Date();
|
||||
console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms');
|
||||
|
||||
var dict = dicts[0];
|
||||
test.equal(dict['CFBundleName'], '天翼阅读');
|
||||
test.equal(dict['CFBundleDisplayName'], '天翼阅读');
|
||||
test.done();
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
|
||||
'uid': function (test) {
|
||||
var file = path.join(__dirname, "uid.bplist");
|
||||
var startTime = new Date();
|
||||
|
||||
bplist.parseFile(file, function (err, dicts) {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
|
||||
var endTime = new Date();
|
||||
console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms');
|
||||
|
||||
var dict = dicts[0];
|
||||
test.deepEqual(dict['$objects'][1]['NS.keys'], [{UID:2}, {UID:3}, {UID:4}]);
|
||||
test.deepEqual(dict['$objects'][1]['NS.objects'], [{UID: 5}, {UID:6}, {UID:7}]);
|
||||
test.deepEqual(dict['$top']['root'], {UID:1});
|
||||
test.done();
|
||||
});
|
||||
},
|
||||
|
||||
'int64': function (test) {
|
||||
var file = path.join(__dirname, "int64.bplist");
|
||||
var startTime = new Date();
|
||||
|
||||
bplist.parseFile(file, function (err, dicts) {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
|
||||
var endTime = new Date();
|
||||
console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms');
|
||||
var dict = dicts[0];
|
||||
test.equal(dict['zero'], '0');
|
||||
test.equal(dict['int64item'], '12345678901234567890');
|
||||
test.done();
|
||||
});
|
||||
}
|
||||
};
|
BIN
node_modules/bplist-parser/test/sample1.bplist
generated
vendored
Normal file
BIN
node_modules/bplist-parser/test/sample1.bplist
generated
vendored
Normal file
Binary file not shown.
BIN
node_modules/bplist-parser/test/sample2.bplist
generated
vendored
Normal file
BIN
node_modules/bplist-parser/test/sample2.bplist
generated
vendored
Normal file
Binary file not shown.
BIN
node_modules/bplist-parser/test/uid.bplist
generated
vendored
Normal file
BIN
node_modules/bplist-parser/test/uid.bplist
generated
vendored
Normal file
Binary file not shown.
BIN
node_modules/bplist-parser/test/utf16.bplist
generated
vendored
Normal file
BIN
node_modules/bplist-parser/test/utf16.bplist
generated
vendored
Normal file
Binary file not shown.
BIN
node_modules/bplist-parser/test/utf16_chinese.plist
generated
vendored
Executable file
BIN
node_modules/bplist-parser/test/utf16_chinese.plist
generated
vendored
Executable file
Binary file not shown.
21
node_modules/brace-expansion/LICENSE
generated
vendored
Normal file
21
node_modules/brace-expansion/LICENSE
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
129
node_modules/brace-expansion/README.md
generated
vendored
Normal file
129
node_modules/brace-expansion/README.md
generated
vendored
Normal file
@ -0,0 +1,129 @@
|
||||
# brace-expansion
|
||||
|
||||
[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html),
|
||||
as known from sh/bash, in JavaScript.
|
||||
|
||||
[](http://travis-ci.org/juliangruber/brace-expansion)
|
||||
[](https://www.npmjs.org/package/brace-expansion)
|
||||
[](https://greenkeeper.io/)
|
||||
|
||||
[](https://ci.testling.com/juliangruber/brace-expansion)
|
||||
|
||||
## Example
|
||||
|
||||
```js
|
||||
var expand = require('brace-expansion');
|
||||
|
||||
expand('file-{a,b,c}.jpg')
|
||||
// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
|
||||
|
||||
expand('-v{,,}')
|
||||
// => ['-v', '-v', '-v']
|
||||
|
||||
expand('file{0..2}.jpg')
|
||||
// => ['file0.jpg', 'file1.jpg', 'file2.jpg']
|
||||
|
||||
expand('file-{a..c}.jpg')
|
||||
// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
|
||||
|
||||
expand('file{2..0}.jpg')
|
||||
// => ['file2.jpg', 'file1.jpg', 'file0.jpg']
|
||||
|
||||
expand('file{0..4..2}.jpg')
|
||||
// => ['file0.jpg', 'file2.jpg', 'file4.jpg']
|
||||
|
||||
expand('file-{a..e..2}.jpg')
|
||||
// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg']
|
||||
|
||||
expand('file{00..10..5}.jpg')
|
||||
// => ['file00.jpg', 'file05.jpg', 'file10.jpg']
|
||||
|
||||
expand('{{A..C},{a..c}}')
|
||||
// => ['A', 'B', 'C', 'a', 'b', 'c']
|
||||
|
||||
expand('ppp{,config,oe{,conf}}')
|
||||
// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf']
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
```js
|
||||
var expand = require('brace-expansion');
|
||||
```
|
||||
|
||||
### var expanded = expand(str)
|
||||
|
||||
Return an array of all possible and valid expansions of `str`. If none are
|
||||
found, `[str]` is returned.
|
||||
|
||||
Valid expansions are:
|
||||
|
||||
```js
|
||||
/^(.*,)+(.+)?$/
|
||||
// {a,b,...}
|
||||
```
|
||||
|
||||
A comma separated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`.
|
||||
|
||||
```js
|
||||
/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
|
||||
// {x..y[..incr]}
|
||||
```
|
||||
|
||||
A numeric sequence from `x` to `y` inclusive, with optional increment.
|
||||
If `x` or `y` start with a leading `0`, all the numbers will be padded
|
||||
to have equal length. Negative numbers and backwards iteration work too.
|
||||
|
||||
```js
|
||||
/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
|
||||
// {x..y[..incr]}
|
||||
```
|
||||
|
||||
An alphabetic sequence from `x` to `y` inclusive, with optional increment.
|
||||
`x` and `y` must be exactly one character, and if given, `incr` must be a
|
||||
number.
|
||||
|
||||
For compatibility reasons, the string `${` is not eligible for brace expansion.
|
||||
|
||||
## Installation
|
||||
|
||||
With [npm](https://npmjs.org) do:
|
||||
|
||||
```bash
|
||||
npm install brace-expansion
|
||||
```
|
||||
|
||||
## Contributors
|
||||
|
||||
- [Julian Gruber](https://github.com/juliangruber)
|
||||
- [Isaac Z. Schlueter](https://github.com/isaacs)
|
||||
|
||||
## Sponsors
|
||||
|
||||
This module is proudly supported by my [Sponsors](https://github.com/juliangruber/sponsors)!
|
||||
|
||||
Do you want to support modules like this to improve their quality, stability and weigh in on new features? Then please consider donating to my [Patreon](https://www.patreon.com/juliangruber). Not sure how much of my modules you're using? Try [feross/thanks](https://github.com/feross/thanks)!
|
||||
|
||||
## License
|
||||
|
||||
(MIT)
|
||||
|
||||
Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
201
node_modules/brace-expansion/index.js
generated
vendored
Normal file
201
node_modules/brace-expansion/index.js
generated
vendored
Normal file
@ -0,0 +1,201 @@
|
||||
var concatMap = require('concat-map');
|
||||
var balanced = require('balanced-match');
|
||||
|
||||
module.exports = expandTop;
|
||||
|
||||
var escSlash = '\0SLASH'+Math.random()+'\0';
|
||||
var escOpen = '\0OPEN'+Math.random()+'\0';
|
||||
var escClose = '\0CLOSE'+Math.random()+'\0';
|
||||
var escComma = '\0COMMA'+Math.random()+'\0';
|
||||
var escPeriod = '\0PERIOD'+Math.random()+'\0';
|
||||
|
||||
function numeric(str) {
|
||||
return parseInt(str, 10) == str
|
||||
? parseInt(str, 10)
|
||||
: str.charCodeAt(0);
|
||||
}
|
||||
|
||||
function escapeBraces(str) {
|
||||
return str.split('\\\\').join(escSlash)
|
||||
.split('\\{').join(escOpen)
|
||||
.split('\\}').join(escClose)
|
||||
.split('\\,').join(escComma)
|
||||
.split('\\.').join(escPeriod);
|
||||
}
|
||||
|
||||
function unescapeBraces(str) {
|
||||
return str.split(escSlash).join('\\')
|
||||
.split(escOpen).join('{')
|
||||
.split(escClose).join('}')
|
||||
.split(escComma).join(',')
|
||||
.split(escPeriod).join('.');
|
||||
}
|
||||
|
||||
|
||||
// Basically just str.split(","), but handling cases
|
||||
// where we have nested braced sections, which should be
|
||||
// treated as individual members, like {a,{b,c},d}
|
||||
function parseCommaParts(str) {
|
||||
if (!str)
|
||||
return [''];
|
||||
|
||||
var parts = [];
|
||||
var m = balanced('{', '}', str);
|
||||
|
||||
if (!m)
|
||||
return str.split(',');
|
||||
|
||||
var pre = m.pre;
|
||||
var body = m.body;
|
||||
var post = m.post;
|
||||
var p = pre.split(',');
|
||||
|
||||
p[p.length-1] += '{' + body + '}';
|
||||
var postParts = parseCommaParts(post);
|
||||
if (post.length) {
|
||||
p[p.length-1] += postParts.shift();
|
||||
p.push.apply(p, postParts);
|
||||
}
|
||||
|
||||
parts.push.apply(parts, p);
|
||||
|
||||
return parts;
|
||||
}
|
||||
|
||||
function expandTop(str) {
|
||||
if (!str)
|
||||
return [];
|
||||
|
||||
// I don't know why Bash 4.3 does this, but it does.
|
||||
// Anything starting with {} will have the first two bytes preserved
|
||||
// but *only* at the top level, so {},a}b will not expand to anything,
|
||||
// but a{},b}c will be expanded to [a}c,abc].
|
||||
// One could argue that this is a bug in Bash, but since the goal of
|
||||
// this module is to match Bash's rules, we escape a leading {}
|
||||
if (str.substr(0, 2) === '{}') {
|
||||
str = '\\{\\}' + str.substr(2);
|
||||
}
|
||||
|
||||
return expand(escapeBraces(str), true).map(unescapeBraces);
|
||||
}
|
||||
|
||||
function identity(e) {
|
||||
return e;
|
||||
}
|
||||
|
||||
function embrace(str) {
|
||||
return '{' + str + '}';
|
||||
}
|
||||
function isPadded(el) {
|
||||
return /^-?0\d/.test(el);
|
||||
}
|
||||
|
||||
function lte(i, y) {
|
||||
return i <= y;
|
||||
}
|
||||
function gte(i, y) {
|
||||
return i >= y;
|
||||
}
|
||||
|
||||
function expand(str, isTop) {
|
||||
var expansions = [];
|
||||
|
||||
var m = balanced('{', '}', str);
|
||||
if (!m || /\$$/.test(m.pre)) return [str];
|
||||
|
||||
var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
|
||||
var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
|
||||
var isSequence = isNumericSequence || isAlphaSequence;
|
||||
var isOptions = m.body.indexOf(',') >= 0;
|
||||
if (!isSequence && !isOptions) {
|
||||
// {a},b}
|
||||
if (m.post.match(/,.*\}/)) {
|
||||
str = m.pre + '{' + m.body + escClose + m.post;
|
||||
return expand(str);
|
||||
}
|
||||
return [str];
|
||||
}
|
||||
|
||||
var n;
|
||||
if (isSequence) {
|
||||
n = m.body.split(/\.\./);
|
||||
} else {
|
||||
n = parseCommaParts(m.body);
|
||||
if (n.length === 1) {
|
||||
// x{{a,b}}y ==> x{a}y x{b}y
|
||||
n = expand(n[0], false).map(embrace);
|
||||
if (n.length === 1) {
|
||||
var post = m.post.length
|
||||
? expand(m.post, false)
|
||||
: [''];
|
||||
return post.map(function(p) {
|
||||
return m.pre + n[0] + p;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// at this point, n is the parts, and we know it's not a comma set
|
||||
// with a single entry.
|
||||
|
||||
// no need to expand pre, since it is guaranteed to be free of brace-sets
|
||||
var pre = m.pre;
|
||||
var post = m.post.length
|
||||
? expand(m.post, false)
|
||||
: [''];
|
||||
|
||||
var N;
|
||||
|
||||
if (isSequence) {
|
||||
var x = numeric(n[0]);
|
||||
var y = numeric(n[1]);
|
||||
var width = Math.max(n[0].length, n[1].length)
|
||||
var incr = n.length == 3
|
||||
? Math.abs(numeric(n[2]))
|
||||
: 1;
|
||||
var test = lte;
|
||||
var reverse = y < x;
|
||||
if (reverse) {
|
||||
incr *= -1;
|
||||
test = gte;
|
||||
}
|
||||
var pad = n.some(isPadded);
|
||||
|
||||
N = [];
|
||||
|
||||
for (var i = x; test(i, y); i += incr) {
|
||||
var c;
|
||||
if (isAlphaSequence) {
|
||||
c = String.fromCharCode(i);
|
||||
if (c === '\\')
|
||||
c = '';
|
||||
} else {
|
||||
c = String(i);
|
||||
if (pad) {
|
||||
var need = width - c.length;
|
||||
if (need > 0) {
|
||||
var z = new Array(need + 1).join('0');
|
||||
if (i < 0)
|
||||
c = '-' + z + c.slice(1);
|
||||
else
|
||||
c = z + c;
|
||||
}
|
||||
}
|
||||
}
|
||||
N.push(c);
|
||||
}
|
||||
} else {
|
||||
N = concatMap(n, function(el) { return expand(el, false) });
|
||||
}
|
||||
|
||||
for (var j = 0; j < N.length; j++) {
|
||||
for (var k = 0; k < post.length; k++) {
|
||||
var expansion = pre + N[j] + post[k];
|
||||
if (!isTop || isSequence || expansion)
|
||||
expansions.push(expansion);
|
||||
}
|
||||
}
|
||||
|
||||
return expansions;
|
||||
}
|
||||
|
75
node_modules/brace-expansion/package.json
generated
vendored
Normal file
75
node_modules/brace-expansion/package.json
generated
vendored
Normal file
@ -0,0 +1,75 @@
|
||||
{
|
||||
"_from": "brace-expansion@^1.1.7",
|
||||
"_id": "brace-expansion@1.1.11",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||
"_location": "/brace-expansion",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "range",
|
||||
"registry": true,
|
||||
"raw": "brace-expansion@^1.1.7",
|
||||
"name": "brace-expansion",
|
||||
"escapedName": "brace-expansion",
|
||||
"rawSpec": "^1.1.7",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "^1.1.7"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/minimatch"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
"_shasum": "3c7fcbf529d87226f3d2f52b966ff5271eb441dd",
|
||||
"_spec": "brace-expansion@^1.1.7",
|
||||
"_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/minimatch",
|
||||
"author": {
|
||||
"name": "Julian Gruber",
|
||||
"email": "mail@juliangruber.com",
|
||||
"url": "http://juliangruber.com"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/juliangruber/brace-expansion/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"dependencies": {
|
||||
"balanced-match": "^1.0.0",
|
||||
"concat-map": "0.0.1"
|
||||
},
|
||||
"deprecated": false,
|
||||
"description": "Brace expansion as known from sh/bash",
|
||||
"devDependencies": {
|
||||
"matcha": "^0.7.0",
|
||||
"tape": "^4.6.0"
|
||||
},
|
||||
"homepage": "https://github.com/juliangruber/brace-expansion",
|
||||
"keywords": [],
|
||||
"license": "MIT",
|
||||
"main": "index.js",
|
||||
"name": "brace-expansion",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/juliangruber/brace-expansion.git"
|
||||
},
|
||||
"scripts": {
|
||||
"bench": "matcha test/perf/bench.js",
|
||||
"gentest": "bash test/generate.sh",
|
||||
"test": "tape test/*.js"
|
||||
},
|
||||
"testling": {
|
||||
"files": "test/*.js",
|
||||
"browsers": [
|
||||
"ie/8..latest",
|
||||
"firefox/20..latest",
|
||||
"firefox/nightly",
|
||||
"chrome/25..latest",
|
||||
"chrome/canary",
|
||||
"opera/12..latest",
|
||||
"opera/next",
|
||||
"safari/5.1..latest",
|
||||
"ipad/6.0..latest",
|
||||
"iphone/6.0..latest",
|
||||
"android-browser/4.2..latest"
|
||||
]
|
||||
},
|
||||
"version": "1.1.11"
|
||||
}
|
4
node_modules/concat-map/.travis.yml
generated
vendored
Normal file
4
node_modules/concat-map/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- 0.4
|
||||
- 0.6
|
18
node_modules/concat-map/LICENSE
generated
vendored
Normal file
18
node_modules/concat-map/LICENSE
generated
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
This software is released under the MIT license:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
62
node_modules/concat-map/README.markdown
generated
vendored
Normal file
62
node_modules/concat-map/README.markdown
generated
vendored
Normal file
@ -0,0 +1,62 @@
|
||||
concat-map
|
||||
==========
|
||||
|
||||
Concatenative mapdashery.
|
||||
|
||||
[](http://ci.testling.com/substack/node-concat-map)
|
||||
|
||||
[](http://travis-ci.org/substack/node-concat-map)
|
||||
|
||||
example
|
||||
=======
|
||||
|
||||
``` js
|
||||
var concatMap = require('concat-map');
|
||||
var xs = [ 1, 2, 3, 4, 5, 6 ];
|
||||
var ys = concatMap(xs, function (x) {
|
||||
return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
|
||||
});
|
||||
console.dir(ys);
|
||||
```
|
||||
|
||||
***
|
||||
|
||||
```
|
||||
[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]
|
||||
```
|
||||
|
||||
methods
|
||||
=======
|
||||
|
||||
``` js
|
||||
var concatMap = require('concat-map')
|
||||
```
|
||||
|
||||
concatMap(xs, fn)
|
||||
-----------------
|
||||
|
||||
Return an array of concatenated elements by calling `fn(x, i)` for each element
|
||||
`x` and each index `i` in the array `xs`.
|
||||
|
||||
When `fn(x, i)` returns an array, its result will be concatenated with the
|
||||
result array. If `fn(x, i)` returns anything else, that value will be pushed
|
||||
onto the end of the result array.
|
||||
|
||||
install
|
||||
=======
|
||||
|
||||
With [npm](http://npmjs.org) do:
|
||||
|
||||
```
|
||||
npm install concat-map
|
||||
```
|
||||
|
||||
license
|
||||
=======
|
||||
|
||||
MIT
|
||||
|
||||
notes
|
||||
=====
|
||||
|
||||
This module was written while sitting high above the ground in a tree.
|
13
node_modules/concat-map/index.js
generated
vendored
Normal file
13
node_modules/concat-map/index.js
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
module.exports = function (xs, fn) {
|
||||
var res = [];
|
||||
for (var i = 0; i < xs.length; i++) {
|
||||
var x = fn(xs[i], i);
|
||||
if (isArray(x)) res.push.apply(res, x);
|
||||
else res.push(x);
|
||||
}
|
||||
return res;
|
||||
};
|
||||
|
||||
var isArray = Array.isArray || function (xs) {
|
||||
return Object.prototype.toString.call(xs) === '[object Array]';
|
||||
};
|
88
node_modules/concat-map/package.json
generated
vendored
Normal file
88
node_modules/concat-map/package.json
generated
vendored
Normal file
@ -0,0 +1,88 @@
|
||||
{
|
||||
"_from": "concat-map@0.0.1",
|
||||
"_id": "concat-map@0.0.1",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
|
||||
"_location": "/concat-map",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "version",
|
||||
"registry": true,
|
||||
"raw": "concat-map@0.0.1",
|
||||
"name": "concat-map",
|
||||
"escapedName": "concat-map",
|
||||
"rawSpec": "0.0.1",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "0.0.1"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/brace-expansion"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
||||
"_shasum": "d8a96bd77fd68df7793a73036a3ba0d5405d477b",
|
||||
"_spec": "concat-map@0.0.1",
|
||||
"_where": "/Users/brodybits/Documents/cordova/cordova-android/node_modules/brace-expansion",
|
||||
"author": {
|
||||
"name": "James Halliday",
|
||||
"email": "mail@substack.net",
|
||||
"url": "http://substack.net"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/substack/node-concat-map/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"deprecated": false,
|
||||
"description": "concatenative mapdashery",
|
||||
"devDependencies": {
|
||||
"tape": "~2.4.0"
|
||||
},
|
||||
"directories": {
|
||||
"example": "example",
|
||||
"test": "test"
|
||||
},
|
||||
"homepage": "https://github.com/substack/node-concat-map#readme",
|
||||
"keywords": [
|
||||
"concat",
|
||||
"concatMap",
|
||||
"map",
|
||||
"functional",
|
||||
"higher-order"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "index.js",
|
||||
"name": "concat-map",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/substack/node-concat-map.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "tape test/*.js"
|
||||
},
|
||||
"testling": {
|
||||
"files": "test/*.js",
|
||||
"browsers": {
|
||||
"ie": [
|
||||
6,
|
||||
7,
|
||||
8,
|
||||
9
|
||||
],
|
||||
"ff": [
|
||||
3.5,
|
||||
10,
|
||||
15
|
||||
],
|
||||
"chrome": [
|
||||
10,
|
||||
22
|
||||
],
|
||||
"safari": [
|
||||
5.1
|
||||
],
|
||||
"opera": [
|
||||
12
|
||||
]
|
||||
}
|
||||
},
|
||||
"version": "0.0.1"
|
||||
}
|
39
node_modules/concat-map/test/map.js
generated
vendored
Normal file
39
node_modules/concat-map/test/map.js
generated
vendored
Normal file
@ -0,0 +1,39 @@
|
||||
var concatMap = require('../');
|
||||
var test = require('tape');
|
||||
|
||||
test('empty or not', function (t) {
|
||||
var xs = [ 1, 2, 3, 4, 5, 6 ];
|
||||
var ixes = [];
|
||||
var ys = concatMap(xs, function (x, ix) {
|
||||
ixes.push(ix);
|
||||
return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
|
||||
});
|
||||
t.same(ys, [ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]);
|
||||
t.same(ixes, [ 0, 1, 2, 3, 4, 5 ]);
|
||||
t.end();
|
||||
});
|
||||
|
||||
test('always something', function (t) {
|
||||
var xs = [ 'a', 'b', 'c', 'd' ];
|
||||
var ys = concatMap(xs, function (x) {
|
||||
return x === 'b' ? [ 'B', 'B', 'B' ] : [ x ];
|
||||
});
|
||||
t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]);
|
||||
t.end();
|
||||
});
|
||||
|
||||
test('scalars', function (t) {
|
||||
var xs = [ 'a', 'b', 'c', 'd' ];
|
||||
var ys = concatMap(xs, function (x) {
|
||||
return x === 'b' ? [ 'B', 'B', 'B' ] : x;
|
||||
});
|
||||
t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]);
|
||||
t.end();
|
||||
});
|
||||
|
||||
test('undefs', function (t) {
|
||||
var xs = [ 'a', 'b', 'c', 'd' ];
|
||||
var ys = concatMap(xs, function () {});
|
||||
t.same(ys, [ undefined, undefined, undefined, undefined ]);
|
||||
t.end();
|
||||
});
|
1
node_modules/cordova-common/.eslintignore
generated
vendored
Normal file
1
node_modules/cordova-common/.eslintignore
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
spec/fixtures/*
|
13
node_modules/cordova-common/.eslintrc.yml
generated
vendored
Normal file
13
node_modules/cordova-common/.eslintrc.yml
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
root: true
|
||||
extends: semistandard
|
||||
rules:
|
||||
indent:
|
||||
- error
|
||||
- 4
|
||||
camelcase: off
|
||||
padded-blocks: off
|
||||
operator-linebreak: off
|
||||
no-throw-literal: off
|
||||
no-unused-vars:
|
||||
- error
|
||||
- args: after-used
|
22
node_modules/cordova-common/.github/PULL_REQUEST_TEMPLATE.md
generated
vendored
Normal file
22
node_modules/cordova-common/.github/PULL_REQUEST_TEMPLATE.md
generated
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
<!--
|
||||
Please make sure the checklist boxes are all checked before submitting the PR. The checklist
|
||||
is intended as a quick reference, for complete details please see our Contributor Guidelines:
|
||||
|
||||
http://cordova.apache.org/contribute/contribute_guidelines.html
|
||||
|
||||
Thanks!
|
||||
-->
|
||||
|
||||
### Platforms affected
|
||||
|
||||
|
||||
### What does this PR do?
|
||||
|
||||
|
||||
### What testing has been done on this change?
|
||||
|
||||
|
||||
### Checklist
|
||||
- [ ] [Reported an issue](http://cordova.apache.org/contribute/issues.html) in the JIRA database
|
||||
- [ ] Commit message follows the format: "CB-3232: (android) Fix bug with resolving file paths", where CB-xxxx is the JIRA ID & "android" is the platform affected.
|
||||
- [ ] Added automated test coverage as appropriate for this change.
|
2
node_modules/cordova-common/.npmignore
generated
vendored
Normal file
2
node_modules/cordova-common/.npmignore
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
spec
|
||||
coverage
|
4
node_modules/cordova-common/.ratignore
generated
vendored
Normal file
4
node_modules/cordova-common/.ratignore
generated
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
fixtures
|
||||
coverage
|
||||
jasmine.json
|
||||
appveyor.yml
|
17
node_modules/cordova-common/.travis.yml
generated
vendored
Normal file
17
node_modules/cordova-common/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
language: node_js
|
||||
sudo: false
|
||||
git:
|
||||
depth: 10
|
||||
node_js:
|
||||
- "4"
|
||||
- "6"
|
||||
- "8"
|
||||
- "10"
|
||||
install:
|
||||
- npm install
|
||||
- npm install -g codecov
|
||||
script:
|
||||
- npm test
|
||||
- npm run cover
|
||||
after_script:
|
||||
- codecov
|
155
node_modules/cordova-common/README.md
generated
vendored
Normal file
155
node_modules/cordova-common/README.md
generated
vendored
Normal file
@ -0,0 +1,155 @@
|
||||
<!--
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
-->
|
||||
|
||||
[](https://ci.appveyor.com/project/ApacheSoftwareFoundation/cordova-common/branch/master)
|
||||
[](https://travis-ci.org/apache/cordova-common)
|
||||
[](https://nodei.co/npm/cordova-common/)
|
||||
|
||||
# cordova-common
|
||||
Exposes shared functionality used by [cordova-lib](https://github.com/apache/cordova-lib/) and Cordova platforms.
|
||||
## Exposed APIs
|
||||
|
||||
### `events`
|
||||
|
||||
Represents special instance of NodeJS EventEmitter which is intended to be used to post events to cordova-lib and cordova-cli
|
||||
|
||||
Usage:
|
||||
```js
|
||||
var events = require('cordova-common').events;
|
||||
events.emit('warn', 'Some warning message')
|
||||
```
|
||||
|
||||
There are the following events supported by cordova-cli: `verbose`, `log`, `info`, `warn`, `error`.
|
||||
|
||||
### `CordovaError`
|
||||
|
||||
An error class used by Cordova to throw cordova-specific errors. The CordovaError class is inherited from Error, so CordovaError instances is also valid Error instances (`instanceof` check succeeds).
|
||||
|
||||
Usage:
|
||||
|
||||
```js
|
||||
var CordovaError = require('cordova-common').CordovaError;
|
||||
throw new CordovaError('Some error message', SOME_ERR_CODE);
|
||||
```
|
||||
|
||||
See [CordovaError](src/CordovaError/CordovaError.js) for supported error codes.
|
||||
|
||||
### `ConfigParser`
|
||||
|
||||
Exposes functionality to deal with cordova project `config.xml` files. For ConfigParser API reference check [ConfigParser Readme](src/ConfigParser/README.md).
|
||||
|
||||
Usage:
|
||||
```js
|
||||
var ConfigParser = require('cordova-common').ConfigParser;
|
||||
var appConfig = new ConfigParser('path/to/cordova-app/config.xml');
|
||||
console.log(appconfig.name() + ':' + appConfig.version());
|
||||
```
|
||||
|
||||
### `PluginInfoProvider` and `PluginInfo`
|
||||
|
||||
`PluginInfo` is a wrapper for cordova plugins' `plugin.xml` files. This class may be instantiated directly or via `PluginInfoProvider`. The difference is that `PluginInfoProvider` caches `PluginInfo` instances based on plugin source directory.
|
||||
|
||||
Usage:
|
||||
```js
|
||||
var PluginInfo: require('cordova-common').PluginInfo;
|
||||
var PluginInfoProvider: require('cordova-common').PluginInfoProvider;
|
||||
|
||||
// The following instances are equal
|
||||
var plugin1 = new PluginInfo('path/to/plugin_directory');
|
||||
var plugin2 = new PluginInfoProvider().get('path/to/plugin_directory');
|
||||
|
||||
console.log('The plugin ' + plugin1.id + ' has version ' + plugin1.version)
|
||||
```
|
||||
|
||||
### `ActionStack`
|
||||
|
||||
Utility module for dealing with sequential tasks. Provides a set of tasks that are needed to be done and reverts all tasks that are already completed if one of those tasks fail to complete. Used internally by cordova-lib and platform's plugin installation routines.
|
||||
|
||||
Usage:
|
||||
```js
|
||||
var ActionStack = require('cordova-common').ActionStack;
|
||||
var stack = new ActionStack()
|
||||
|
||||
var action1 = stack.createAction(task1, [<task parameters>], task1_reverter, [<reverter_parameters>]);
|
||||
var action2 = stack.createAction(task2, [<task parameters>], task2_reverter, [<reverter_parameters>]);
|
||||
|
||||
stack.push(action1);
|
||||
stack.push(action2);
|
||||
|
||||
stack.process()
|
||||
.then(function() {
|
||||
// all actions succeded
|
||||
})
|
||||
.catch(function(error){
|
||||
// One of actions failed with error
|
||||
})
|
||||
```
|
||||
|
||||
### `superspawn`
|
||||
|
||||
Module for spawning child processes with some advanced logic.
|
||||
|
||||
Usage:
|
||||
```js
|
||||
var superspawn = require('cordova-common').superspawn;
|
||||
superspawn.spawn('adb', ['devices'])
|
||||
.progress(function(data){
|
||||
if (data.stderr)
|
||||
console.error('"adb devices" raised an error: ' + data.stderr);
|
||||
})
|
||||
.then(function(devices){
|
||||
// Do something...
|
||||
})
|
||||
```
|
||||
|
||||
### `xmlHelpers`
|
||||
|
||||
A set of utility methods for dealing with XML files.
|
||||
|
||||
Usage:
|
||||
```js
|
||||
var xml = require('cordova-common').xmlHelpers;
|
||||
|
||||
var xmlDoc1 = xml.parseElementtreeSync('some/xml/file');
|
||||
var xmlDoc2 = xml.parseElementtreeSync('another/xml/file');
|
||||
|
||||
xml.mergeXml(doc1, doc2); // doc2 now contains all the nodes from doc1
|
||||
```
|
||||
|
||||
### Other APIs
|
||||
|
||||
The APIs listed below are also exposed but are intended to be only used internally by cordova plugin installation routines.
|
||||
|
||||
```
|
||||
PlatformJson
|
||||
ConfigChanges
|
||||
ConfigKeeper
|
||||
ConfigFile
|
||||
mungeUtil
|
||||
```
|
||||
|
||||
## Setup
|
||||
* Clone this repository onto your local machine
|
||||
`git clone https://github.com/apache/cordova-common.git`
|
||||
* Navigate to cordova-common directory, install dependencies and npm-link
|
||||
`cd cordova-common && npm install && npm link`
|
||||
* Navigate to cordova-lib directory and link cordova-common
|
||||
`cd <cordova-lib directory> && npm link cordova-common && npm install`
|
153
node_modules/cordova-common/RELEASENOTES.md
generated
vendored
Normal file
153
node_modules/cordova-common/RELEASENOTES.md
generated
vendored
Normal file
@ -0,0 +1,153 @@
|
||||
<!--
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
-->
|
||||
# Cordova-common Release Notes
|
||||
|
||||
### 2.2.5 (Jun 26, 2018)
|
||||
* Use plist@2 (^2.1.0) to avoid engine warning message on Node.js 4
|
||||
|
||||
### 2.2.4 (June 15, 2018)
|
||||
|
||||
* Revert change to update dependencies in package.json (needed to resolve issues with cordova-ios@4)
|
||||
* Revert change to use strip-bom package to strip BOM
|
||||
* Continue to use plist@^3.0.1 in package.json
|
||||
|
||||
### 2.2.3 (June 1, 2018)
|
||||
* Revert a minor refactoring that was incompatible with NodeJS 4.x. No change to functionality.
|
||||
|
||||
### 2.2.2 (May 30, 2018)
|
||||
* [CB-13979](https://issues.apache.org/jira/browse/CB-13979) More consistency for `config.xml` lookups
|
||||
* [CB-14064](https://issues.apache.org/jira/browse/CB-14064) Remove Node 4 from CI matrix
|
||||
* [CB-14088](https://issues.apache.org/jira/browse/CB-14088) Update dependencies
|
||||
* [CB-11691](https://issues.apache.org/jira/browse/CB-11691) Fix for modifying binary plists
|
||||
* [CB-13770](https://issues.apache.org/jira/browse/CB-13770) Warn when <edit-config> or <config-file> not found
|
||||
* [CB-13471](https://issues.apache.org/jira/browse/CB-13471) Fix tests and path issues for **Windows**
|
||||
* [CB-13471](https://issues.apache.org/jira/browse/CB-13471) added unit test for config file provider
|
||||
* [CB-13744](https://issues.apache.org/jira/browse/CB-13744) Recognize storyboards as XML files
|
||||
* [CB-13674](https://issues.apache.org/jira/browse/CB-13674) Incremented package version to -dev
|
||||
|
||||
### 2.2.1 (Dec 14, 2017)
|
||||
* [CB-13674](https://issues.apache.org/jira/browse/CB-13674): updated dependencies
|
||||
|
||||
### 2.2.0 (Nov 22, 2017)
|
||||
* [CB-13471](https://issues.apache.org/jira/browse/CB-13471) File Provider fix belongs in cordova-common
|
||||
* [CB-11244](https://issues.apache.org/jira/browse/CB-11244) Spot fix for upcoming `cordova-android@7` changes. https://github.com/apache/cordova-android/pull/389
|
||||
|
||||
### 2.1.1 (Oct 04, 2017)
|
||||
* [CB-13145](https://issues.apache.org/jira/browse/CB-13145) added `getFrameworks` to unit tests
|
||||
* [CB-13145](https://issues.apache.org/jira/browse/CB-13145) added variable replacing to framework tag
|
||||
|
||||
### 2.1.0 (August 30, 2017)
|
||||
* [CB-13145](https://issues.apache.org/jira/browse/CB-13145) added variable replacing to `framework` tag
|
||||
* [CB-13211](https://issues.apache.org/jira/browse/CB-13211) Add `allows-arbitrary-loads-for-media` attribute parsing for `getAccesses`
|
||||
* [CB-11968](https://issues.apache.org/jira/browse/CB-11968) Added support for `<config-file>` in `config.xml`
|
||||
* [CB-12895](https://issues.apache.org/jira/browse/CB-12895) set up `eslint` and removed `jshint`
|
||||
* [CB-12785](https://issues.apache.org/jira/browse/CB-12785) added `.gitignore`, `travis`, and `appveyor` support
|
||||
* [CB-12250](https://issues.apache.org/jira/browse/CB-12250) & [CB-12409](https://issues.apache.org/jira/browse/CB-12409) *iOS*: Fix bug with escaping properties from `plist` file
|
||||
* [CB-12762](https://issues.apache.org/jira/browse/CB-12762) updated `common`, `fetch`, and `serve` `pkgJson` to point `pkgJson` repo items to github mirrors
|
||||
* [CB-12766](https://issues.apache.org/jira/browse/CB-12766) Consistently write `JSON` with 2 spaces indentation
|
||||
|
||||
### 2.0.3 (May 02, 2017)
|
||||
* [CB-8978](https://issues.apache.org/jira/browse/CB-8978) Add option to get `resource-file` from `root`
|
||||
* [CB-11908](https://issues.apache.org/jira/browse/CB-11908) Add tests for `edit-config` in `config.xml`
|
||||
* [CB-12665](https://issues.apache.org/jira/browse/CB-12665) removed `enginestrict` since it is deprecated
|
||||
|
||||
### 2.0.2 (Apr 14, 2017)
|
||||
* [CB-11233](https://issues.apache.org/jira/browse/CB-11233) - Support installing frameworks into 'Embedded Binaries' section of the Xcode project
|
||||
* [CB-10438](https://issues.apache.org/jira/browse/CB-10438) - Install correct dependency version. Removed shell.remove, added pkg.json to dependency tests 1-3, and updated install.js (.replace) to fix tests in uninstall.spec.js and update to workw with jasmine 2.0
|
||||
* [CB-11120](https://issues.apache.org/jira/browse/CB-11120) - Allow short/display name in config.xml
|
||||
* [CB-11346](https://issues.apache.org/jira/browse/CB-11346) - Remove known platforms check
|
||||
* [CB-11977](https://issues.apache.org/jira/browse/CB-11977) - updated engines and enginescript for common, fetch, and serve
|
||||
|
||||
### 2.0.1 (Mar 09, 2017)
|
||||
* [CB-12557](https://issues.apache.org/jira/browse/CB-12557) add both stdout and stderr properties to the error object passed to superspawn reject handler.
|
||||
|
||||
### 2.0.0 (Jan 17, 2017)
|
||||
* [CB-8978](https://issues.apache.org/jira/browse/CB-8978) Add `resource-file` parsing to `config.xml`
|
||||
* [CB-12018](https://issues.apache.org/jira/browse/CB-12018): updated `jshint` and updated tests to work with `jasmine@2` instead of `jasmine-node`
|
||||
* [CB-12163](https://issues.apache.org/jira/browse/CB-12163) Add reference attrib to `resource-file` for **Windows**
|
||||
* Move windows-specific logic to `cordova-windows`
|
||||
* [CB-12189](https://issues.apache.org/jira/browse/CB-12189) Add implementation attribute to framework
|
||||
|
||||
### 1.5.1 (Oct 12, 2016)
|
||||
* [CB-12002](https://issues.apache.org/jira/browse/CB-12002) Add `getAllowIntents()` to `ConfigParser`
|
||||
* [CB-11998](https://issues.apache.org/jira/browse/CB-11998) `cordova platform add` error with `cordova-common@1.5.0`
|
||||
|
||||
### 1.5.0 (Oct 06, 2016)
|
||||
* [CB-11776](https://issues.apache.org/jira/browse/CB-11776) Add test case for different `edit-config` targets
|
||||
* [CB-11908](https://issues.apache.org/jira/browse/CB-11908) Add `edit-config` to `config.xml`
|
||||
* [CB-11936](https://issues.apache.org/jira/browse/CB-11936) Support four new **App Transport Security (ATS)** keys
|
||||
* update `config.xml` location if it is a **Android Studio** project.
|
||||
* use `array` methods and `object.keys` for iterating. avoiding `for-in` loops
|
||||
* [CB-11517](https://issues.apache.org/jira/browse/CB-11517) Allow `.folder` matches
|
||||
* [CB-11776](https://issues.apache.org/jira/browse/CB-11776) check `edit-config` target exists
|
||||
|
||||
### 1.4.1 (Aug 09, 2016)
|
||||
* Add general purpose `ConfigParser.getAttribute` API
|
||||
* [CB-11653](https://issues.apache.org/jira/browse/CB-11653) moved `findProjectRoot` from `cordova-lib` to `cordova-common`
|
||||
* [CB-11636](https://issues.apache.org/jira/browse/CB-11636) Handle attributes with quotes correctly
|
||||
* [CB-11645](https://issues.apache.org/jira/browse/CB-11645) added check to see if `getEditConfig` exists before trying to use it
|
||||
* [CB-9825](https://issues.apache.org/jira/browse/CB-9825) framework tag spec parsing
|
||||
|
||||
### 1.4.0 (Jul 12, 2016)
|
||||
* [CB-11023](https://issues.apache.org/jira/browse/CB-11023) Add edit-config functionality
|
||||
|
||||
### 1.3.0 (May 12, 2016)
|
||||
* [CB-11259](https://issues.apache.org/jira/browse/CB-11259): Improving prepare and build logging
|
||||
* [CB-11194](https://issues.apache.org/jira/browse/CB-11194) Improve cordova load time
|
||||
* [CB-1117](https://issues.apache.org/jira/browse/CB-1117) Add `FileUpdater` module to `cordova-common`.
|
||||
* [CB-11131](https://issues.apache.org/jira/browse/CB-11131) Fix `TypeError: message.toUpperCase` is not a function in `CordovaLogger`
|
||||
|
||||
### 1.2.0 (Apr 18, 2016)
|
||||
* [CB-11022](https://issues.apache.org/jira/browse/CB-11022) Save modulesMetadata to both www and platform_www when necessary
|
||||
* [CB-10833](https://issues.apache.org/jira/browse/CB-10833) Deduplicate common logic for plugin installation/uninstallation
|
||||
* [CB-10822](https://issues.apache.org/jira/browse/CB-10822) Manage plugins/modules metadata using PlatformJson
|
||||
* [CB-10940](https://issues.apache.org/jira/browse/CB-10940) Can't add Android platform from path
|
||||
* [CB-10965](https://issues.apache.org/jira/browse/CB-10965) xml helper allows multiple instances to be merge in config.xml
|
||||
|
||||
### 1.1.1 (Mar 18, 2016)
|
||||
* [CB-10694](https://issues.apache.org/jira/browse/CB-10694) Update test to reflect merging of [CB-9264](https://issues.apache.org/jira/browse/CB-9264) fix
|
||||
* [CB-10694](https://issues.apache.org/jira/browse/CB-10694) Platform-specific configuration preferences don't override global settings
|
||||
* [CB-9264](https://issues.apache.org/jira/browse/CB-9264) Duplicate entries in `config.xml`
|
||||
* [CB-10791](https://issues.apache.org/jira/browse/CB-10791) Add `adjustLoggerLevel` to `cordova-common.CordovaLogger`
|
||||
* [CB-10662](https://issues.apache.org/jira/browse/CB-10662) Add tests for `ConfigParser.getStaticResources`
|
||||
* [CB-10622](https://issues.apache.org/jira/browse/CB-10622) fix target attribute being ignored for images in `config.xml`.
|
||||
* [CB-10583](https://issues.apache.org/jira/browse/CB-10583) Protect plugin preferences from adding extra Array properties.
|
||||
|
||||
### 1.1.0 (Feb 16, 2016)
|
||||
* [CB-10482](https://issues.apache.org/jira/browse/CB-10482) Remove references to windows8 from cordova-lib/cli
|
||||
* [CB-10430](https://issues.apache.org/jira/browse/CB-10430) Adds forwardEvents method to easily connect two EventEmitters
|
||||
* [CB-10176](https://issues.apache.org/jira/browse/CB-10176) Adds CordovaLogger class, based on logger module from cordova-cli
|
||||
* [CB-10052](https://issues.apache.org/jira/browse/CB-10052) Expose child process' io streams via promise progress notification
|
||||
* [CB-10497](https://issues.apache.org/jira/browse/CB-10497) Prefer .bat over .cmd on windows platform
|
||||
* [CB-9984](https://issues.apache.org/jira/browse/CB-9984) Bumps plist version and fixes failing cordova-common test
|
||||
|
||||
### 1.0.0 (Oct 29, 2015)
|
||||
|
||||
* [CB-9890](https://issues.apache.org/jira/browse/CB-9890) Documents cordova-common
|
||||
* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Correct cordova-lib -> cordova-common in README
|
||||
* Pick ConfigParser changes from apache@0c3614e
|
||||
* [CB-9743](https://issues.apache.org/jira/browse/CB-9743) Removes system frameworks handling from ConfigChanges
|
||||
* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Cleans out code which has been moved to `cordova-common`
|
||||
* Pick ConfigParser changes from apache@ddb027b
|
||||
* Picking CordovaError changes from apache@a3b1fca
|
||||
* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Adds tests and fixtures based on existing cordova-lib ones
|
||||
* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Initial implementation for cordova-common
|
||||
|
20
node_modules/cordova-common/appveyor.yml
generated
vendored
Normal file
20
node_modules/cordova-common/appveyor.yml
generated
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
# appveyor file
|
||||
# http://www.appveyor.com/docs/appveyor-yml
|
||||
|
||||
environment:
|
||||
matrix:
|
||||
- nodejs_version: "4"
|
||||
- nodejs_version: "6"
|
||||
- nodejs_version: "8"
|
||||
- nodejs_version: "10"
|
||||
|
||||
install:
|
||||
- ps: Install-Product node $env:nodejs_version
|
||||
- npm install
|
||||
|
||||
build: off
|
||||
|
||||
test_script:
|
||||
- node --version
|
||||
- npm --version
|
||||
- npm test
|
47
node_modules/cordova-common/cordova-common.js
generated
vendored
Normal file
47
node_modules/cordova-common/cordova-common.js
generated
vendored
Normal file
@ -0,0 +1,47 @@
|
||||
/**
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
var addProperty = require('./src/util/addProperty');
|
||||
|
||||
module.exports = { };
|
||||
|
||||
addProperty(module, 'events', './src/events');
|
||||
addProperty(module, 'superspawn', './src/superspawn');
|
||||
|
||||
addProperty(module, 'ActionStack', './src/ActionStack');
|
||||
addProperty(module, 'CordovaError', './src/CordovaError/CordovaError');
|
||||
addProperty(module, 'CordovaLogger', './src/CordovaLogger');
|
||||
addProperty(module, 'CordovaCheck', './src/CordovaCheck');
|
||||
addProperty(module, 'CordovaExternalToolErrorContext', './src/CordovaError/CordovaExternalToolErrorContext');
|
||||
addProperty(module, 'PlatformJson', './src/PlatformJson');
|
||||
addProperty(module, 'ConfigParser', './src/ConfigParser/ConfigParser');
|
||||
addProperty(module, 'FileUpdater', './src/FileUpdater');
|
||||
|
||||
addProperty(module, 'PluginInfo', './src/PluginInfo/PluginInfo');
|
||||
addProperty(module, 'PluginInfoProvider', './src/PluginInfo/PluginInfoProvider');
|
||||
|
||||
addProperty(module, 'PluginManager', './src/PluginManager');
|
||||
|
||||
addProperty(module, 'ConfigChanges', './src/ConfigChanges/ConfigChanges');
|
||||
addProperty(module, 'ConfigKeeper', './src/ConfigChanges/ConfigKeeper');
|
||||
addProperty(module, 'ConfigFile', './src/ConfigChanges/ConfigFile');
|
||||
addProperty(module, 'mungeUtil', './src/ConfigChanges/munge-util');
|
||||
|
||||
addProperty(module, 'xmlHelpers', './src/util/xml-helpers');
|
||||
|
81
node_modules/cordova-common/package.json
generated
vendored
Normal file
81
node_modules/cordova-common/package.json
generated
vendored
Normal file
@ -0,0 +1,81 @@
|
||||
{
|
||||
"_from": "cordova-common@2.2.5",
|
||||
"_id": "cordova-common@2.2.5",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha1-+TzvKtSUz8v1bEbj1hKqqctfzDI=",
|
||||
"_location": "/cordova-common",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "version",
|
||||
"registry": true,
|
||||
"raw": "cordova-common@2.2.5",
|
||||
"name": "cordova-common",
|
||||
"escapedName": "cordova-common",
|
||||
"rawSpec": "2.2.5",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "2.2.5"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/cordova-common/-/cordova-common-2.2.5.tgz",
|
||||
"_shasum": "f93cef2ad494cfcbf56c46e3d612aaa9cb5fcc32",
|
||||
"_spec": "cordova-common@2.2.5",
|
||||
"_where": "/Users/brodybits/Documents/cordova/cordova-android",
|
||||
"author": {
|
||||
"name": "Apache Software Foundation"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://issues.apache.org/jira/browse/CB",
|
||||
"email": "dev@cordova.apache.org"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"contributors": [],
|
||||
"dependencies": {
|
||||
"ansi": "^0.3.1",
|
||||
"bplist-parser": "^0.1.0",
|
||||
"cordova-registry-mapper": "^1.1.8",
|
||||
"elementtree": "0.1.6",
|
||||
"glob": "^5.0.13",
|
||||
"minimatch": "^3.0.0",
|
||||
"plist": "^2.1.0",
|
||||
"q": "^1.4.1",
|
||||
"shelljs": "^0.5.3",
|
||||
"underscore": "^1.8.3",
|
||||
"unorm": "^1.3.3"
|
||||
},
|
||||
"deprecated": false,
|
||||
"description": "Apache Cordova tools and platforms shared routines",
|
||||
"devDependencies": {
|
||||
"eslint": "^4.0.0",
|
||||
"eslint-config-semistandard": "^11.0.0",
|
||||
"eslint-config-standard": "^10.2.1",
|
||||
"eslint-plugin-import": "^2.3.0",
|
||||
"eslint-plugin-node": "^5.0.0",
|
||||
"eslint-plugin-promise": "^3.5.0",
|
||||
"eslint-plugin-standard": "^3.0.1",
|
||||
"istanbul": "^0.4.5",
|
||||
"jasmine": "^2.5.2",
|
||||
"osenv": "^0.1.3",
|
||||
"promise-matchers": "^0.9.6",
|
||||
"rewire": "^2.5.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4.0.0"
|
||||
},
|
||||
"homepage": "https://github.com/apache/cordova-common#readme",
|
||||
"license": "Apache-2.0",
|
||||
"main": "cordova-common.js",
|
||||
"name": "cordova-common",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/apache/cordova-common.git"
|
||||
},
|
||||
"scripts": {
|
||||
"cover": "istanbul cover --root src --print detail jasmine",
|
||||
"eslint": "eslint src spec",
|
||||
"jasmine": "jasmine JASMINE_CONFIG_PATH=spec/support/jasmine.json",
|
||||
"test": "npm run eslint && npm run jasmine"
|
||||
},
|
||||
"version": "2.2.5"
|
||||
}
|
85
node_modules/cordova-common/src/ActionStack.js
generated
vendored
Normal file
85
node_modules/cordova-common/src/ActionStack.js
generated
vendored
Normal file
@ -0,0 +1,85 @@
|
||||
/**
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
/* jshint quotmark:false */
|
||||
|
||||
var events = require('./events');
|
||||
var Q = require('q');
|
||||
|
||||
function ActionStack () {
|
||||
this.stack = [];
|
||||
this.completed = [];
|
||||
}
|
||||
|
||||
ActionStack.prototype = {
|
||||
createAction: function (handler, action_params, reverter, revert_params) {
|
||||
return {
|
||||
handler: {
|
||||
run: handler,
|
||||
params: action_params
|
||||
},
|
||||
reverter: {
|
||||
run: reverter,
|
||||
params: revert_params
|
||||
}
|
||||
};
|
||||
},
|
||||
push: function (tx) {
|
||||
this.stack.push(tx);
|
||||
},
|
||||
// Returns a promise.
|
||||
process: function (platform) {
|
||||
events.emit('verbose', 'Beginning processing of action stack for ' + platform + ' project...');
|
||||
|
||||
while (this.stack.length) {
|
||||
var action = this.stack.shift();
|
||||
var handler = action.handler.run;
|
||||
var action_params = action.handler.params;
|
||||
|
||||
try {
|
||||
handler.apply(null, action_params);
|
||||
} catch (e) {
|
||||
events.emit('warn', 'Error during processing of action! Attempting to revert...');
|
||||
this.stack.unshift(action);
|
||||
var issue = 'Uh oh!\n';
|
||||
// revert completed tasks
|
||||
while (this.completed.length) {
|
||||
var undo = this.completed.shift();
|
||||
var revert = undo.reverter.run;
|
||||
var revert_params = undo.reverter.params;
|
||||
|
||||
try {
|
||||
revert.apply(null, revert_params);
|
||||
} catch (err) {
|
||||
events.emit('warn', 'Error during reversion of action! We probably really messed up your project now, sorry! D:');
|
||||
issue += 'A reversion action failed: ' + err.message + '\n';
|
||||
}
|
||||
}
|
||||
e.message = issue + e.message;
|
||||
return Q.reject(e);
|
||||
}
|
||||
this.completed.push(action);
|
||||
}
|
||||
events.emit('verbose', 'Action stack processing complete.');
|
||||
|
||||
return Q();
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = ActionStack;
|
426
node_modules/cordova-common/src/ConfigChanges/ConfigChanges.js
generated
vendored
Normal file
426
node_modules/cordova-common/src/ConfigChanges/ConfigChanges.js
generated
vendored
Normal file
@ -0,0 +1,426 @@
|
||||
/**
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This module deals with shared configuration / dependency "stuff". That is:
|
||||
* - XML configuration files such as config.xml, AndroidManifest.xml or WMAppManifest.xml.
|
||||
* - plist files in iOS
|
||||
* Essentially, any type of shared resources that we need to handle with awareness
|
||||
* of how potentially multiple plugins depend on a single shared resource, should be
|
||||
* handled in this module.
|
||||
*
|
||||
* The implementation uses an object as a hash table, with "leaves" of the table tracking
|
||||
* reference counts.
|
||||
*/
|
||||
|
||||
var path = require('path');
|
||||
var et = require('elementtree');
|
||||
var ConfigKeeper = require('./ConfigKeeper');
|
||||
var events = require('../events');
|
||||
|
||||
var mungeutil = require('./munge-util');
|
||||
var xml_helpers = require('../util/xml-helpers');
|
||||
|
||||
exports.PlatformMunger = PlatformMunger;
|
||||
|
||||
exports.process = function (plugins_dir, project_dir, platform, platformJson, pluginInfoProvider) {
|
||||
var munger = new PlatformMunger(platform, project_dir, platformJson, pluginInfoProvider);
|
||||
munger.process(plugins_dir);
|
||||
munger.save_all();
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* PlatformMunger class
|
||||
*
|
||||
* Can deal with config file of a single project.
|
||||
* Parsed config files are cached in a ConfigKeeper object.
|
||||
******************************************************************************/
|
||||
function PlatformMunger (platform, project_dir, platformJson, pluginInfoProvider) {
|
||||
this.platform = platform;
|
||||
this.project_dir = project_dir;
|
||||
this.config_keeper = new ConfigKeeper(project_dir);
|
||||
this.platformJson = platformJson;
|
||||
this.pluginInfoProvider = pluginInfoProvider;
|
||||
}
|
||||
|
||||
// Write out all unsaved files.
|
||||
PlatformMunger.prototype.save_all = PlatformMunger_save_all;
|
||||
function PlatformMunger_save_all () {
|
||||
this.config_keeper.save_all();
|
||||
this.platformJson.save();
|
||||
}
|
||||
|
||||
// Apply a munge object to a single config file.
|
||||
// The remove parameter tells whether to add the change or remove it.
|
||||
PlatformMunger.prototype.apply_file_munge = PlatformMunger_apply_file_munge;
|
||||
function PlatformMunger_apply_file_munge (file, munge, remove) {
|
||||
var self = this;
|
||||
|
||||
for (var selector in munge.parents) {
|
||||
for (var xml_child in munge.parents[selector]) {
|
||||
// this xml child is new, graft it (only if config file exists)
|
||||
var config_file = self.config_keeper.get(self.project_dir, self.platform, file);
|
||||
if (config_file.exists) {
|
||||
if (remove) config_file.prune_child(selector, munge.parents[selector][xml_child]);
|
||||
else config_file.graft_child(selector, munge.parents[selector][xml_child]);
|
||||
} else {
|
||||
events.emit('warn', 'config file ' + file + ' requested for changes not found at ' + config_file.filepath + ', ignoring');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PlatformMunger.prototype.remove_plugin_changes = remove_plugin_changes;
|
||||
function remove_plugin_changes (pluginInfo, is_top_level) {
|
||||
var self = this;
|
||||
var platform_config = self.platformJson.root;
|
||||
var plugin_vars = is_top_level ?
|
||||
platform_config.installed_plugins[pluginInfo.id] :
|
||||
platform_config.dependent_plugins[pluginInfo.id];
|
||||
var edit_config_changes = null;
|
||||
if (pluginInfo.getEditConfigs) {
|
||||
edit_config_changes = pluginInfo.getEditConfigs(self.platform);
|
||||
}
|
||||
|
||||
// get config munge, aka how did this plugin change various config files
|
||||
var config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars, edit_config_changes);
|
||||
// global munge looks at all plugins' changes to config files
|
||||
var global_munge = platform_config.config_munge;
|
||||
var munge = mungeutil.decrement_munge(global_munge, config_munge);
|
||||
|
||||
for (var file in munge.files) {
|
||||
self.apply_file_munge(file, munge.files[file], /* remove = */ true);
|
||||
}
|
||||
|
||||
// Remove from installed_plugins
|
||||
self.platformJson.removePlugin(pluginInfo.id, is_top_level);
|
||||
return self;
|
||||
}
|
||||
|
||||
PlatformMunger.prototype.add_plugin_changes = add_plugin_changes;
|
||||
function add_plugin_changes (pluginInfo, plugin_vars, is_top_level, should_increment, plugin_force) {
|
||||
var self = this;
|
||||
var platform_config = self.platformJson.root;
|
||||
|
||||
var edit_config_changes = null;
|
||||
if (pluginInfo.getEditConfigs) {
|
||||
edit_config_changes = pluginInfo.getEditConfigs(self.platform);
|
||||
}
|
||||
|
||||
var config_munge;
|
||||
|
||||
if (!edit_config_changes || edit_config_changes.length === 0) {
|
||||
// get config munge, aka how should this plugin change various config files
|
||||
config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars);
|
||||
} else {
|
||||
var isConflictingInfo = is_conflicting(edit_config_changes, platform_config.config_munge, self, plugin_force);
|
||||
|
||||
if (isConflictingInfo.conflictWithConfigxml) {
|
||||
throw new Error(pluginInfo.id +
|
||||
' cannot be added. <edit-config> changes in this plugin conflicts with <edit-config> changes in config.xml. Conflicts must be resolved before plugin can be added.');
|
||||
}
|
||||
if (plugin_force) {
|
||||
events.emit('warn', '--force is used. edit-config will overwrite conflicts if any. Conflicting plugins may not work as expected.');
|
||||
|
||||
// remove conflicting munges
|
||||
var conflict_munge = mungeutil.decrement_munge(platform_config.config_munge, isConflictingInfo.conflictingMunge);
|
||||
for (var conflict_file in conflict_munge.files) {
|
||||
self.apply_file_munge(conflict_file, conflict_munge.files[conflict_file], /* remove = */ true);
|
||||
}
|
||||
|
||||
// force add new munges
|
||||
config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars, edit_config_changes);
|
||||
} else if (isConflictingInfo.conflictFound) {
|
||||
throw new Error('There was a conflict trying to modify attributes with <edit-config> in plugin ' + pluginInfo.id +
|
||||
'. The conflicting plugin, ' + isConflictingInfo.conflictingPlugin + ', already modified the same attributes. The conflict must be resolved before ' +
|
||||
pluginInfo.id + ' can be added. You may use --force to add the plugin and overwrite the conflicting attributes.');
|
||||
} else {
|
||||
// no conflicts, will handle edit-config
|
||||
config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars, edit_config_changes);
|
||||
}
|
||||
}
|
||||
|
||||
self = munge_helper(should_increment, self, platform_config, config_munge);
|
||||
|
||||
// Move to installed/dependent_plugins
|
||||
self.platformJson.addPlugin(pluginInfo.id, plugin_vars || {}, is_top_level);
|
||||
return self;
|
||||
}
|
||||
|
||||
// Handle edit-config changes from config.xml
|
||||
PlatformMunger.prototype.add_config_changes = add_config_changes;
|
||||
function add_config_changes (config, should_increment) {
|
||||
var self = this;
|
||||
var platform_config = self.platformJson.root;
|
||||
|
||||
var config_munge;
|
||||
var changes = [];
|
||||
|
||||
if (config.getEditConfigs) {
|
||||
var edit_config_changes = config.getEditConfigs(self.platform);
|
||||
if (edit_config_changes) {
|
||||
changes = changes.concat(edit_config_changes);
|
||||
}
|
||||
}
|
||||
|
||||
if (config.getConfigFiles) {
|
||||
var config_files_changes = config.getConfigFiles(self.platform);
|
||||
if (config_files_changes) {
|
||||
changes = changes.concat(config_files_changes);
|
||||
}
|
||||
}
|
||||
|
||||
if (changes && changes.length > 0) {
|
||||
var isConflictingInfo = is_conflicting(changes, platform_config.config_munge, self, true /* always force overwrite other edit-config */);
|
||||
if (isConflictingInfo.conflictFound) {
|
||||
var conflict_munge;
|
||||
var conflict_file;
|
||||
|
||||
if (Object.keys(isConflictingInfo.configxmlMunge.files).length !== 0) {
|
||||
// silently remove conflicting config.xml munges so new munges can be added
|
||||
conflict_munge = mungeutil.decrement_munge(platform_config.config_munge, isConflictingInfo.configxmlMunge);
|
||||
for (conflict_file in conflict_munge.files) {
|
||||
self.apply_file_munge(conflict_file, conflict_munge.files[conflict_file], /* remove = */ true);
|
||||
}
|
||||
}
|
||||
if (Object.keys(isConflictingInfo.conflictingMunge.files).length !== 0) {
|
||||
events.emit('warn', 'Conflict found, edit-config changes from config.xml will overwrite plugin.xml changes');
|
||||
|
||||
// remove conflicting plugin.xml munges
|
||||
conflict_munge = mungeutil.decrement_munge(platform_config.config_munge, isConflictingInfo.conflictingMunge);
|
||||
for (conflict_file in conflict_munge.files) {
|
||||
self.apply_file_munge(conflict_file, conflict_munge.files[conflict_file], /* remove = */ true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Add config.xml edit-config and config-file munges
|
||||
config_munge = self.generate_config_xml_munge(config, changes, 'config.xml');
|
||||
self = munge_helper(should_increment, self, platform_config, config_munge);
|
||||
|
||||
// Move to installed/dependent_plugins
|
||||
return self;
|
||||
}
|
||||
|
||||
function munge_helper (should_increment, self, platform_config, config_munge) {
|
||||
// global munge looks at all changes to config files
|
||||
|
||||
// TODO: The should_increment param is only used by cordova-cli and is going away soon.
|
||||
// If should_increment is set to false, avoid modifying the global_munge (use clone)
|
||||
// and apply the entire config_munge because it's already a proper subset of the global_munge.
|
||||
var munge, global_munge;
|
||||
if (should_increment) {
|
||||
global_munge = platform_config.config_munge;
|
||||
munge = mungeutil.increment_munge(global_munge, config_munge);
|
||||
} else {
|
||||
global_munge = mungeutil.clone_munge(platform_config.config_munge);
|
||||
munge = config_munge;
|
||||
}
|
||||
|
||||
for (var file in munge.files) {
|
||||
self.apply_file_munge(file, munge.files[file]);
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
// Load the global munge from platform json and apply all of it.
|
||||
// Used by cordova prepare to re-generate some config file from platform
|
||||
// defaults and the global munge.
|
||||
PlatformMunger.prototype.reapply_global_munge = reapply_global_munge;
|
||||
function reapply_global_munge () {
|
||||
var self = this;
|
||||
|
||||
var platform_config = self.platformJson.root;
|
||||
var global_munge = platform_config.config_munge;
|
||||
for (var file in global_munge.files) {
|
||||
self.apply_file_munge(file, global_munge.files[file]);
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
// generate_plugin_config_munge
|
||||
// Generate the munge object from config.xml
|
||||
PlatformMunger.prototype.generate_config_xml_munge = generate_config_xml_munge;
|
||||
function generate_config_xml_munge (config, config_changes, type) {
|
||||
var munge = { files: {} };
|
||||
var id;
|
||||
|
||||
if (!config_changes) {
|
||||
return munge;
|
||||
}
|
||||
|
||||
if (type === 'config.xml') {
|
||||
id = type;
|
||||
} else {
|
||||
id = config.id;
|
||||
}
|
||||
|
||||
config_changes.forEach(function (change) {
|
||||
change.xmls.forEach(function (xml) {
|
||||
// 1. stringify each xml
|
||||
var stringified = (new et.ElementTree(xml)).write({xml_declaration: false});
|
||||
// 2. add into munge
|
||||
if (change.mode) {
|
||||
mungeutil.deep_add(munge, change.file, change.target, { xml: stringified, count: 1, mode: change.mode, id: id });
|
||||
} else {
|
||||
mungeutil.deep_add(munge, change.target, change.parent, { xml: stringified, count: 1, after: change.after });
|
||||
}
|
||||
});
|
||||
});
|
||||
return munge;
|
||||
}
|
||||
|
||||
// generate_plugin_config_munge
|
||||
// Generate the munge object from plugin.xml + vars
|
||||
PlatformMunger.prototype.generate_plugin_config_munge = generate_plugin_config_munge;
|
||||
function generate_plugin_config_munge (pluginInfo, vars, edit_config_changes) {
|
||||
var self = this;
|
||||
|
||||
vars = vars || {};
|
||||
var munge = { files: {} };
|
||||
var changes = pluginInfo.getConfigFiles(self.platform);
|
||||
|
||||
if (edit_config_changes) {
|
||||
Array.prototype.push.apply(changes, edit_config_changes);
|
||||
}
|
||||
|
||||
changes.forEach(function (change) {
|
||||
change.xmls.forEach(function (xml) {
|
||||
// 1. stringify each xml
|
||||
var stringified = (new et.ElementTree(xml)).write({xml_declaration: false});
|
||||
// interp vars
|
||||
if (vars) {
|
||||
Object.keys(vars).forEach(function (key) {
|
||||
var regExp = new RegExp('\\$' + key, 'g');
|
||||
stringified = stringified.replace(regExp, vars[key]);
|
||||
});
|
||||
}
|
||||
// 2. add into munge
|
||||
if (change.mode) {
|
||||
if (change.mode !== 'remove') {
|
||||
mungeutil.deep_add(munge, change.file, change.target, { xml: stringified, count: 1, mode: change.mode, plugin: pluginInfo.id });
|
||||
}
|
||||
} else {
|
||||
mungeutil.deep_add(munge, change.target, change.parent, { xml: stringified, count: 1, after: change.after });
|
||||
}
|
||||
});
|
||||
});
|
||||
return munge;
|
||||
}
|
||||
|
||||
function is_conflicting (editchanges, config_munge, self, force) {
|
||||
var files = config_munge.files;
|
||||
var conflictFound = false;
|
||||
var conflictWithConfigxml = false;
|
||||
var conflictingMunge = { files: {} };
|
||||
var configxmlMunge = { files: {} };
|
||||
var conflictingParent;
|
||||
var conflictingPlugin;
|
||||
|
||||
editchanges.forEach(function (editchange) {
|
||||
if (files[editchange.file]) {
|
||||
var parents = files[editchange.file].parents;
|
||||
var target = parents[editchange.target];
|
||||
|
||||
// Check if the edit target will resolve to an existing target
|
||||
if (!target || target.length === 0) {
|
||||
var file_xml = self.config_keeper.get(self.project_dir, self.platform, editchange.file).data;
|
||||
var resolveEditTarget = xml_helpers.resolveParent(file_xml, editchange.target);
|
||||
var resolveTarget;
|
||||
|
||||
if (resolveEditTarget) {
|
||||
for (var parent in parents) {
|
||||
resolveTarget = xml_helpers.resolveParent(file_xml, parent);
|
||||
if (resolveEditTarget === resolveTarget) {
|
||||
conflictingParent = parent;
|
||||
target = parents[parent];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
conflictingParent = editchange.target;
|
||||
}
|
||||
|
||||
if (target && target.length !== 0) {
|
||||
// conflict has been found
|
||||
conflictFound = true;
|
||||
|
||||
if (editchange.id === 'config.xml') {
|
||||
if (target[0].id === 'config.xml') {
|
||||
// Keep track of config.xml/config.xml edit-config conflicts
|
||||
mungeutil.deep_add(configxmlMunge, editchange.file, conflictingParent, target[0]);
|
||||
} else {
|
||||
// Keep track of config.xml x plugin.xml edit-config conflicts
|
||||
mungeutil.deep_add(conflictingMunge, editchange.file, conflictingParent, target[0]);
|
||||
}
|
||||
} else {
|
||||
if (target[0].id === 'config.xml') {
|
||||
// plugin.xml cannot overwrite config.xml changes even if --force is used
|
||||
conflictWithConfigxml = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (force) {
|
||||
// Need to find all conflicts when --force is used, track conflicting munges
|
||||
mungeutil.deep_add(conflictingMunge, editchange.file, conflictingParent, target[0]);
|
||||
} else {
|
||||
// plugin cannot overwrite other plugin changes without --force
|
||||
conflictingPlugin = target[0].plugin;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return {conflictFound: conflictFound,
|
||||
conflictingPlugin: conflictingPlugin,
|
||||
conflictingMunge: conflictingMunge,
|
||||
configxmlMunge: configxmlMunge,
|
||||
conflictWithConfigxml: conflictWithConfigxml};
|
||||
}
|
||||
|
||||
// Go over the prepare queue and apply the config munges for each plugin
|
||||
// that has been (un)installed.
|
||||
PlatformMunger.prototype.process = PlatformMunger_process;
|
||||
function PlatformMunger_process (plugins_dir) {
|
||||
var self = this;
|
||||
var platform_config = self.platformJson.root;
|
||||
|
||||
// Uninstallation first
|
||||
platform_config.prepare_queue.uninstalled.forEach(function (u) {
|
||||
var pluginInfo = self.pluginInfoProvider.get(path.join(plugins_dir, u.plugin));
|
||||
self.remove_plugin_changes(pluginInfo, u.topLevel);
|
||||
});
|
||||
|
||||
// Now handle installation
|
||||
platform_config.prepare_queue.installed.forEach(function (u) {
|
||||
var pluginInfo = self.pluginInfoProvider.get(path.join(plugins_dir, u.plugin));
|
||||
self.add_plugin_changes(pluginInfo, u.vars, u.topLevel, true, u.force);
|
||||
});
|
||||
|
||||
// Empty out installed/ uninstalled queues.
|
||||
platform_config.prepare_queue.uninstalled = [];
|
||||
platform_config.prepare_queue.installed = [];
|
||||
}
|
||||
/** ** END of PlatformMunger ****/
|
259
node_modules/cordova-common/src/ConfigChanges/ConfigFile.js
generated
vendored
Normal file
259
node_modules/cordova-common/src/ConfigChanges/ConfigFile.js
generated
vendored
Normal file
@ -0,0 +1,259 @@
|
||||
/*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
/* eslint no-control-regex: 0 */
|
||||
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
|
||||
var modules = {};
|
||||
var addProperty = require('../util/addProperty');
|
||||
|
||||
// Use delay loading to ensure plist and other node modules to not get loaded
|
||||
// on Android, Windows platforms
|
||||
addProperty(module, 'bplist', 'bplist-parser', modules);
|
||||
addProperty(module, 'et', 'elementtree', modules);
|
||||
addProperty(module, 'glob', 'glob', modules);
|
||||
addProperty(module, 'plist', 'plist', modules);
|
||||
addProperty(module, 'plist_helpers', '../util/plist-helpers', modules);
|
||||
addProperty(module, 'xml_helpers', '../util/xml-helpers', modules);
|
||||
|
||||
/******************************************************************************
|
||||
* ConfigFile class
|
||||
*
|
||||
* Can load and keep various types of config files. Provides some functionality
|
||||
* specific to some file types such as grafting XML children. In most cases it
|
||||
* should be instantiated by ConfigKeeper.
|
||||
*
|
||||
* For plugin.xml files use as:
|
||||
* plugin_config = self.config_keeper.get(plugin_dir, '', 'plugin.xml');
|
||||
*
|
||||
* TODO: Consider moving it out to a separate file and maybe partially with
|
||||
* overrides in platform handlers.
|
||||
******************************************************************************/
|
||||
function ConfigFile (project_dir, platform, file_tag) {
|
||||
this.project_dir = project_dir;
|
||||
this.platform = platform;
|
||||
this.file_tag = file_tag;
|
||||
this.is_changed = false;
|
||||
|
||||
this.load();
|
||||
}
|
||||
|
||||
// ConfigFile.load()
|
||||
ConfigFile.prototype.load = ConfigFile_load;
|
||||
function ConfigFile_load () {
|
||||
var self = this;
|
||||
|
||||
// config file may be in a place not exactly specified in the target
|
||||
var filepath = self.filepath = resolveConfigFilePath(self.project_dir, self.platform, self.file_tag);
|
||||
|
||||
if (!filepath || !fs.existsSync(filepath)) {
|
||||
self.exists = false;
|
||||
return;
|
||||
}
|
||||
self.exists = true;
|
||||
self.mtime = fs.statSync(self.filepath).mtime;
|
||||
|
||||
var ext = path.extname(filepath);
|
||||
// Windows8 uses an appxmanifest, and wp8 will likely use
|
||||
// the same in a future release
|
||||
if (ext === '.xml' || ext === '.appxmanifest' || ext === '.storyboard') {
|
||||
self.type = 'xml';
|
||||
self.data = modules.xml_helpers.parseElementtreeSync(filepath);
|
||||
} else {
|
||||
// plist file
|
||||
self.type = 'plist';
|
||||
// TODO: isBinaryPlist() reads the file and then parse re-reads it again.
|
||||
// We always write out text plist, not binary.
|
||||
// Do we still need to support binary plist?
|
||||
// If yes, use plist.parseStringSync() and read the file once.
|
||||
self.data = isBinaryPlist(filepath) ?
|
||||
modules.bplist.parseBuffer(fs.readFileSync(filepath))[0] :
|
||||
modules.plist.parse(fs.readFileSync(filepath, 'utf8'));
|
||||
}
|
||||
}
|
||||
|
||||
ConfigFile.prototype.save = function ConfigFile_save () {
|
||||
var self = this;
|
||||
if (self.type === 'xml') {
|
||||
fs.writeFileSync(self.filepath, self.data.write({indent: 4}), 'utf-8');
|
||||
} else {
|
||||
// plist
|
||||
var regExp = new RegExp('<string>[ \t\r\n]+?</string>', 'g');
|
||||
fs.writeFileSync(self.filepath, modules.plist.build(self.data).replace(regExp, '<string></string>'));
|
||||
}
|
||||
self.is_changed = false;
|
||||
};
|
||||
|
||||
ConfigFile.prototype.graft_child = function ConfigFile_graft_child (selector, xml_child) {
|
||||
var self = this;
|
||||
var filepath = self.filepath;
|
||||
var result;
|
||||
if (self.type === 'xml') {
|
||||
var xml_to_graft = [modules.et.XML(xml_child.xml)];
|
||||
switch (xml_child.mode) {
|
||||
case 'merge':
|
||||
result = modules.xml_helpers.graftXMLMerge(self.data, xml_to_graft, selector, xml_child);
|
||||
break;
|
||||
case 'overwrite':
|
||||
result = modules.xml_helpers.graftXMLOverwrite(self.data, xml_to_graft, selector, xml_child);
|
||||
break;
|
||||
case 'remove':
|
||||
result = modules.xml_helpers.pruneXMLRemove(self.data, selector, xml_to_graft);
|
||||
break;
|
||||
default:
|
||||
result = modules.xml_helpers.graftXML(self.data, xml_to_graft, selector, xml_child.after);
|
||||
}
|
||||
if (!result) {
|
||||
throw new Error('Unable to graft xml at selector "' + selector + '" from "' + filepath + '" during config install');
|
||||
}
|
||||
} else {
|
||||
// plist file
|
||||
result = modules.plist_helpers.graftPLIST(self.data, xml_child.xml, selector);
|
||||
if (!result) {
|
||||
throw new Error('Unable to graft plist "' + filepath + '" during config install');
|
||||
}
|
||||
}
|
||||
self.is_changed = true;
|
||||
};
|
||||
|
||||
ConfigFile.prototype.prune_child = function ConfigFile_prune_child (selector, xml_child) {
|
||||
var self = this;
|
||||
var filepath = self.filepath;
|
||||
var result;
|
||||
if (self.type === 'xml') {
|
||||
var xml_to_graft = [modules.et.XML(xml_child.xml)];
|
||||
switch (xml_child.mode) {
|
||||
case 'merge':
|
||||
case 'overwrite':
|
||||
result = modules.xml_helpers.pruneXMLRestore(self.data, selector, xml_child);
|
||||
break;
|
||||
case 'remove':
|
||||
result = modules.xml_helpers.pruneXMLRemove(self.data, selector, xml_to_graft);
|
||||
break;
|
||||
default:
|
||||
result = modules.xml_helpers.pruneXML(self.data, xml_to_graft, selector);
|
||||
}
|
||||
} else {
|
||||
// plist file
|
||||
result = modules.plist_helpers.prunePLIST(self.data, xml_child.xml, selector);
|
||||
}
|
||||
if (!result) {
|
||||
var err_msg = 'Pruning at selector "' + selector + '" from "' + filepath + '" went bad.';
|
||||
throw new Error(err_msg);
|
||||
}
|
||||
self.is_changed = true;
|
||||
};
|
||||
|
||||
// Some config-file target attributes are not qualified with a full leading directory, or contain wildcards.
|
||||
// Resolve to a real path in this function.
|
||||
// TODO: getIOSProjectname is slow because of glob, try to avoid calling it several times per project.
|
||||
function resolveConfigFilePath (project_dir, platform, file) {
|
||||
var filepath = path.join(project_dir, file);
|
||||
var matches;
|
||||
|
||||
file = path.normalize(file);
|
||||
|
||||
if (file.indexOf('*') > -1) {
|
||||
// handle wildcards in targets using glob.
|
||||
matches = modules.glob.sync(path.join(project_dir, '**', file));
|
||||
if (matches.length) filepath = matches[0];
|
||||
|
||||
// [CB-5989] multiple Info.plist files may exist. default to $PROJECT_NAME-Info.plist
|
||||
if (matches.length > 1 && file.indexOf('-Info.plist') > -1) {
|
||||
var plistName = getIOSProjectname(project_dir) + '-Info.plist';
|
||||
for (var i = 0; i < matches.length; i++) {
|
||||
if (matches[i].indexOf(plistName) > -1) {
|
||||
filepath = matches[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return filepath;
|
||||
}
|
||||
|
||||
// XXX this checks for android studio projects
|
||||
// only if none of the options above are satisfied does this get called
|
||||
// TODO: Move this out of cordova-common and into the platforms somehow
|
||||
if (platform === 'android' && !fs.existsSync(filepath)) {
|
||||
if (file === 'AndroidManifest.xml') {
|
||||
filepath = path.join(project_dir, 'app', 'src', 'main', 'AndroidManifest.xml');
|
||||
} else if (file.endsWith('config.xml')) {
|
||||
filepath = path.join(project_dir, 'app', 'src', 'main', 'res', 'xml', 'config.xml');
|
||||
} else if (file.endsWith('strings.xml')) {
|
||||
// Plugins really shouldn't mess with strings.xml, since it's able to be localized
|
||||
filepath = path.join(project_dir, 'app', 'src', 'main', 'res', 'values', 'strings.xml');
|
||||
} else if (file.includes(path.join('res', 'xml'))) {
|
||||
// Catch-all for all other stored XML configuration in legacy plugins
|
||||
var config_file = path.basename(file);
|
||||
filepath = path.join(project_dir, 'app', 'src', 'main', 'res', 'xml', config_file);
|
||||
}
|
||||
return filepath;
|
||||
}
|
||||
|
||||
// special-case config.xml target that is just "config.xml" for other platforms. This should
|
||||
// be resolved to the real location of the file.
|
||||
// TODO: Move this out of cordova-common into platforms
|
||||
if (file === 'config.xml') {
|
||||
if (platform === 'ubuntu') {
|
||||
filepath = path.join(project_dir, 'config.xml');
|
||||
} else if (platform === 'ios') {
|
||||
var iospath = module.exports.getIOSProjectname(project_dir);
|
||||
filepath = path.join(project_dir, iospath, 'config.xml');
|
||||
} else {
|
||||
matches = modules.glob.sync(path.join(project_dir, '**', 'config.xml'));
|
||||
if (matches.length) filepath = matches[0];
|
||||
}
|
||||
return filepath;
|
||||
}
|
||||
|
||||
// None of the special cases matched, returning project_dir/file.
|
||||
return filepath;
|
||||
}
|
||||
|
||||
// Find out the real name of an iOS project
|
||||
// TODO: glob is slow, need a better way or caching, or avoid using more than once.
|
||||
function getIOSProjectname (project_dir) {
|
||||
var matches = modules.glob.sync(path.join(project_dir, '*.xcodeproj'));
|
||||
var iospath;
|
||||
if (matches.length === 1) {
|
||||
iospath = path.basename(matches[0], '.xcodeproj');
|
||||
} else {
|
||||
var msg;
|
||||
if (matches.length === 0) {
|
||||
msg = 'Does not appear to be an xcode project, no xcode project file in ' + project_dir;
|
||||
} else {
|
||||
msg = 'There are multiple *.xcodeproj dirs in ' + project_dir;
|
||||
}
|
||||
throw new Error(msg);
|
||||
}
|
||||
return iospath;
|
||||
}
|
||||
|
||||
// determine if a plist file is binary
|
||||
function isBinaryPlist (filename) {
|
||||
// I wish there was a synchronous way to read only the first 6 bytes of a
|
||||
// file. This is wasteful :/
|
||||
var buf = '' + fs.readFileSync(filename, 'utf8');
|
||||
// binary plists start with a magic header, "bplist"
|
||||
return buf.substring(0, 6) === 'bplist';
|
||||
}
|
||||
|
||||
module.exports = ConfigFile;
|
||||
module.exports.isBinaryPlist = isBinaryPlist;
|
||||
module.exports.getIOSProjectname = getIOSProjectname;
|
||||
module.exports.resolveConfigFilePath = resolveConfigFilePath;
|
64
node_modules/cordova-common/src/ConfigChanges/ConfigKeeper.js
generated
vendored
Normal file
64
node_modules/cordova-common/src/ConfigChanges/ConfigKeeper.js
generated
vendored
Normal file
@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
*/
|
||||
/* jshint sub:true */
|
||||
|
||||
var path = require('path');
|
||||
var ConfigFile = require('./ConfigFile');
|
||||
|
||||
/******************************************************************************
|
||||
* ConfigKeeper class
|
||||
*
|
||||
* Used to load and store config files to avoid re-parsing and writing them out
|
||||
* multiple times.
|
||||
*
|
||||
* The config files are referred to by a fake path constructed as
|
||||
* project_dir/platform/file
|
||||
* where file is the name used for the file in config munges.
|
||||
******************************************************************************/
|
||||
function ConfigKeeper (project_dir, plugins_dir) {
|
||||
this.project_dir = project_dir;
|
||||
this.plugins_dir = plugins_dir;
|
||||
this._cached = {};
|
||||
}
|
||||
|
||||
ConfigKeeper.prototype.get = function ConfigKeeper_get (project_dir, platform, file) {
|
||||
var self = this;
|
||||
|
||||
// This fixes a bug with older plugins - when specifying config xml instead of res/xml/config.xml
|
||||
// https://issues.apache.org/jira/browse/CB-6414
|
||||
if (file === 'config.xml' && platform === 'android') {
|
||||
file = 'res/xml/config.xml';
|
||||
}
|
||||
var fake_path = path.join(project_dir, platform, file);
|
||||
|
||||
if (self._cached[fake_path]) {
|
||||
return self._cached[fake_path];
|
||||
}
|
||||
// File was not cached, need to load.
|
||||
var config_file = new ConfigFile(project_dir, platform, file);
|
||||
self._cached[fake_path] = config_file;
|
||||
return config_file;
|
||||
};
|
||||
|
||||
ConfigKeeper.prototype.save_all = function ConfigKeeper_save_all () {
|
||||
var self = this;
|
||||
Object.keys(self._cached).forEach(function (fake_path) {
|
||||
var config_file = self._cached[fake_path];
|
||||
if (config_file.is_changed) config_file.save();
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = ConfigKeeper;
|
162
node_modules/cordova-common/src/ConfigChanges/munge-util.js
generated
vendored
Normal file
162
node_modules/cordova-common/src/ConfigChanges/munge-util.js
generated
vendored
Normal file
@ -0,0 +1,162 @@
|
||||
/*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
*/
|
||||
/* jshint sub:true */
|
||||
|
||||
var _ = require('underscore');
|
||||
|
||||
// add the count of [key1][key2]...[keyN] to obj
|
||||
// return true if it didn't exist before
|
||||
exports.deep_add = function deep_add (obj, keys /* or key1, key2 .... */) {
|
||||
if (!Array.isArray(keys)) {
|
||||
keys = Array.prototype.slice.call(arguments, 1);
|
||||
}
|
||||
|
||||
return exports.process_munge(obj, true/* createParents */, function (parentArray, k) {
|
||||
var found = _.find(parentArray, function (element) {
|
||||
return element.xml === k.xml;
|
||||
});
|
||||
if (found) {
|
||||
found.after = found.after || k.after;
|
||||
found.count += k.count;
|
||||
} else {
|
||||
parentArray.push(k);
|
||||
}
|
||||
return !found;
|
||||
}, keys);
|
||||
};
|
||||
|
||||
// decrement the count of [key1][key2]...[keyN] from obj and remove if it reaches 0
|
||||
// return true if it was removed or not found
|
||||
exports.deep_remove = function deep_remove (obj, keys /* or key1, key2 .... */) {
|
||||
if (!Array.isArray(keys)) {
|
||||
keys = Array.prototype.slice.call(arguments, 1);
|
||||
}
|
||||
|
||||
var result = exports.process_munge(obj, false/* createParents */, function (parentArray, k) {
|
||||
var index = -1;
|
||||
var found = _.find(parentArray, function (element) {
|
||||
index++;
|
||||
return element.xml === k.xml;
|
||||
});
|
||||
if (found) {
|
||||
if (parentArray[index].oldAttrib) {
|
||||
k.oldAttrib = _.extend({}, parentArray[index].oldAttrib);
|
||||
}
|
||||
found.count -= k.count;
|
||||
if (found.count > 0) {
|
||||
return false;
|
||||
} else {
|
||||
parentArray.splice(index, 1);
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
}, keys);
|
||||
|
||||
return typeof result === 'undefined' ? true : result;
|
||||
};
|
||||
|
||||
// search for [key1][key2]...[keyN]
|
||||
// return the object or undefined if not found
|
||||
exports.deep_find = function deep_find (obj, keys /* or key1, key2 .... */) {
|
||||
if (!Array.isArray(keys)) {
|
||||
keys = Array.prototype.slice.call(arguments, 1);
|
||||
}
|
||||
|
||||
return exports.process_munge(obj, false/* createParents? */, function (parentArray, k) {
|
||||
return _.find(parentArray, function (element) {
|
||||
return element.xml === (k.xml || k);
|
||||
});
|
||||
}, keys);
|
||||
};
|
||||
|
||||
// Execute func passing it the parent array and the xmlChild key.
|
||||
// When createParents is true, add the file and parent items they are missing
|
||||
// When createParents is false, stop and return undefined if the file and/or parent items are missing
|
||||
|
||||
exports.process_munge = function process_munge (obj, createParents, func, keys /* or key1, key2 .... */) {
|
||||
if (!Array.isArray(keys)) {
|
||||
keys = Array.prototype.slice.call(arguments, 1);
|
||||
}
|
||||
var k = keys[0];
|
||||
if (keys.length === 1) {
|
||||
return func(obj, k);
|
||||
} else if (keys.length === 2) {
|
||||
if (!obj.parents[k] && !createParents) {
|
||||
return undefined;
|
||||
}
|
||||
obj.parents[k] = obj.parents[k] || [];
|
||||
return exports.process_munge(obj.parents[k], createParents, func, keys.slice(1));
|
||||
} else if (keys.length === 3) {
|
||||
if (!obj.files[k] && !createParents) {
|
||||
return undefined;
|
||||
}
|
||||
obj.files[k] = obj.files[k] || { parents: {} };
|
||||
return exports.process_munge(obj.files[k], createParents, func, keys.slice(1));
|
||||
} else {
|
||||
throw new Error('Invalid key format. Must contain at most 3 elements (file, parent, xmlChild).');
|
||||
}
|
||||
};
|
||||
|
||||
// All values from munge are added to base as
|
||||
// base[file][selector][child] += munge[file][selector][child]
|
||||
// Returns a munge object containing values that exist in munge
|
||||
// but not in base.
|
||||
exports.increment_munge = function increment_munge (base, munge) {
|
||||
var diff = { files: {} };
|
||||
|
||||
for (var file in munge.files) {
|
||||
for (var selector in munge.files[file].parents) {
|
||||
for (var xml_child in munge.files[file].parents[selector]) {
|
||||
var val = munge.files[file].parents[selector][xml_child];
|
||||
// if node not in base, add it to diff and base
|
||||
// else increment it's value in base without adding to diff
|
||||
var newlyAdded = exports.deep_add(base, [file, selector, val]);
|
||||
if (newlyAdded) {
|
||||
exports.deep_add(diff, file, selector, val);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return diff;
|
||||
};
|
||||
|
||||
// Update the base munge object as
|
||||
// base[file][selector][child] -= munge[file][selector][child]
|
||||
// nodes that reached zero value are removed from base and added to the returned munge
|
||||
// object.
|
||||
exports.decrement_munge = function decrement_munge (base, munge) {
|
||||
var zeroed = { files: {} };
|
||||
|
||||
for (var file in munge.files) {
|
||||
for (var selector in munge.files[file].parents) {
|
||||
for (var xml_child in munge.files[file].parents[selector]) {
|
||||
var val = munge.files[file].parents[selector][xml_child];
|
||||
// if node not in base, add it to diff and base
|
||||
// else increment it's value in base without adding to diff
|
||||
var removed = exports.deep_remove(base, [file, selector, val]);
|
||||
if (removed) {
|
||||
exports.deep_add(zeroed, file, selector, val);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return zeroed;
|
||||
};
|
||||
|
||||
// For better readability where used
|
||||
exports.clone_munge = function clone_munge (munge) {
|
||||
return exports.increment_munge({}, munge);
|
||||
};
|
602
node_modules/cordova-common/src/ConfigParser/ConfigParser.js
generated
vendored
Normal file
602
node_modules/cordova-common/src/ConfigParser/ConfigParser.js
generated
vendored
Normal file
@ -0,0 +1,602 @@
|
||||
/**
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
var et = require('elementtree');
|
||||
var xml = require('../util/xml-helpers');
|
||||
var CordovaError = require('../CordovaError/CordovaError');
|
||||
var fs = require('fs');
|
||||
var events = require('../events');
|
||||
|
||||
/** Wraps a config.xml file */
|
||||
function ConfigParser (path) {
|
||||
this.path = path;
|
||||
try {
|
||||
this.doc = xml.parseElementtreeSync(path);
|
||||
this.cdvNamespacePrefix = getCordovaNamespacePrefix(this.doc);
|
||||
et.register_namespace(this.cdvNamespacePrefix, 'http://cordova.apache.org/ns/1.0');
|
||||
} catch (e) {
|
||||
events.emit('error', 'Parsing ' + path + ' failed');
|
||||
throw e;
|
||||
}
|
||||
var r = this.doc.getroot();
|
||||
if (r.tag !== 'widget') {
|
||||
throw new CordovaError(path + ' has incorrect root node name (expected "widget", was "' + r.tag + '")');
|
||||
}
|
||||
}
|
||||
|
||||
function getNodeTextSafe (el) {
|
||||
return el && el.text && el.text.trim();
|
||||
}
|
||||
|
||||
function findOrCreate (doc, name) {
|
||||
var ret = doc.find(name);
|
||||
if (!ret) {
|
||||
ret = new et.Element(name);
|
||||
doc.getroot().append(ret);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
function getCordovaNamespacePrefix (doc) {
|
||||
var rootAtribs = Object.getOwnPropertyNames(doc.getroot().attrib);
|
||||
var prefix = 'cdv';
|
||||
for (var j = 0; j < rootAtribs.length; j++) {
|
||||
if (rootAtribs[j].indexOf('xmlns:') === 0 &&
|
||||
doc.getroot().attrib[rootAtribs[j]] === 'http://cordova.apache.org/ns/1.0') {
|
||||
var strings = rootAtribs[j].split(':');
|
||||
prefix = strings[1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
return prefix;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the value of an element's attribute
|
||||
* @param {String} attributeName Name of the attribute to search for
|
||||
* @param {Array} elems An array of ElementTree nodes
|
||||
* @return {String}
|
||||
*/
|
||||
function findElementAttributeValue (attributeName, elems) {
|
||||
|
||||
elems = Array.isArray(elems) ? elems : [ elems ];
|
||||
|
||||
var value = elems.filter(function (elem) {
|
||||
return elem.attrib.name.toLowerCase() === attributeName.toLowerCase();
|
||||
}).map(function (filteredElems) {
|
||||
return filteredElems.attrib.value;
|
||||
}).pop();
|
||||
|
||||
return value || '';
|
||||
}
|
||||
|
||||
function removeChildren (el, selector) {
|
||||
const matches = el.findall(selector);
|
||||
matches.forEach(child => el.remove(child));
|
||||
}
|
||||
|
||||
ConfigParser.prototype = {
|
||||
getAttribute: function (attr) {
|
||||
return this.doc.getroot().attrib[attr];
|
||||
},
|
||||
|
||||
packageName: function () {
|
||||
return this.getAttribute('id');
|
||||
},
|
||||
setPackageName: function (id) {
|
||||
this.doc.getroot().attrib['id'] = id;
|
||||
},
|
||||
android_packageName: function () {
|
||||
return this.getAttribute('android-packageName');
|
||||
},
|
||||
android_activityName: function () {
|
||||
return this.getAttribute('android-activityName');
|
||||
},
|
||||
ios_CFBundleIdentifier: function () {
|
||||
return this.getAttribute('ios-CFBundleIdentifier');
|
||||
},
|
||||
name: function () {
|
||||
return getNodeTextSafe(this.doc.find('name'));
|
||||
},
|
||||
setName: function (name) {
|
||||
var el = findOrCreate(this.doc, 'name');
|
||||
el.text = name;
|
||||
},
|
||||
shortName: function () {
|
||||
return this.doc.find('name').attrib['short'] || this.name();
|
||||
},
|
||||
setShortName: function (shortname) {
|
||||
var el = findOrCreate(this.doc, 'name');
|
||||
if (!el.text) {
|
||||
el.text = shortname;
|
||||
}
|
||||
el.attrib['short'] = shortname;
|
||||
},
|
||||
description: function () {
|
||||
return getNodeTextSafe(this.doc.find('description'));
|
||||
},
|
||||
setDescription: function (text) {
|
||||
var el = findOrCreate(this.doc, 'description');
|
||||
el.text = text;
|
||||
},
|
||||
version: function () {
|
||||
return this.getAttribute('version');
|
||||
},
|
||||
windows_packageVersion: function () {
|
||||
return this.getAttribute('windows-packageVersion');
|
||||
},
|
||||
android_versionCode: function () {
|
||||
return this.getAttribute('android-versionCode');
|
||||
},
|
||||
ios_CFBundleVersion: function () {
|
||||
return this.getAttribute('ios-CFBundleVersion');
|
||||
},
|
||||
setVersion: function (value) {
|
||||
this.doc.getroot().attrib['version'] = value;
|
||||
},
|
||||
author: function () {
|
||||
return getNodeTextSafe(this.doc.find('author'));
|
||||
},
|
||||
getGlobalPreference: function (name) {
|
||||
return findElementAttributeValue(name, this.doc.findall('preference'));
|
||||
},
|
||||
setGlobalPreference: function (name, value) {
|
||||
var pref = this.doc.find('preference[@name="' + name + '"]');
|
||||
if (!pref) {
|
||||
pref = new et.Element('preference');
|
||||
pref.attrib.name = name;
|
||||
this.doc.getroot().append(pref);
|
||||
}
|
||||
pref.attrib.value = value;
|
||||
},
|
||||
getPlatformPreference: function (name, platform) {
|
||||
return findElementAttributeValue(name, this.doc.findall('./platform[@name="' + platform + '"]/preference'));
|
||||
},
|
||||
getPreference: function (name, platform) {
|
||||
|
||||
var platformPreference = '';
|
||||
|
||||
if (platform) {
|
||||
platformPreference = this.getPlatformPreference(name, platform);
|
||||
}
|
||||
|
||||
return platformPreference || this.getGlobalPreference(name);
|
||||
|
||||
},
|
||||
/**
|
||||
* Returns all resources for the platform specified.
|
||||
* @param {String} platform The platform.
|
||||
* @param {string} resourceName Type of static resources to return.
|
||||
* "icon" and "splash" currently supported.
|
||||
* @return {Array} Resources for the platform specified.
|
||||
*/
|
||||
getStaticResources: function (platform, resourceName) {
|
||||
var ret = [];
|
||||
var staticResources = [];
|
||||
if (platform) { // platform specific icons
|
||||
this.doc.findall('./platform[@name="' + platform + '"]/' + resourceName).forEach(function (elt) {
|
||||
elt.platform = platform; // mark as platform specific resource
|
||||
staticResources.push(elt);
|
||||
});
|
||||
}
|
||||
// root level resources
|
||||
staticResources = staticResources.concat(this.doc.findall(resourceName));
|
||||
// parse resource elements
|
||||
var that = this;
|
||||
staticResources.forEach(function (elt) {
|
||||
var res = {};
|
||||
res.src = elt.attrib.src;
|
||||
res.target = elt.attrib.target || undefined;
|
||||
res.density = elt.attrib['density'] || elt.attrib[that.cdvNamespacePrefix + ':density'] || elt.attrib['gap:density'];
|
||||
res.platform = elt.platform || null; // null means icon represents default icon (shared between platforms)
|
||||
res.width = +elt.attrib.width || undefined;
|
||||
res.height = +elt.attrib.height || undefined;
|
||||
|
||||
// default icon
|
||||
if (!res.width && !res.height && !res.density) {
|
||||
ret.defaultResource = res;
|
||||
}
|
||||
ret.push(res);
|
||||
});
|
||||
|
||||
/**
|
||||
* Returns resource with specified width and/or height.
|
||||
* @param {number} width Width of resource.
|
||||
* @param {number} height Height of resource.
|
||||
* @return {Resource} Resource object or null if not found.
|
||||
*/
|
||||
ret.getBySize = function (width, height) {
|
||||
return ret.filter(function (res) {
|
||||
if (!res.width && !res.height) {
|
||||
return false;
|
||||
}
|
||||
return ((!res.width || (width === res.width)) &&
|
||||
(!res.height || (height === res.height)));
|
||||
})[0] || null;
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns resource with specified density.
|
||||
* @param {string} density Density of resource.
|
||||
* @return {Resource} Resource object or null if not found.
|
||||
*/
|
||||
ret.getByDensity = function (density) {
|
||||
return ret.filter(function (res) {
|
||||
return res.density === density;
|
||||
})[0] || null;
|
||||
};
|
||||
|
||||
/** Returns default icons */
|
||||
ret.getDefault = function () {
|
||||
return ret.defaultResource;
|
||||
};
|
||||
|
||||
return ret;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns all icons for specific platform.
|
||||
* @param {string} platform Platform name
|
||||
* @return {Resource[]} Array of icon objects.
|
||||
*/
|
||||
getIcons: function (platform) {
|
||||
return this.getStaticResources(platform, 'icon');
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns all splash images for specific platform.
|
||||
* @param {string} platform Platform name
|
||||
* @return {Resource[]} Array of Splash objects.
|
||||
*/
|
||||
getSplashScreens: function (platform) {
|
||||
return this.getStaticResources(platform, 'splash');
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns all resource-files for a specific platform.
|
||||
* @param {string} platform Platform name
|
||||
* @param {boolean} includeGlobal Whether to return resource-files at the
|
||||
* root level.
|
||||
* @return {Resource[]} Array of resource file objects.
|
||||
*/
|
||||
getFileResources: function (platform, includeGlobal) {
|
||||
var fileResources = [];
|
||||
|
||||
if (platform) { // platform specific resources
|
||||
fileResources = this.doc.findall('./platform[@name="' + platform + '"]/resource-file').map(function (tag) {
|
||||
return {
|
||||
platform: platform,
|
||||
src: tag.attrib.src,
|
||||
target: tag.attrib.target,
|
||||
versions: tag.attrib.versions,
|
||||
deviceTarget: tag.attrib['device-target'],
|
||||
arch: tag.attrib.arch
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
if (includeGlobal) {
|
||||
this.doc.findall('resource-file').forEach(function (tag) {
|
||||
fileResources.push({
|
||||
platform: platform || null,
|
||||
src: tag.attrib.src,
|
||||
target: tag.attrib.target,
|
||||
versions: tag.attrib.versions,
|
||||
deviceTarget: tag.attrib['device-target'],
|
||||
arch: tag.attrib.arch
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
return fileResources;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns all hook scripts for the hook type specified.
|
||||
* @param {String} hook The hook type.
|
||||
* @param {Array} platforms Platforms to look for scripts into (root scripts will be included as well).
|
||||
* @return {Array} Script elements.
|
||||
*/
|
||||
getHookScripts: function (hook, platforms) {
|
||||
var self = this;
|
||||
var scriptElements = self.doc.findall('./hook');
|
||||
|
||||
if (platforms) {
|
||||
platforms.forEach(function (platform) {
|
||||
scriptElements = scriptElements.concat(self.doc.findall('./platform[@name="' + platform + '"]/hook'));
|
||||
});
|
||||
}
|
||||
|
||||
function filterScriptByHookType (el) {
|
||||
return el.attrib.src && el.attrib.type && el.attrib.type.toLowerCase() === hook;
|
||||
}
|
||||
|
||||
return scriptElements.filter(filterScriptByHookType);
|
||||
},
|
||||
/**
|
||||
* Returns a list of plugin (IDs).
|
||||
*
|
||||
* This function also returns any plugin's that
|
||||
* were defined using the legacy <feature> tags.
|
||||
* @return {string[]} Array of plugin IDs
|
||||
*/
|
||||
getPluginIdList: function () {
|
||||
var plugins = this.doc.findall('plugin');
|
||||
var result = plugins.map(function (plugin) {
|
||||
return plugin.attrib.name;
|
||||
});
|
||||
var features = this.doc.findall('feature');
|
||||
features.forEach(function (element) {
|
||||
var idTag = element.find('./param[@name="id"]');
|
||||
if (idTag) {
|
||||
result.push(idTag.attrib.value);
|
||||
}
|
||||
});
|
||||
return result;
|
||||
},
|
||||
getPlugins: function () {
|
||||
return this.getPluginIdList().map(function (pluginId) {
|
||||
return this.getPlugin(pluginId);
|
||||
}, this);
|
||||
},
|
||||
/**
|
||||
* Adds a plugin element. Does not check for duplicates.
|
||||
* @name addPlugin
|
||||
* @function
|
||||
* @param {object} attributes name and spec are supported
|
||||
* @param {Array|object} variables name, value or arbitary object
|
||||
*/
|
||||
addPlugin: function (attributes, variables) {
|
||||
if (!attributes && !attributes.name) return;
|
||||
var el = new et.Element('plugin');
|
||||
el.attrib.name = attributes.name;
|
||||
if (attributes.spec) {
|
||||
el.attrib.spec = attributes.spec;
|
||||
}
|
||||
|
||||
// support arbitrary object as variables source
|
||||
if (variables && typeof variables === 'object' && !Array.isArray(variables)) {
|
||||
variables = Object.keys(variables)
|
||||
.map(function (variableName) {
|
||||
return {name: variableName, value: variables[variableName]};
|
||||
});
|
||||
}
|
||||
|
||||
if (variables) {
|
||||
variables.forEach(function (variable) {
|
||||
el.append(new et.Element('variable', { name: variable.name, value: variable.value }));
|
||||
});
|
||||
}
|
||||
this.doc.getroot().append(el);
|
||||
},
|
||||
/**
|
||||
* Retrives the plugin with the given id or null if not found.
|
||||
*
|
||||
* This function also returns any plugin's that
|
||||
* were defined using the legacy <feature> tags.
|
||||
* @name getPlugin
|
||||
* @function
|
||||
* @param {String} id
|
||||
* @returns {object} plugin including any variables
|
||||
*/
|
||||
getPlugin: function (id) {
|
||||
if (!id) {
|
||||
return undefined;
|
||||
}
|
||||
var pluginElement = this.doc.find('./plugin/[@name="' + id + '"]');
|
||||
if (pluginElement === null) {
|
||||
var legacyFeature = this.doc.find('./feature/param[@name="id"][@value="' + id + '"]/..');
|
||||
if (legacyFeature) {
|
||||
events.emit('log', 'Found deprecated feature entry for ' + id + ' in config.xml.');
|
||||
return featureToPlugin(legacyFeature);
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
var plugin = {};
|
||||
|
||||
plugin.name = pluginElement.attrib.name;
|
||||
plugin.spec = pluginElement.attrib.spec || pluginElement.attrib.src || pluginElement.attrib.version;
|
||||
plugin.variables = {};
|
||||
var variableElements = pluginElement.findall('variable');
|
||||
variableElements.forEach(function (varElement) {
|
||||
var name = varElement.attrib.name;
|
||||
var value = varElement.attrib.value;
|
||||
if (name) {
|
||||
plugin.variables[name] = value;
|
||||
}
|
||||
});
|
||||
return plugin;
|
||||
},
|
||||
/**
|
||||
* Remove the plugin entry with give name (id).
|
||||
*
|
||||
* This function also operates on any plugin's that
|
||||
* were defined using the legacy <feature> tags.
|
||||
* @name removePlugin
|
||||
* @function
|
||||
* @param id name of the plugin
|
||||
*/
|
||||
removePlugin: function (id) {
|
||||
if (!id) return;
|
||||
const root = this.doc.getroot();
|
||||
removeChildren(root, `./plugin/[@name="${id}"]`);
|
||||
removeChildren(root, `./feature/param[@name="id"][@value="${id}"]/..`);
|
||||
},
|
||||
|
||||
// Add any element to the root
|
||||
addElement: function (name, attributes) {
|
||||
var el = et.Element(name);
|
||||
for (var a in attributes) {
|
||||
el.attrib[a] = attributes[a];
|
||||
}
|
||||
this.doc.getroot().append(el);
|
||||
},
|
||||
|
||||
/**
|
||||
* Adds an engine. Does not check for duplicates.
|
||||
* @param {String} name the engine name
|
||||
* @param {String} spec engine source location or version (optional)
|
||||
*/
|
||||
addEngine: function (name, spec) {
|
||||
if (!name) return;
|
||||
var el = et.Element('engine');
|
||||
el.attrib.name = name;
|
||||
if (spec) {
|
||||
el.attrib.spec = spec;
|
||||
}
|
||||
this.doc.getroot().append(el);
|
||||
},
|
||||
/**
|
||||
* Removes all the engines with given name
|
||||
* @param {String} name the engine name.
|
||||
*/
|
||||
removeEngine: function (name) {
|
||||
removeChildren(this.doc.getroot(), `./engine/[@name="${name}"]`);
|
||||
},
|
||||
getEngines: function () {
|
||||
var engines = this.doc.findall('./engine');
|
||||
return engines.map(function (engine) {
|
||||
var spec = engine.attrib.spec || engine.attrib.version;
|
||||
return {
|
||||
'name': engine.attrib.name,
|
||||
'spec': spec || null
|
||||
};
|
||||
});
|
||||
},
|
||||
/* Get all the access tags */
|
||||
getAccesses: function () {
|
||||
var accesses = this.doc.findall('./access');
|
||||
return accesses.map(function (access) {
|
||||
var minimum_tls_version = access.attrib['minimum-tls-version']; /* String */
|
||||
var requires_forward_secrecy = access.attrib['requires-forward-secrecy']; /* Boolean */
|
||||
var requires_certificate_transparency = access.attrib['requires-certificate-transparency']; /* Boolean */
|
||||
var allows_arbitrary_loads_in_web_content = access.attrib['allows-arbitrary-loads-in-web-content']; /* Boolean */
|
||||
var allows_arbitrary_loads_in_media = access.attrib['allows-arbitrary-loads-in-media']; /* Boolean (DEPRECATED) */
|
||||
var allows_arbitrary_loads_for_media = access.attrib['allows-arbitrary-loads-for-media']; /* Boolean */
|
||||
var allows_local_networking = access.attrib['allows-local-networking']; /* Boolean */
|
||||
|
||||
return {
|
||||
'origin': access.attrib.origin,
|
||||
'minimum_tls_version': minimum_tls_version,
|
||||
'requires_forward_secrecy': requires_forward_secrecy,
|
||||
'requires_certificate_transparency': requires_certificate_transparency,
|
||||
'allows_arbitrary_loads_in_web_content': allows_arbitrary_loads_in_web_content,
|
||||
'allows_arbitrary_loads_in_media': allows_arbitrary_loads_in_media,
|
||||
'allows_arbitrary_loads_for_media': allows_arbitrary_loads_for_media,
|
||||
'allows_local_networking': allows_local_networking
|
||||
};
|
||||
});
|
||||
},
|
||||
/* Get all the allow-navigation tags */
|
||||
getAllowNavigations: function () {
|
||||
var allow_navigations = this.doc.findall('./allow-navigation');
|
||||
return allow_navigations.map(function (allow_navigation) {
|
||||
var minimum_tls_version = allow_navigation.attrib['minimum-tls-version']; /* String */
|
||||
var requires_forward_secrecy = allow_navigation.attrib['requires-forward-secrecy']; /* Boolean */
|
||||
var requires_certificate_transparency = allow_navigation.attrib['requires-certificate-transparency']; /* Boolean */
|
||||
|
||||
return {
|
||||
'href': allow_navigation.attrib.href,
|
||||
'minimum_tls_version': minimum_tls_version,
|
||||
'requires_forward_secrecy': requires_forward_secrecy,
|
||||
'requires_certificate_transparency': requires_certificate_transparency
|
||||
};
|
||||
});
|
||||
},
|
||||
/* Get all the allow-intent tags */
|
||||
getAllowIntents: function () {
|
||||
var allow_intents = this.doc.findall('./allow-intent');
|
||||
return allow_intents.map(function (allow_intent) {
|
||||
return {
|
||||
'href': allow_intent.attrib.href
|
||||
};
|
||||
});
|
||||
},
|
||||
/* Get all edit-config tags */
|
||||
getEditConfigs: function (platform) {
|
||||
var platform_edit_configs = this.doc.findall('./platform[@name="' + platform + '"]/edit-config');
|
||||
var edit_configs = this.doc.findall('edit-config').concat(platform_edit_configs);
|
||||
|
||||
return edit_configs.map(function (tag) {
|
||||
var editConfig =
|
||||
{
|
||||
file: tag.attrib['file'],
|
||||
target: tag.attrib['target'],
|
||||
mode: tag.attrib['mode'],
|
||||
id: 'config.xml',
|
||||
xmls: tag.getchildren()
|
||||
};
|
||||
return editConfig;
|
||||
});
|
||||
},
|
||||
|
||||
/* Get all config-file tags */
|
||||
getConfigFiles: function (platform) {
|
||||
var platform_config_files = this.doc.findall('./platform[@name="' + platform + '"]/config-file');
|
||||
var config_files = this.doc.findall('config-file').concat(platform_config_files);
|
||||
|
||||
return config_files.map(function (tag) {
|
||||
var configFile =
|
||||
{
|
||||
target: tag.attrib['target'],
|
||||
parent: tag.attrib['parent'],
|
||||
after: tag.attrib['after'],
|
||||
xmls: tag.getchildren(),
|
||||
// To support demuxing via versions
|
||||
versions: tag.attrib['versions'],
|
||||
deviceTarget: tag.attrib['device-target']
|
||||
};
|
||||
return configFile;
|
||||
});
|
||||
},
|
||||
|
||||
write: function () {
|
||||
fs.writeFileSync(this.path, this.doc.write({indent: 4}), 'utf-8');
|
||||
}
|
||||
};
|
||||
|
||||
function featureToPlugin (featureElement) {
|
||||
var plugin = {};
|
||||
plugin.variables = [];
|
||||
var pluginVersion,
|
||||
pluginSrc;
|
||||
|
||||
var nodes = featureElement.findall('param');
|
||||
nodes.forEach(function (element) {
|
||||
var n = element.attrib.name;
|
||||
var v = element.attrib.value;
|
||||
if (n === 'id') {
|
||||
plugin.name = v;
|
||||
} else if (n === 'version') {
|
||||
pluginVersion = v;
|
||||
} else if (n === 'url' || n === 'installPath') {
|
||||
pluginSrc = v;
|
||||
} else {
|
||||
plugin.variables[n] = v;
|
||||
}
|
||||
});
|
||||
|
||||
var spec = pluginSrc || pluginVersion;
|
||||
if (spec) {
|
||||
plugin.spec = spec;
|
||||
}
|
||||
|
||||
return plugin;
|
||||
}
|
||||
module.exports = ConfigParser;
|
76
node_modules/cordova-common/src/CordovaCheck.js
generated
vendored
Normal file
76
node_modules/cordova-common/src/CordovaCheck.js
generated
vendored
Normal file
@ -0,0 +1,76 @@
|
||||
/**
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
|
||||
function isRootDir (dir) {
|
||||
if (fs.existsSync(path.join(dir, 'www'))) {
|
||||
if (fs.existsSync(path.join(dir, 'config.xml'))) {
|
||||
// For sure is.
|
||||
if (fs.existsSync(path.join(dir, 'platforms'))) {
|
||||
return 2;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
// Might be (or may be under platforms/).
|
||||
if (fs.existsSync(path.join(dir, 'www', 'config.xml'))) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Runs up the directory chain looking for a .cordova directory.
|
||||
// IF it is found we are in a Cordova project.
|
||||
// Omit argument to use CWD.
|
||||
function isCordova (dir) {
|
||||
if (!dir) {
|
||||
// Prefer PWD over cwd so that symlinked dirs within your PWD work correctly (CB-5687).
|
||||
var pwd = process.env.PWD;
|
||||
var cwd = process.cwd();
|
||||
if (pwd && pwd !== cwd && pwd !== 'undefined') {
|
||||
return isCordova(pwd) || isCordova(cwd);
|
||||
}
|
||||
return isCordova(cwd);
|
||||
}
|
||||
var bestReturnValueSoFar = false;
|
||||
for (var i = 0; i < 1000; ++i) {
|
||||
var result = isRootDir(dir);
|
||||
if (result === 2) {
|
||||
return dir;
|
||||
}
|
||||
if (result === 1) {
|
||||
bestReturnValueSoFar = dir;
|
||||
}
|
||||
var parentDir = path.normalize(path.join(dir, '..'));
|
||||
// Detect fs root.
|
||||
if (parentDir === dir) {
|
||||
return bestReturnValueSoFar;
|
||||
}
|
||||
dir = parentDir;
|
||||
}
|
||||
console.error('Hit an unhandled case in CordovaCheck.isCordova');
|
||||
return false;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
findProjectRoot: isCordova
|
||||
};
|
92
node_modules/cordova-common/src/CordovaError/CordovaError.js
generated
vendored
Normal file
92
node_modules/cordova-common/src/CordovaError/CordovaError.js
generated
vendored
Normal file
@ -0,0 +1,92 @@
|
||||
/**
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
/* eslint no-proto: 0 */
|
||||
|
||||
var EOL = require('os').EOL;
|
||||
|
||||
/**
|
||||
* A derived exception class. See usage example in cli.js
|
||||
* Based on:
|
||||
* stackoverflow.com/questions/1382107/whats-a-good-way-to-extend-error-in-javascript/8460753#8460753
|
||||
* @param {String} message Error message
|
||||
* @param {Number} [code=0] Error code
|
||||
* @param {CordovaExternalToolErrorContext} [context] External tool error context object
|
||||
* @constructor
|
||||
*/
|
||||
function CordovaError (message, code, context) {
|
||||
Error.captureStackTrace(this, this.constructor);
|
||||
this.name = this.constructor.name;
|
||||
this.message = message;
|
||||
this.code = code || CordovaError.UNKNOWN_ERROR;
|
||||
this.context = context;
|
||||
}
|
||||
CordovaError.prototype.__proto__ = Error.prototype;
|
||||
|
||||
// TODO: Extend error codes according the projects specifics
|
||||
CordovaError.UNKNOWN_ERROR = 0;
|
||||
CordovaError.EXTERNAL_TOOL_ERROR = 1;
|
||||
|
||||
/**
|
||||
* Translates instance's error code number into error code name, e.g. 0 -> UNKNOWN_ERROR
|
||||
* @returns {string} Error code string name
|
||||
*/
|
||||
CordovaError.prototype.getErrorCodeName = function () {
|
||||
for (var key in CordovaError) {
|
||||
if (CordovaError.hasOwnProperty(key)) {
|
||||
if (CordovaError[key] === this.code) {
|
||||
return key;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Converts CordovaError instance to string representation
|
||||
* @param {Boolean} [isVerbose] Set up verbose mode. Used to provide more
|
||||
* details including information about error code name and context
|
||||
* @return {String} Stringified error representation
|
||||
*/
|
||||
CordovaError.prototype.toString = function (isVerbose) {
|
||||
var message = '';
|
||||
var codePrefix = '';
|
||||
|
||||
if (this.code !== CordovaError.UNKNOWN_ERROR) {
|
||||
codePrefix = 'code: ' + this.code + (isVerbose ? (' (' + this.getErrorCodeName() + ')') : '') + ' ';
|
||||
}
|
||||
|
||||
if (this.code === CordovaError.EXTERNAL_TOOL_ERROR) {
|
||||
if (typeof this.context !== 'undefined') {
|
||||
if (isVerbose) {
|
||||
message = codePrefix + EOL + this.context.toString(isVerbose) + '\n failed with an error: ' +
|
||||
this.message + EOL + 'Stack trace: ' + this.stack;
|
||||
} else {
|
||||
message = codePrefix + '\'' + this.context.toString(isVerbose) + '\' ' + this.message;
|
||||
}
|
||||
} else {
|
||||
message = 'External tool failed with an error: ' + this.message;
|
||||
}
|
||||
} else {
|
||||
message = isVerbose ? codePrefix + this.stack : codePrefix + this.message;
|
||||
}
|
||||
|
||||
return message;
|
||||
};
|
||||
|
||||
module.exports = CordovaError;
|
48
node_modules/cordova-common/src/CordovaError/CordovaExternalToolErrorContext.js
generated
vendored
Normal file
48
node_modules/cordova-common/src/CordovaError/CordovaExternalToolErrorContext.js
generated
vendored
Normal file
@ -0,0 +1,48 @@
|
||||
/**
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
/* jshint proto:true */
|
||||
|
||||
var path = require('path');
|
||||
|
||||
/**
|
||||
* @param {String} cmd Command full path
|
||||
* @param {String[]} args Command args
|
||||
* @param {String} [cwd] Command working directory
|
||||
* @constructor
|
||||
*/
|
||||
function CordovaExternalToolErrorContext (cmd, args, cwd) {
|
||||
this.cmd = cmd;
|
||||
// Helper field for readability
|
||||
this.cmdShortName = path.basename(cmd);
|
||||
this.args = args;
|
||||
this.cwd = cwd;
|
||||
}
|
||||
|
||||
CordovaExternalToolErrorContext.prototype.toString = function (isVerbose) {
|
||||
if (isVerbose) {
|
||||
return 'External tool \'' + this.cmdShortName + '\'' +
|
||||
'\nCommand full path: ' + this.cmd + '\nCommand args: ' + this.args +
|
||||
(typeof this.cwd !== 'undefined' ? '\nCommand cwd: ' + this.cwd : '');
|
||||
}
|
||||
|
||||
return this.cmdShortName;
|
||||
};
|
||||
|
||||
module.exports = CordovaExternalToolErrorContext;
|
220
node_modules/cordova-common/src/CordovaLogger.js
generated
vendored
Normal file
220
node_modules/cordova-common/src/CordovaLogger.js
generated
vendored
Normal file
@ -0,0 +1,220 @@
|
||||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
var ansi = require('ansi');
|
||||
var EventEmitter = require('events').EventEmitter;
|
||||
var CordovaError = require('./CordovaError/CordovaError');
|
||||
var EOL = require('os').EOL;
|
||||
|
||||
var INSTANCE;
|
||||
|
||||
/**
|
||||
* @class CordovaLogger
|
||||
*
|
||||
* Implements logging facility that anybody could use. Should not be
|
||||
* instantiated directly, `CordovaLogger.get()` method should be used instead
|
||||
* to acquire logger instance
|
||||
*/
|
||||
function CordovaLogger () {
|
||||
this.levels = {};
|
||||
this.colors = {};
|
||||
this.stdout = process.stdout;
|
||||
this.stderr = process.stderr;
|
||||
|
||||
this.stdoutCursor = ansi(this.stdout);
|
||||
this.stderrCursor = ansi(this.stderr);
|
||||
|
||||
this.addLevel('verbose', 1000, 'grey');
|
||||
this.addLevel('normal', 2000);
|
||||
this.addLevel('warn', 2000, 'yellow');
|
||||
this.addLevel('info', 3000, 'blue');
|
||||
this.addLevel('error', 5000, 'red');
|
||||
this.addLevel('results', 10000);
|
||||
|
||||
this.setLevel('normal');
|
||||
}
|
||||
|
||||
/**
|
||||
* Static method to create new or acquire existing instance.
|
||||
*
|
||||
* @return {CordovaLogger} Logger instance
|
||||
*/
|
||||
CordovaLogger.get = function () {
|
||||
return INSTANCE || (INSTANCE = new CordovaLogger());
|
||||
};
|
||||
|
||||
CordovaLogger.VERBOSE = 'verbose';
|
||||
CordovaLogger.NORMAL = 'normal';
|
||||
CordovaLogger.WARN = 'warn';
|
||||
CordovaLogger.INFO = 'info';
|
||||
CordovaLogger.ERROR = 'error';
|
||||
CordovaLogger.RESULTS = 'results';
|
||||
|
||||
/**
|
||||
* Emits log message to process' stdout/stderr depending on message's severity
|
||||
* and current log level. If severity is less than current logger's level,
|
||||
* then the message is ignored.
|
||||
*
|
||||
* @param {String} logLevel The message's log level. The logger should have
|
||||
* corresponding level added (via logger.addLevel), otherwise
|
||||
* `CordovaLogger.NORMAL` level will be used.
|
||||
* @param {String} message The message, that should be logged to process'
|
||||
* stdio
|
||||
*
|
||||
* @return {CordovaLogger} Current instance, to allow calls chaining.
|
||||
*/
|
||||
CordovaLogger.prototype.log = function (logLevel, message) {
|
||||
// if there is no such logLevel defined, or provided level has
|
||||
// less severity than active level, then just ignore this call and return
|
||||
if (!this.levels[logLevel] || this.levels[logLevel] < this.levels[this.logLevel]) {
|
||||
// return instance to allow to chain calls
|
||||
return this;
|
||||
}
|
||||
|
||||
var isVerbose = this.logLevel === 'verbose';
|
||||
var cursor = this.stdoutCursor;
|
||||
|
||||
if (message instanceof Error || logLevel === CordovaLogger.ERROR) {
|
||||
message = formatError(message, isVerbose);
|
||||
cursor = this.stderrCursor;
|
||||
}
|
||||
|
||||
var color = this.colors[logLevel];
|
||||
if (color) {
|
||||
cursor.bold().fg[color]();
|
||||
}
|
||||
|
||||
cursor.write(message).reset().write(EOL);
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Adds a new level to logger instance. This method also creates a shortcut
|
||||
* method to log events with the level provided (i.e. after adding new level
|
||||
* 'debug', the method `debug(message)`, equal to logger.log('debug', message),
|
||||
* will be added to logger instance)
|
||||
*
|
||||
* @param {String} level A log level name. The levels with the following
|
||||
* names added by default to every instance: 'verbose', 'normal', 'warn',
|
||||
* 'info', 'error', 'results'
|
||||
* @param {Number} severity A number that represents level's severity.
|
||||
* @param {String} color A valid color name, that will be used to log
|
||||
* messages with this level. Any CSS color code or RGB value is allowed
|
||||
* (according to ansi documentation:
|
||||
* https://github.com/TooTallNate/ansi.js#features)
|
||||
*
|
||||
* @return {CordovaLogger} Current instance, to allow calls chaining.
|
||||
*/
|
||||
CordovaLogger.prototype.addLevel = function (level, severity, color) {
|
||||
|
||||
this.levels[level] = severity;
|
||||
|
||||
if (color) {
|
||||
this.colors[level] = color;
|
||||
}
|
||||
|
||||
// Define own method with corresponding name
|
||||
if (!this[level]) {
|
||||
this[level] = this.log.bind(this, level);
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Sets the current logger level to provided value. If logger doesn't have level
|
||||
* with this name, `CordovaLogger.NORMAL` will be used.
|
||||
*
|
||||
* @param {String} logLevel Level name. The level with this name should be
|
||||
* added to logger before.
|
||||
*
|
||||
* @return {CordovaLogger} Current instance, to allow calls chaining.
|
||||
*/
|
||||
CordovaLogger.prototype.setLevel = function (logLevel) {
|
||||
this.logLevel = this.levels[logLevel] ? logLevel : CordovaLogger.NORMAL;
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Adjusts the current logger level according to the passed options.
|
||||
*
|
||||
* @param {Object|Array} opts An object or args array with options
|
||||
*
|
||||
* @return {CordovaLogger} Current instance, to allow calls chaining.
|
||||
*/
|
||||
CordovaLogger.prototype.adjustLevel = function (opts) {
|
||||
if (opts.verbose || (Array.isArray(opts) && opts.indexOf('--verbose') !== -1)) {
|
||||
this.setLevel('verbose');
|
||||
} else if (opts.silent || (Array.isArray(opts) && opts.indexOf('--silent') !== -1)) {
|
||||
this.setLevel('error');
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Attaches logger to EventEmitter instance provided.
|
||||
*
|
||||
* @param {EventEmitter} eventEmitter An EventEmitter instance to attach
|
||||
* logger to.
|
||||
*
|
||||
* @return {CordovaLogger} Current instance, to allow calls chaining.
|
||||
*/
|
||||
CordovaLogger.prototype.subscribe = function (eventEmitter) {
|
||||
|
||||
if (!(eventEmitter instanceof EventEmitter)) { throw new Error('Subscribe method only accepts an EventEmitter instance as argument'); }
|
||||
|
||||
eventEmitter.on('verbose', this.verbose)
|
||||
.on('log', this.normal)
|
||||
.on('info', this.info)
|
||||
.on('warn', this.warn)
|
||||
.on('warning', this.warn)
|
||||
// Set up event handlers for logging and results emitted as events.
|
||||
.on('results', this.results);
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
function formatError (error, isVerbose) {
|
||||
var message = '';
|
||||
|
||||
if (error instanceof CordovaError) {
|
||||
message = error.toString(isVerbose);
|
||||
} else if (error instanceof Error) {
|
||||
if (isVerbose) {
|
||||
message = error.stack;
|
||||
} else {
|
||||
message = error.message;
|
||||
}
|
||||
} else {
|
||||
// Plain text error message
|
||||
message = error;
|
||||
}
|
||||
|
||||
if (typeof message === 'string' && message.toUpperCase().indexOf('ERROR:') !== 0) {
|
||||
// Needed for backward compatibility with external tools
|
||||
message = 'Error: ' + message;
|
||||
}
|
||||
|
||||
return message;
|
||||
}
|
||||
|
||||
module.exports = CordovaLogger;
|
415
node_modules/cordova-common/src/FileUpdater.js
generated
vendored
Normal file
415
node_modules/cordova-common/src/FileUpdater.js
generated
vendored
Normal file
@ -0,0 +1,415 @@
|
||||
/**
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var shell = require('shelljs');
|
||||
var minimatch = require('minimatch');
|
||||
|
||||
/**
|
||||
* Logging callback used in the FileUpdater methods.
|
||||
* @callback loggingCallback
|
||||
* @param {string} message A message describing a single file update operation.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Updates a target file or directory with a source file or directory. (Directory updates are
|
||||
* not recursive.) Stats for target and source items must be passed in. This is an internal
|
||||
* helper function used by other methods in this module.
|
||||
*
|
||||
* @param {?string} sourcePath Source file or directory to be used to update the
|
||||
* destination. If the source is null, then the destination is deleted if it exists.
|
||||
* @param {?fs.Stats} sourceStats An instance of fs.Stats for the source path, or null if
|
||||
* the source does not exist.
|
||||
* @param {string} targetPath Required destination file or directory to be updated. If it does
|
||||
* not exist, it will be created.
|
||||
* @param {?fs.Stats} targetStats An instance of fs.Stats for the target path, or null if
|
||||
* the target does not exist.
|
||||
* @param {Object} [options] Optional additional parameters for the update.
|
||||
* @param {string} [options.rootDir] Optional root directory (such as a project) to which target
|
||||
* and source path parameters are relative; may be omitted if the paths are absolute. The
|
||||
* rootDir is always omitted from any logged paths, to make the logs easier to read.
|
||||
* @param {boolean} [options.all] If true, all files are copied regardless of last-modified times.
|
||||
* Otherwise, a file is copied if the source's last-modified time is greather than or
|
||||
* equal to the target's last-modified time, or if the file sizes are different.
|
||||
* @param {loggingCallback} [log] Optional logging callback that takes a string message
|
||||
* describing any file operations that are performed.
|
||||
* @return {boolean} true if any changes were made, or false if the force flag is not set
|
||||
* and everything was up to date
|
||||
*/
|
||||
function updatePathWithStats (sourcePath, sourceStats, targetPath, targetStats, options, log) {
|
||||
var updated = false;
|
||||
|
||||
var rootDir = (options && options.rootDir) || '';
|
||||
var copyAll = (options && options.all) || false;
|
||||
|
||||
var targetFullPath = path.join(rootDir || '', targetPath);
|
||||
|
||||
if (sourceStats) {
|
||||
var sourceFullPath = path.join(rootDir || '', sourcePath);
|
||||
|
||||
if (targetStats) {
|
||||
// The target exists. But if the directory status doesn't match the source, delete it.
|
||||
if (targetStats.isDirectory() && !sourceStats.isDirectory()) {
|
||||
log('rmdir ' + targetPath + ' (source is a file)');
|
||||
shell.rm('-rf', targetFullPath);
|
||||
targetStats = null;
|
||||
updated = true;
|
||||
} else if (!targetStats.isDirectory() && sourceStats.isDirectory()) {
|
||||
log('delete ' + targetPath + ' (source is a directory)');
|
||||
shell.rm('-f', targetFullPath);
|
||||
targetStats = null;
|
||||
updated = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!targetStats) {
|
||||
if (sourceStats.isDirectory()) {
|
||||
// The target directory does not exist, so it should be created.
|
||||
log('mkdir ' + targetPath);
|
||||
shell.mkdir('-p', targetFullPath);
|
||||
updated = true;
|
||||
} else if (sourceStats.isFile()) {
|
||||
// The target file does not exist, so it should be copied from the source.
|
||||
log('copy ' + sourcePath + ' ' + targetPath + (copyAll ? '' : ' (new file)'));
|
||||
shell.cp('-f', sourceFullPath, targetFullPath);
|
||||
updated = true;
|
||||
}
|
||||
} else if (sourceStats.isFile() && targetStats.isFile()) {
|
||||
// The source and target paths both exist and are files.
|
||||
if (copyAll) {
|
||||
// The caller specified all files should be copied.
|
||||
log('copy ' + sourcePath + ' ' + targetPath);
|
||||
shell.cp('-f', sourceFullPath, targetFullPath);
|
||||
updated = true;
|
||||
} else {
|
||||
// Copy if the source has been modified since it was copied to the target, or if
|
||||
// the file sizes are different. (The latter catches most cases in which something
|
||||
// was done to the file after copying.) Comparison is >= rather than > to allow
|
||||
// for timestamps lacking sub-second precision in some filesystems.
|
||||
if (sourceStats.mtime.getTime() >= targetStats.mtime.getTime() ||
|
||||
sourceStats.size !== targetStats.size) {
|
||||
log('copy ' + sourcePath + ' ' + targetPath + ' (updated file)');
|
||||
shell.cp('-f', sourceFullPath, targetFullPath);
|
||||
updated = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (targetStats) {
|
||||
// The target exists but the source is null, so the target should be deleted.
|
||||
if (targetStats.isDirectory()) {
|
||||
log('rmdir ' + targetPath + (copyAll ? '' : ' (no source)'));
|
||||
shell.rm('-rf', targetFullPath);
|
||||
} else {
|
||||
log('delete ' + targetPath + (copyAll ? '' : ' (no source)'));
|
||||
shell.rm('-f', targetFullPath);
|
||||
}
|
||||
updated = true;
|
||||
}
|
||||
|
||||
return updated;
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper for updatePath and updatePaths functions. Queries stats for source and target
|
||||
* and ensures target directory exists before copying a file.
|
||||
*/
|
||||
function updatePathInternal (sourcePath, targetPath, options, log) {
|
||||
var rootDir = (options && options.rootDir) || '';
|
||||
var targetFullPath = path.join(rootDir, targetPath);
|
||||
var targetStats = fs.existsSync(targetFullPath) ? fs.statSync(targetFullPath) : null;
|
||||
var sourceStats = null;
|
||||
|
||||
if (sourcePath) {
|
||||
// A non-null source path was specified. It should exist.
|
||||
var sourceFullPath = path.join(rootDir, sourcePath);
|
||||
if (!fs.existsSync(sourceFullPath)) {
|
||||
throw new Error('Source path does not exist: ' + sourcePath);
|
||||
}
|
||||
|
||||
sourceStats = fs.statSync(sourceFullPath);
|
||||
|
||||
// Create the target's parent directory if it doesn't exist.
|
||||
var parentDir = path.dirname(targetFullPath);
|
||||
if (!fs.existsSync(parentDir)) {
|
||||
shell.mkdir('-p', parentDir);
|
||||
}
|
||||
}
|
||||
|
||||
return updatePathWithStats(sourcePath, sourceStats, targetPath, targetStats, options, log);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates a target file or directory with a source file or directory. (Directory updates are
|
||||
* not recursive.)
|
||||
*
|
||||
* @param {?string} sourcePath Source file or directory to be used to update the
|
||||
* destination. If the source is null, then the destination is deleted if it exists.
|
||||
* @param {string} targetPath Required destination file or directory to be updated. If it does
|
||||
* not exist, it will be created.
|
||||
* @param {Object} [options] Optional additional parameters for the update.
|
||||
* @param {string} [options.rootDir] Optional root directory (such as a project) to which target
|
||||
* and source path parameters are relative; may be omitted if the paths are absolute. The
|
||||
* rootDir is always omitted from any logged paths, to make the logs easier to read.
|
||||
* @param {boolean} [options.all] If true, all files are copied regardless of last-modified times.
|
||||
* Otherwise, a file is copied if the source's last-modified time is greather than or
|
||||
* equal to the target's last-modified time, or if the file sizes are different.
|
||||
* @param {loggingCallback} [log] Optional logging callback that takes a string message
|
||||
* describing any file operations that are performed.
|
||||
* @return {boolean} true if any changes were made, or false if the force flag is not set
|
||||
* and everything was up to date
|
||||
*/
|
||||
function updatePath (sourcePath, targetPath, options, log) {
|
||||
if (sourcePath !== null && typeof sourcePath !== 'string') {
|
||||
throw new Error('A source path (or null) is required.');
|
||||
}
|
||||
|
||||
if (!targetPath || typeof targetPath !== 'string') {
|
||||
throw new Error('A target path is required.');
|
||||
}
|
||||
|
||||
log = log || function () { };
|
||||
|
||||
return updatePathInternal(sourcePath, targetPath, options, log);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates files and directories based on a mapping from target paths to source paths. Targets
|
||||
* with null sources in the map are deleted.
|
||||
*
|
||||
* @param {Object} pathMap A dictionary mapping from target paths to source paths.
|
||||
* @param {Object} [options] Optional additional parameters for the update.
|
||||
* @param {string} [options.rootDir] Optional root directory (such as a project) to which target
|
||||
* and source path parameters are relative; may be omitted if the paths are absolute. The
|
||||
* rootDir is always omitted from any logged paths, to make the logs easier to read.
|
||||
* @param {boolean} [options.all] If true, all files are copied regardless of last-modified times.
|
||||
* Otherwise, a file is copied if the source's last-modified time is greather than or
|
||||
* equal to the target's last-modified time, or if the file sizes are different.
|
||||
* @param {loggingCallback} [log] Optional logging callback that takes a string message
|
||||
* describing any file operations that are performed.
|
||||
* @return {boolean} true if any changes were made, or false if the force flag is not set
|
||||
* and everything was up to date
|
||||
*/
|
||||
function updatePaths (pathMap, options, log) {
|
||||
if (!pathMap || typeof pathMap !== 'object' || Array.isArray(pathMap)) {
|
||||
throw new Error('An object mapping from target paths to source paths is required.');
|
||||
}
|
||||
|
||||
log = log || function () { };
|
||||
|
||||
var updated = false;
|
||||
|
||||
// Iterate in sorted order to ensure directories are created before files under them.
|
||||
Object.keys(pathMap).sort().forEach(function (targetPath) {
|
||||
var sourcePath = pathMap[targetPath];
|
||||
updated = updatePathInternal(sourcePath, targetPath, options, log) || updated;
|
||||
});
|
||||
|
||||
return updated;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates a target directory with merged files and subdirectories from source directories.
|
||||
*
|
||||
* @param {string|string[]} sourceDirs Required source directory or array of source directories
|
||||
* to be merged into the target. The directories are listed in order of precedence; files in
|
||||
* directories later in the array supersede files in directories earlier in the array
|
||||
* (regardless of timestamps).
|
||||
* @param {string} targetDir Required destination directory to be updated. If it does not exist,
|
||||
* it will be created. If it exists, newer files from source directories will be copied over,
|
||||
* and files missing in the source directories will be deleted.
|
||||
* @param {Object} [options] Optional additional parameters for the update.
|
||||
* @param {string} [options.rootDir] Optional root directory (such as a project) to which target
|
||||
* and source path parameters are relative; may be omitted if the paths are absolute. The
|
||||
* rootDir is always omitted from any logged paths, to make the logs easier to read.
|
||||
* @param {boolean} [options.all] If true, all files are copied regardless of last-modified times.
|
||||
* Otherwise, a file is copied if the source's last-modified time is greather than or
|
||||
* equal to the target's last-modified time, or if the file sizes are different.
|
||||
* @param {string|string[]} [options.include] Optional glob string or array of glob strings that
|
||||
* are tested against both target and source relative paths to determine if they are included
|
||||
* in the merge-and-update. If unspecified, all items are included.
|
||||
* @param {string|string[]} [options.exclude] Optional glob string or array of glob strings that
|
||||
* are tested against both target and source relative paths to determine if they are excluded
|
||||
* from the merge-and-update. Exclusions override inclusions. If unspecified, no items are
|
||||
* excluded.
|
||||
* @param {loggingCallback} [log] Optional logging callback that takes a string message
|
||||
* describing any file operations that are performed.
|
||||
* @return {boolean} true if any changes were made, or false if the force flag is not set
|
||||
* and everything was up to date
|
||||
*/
|
||||
function mergeAndUpdateDir (sourceDirs, targetDir, options, log) {
|
||||
if (sourceDirs && typeof sourceDirs === 'string') {
|
||||
sourceDirs = [ sourceDirs ];
|
||||
} else if (!Array.isArray(sourceDirs)) {
|
||||
throw new Error('A source directory path or array of paths is required.');
|
||||
}
|
||||
|
||||
if (!targetDir || typeof targetDir !== 'string') {
|
||||
throw new Error('A target directory path is required.');
|
||||
}
|
||||
|
||||
log = log || function () { };
|
||||
|
||||
var rootDir = (options && options.rootDir) || '';
|
||||
|
||||
var include = (options && options.include) || [ '**' ];
|
||||
if (typeof include === 'string') {
|
||||
include = [ include ];
|
||||
} else if (!Array.isArray(include)) {
|
||||
throw new Error('Include parameter must be a glob string or array of glob strings.');
|
||||
}
|
||||
|
||||
var exclude = (options && options.exclude) || [];
|
||||
if (typeof exclude === 'string') {
|
||||
exclude = [ exclude ];
|
||||
} else if (!Array.isArray(exclude)) {
|
||||
throw new Error('Exclude parameter must be a glob string or array of glob strings.');
|
||||
}
|
||||
|
||||
// Scan the files in each of the source directories.
|
||||
var sourceMaps = sourceDirs.map(function (sourceDir) {
|
||||
return path.join(rootDir, sourceDir);
|
||||
}).map(function (sourcePath) {
|
||||
if (!fs.existsSync(sourcePath)) {
|
||||
throw new Error('Source directory does not exist: ' + sourcePath);
|
||||
}
|
||||
return mapDirectory(rootDir, path.relative(rootDir, sourcePath), include, exclude);
|
||||
});
|
||||
|
||||
// Scan the files in the target directory, if it exists.
|
||||
var targetMap = {};
|
||||
var targetFullPath = path.join(rootDir, targetDir);
|
||||
if (fs.existsSync(targetFullPath)) {
|
||||
targetMap = mapDirectory(rootDir, targetDir, include, exclude);
|
||||
}
|
||||
|
||||
var pathMap = mergePathMaps(sourceMaps, targetMap, targetDir);
|
||||
|
||||
var updated = false;
|
||||
|
||||
// Iterate in sorted order to ensure directories are created before files under them.
|
||||
Object.keys(pathMap).sort().forEach(function (subPath) {
|
||||
var entry = pathMap[subPath];
|
||||
updated = updatePathWithStats(
|
||||
entry.sourcePath,
|
||||
entry.sourceStats,
|
||||
entry.targetPath,
|
||||
entry.targetStats,
|
||||
options,
|
||||
log) || updated;
|
||||
});
|
||||
|
||||
return updated;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a dictionary map of all files and directories under a path.
|
||||
*/
|
||||
function mapDirectory (rootDir, subDir, include, exclude) {
|
||||
var dirMap = { '': { subDir: subDir, stats: fs.statSync(path.join(rootDir, subDir)) } };
|
||||
mapSubdirectory(rootDir, subDir, '', include, exclude, dirMap);
|
||||
return dirMap;
|
||||
|
||||
function mapSubdirectory (rootDir, subDir, relativeDir, include, exclude, dirMap) {
|
||||
var itemMapped = false;
|
||||
var items = fs.readdirSync(path.join(rootDir, subDir, relativeDir));
|
||||
|
||||
items.forEach(function (item) {
|
||||
var relativePath = path.join(relativeDir, item);
|
||||
if (!matchGlobArray(relativePath, exclude)) {
|
||||
// Stats obtained here (required at least to know where to recurse in directories)
|
||||
// are saved for later, where the modified times may also be used. This minimizes
|
||||
// the number of file I/O operations performed.
|
||||
var fullPath = path.join(rootDir, subDir, relativePath);
|
||||
var stats = fs.statSync(fullPath);
|
||||
|
||||
if (stats.isDirectory()) {
|
||||
// Directories are included if either something under them is included or they
|
||||
// match an include glob.
|
||||
if (mapSubdirectory(rootDir, subDir, relativePath, include, exclude, dirMap) ||
|
||||
matchGlobArray(relativePath, include)) {
|
||||
dirMap[relativePath] = { subDir: subDir, stats: stats };
|
||||
itemMapped = true;
|
||||
}
|
||||
} else if (stats.isFile()) {
|
||||
// Files are included only if they match an include glob.
|
||||
if (matchGlobArray(relativePath, include)) {
|
||||
dirMap[relativePath] = { subDir: subDir, stats: stats };
|
||||
itemMapped = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
return itemMapped;
|
||||
}
|
||||
|
||||
function matchGlobArray (path, globs) {
|
||||
return globs.some(function (elem) {
|
||||
return minimatch(path, elem, {dot: true});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Merges together multiple source maps and a target map into a single mapping from
|
||||
* relative paths to objects with target and source paths and stats.
|
||||
*/
|
||||
function mergePathMaps (sourceMaps, targetMap, targetDir) {
|
||||
// Merge multiple source maps together, along with target path info.
|
||||
// Entries in later source maps override those in earlier source maps.
|
||||
// Target stats will be filled in below for targets that exist.
|
||||
var pathMap = {};
|
||||
sourceMaps.forEach(function (sourceMap) {
|
||||
Object.keys(sourceMap).forEach(function (sourceSubPath) {
|
||||
var sourceEntry = sourceMap[sourceSubPath];
|
||||
pathMap[sourceSubPath] = {
|
||||
targetPath: path.join(targetDir, sourceSubPath),
|
||||
targetStats: null,
|
||||
sourcePath: path.join(sourceEntry.subDir, sourceSubPath),
|
||||
sourceStats: sourceEntry.stats
|
||||
};
|
||||
});
|
||||
});
|
||||
|
||||
// Fill in target stats for targets that exist, and create entries
|
||||
// for targets that don't have any corresponding sources.
|
||||
Object.keys(targetMap).forEach(function (subPath) {
|
||||
var entry = pathMap[subPath];
|
||||
if (entry) {
|
||||
entry.targetStats = targetMap[subPath].stats;
|
||||
} else {
|
||||
pathMap[subPath] = {
|
||||
targetPath: path.join(targetDir, subPath),
|
||||
targetStats: targetMap[subPath].stats,
|
||||
sourcePath: null,
|
||||
sourceStats: null
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
return pathMap;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
updatePath: updatePath,
|
||||
updatePaths: updatePaths,
|
||||
mergeAndUpdateDir: mergeAndUpdateDir
|
||||
};
|
277
node_modules/cordova-common/src/PlatformJson.js
generated
vendored
Normal file
277
node_modules/cordova-common/src/PlatformJson.js
generated
vendored
Normal file
@ -0,0 +1,277 @@
|
||||
/*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var shelljs = require('shelljs');
|
||||
var mungeutil = require('./ConfigChanges/munge-util');
|
||||
var pluginMappernto = require('cordova-registry-mapper').newToOld;
|
||||
var pluginMapperotn = require('cordova-registry-mapper').oldToNew;
|
||||
|
||||
function PlatformJson (filePath, platform, root) {
|
||||
this.filePath = filePath;
|
||||
this.platform = platform;
|
||||
this.root = fix_munge(root || {});
|
||||
}
|
||||
|
||||
PlatformJson.load = function (plugins_dir, platform) {
|
||||
var filePath = path.join(plugins_dir, platform + '.json');
|
||||
var root = null;
|
||||
if (fs.existsSync(filePath)) {
|
||||
root = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
||||
}
|
||||
return new PlatformJson(filePath, platform, root);
|
||||
};
|
||||
|
||||
PlatformJson.prototype.save = function () {
|
||||
shelljs.mkdir('-p', path.dirname(this.filePath));
|
||||
fs.writeFileSync(this.filePath, JSON.stringify(this.root, null, 2), 'utf-8');
|
||||
};
|
||||
|
||||
/**
|
||||
* Indicates whether the specified plugin is installed as a top-level (not as
|
||||
* dependency to others)
|
||||
* @method function
|
||||
* @param {String} pluginId A plugin id to check for.
|
||||
* @return {Boolean} true if plugin installed as top-level, otherwise false.
|
||||
*/
|
||||
PlatformJson.prototype.isPluginTopLevel = function (pluginId) {
|
||||
var installedPlugins = this.root.installed_plugins;
|
||||
return installedPlugins[pluginId] ||
|
||||
installedPlugins[pluginMappernto[pluginId]] ||
|
||||
installedPlugins[pluginMapperotn[pluginId]];
|
||||
};
|
||||
|
||||
/**
|
||||
* Indicates whether the specified plugin is installed as a dependency to other
|
||||
* plugin.
|
||||
* @method function
|
||||
* @param {String} pluginId A plugin id to check for.
|
||||
* @return {Boolean} true if plugin installed as a dependency, otherwise false.
|
||||
*/
|
||||
PlatformJson.prototype.isPluginDependent = function (pluginId) {
|
||||
var dependentPlugins = this.root.dependent_plugins;
|
||||
return dependentPlugins[pluginId] ||
|
||||
dependentPlugins[pluginMappernto[pluginId]] ||
|
||||
dependentPlugins[pluginMapperotn[pluginId]];
|
||||
};
|
||||
|
||||
/**
|
||||
* Indicates whether plugin is installed either as top-level or as dependency.
|
||||
* @method function
|
||||
* @param {String} pluginId A plugin id to check for.
|
||||
* @return {Boolean} true if plugin installed, otherwise false.
|
||||
*/
|
||||
PlatformJson.prototype.isPluginInstalled = function (pluginId) {
|
||||
return this.isPluginTopLevel(pluginId) ||
|
||||
this.isPluginDependent(pluginId);
|
||||
};
|
||||
|
||||
PlatformJson.prototype.addPlugin = function (pluginId, variables, isTopLevel) {
|
||||
var pluginsList = isTopLevel ?
|
||||
this.root.installed_plugins :
|
||||
this.root.dependent_plugins;
|
||||
|
||||
pluginsList[pluginId] = variables;
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* @chaining
|
||||
* Generates and adds metadata for provided plugin into associated <platform>.json file
|
||||
*
|
||||
* @param {PluginInfo} pluginInfo A pluginInfo instance to add metadata from
|
||||
* @returns {this} Current PlatformJson instance to allow calls chaining
|
||||
*/
|
||||
PlatformJson.prototype.addPluginMetadata = function (pluginInfo) {
|
||||
|
||||
var installedModules = this.root.modules || [];
|
||||
|
||||
var installedPaths = installedModules.map(function (installedModule) {
|
||||
return installedModule.file;
|
||||
});
|
||||
|
||||
var modulesToInstall = pluginInfo.getJsModules(this.platform)
|
||||
.map(function (module) {
|
||||
return new ModuleMetadata(pluginInfo.id, module);
|
||||
})
|
||||
.filter(function (metadata) {
|
||||
// Filter out modules which are already added to metadata
|
||||
return installedPaths.indexOf(metadata.file) === -1;
|
||||
});
|
||||
|
||||
this.root.modules = installedModules.concat(modulesToInstall);
|
||||
|
||||
this.root.plugin_metadata = this.root.plugin_metadata || {};
|
||||
this.root.plugin_metadata[pluginInfo.id] = pluginInfo.version;
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
PlatformJson.prototype.removePlugin = function (pluginId, isTopLevel) {
|
||||
var pluginsList = isTopLevel ?
|
||||
this.root.installed_plugins :
|
||||
this.root.dependent_plugins;
|
||||
|
||||
delete pluginsList[pluginId];
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* @chaining
|
||||
* Removes metadata for provided plugin from associated file
|
||||
*
|
||||
* @param {PluginInfo} pluginInfo A PluginInfo instance to which modules' metadata
|
||||
* we need to remove
|
||||
*
|
||||
* @returns {this} Current PlatformJson instance to allow calls chaining
|
||||
*/
|
||||
PlatformJson.prototype.removePluginMetadata = function (pluginInfo) {
|
||||
var modulesToRemove = pluginInfo.getJsModules(this.platform)
|
||||
.map(function (jsModule) {
|
||||
return ['plugins', pluginInfo.id, jsModule.src].join('/');
|
||||
});
|
||||
|
||||
var installedModules = this.root.modules || [];
|
||||
this.root.modules = installedModules
|
||||
.filter(function (installedModule) {
|
||||
// Leave only those metadatas which 'file' is not in removed modules
|
||||
return (modulesToRemove.indexOf(installedModule.file) === -1);
|
||||
});
|
||||
|
||||
if (this.root.plugin_metadata) {
|
||||
delete this.root.plugin_metadata[pluginInfo.id];
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
PlatformJson.prototype.addInstalledPluginToPrepareQueue = function (pluginDirName, vars, is_top_level, force) {
|
||||
this.root.prepare_queue.installed.push({'plugin': pluginDirName, 'vars': vars, 'topLevel': is_top_level, 'force': force});
|
||||
};
|
||||
|
||||
PlatformJson.prototype.addUninstalledPluginToPrepareQueue = function (pluginId, is_top_level) {
|
||||
this.root.prepare_queue.uninstalled.push({'plugin': pluginId, 'id': pluginId, 'topLevel': is_top_level});
|
||||
};
|
||||
|
||||
/**
|
||||
* Moves plugin, specified by id to top-level plugins. If plugin is top-level
|
||||
* already, then does nothing.
|
||||
* @method function
|
||||
* @param {String} pluginId A plugin id to make top-level.
|
||||
* @return {PlatformJson} PlatformJson instance.
|
||||
*/
|
||||
PlatformJson.prototype.makeTopLevel = function (pluginId) {
|
||||
var plugin = this.root.dependent_plugins[pluginId];
|
||||
if (plugin) {
|
||||
delete this.root.dependent_plugins[pluginId];
|
||||
this.root.installed_plugins[pluginId] = plugin;
|
||||
}
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Generates a metadata for all installed plugins and js modules. The resultant
|
||||
* string is ready to be written to 'cordova_plugins.js'
|
||||
*
|
||||
* @returns {String} cordova_plugins.js contents
|
||||
*/
|
||||
PlatformJson.prototype.generateMetadata = function () {
|
||||
return [
|
||||
'cordova.define(\'cordova/plugin_list\', function(require, exports, module) {',
|
||||
'module.exports = ' + JSON.stringify(this.root.modules, null, 2) + ';',
|
||||
'module.exports.metadata = ',
|
||||
'// TOP OF METADATA',
|
||||
JSON.stringify(this.root.plugin_metadata, null, 2) + ';',
|
||||
'// BOTTOM OF METADATA',
|
||||
'});' // Close cordova.define.
|
||||
].join('\n');
|
||||
};
|
||||
|
||||
/**
|
||||
* @chaining
|
||||
* Generates and then saves metadata to specified file. Doesn't check if file exists.
|
||||
*
|
||||
* @param {String} destination File metadata will be written to
|
||||
* @return {PlatformJson} PlatformJson instance
|
||||
*/
|
||||
PlatformJson.prototype.generateAndSaveMetadata = function (destination) {
|
||||
var meta = this.generateMetadata();
|
||||
shelljs.mkdir('-p', path.dirname(destination));
|
||||
fs.writeFileSync(destination, meta, 'utf-8');
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
// convert a munge from the old format ([file][parent][xml] = count) to the current one
|
||||
function fix_munge (root) {
|
||||
root.prepare_queue = root.prepare_queue || {installed: [], uninstalled: []};
|
||||
root.config_munge = root.config_munge || {files: {}};
|
||||
root.installed_plugins = root.installed_plugins || {};
|
||||
root.dependent_plugins = root.dependent_plugins || {};
|
||||
|
||||
var munge = root.config_munge;
|
||||
if (!munge.files) {
|
||||
var new_munge = { files: {} };
|
||||
for (var file in munge) {
|
||||
for (var selector in munge[file]) {
|
||||
for (var xml_child in munge[file][selector]) {
|
||||
var val = parseInt(munge[file][selector][xml_child]);
|
||||
for (var i = 0; i < val; i++) {
|
||||
mungeutil.deep_add(new_munge, [file, selector, { xml: xml_child, count: val }]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
root.config_munge = new_munge;
|
||||
}
|
||||
|
||||
return root;
|
||||
}
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
* @class ModuleMetadata
|
||||
*
|
||||
* Creates a ModuleMetadata object that represents module entry in 'cordova_plugins.js'
|
||||
* file at run time
|
||||
*
|
||||
* @param {String} pluginId Plugin id where this module installed from
|
||||
* @param (JsModule|Object) jsModule A js-module entry from PluginInfo class to generate metadata for
|
||||
*/
|
||||
function ModuleMetadata (pluginId, jsModule) {
|
||||
|
||||
if (!pluginId) throw new TypeError('pluginId argument must be a valid plugin id');
|
||||
if (!jsModule.src && !jsModule.name) throw new TypeError('jsModule argument must contain src or/and name properties');
|
||||
|
||||
this.id = pluginId + '.' + (jsModule.name || jsModule.src.match(/([^\/]+)\.js/)[1]); /* eslint no-useless-escape: 0 */
|
||||
this.file = ['plugins', pluginId, jsModule.src].join('/');
|
||||
this.pluginId = pluginId;
|
||||
|
||||
if (jsModule.clobbers && jsModule.clobbers.length > 0) {
|
||||
this.clobbers = jsModule.clobbers.map(function (o) { return o.target; });
|
||||
}
|
||||
if (jsModule.merges && jsModule.merges.length > 0) {
|
||||
this.merges = jsModule.merges.map(function (o) { return o.target; });
|
||||
}
|
||||
if (jsModule.runs) {
|
||||
this.runs = true;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = PlatformJson;
|
439
node_modules/cordova-common/src/PluginInfo/PluginInfo.js
generated
vendored
Normal file
439
node_modules/cordova-common/src/PluginInfo/PluginInfo.js
generated
vendored
Normal file
@ -0,0 +1,439 @@
|
||||
/**
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
A class for holidng the information currently stored in plugin.xml
|
||||
It should also be able to answer questions like whether the plugin
|
||||
is compatible with a given engine version.
|
||||
|
||||
TODO (kamrik): refactor this to not use sync functions and return promises.
|
||||
*/
|
||||
|
||||
var path = require('path');
|
||||
var fs = require('fs');
|
||||
var xml_helpers = require('../util/xml-helpers');
|
||||
var CordovaError = require('../CordovaError/CordovaError');
|
||||
|
||||
function PluginInfo (dirname) {
|
||||
var self = this;
|
||||
|
||||
// METHODS
|
||||
// Defined inside the constructor to avoid the "this" binding problems.
|
||||
|
||||
// <preference> tag
|
||||
// Example: <preference name="API_KEY" />
|
||||
// Used to require a variable to be specified via --variable when installing the plugin.
|
||||
// returns { key : default | null}
|
||||
self.getPreferences = getPreferences;
|
||||
function getPreferences (platform) {
|
||||
return _getTags(self._et, 'preference', platform, _parsePreference)
|
||||
.reduce(function (preferences, pref) {
|
||||
preferences[pref.preference] = pref.default;
|
||||
return preferences;
|
||||
}, {});
|
||||
}
|
||||
|
||||
function _parsePreference (prefTag) {
|
||||
var name = prefTag.attrib.name.toUpperCase();
|
||||
var def = prefTag.attrib.default || null;
|
||||
return {preference: name, default: def};
|
||||
}
|
||||
|
||||
// <asset>
|
||||
self.getAssets = getAssets;
|
||||
function getAssets (platform) {
|
||||
var assets = _getTags(self._et, 'asset', platform, _parseAsset);
|
||||
return assets;
|
||||
}
|
||||
|
||||
function _parseAsset (tag) {
|
||||
var src = tag.attrib.src;
|
||||
var target = tag.attrib.target;
|
||||
|
||||
if (!src || !target) {
|
||||
var msg =
|
||||
'Malformed <asset> tag. Both "src" and "target" attributes'
|
||||
+ 'must be specified in\n'
|
||||
+ self.filepath
|
||||
;
|
||||
throw new Error(msg);
|
||||
}
|
||||
|
||||
var asset = {
|
||||
itemType: 'asset',
|
||||
src: src,
|
||||
target: target
|
||||
};
|
||||
return asset;
|
||||
}
|
||||
|
||||
// <dependency>
|
||||
// Example:
|
||||
// <dependency id="com.plugin.id"
|
||||
// url="https://github.com/myuser/someplugin"
|
||||
// commit="428931ada3891801"
|
||||
// subdir="some/path/here" />
|
||||
self.getDependencies = getDependencies;
|
||||
function getDependencies (platform) {
|
||||
var deps = _getTags(
|
||||
self._et,
|
||||
'dependency',
|
||||
platform,
|
||||
_parseDependency
|
||||
);
|
||||
return deps;
|
||||
}
|
||||
|
||||
function _parseDependency (tag) {
|
||||
var dep =
|
||||
{ id: tag.attrib.id,
|
||||
version: tag.attrib.version || '',
|
||||
url: tag.attrib.url || '',
|
||||
subdir: tag.attrib.subdir || '',
|
||||
commit: tag.attrib.commit
|
||||
};
|
||||
|
||||
dep.git_ref = dep.commit;
|
||||
|
||||
if (!dep.id) {
|
||||
var msg =
|
||||
'<dependency> tag is missing id attribute in '
|
||||
+ self.filepath
|
||||
;
|
||||
throw new CordovaError(msg);
|
||||
}
|
||||
return dep;
|
||||
}
|
||||
|
||||
// <config-file> tag
|
||||
self.getConfigFiles = getConfigFiles;
|
||||
function getConfigFiles (platform) {
|
||||
var configFiles = _getTags(self._et, 'config-file', platform, _parseConfigFile);
|
||||
return configFiles;
|
||||
}
|
||||
|
||||
function _parseConfigFile (tag) {
|
||||
var configFile =
|
||||
{ target: tag.attrib['target'],
|
||||
parent: tag.attrib['parent'],
|
||||
after: tag.attrib['after'],
|
||||
xmls: tag.getchildren(),
|
||||
// To support demuxing via versions
|
||||
versions: tag.attrib['versions'],
|
||||
deviceTarget: tag.attrib['device-target']
|
||||
};
|
||||
return configFile;
|
||||
}
|
||||
|
||||
self.getEditConfigs = getEditConfigs;
|
||||
function getEditConfigs (platform) {
|
||||
var editConfigs = _getTags(self._et, 'edit-config', platform, _parseEditConfigs);
|
||||
return editConfigs;
|
||||
}
|
||||
|
||||
function _parseEditConfigs (tag) {
|
||||
var editConfig =
|
||||
{ file: tag.attrib['file'],
|
||||
target: tag.attrib['target'],
|
||||
mode: tag.attrib['mode'],
|
||||
xmls: tag.getchildren()
|
||||
};
|
||||
return editConfig;
|
||||
}
|
||||
|
||||
// <info> tags, both global and within a <platform>
|
||||
// TODO (kamrik): Do we ever use <info> under <platform>? Example wanted.
|
||||
self.getInfo = getInfo;
|
||||
function getInfo (platform) {
|
||||
var infos = _getTags(
|
||||
self._et,
|
||||
'info',
|
||||
platform,
|
||||
function (elem) { return elem.text; }
|
||||
);
|
||||
// Filter out any undefined or empty strings.
|
||||
infos = infos.filter(Boolean);
|
||||
return infos;
|
||||
}
|
||||
|
||||
// <source-file>
|
||||
// Examples:
|
||||
// <source-file src="src/ios/someLib.a" framework="true" />
|
||||
// <source-file src="src/ios/someLib.a" compiler-flags="-fno-objc-arc" />
|
||||
self.getSourceFiles = getSourceFiles;
|
||||
function getSourceFiles (platform) {
|
||||
var sourceFiles = _getTagsInPlatform(self._et, 'source-file', platform, _parseSourceFile);
|
||||
return sourceFiles;
|
||||
}
|
||||
|
||||
function _parseSourceFile (tag) {
|
||||
return {
|
||||
itemType: 'source-file',
|
||||
src: tag.attrib.src,
|
||||
framework: isStrTrue(tag.attrib.framework),
|
||||
weak: isStrTrue(tag.attrib.weak),
|
||||
compilerFlags: tag.attrib['compiler-flags'],
|
||||
targetDir: tag.attrib['target-dir']
|
||||
};
|
||||
}
|
||||
|
||||
// <header-file>
|
||||
// Example:
|
||||
// <header-file src="CDVFoo.h" />
|
||||
self.getHeaderFiles = getHeaderFiles;
|
||||
function getHeaderFiles (platform) {
|
||||
var headerFiles = _getTagsInPlatform(self._et, 'header-file', platform, function (tag) {
|
||||
return {
|
||||
itemType: 'header-file',
|
||||
src: tag.attrib.src,
|
||||
targetDir: tag.attrib['target-dir']
|
||||
};
|
||||
});
|
||||
return headerFiles;
|
||||
}
|
||||
|
||||
// <resource-file>
|
||||
// Example:
|
||||
// <resource-file src="FooPluginStrings.xml" target="res/values/FooPluginStrings.xml" device-target="win" arch="x86" versions=">=8.1" />
|
||||
self.getResourceFiles = getResourceFiles;
|
||||
function getResourceFiles (platform) {
|
||||
var resourceFiles = _getTagsInPlatform(self._et, 'resource-file', platform, function (tag) {
|
||||
return {
|
||||
itemType: 'resource-file',
|
||||
src: tag.attrib.src,
|
||||
target: tag.attrib.target,
|
||||
versions: tag.attrib.versions,
|
||||
deviceTarget: tag.attrib['device-target'],
|
||||
arch: tag.attrib.arch,
|
||||
reference: tag.attrib.reference
|
||||
};
|
||||
});
|
||||
return resourceFiles;
|
||||
}
|
||||
|
||||
// <lib-file>
|
||||
// Example:
|
||||
// <lib-file src="src/BlackBerry10/native/device/libfoo.so" arch="device" />
|
||||
self.getLibFiles = getLibFiles;
|
||||
function getLibFiles (platform) {
|
||||
var libFiles = _getTagsInPlatform(self._et, 'lib-file', platform, function (tag) {
|
||||
return {
|
||||
itemType: 'lib-file',
|
||||
src: tag.attrib.src,
|
||||
arch: tag.attrib.arch,
|
||||
Include: tag.attrib.Include,
|
||||
versions: tag.attrib.versions,
|
||||
deviceTarget: tag.attrib['device-target'] || tag.attrib.target
|
||||
};
|
||||
});
|
||||
return libFiles;
|
||||
}
|
||||
|
||||
// <hook>
|
||||
// Example:
|
||||
// <hook type="before_build" src="scripts/beforeBuild.js" />
|
||||
self.getHookScripts = getHookScripts;
|
||||
function getHookScripts (hook, platforms) {
|
||||
var scriptElements = self._et.findall('./hook');
|
||||
|
||||
if (platforms) {
|
||||
platforms.forEach(function (platform) {
|
||||
scriptElements = scriptElements.concat(self._et.findall('./platform[@name="' + platform + '"]/hook'));
|
||||
});
|
||||
}
|
||||
|
||||
function filterScriptByHookType (el) {
|
||||
return el.attrib.src && el.attrib.type && el.attrib.type.toLowerCase() === hook;
|
||||
}
|
||||
|
||||
return scriptElements.filter(filterScriptByHookType);
|
||||
}
|
||||
|
||||
self.getJsModules = getJsModules;
|
||||
function getJsModules (platform) {
|
||||
var modules = _getTags(self._et, 'js-module', platform, _parseJsModule);
|
||||
return modules;
|
||||
}
|
||||
|
||||
function _parseJsModule (tag) {
|
||||
var ret = {
|
||||
itemType: 'js-module',
|
||||
name: tag.attrib.name,
|
||||
src: tag.attrib.src,
|
||||
clobbers: tag.findall('clobbers').map(function (tag) { return { target: tag.attrib.target }; }),
|
||||
merges: tag.findall('merges').map(function (tag) { return { target: tag.attrib.target }; }),
|
||||
runs: tag.findall('runs').length > 0
|
||||
};
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
self.getEngines = function () {
|
||||
return self._et.findall('engines/engine').map(function (n) {
|
||||
return {
|
||||
name: n.attrib.name,
|
||||
version: n.attrib.version,
|
||||
platform: n.attrib.platform,
|
||||
scriptSrc: n.attrib.scriptSrc
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
self.getPlatforms = function () {
|
||||
return self._et.findall('platform').map(function (n) {
|
||||
return { name: n.attrib.name };
|
||||
});
|
||||
};
|
||||
|
||||
self.getPlatformsArray = function () {
|
||||
return self._et.findall('platform').map(function (n) {
|
||||
return n.attrib.name;
|
||||
});
|
||||
};
|
||||
|
||||
self.getFrameworks = function (platform, options) {
|
||||
return _getTags(self._et, 'framework', platform, function (el) {
|
||||
var src = el.attrib.src;
|
||||
if (options) {
|
||||
var vars = options.cli_variables || {};
|
||||
|
||||
if (Object.keys(vars).length === 0) {
|
||||
// get variable defaults from plugin.xml for removal
|
||||
vars = self.getPreferences(platform);
|
||||
}
|
||||
var regExp;
|
||||
// Iterate over plugin variables.
|
||||
// Replace them in framework src if they exist
|
||||
Object.keys(vars).forEach(function (name) {
|
||||
if (vars[name]) {
|
||||
regExp = new RegExp('\\$' + name, 'g');
|
||||
src = src.replace(regExp, vars[name]);
|
||||
}
|
||||
});
|
||||
}
|
||||
var ret = {
|
||||
itemType: 'framework',
|
||||
type: el.attrib.type,
|
||||
parent: el.attrib.parent,
|
||||
custom: isStrTrue(el.attrib.custom),
|
||||
embed: isStrTrue(el.attrib.embed),
|
||||
src: src,
|
||||
spec: el.attrib.spec,
|
||||
weak: isStrTrue(el.attrib.weak),
|
||||
versions: el.attrib.versions,
|
||||
targetDir: el.attrib['target-dir'],
|
||||
deviceTarget: el.attrib['device-target'] || el.attrib.target,
|
||||
arch: el.attrib.arch,
|
||||
implementation: el.attrib.implementation
|
||||
};
|
||||
return ret;
|
||||
});
|
||||
};
|
||||
|
||||
self.getFilesAndFrameworks = getFilesAndFrameworks;
|
||||
function getFilesAndFrameworks (platform, options) {
|
||||
// Please avoid changing the order of the calls below, files will be
|
||||
// installed in this order.
|
||||
var items = [].concat(
|
||||
self.getSourceFiles(platform),
|
||||
self.getHeaderFiles(platform),
|
||||
self.getResourceFiles(platform),
|
||||
self.getFrameworks(platform, options),
|
||||
self.getLibFiles(platform)
|
||||
);
|
||||
return items;
|
||||
}
|
||||
/// // End of PluginInfo methods /////
|
||||
|
||||
/// // PluginInfo Constructor logic /////
|
||||
self.filepath = path.join(dirname, 'plugin.xml');
|
||||
if (!fs.existsSync(self.filepath)) {
|
||||
throw new CordovaError('Cannot find plugin.xml for plugin "' + path.basename(dirname) + '". Please try adding it again.');
|
||||
}
|
||||
|
||||
self.dir = dirname;
|
||||
var et = self._et = xml_helpers.parseElementtreeSync(self.filepath);
|
||||
var pelem = et.getroot();
|
||||
self.id = pelem.attrib.id;
|
||||
self.version = pelem.attrib.version;
|
||||
|
||||
// Optional fields
|
||||
self.name = pelem.findtext('name');
|
||||
self.description = pelem.findtext('description');
|
||||
self.license = pelem.findtext('license');
|
||||
self.repo = pelem.findtext('repo');
|
||||
self.issue = pelem.findtext('issue');
|
||||
self.keywords = pelem.findtext('keywords');
|
||||
self.info = pelem.findtext('info');
|
||||
if (self.keywords) {
|
||||
self.keywords = self.keywords.split(',').map(function (s) { return s.trim(); });
|
||||
}
|
||||
self.getKeywordsAndPlatforms = function () {
|
||||
var ret = self.keywords || [];
|
||||
return ret.concat('ecosystem:cordova').concat(addCordova(self.getPlatformsArray()));
|
||||
};
|
||||
} // End of PluginInfo constructor.
|
||||
|
||||
// Helper function used to prefix every element of an array with cordova-
|
||||
// Useful when we want to modify platforms to be cordova-platform
|
||||
function addCordova (someArray) {
|
||||
var newArray = someArray.map(function (element) {
|
||||
return 'cordova-' + element;
|
||||
});
|
||||
return newArray;
|
||||
}
|
||||
|
||||
// Helper function used by most of the getSomething methods of PluginInfo.
|
||||
// Get all elements of a given name. Both in root and in platform sections
|
||||
// for the given platform. If transform is given and is a function, it is
|
||||
// applied to each element.
|
||||
function _getTags (pelem, tag, platform, transform) {
|
||||
var platformTag = pelem.find('./platform[@name="' + platform + '"]');
|
||||
var tagsInRoot = pelem.findall(tag);
|
||||
tagsInRoot = tagsInRoot || [];
|
||||
var tagsInPlatform = platformTag ? platformTag.findall(tag) : [];
|
||||
var tags = tagsInRoot.concat(tagsInPlatform);
|
||||
if (typeof transform === 'function') {
|
||||
tags = tags.map(transform);
|
||||
}
|
||||
return tags;
|
||||
}
|
||||
|
||||
// Same as _getTags() but only looks inside a platform section.
|
||||
function _getTagsInPlatform (pelem, tag, platform, transform) {
|
||||
var platformTag = pelem.find('./platform[@name="' + platform + '"]');
|
||||
var tags = platformTag ? platformTag.findall(tag) : [];
|
||||
if (typeof transform === 'function') {
|
||||
tags = tags.map(transform);
|
||||
}
|
||||
return tags;
|
||||
}
|
||||
|
||||
// Check if x is a string 'true'.
|
||||
function isStrTrue (x) {
|
||||
return String(x).toLowerCase() === 'true';
|
||||
}
|
||||
|
||||
module.exports = PluginInfo;
|
||||
// Backwards compat:
|
||||
PluginInfo.PluginInfo = PluginInfo;
|
||||
PluginInfo.loadPluginsDir = function (dir) {
|
||||
var PluginInfoProvider = require('./PluginInfoProvider');
|
||||
return new PluginInfoProvider().getAllWithinSearchPath(dir);
|
||||
};
|
82
node_modules/cordova-common/src/PluginInfo/PluginInfoProvider.js
generated
vendored
Normal file
82
node_modules/cordova-common/src/PluginInfo/PluginInfoProvider.js
generated
vendored
Normal file
@ -0,0 +1,82 @@
|
||||
/**
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
/* jshint sub:true, laxcomma:true, laxbreak:true */
|
||||
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var PluginInfo = require('./PluginInfo');
|
||||
var events = require('../events');
|
||||
|
||||
function PluginInfoProvider () {
|
||||
this._cache = {};
|
||||
this._getAllCache = {};
|
||||
}
|
||||
|
||||
PluginInfoProvider.prototype.get = function (dirName) {
|
||||
var absPath = path.resolve(dirName);
|
||||
if (!this._cache[absPath]) {
|
||||
this._cache[absPath] = new PluginInfo(dirName);
|
||||
}
|
||||
return this._cache[absPath];
|
||||
};
|
||||
|
||||
// Normally you don't need to put() entries, but it's used
|
||||
// when copying plugins, and in unit tests.
|
||||
PluginInfoProvider.prototype.put = function (pluginInfo) {
|
||||
var absPath = path.resolve(pluginInfo.dir);
|
||||
this._cache[absPath] = pluginInfo;
|
||||
};
|
||||
|
||||
// Used for plugin search path processing.
|
||||
// Given a dir containing multiple plugins, create a PluginInfo object for
|
||||
// each of them and return as array.
|
||||
// Should load them all in parallel and return a promise, but not yet.
|
||||
PluginInfoProvider.prototype.getAllWithinSearchPath = function (dirName) {
|
||||
var absPath = path.resolve(dirName);
|
||||
if (!this._getAllCache[absPath]) {
|
||||
this._getAllCache[absPath] = getAllHelper(absPath, this);
|
||||
}
|
||||
return this._getAllCache[absPath];
|
||||
};
|
||||
|
||||
function getAllHelper (absPath, provider) {
|
||||
if (!fs.existsSync(absPath)) {
|
||||
return [];
|
||||
}
|
||||
// If dir itself is a plugin, return it in an array with one element.
|
||||
if (fs.existsSync(path.join(absPath, 'plugin.xml'))) {
|
||||
return [provider.get(absPath)];
|
||||
}
|
||||
var subdirs = fs.readdirSync(absPath);
|
||||
var plugins = [];
|
||||
subdirs.forEach(function (subdir) {
|
||||
var d = path.join(absPath, subdir);
|
||||
if (fs.existsSync(path.join(d, 'plugin.xml'))) {
|
||||
try {
|
||||
plugins.push(provider.get(d));
|
||||
} catch (e) {
|
||||
events.emit('warn', 'Error parsing ' + path.join(d, 'plugin.xml.\n' + e.stack));
|
||||
}
|
||||
}
|
||||
});
|
||||
return plugins;
|
||||
}
|
||||
|
||||
module.exports = PluginInfoProvider;
|
149
node_modules/cordova-common/src/PluginManager.js
generated
vendored
Normal file
149
node_modules/cordova-common/src/PluginManager.js
generated
vendored
Normal file
@ -0,0 +1,149 @@
|
||||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
var Q = require('q');
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
|
||||
var ActionStack = require('./ActionStack');
|
||||
var PlatformJson = require('./PlatformJson');
|
||||
var CordovaError = require('./CordovaError/CordovaError');
|
||||
var PlatformMunger = require('./ConfigChanges/ConfigChanges').PlatformMunger;
|
||||
var PluginInfoProvider = require('./PluginInfo/PluginInfoProvider');
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
* @class PluginManager
|
||||
* Represents an entity for adding/removing plugins for platforms
|
||||
*
|
||||
* @param {String} platform Platform name
|
||||
* @param {Object} locations - Platform files and directories
|
||||
* @param {IDEProject} ideProject The IDE project to add/remove plugin changes to/from
|
||||
*/
|
||||
function PluginManager (platform, locations, ideProject) {
|
||||
this.platform = platform;
|
||||
this.locations = locations;
|
||||
this.project = ideProject;
|
||||
|
||||
var platformJson = PlatformJson.load(locations.root, platform);
|
||||
this.munger = new PlatformMunger(platform, locations.root, platformJson, new PluginInfoProvider());
|
||||
}
|
||||
|
||||
/**
|
||||
* @constructs PluginManager
|
||||
* A convenience shortcut to new PluginManager(...)
|
||||
*
|
||||
* @param {String} platform Platform name
|
||||
* @param {Object} locations - Platform files and directories
|
||||
* @param {IDEProject} ideProject The IDE project to add/remove plugin changes to/from
|
||||
* @returns new PluginManager instance
|
||||
*/
|
||||
PluginManager.get = function (platform, locations, ideProject) {
|
||||
return new PluginManager(platform, locations, ideProject);
|
||||
};
|
||||
|
||||
PluginManager.INSTALL = 'install';
|
||||
PluginManager.UNINSTALL = 'uninstall';
|
||||
|
||||
module.exports = PluginManager;
|
||||
|
||||
/**
|
||||
* Describes and implements common plugin installation/uninstallation routine. The flow is the following:
|
||||
* * Validate and set defaults for options. Note that options are empty by default. Everything
|
||||
* needed for platform IDE project must be passed from outside. Plugin variables (which
|
||||
* are the part of the options) also must be already populated with 'PACKAGE_NAME' variable.
|
||||
* * Collect all plugin's native and web files, get installers/uninstallers and process
|
||||
* all these via ActionStack.
|
||||
* * Save the IDE project, so the changes made by installers are persisted.
|
||||
* * Generate config changes munge for plugin and apply it to all required files
|
||||
* * Generate metadata for plugin and plugin modules and save it to 'cordova_plugins.js'
|
||||
*
|
||||
* @param {PluginInfo} plugin A PluginInfo structure representing plugin to install
|
||||
* @param {Object} [options={}] An installation options. It is expected but is not necessary
|
||||
* that options would contain 'variables' inner object with 'PACKAGE_NAME' field set by caller.
|
||||
*
|
||||
* @returns {Promise} Returns a Q promise, either resolved in case of success, rejected otherwise.
|
||||
*/
|
||||
PluginManager.prototype.doOperation = function (operation, plugin, options) {
|
||||
if (operation !== PluginManager.INSTALL && operation !== PluginManager.UNINSTALL) { return Q.reject(new CordovaError('The parameter is incorrect. The opeation must be either "add" or "remove"')); }
|
||||
|
||||
if (!plugin || plugin.constructor.name !== 'PluginInfo') { return Q.reject(new CordovaError('The parameter is incorrect. The first parameter should be a PluginInfo instance')); }
|
||||
|
||||
// Set default to empty object to play safe when accesing properties
|
||||
options = options || {};
|
||||
|
||||
var self = this;
|
||||
var actions = new ActionStack();
|
||||
|
||||
// gather all files need to be handled during operation ...
|
||||
plugin.getFilesAndFrameworks(this.platform, options)
|
||||
.concat(plugin.getAssets(this.platform))
|
||||
.concat(plugin.getJsModules(this.platform))
|
||||
// ... put them into stack ...
|
||||
.forEach(function (item) {
|
||||
var installer = self.project.getInstaller(item.itemType);
|
||||
var uninstaller = self.project.getUninstaller(item.itemType);
|
||||
var actionArgs = [item, plugin, self.project, options];
|
||||
|
||||
var action;
|
||||
if (operation === PluginManager.INSTALL) {
|
||||
action = actions.createAction.apply(actions, [installer, actionArgs, uninstaller, actionArgs]); /* eslint no-useless-call: 0 */
|
||||
} else /* op === PluginManager.UNINSTALL */{
|
||||
action = actions.createAction.apply(actions, [uninstaller, actionArgs, installer, actionArgs]); /* eslint no-useless-call: 0 */
|
||||
}
|
||||
actions.push(action);
|
||||
});
|
||||
|
||||
// ... and run through the action stack
|
||||
return actions.process(this.platform)
|
||||
.then(function () {
|
||||
if (self.project.write) {
|
||||
self.project.write();
|
||||
}
|
||||
|
||||
if (operation === PluginManager.INSTALL) {
|
||||
// Ignore passed `is_top_level` option since platform itself doesn't know
|
||||
// anything about managing dependencies - it's responsibility of caller.
|
||||
self.munger.add_plugin_changes(plugin, options.variables, /* is_top_level= */true, /* should_increment= */true, options.force);
|
||||
self.munger.platformJson.addPluginMetadata(plugin);
|
||||
} else {
|
||||
self.munger.remove_plugin_changes(plugin, /* is_top_level= */true);
|
||||
self.munger.platformJson.removePluginMetadata(plugin);
|
||||
}
|
||||
|
||||
// Save everything (munge and plugin/modules metadata)
|
||||
self.munger.save_all();
|
||||
|
||||
var metadata = self.munger.platformJson.generateMetadata();
|
||||
fs.writeFileSync(path.join(self.locations.www, 'cordova_plugins.js'), metadata, 'utf-8');
|
||||
|
||||
// CB-11022 save plugin metadata to both www and platform_www if options.usePlatformWww is specified
|
||||
if (options.usePlatformWww) {
|
||||
fs.writeFileSync(path.join(self.locations.platformWww, 'cordova_plugins.js'), metadata, 'utf-8');
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
PluginManager.prototype.addPlugin = function (plugin, installOptions) {
|
||||
return this.doOperation(PluginManager.INSTALL, plugin, installOptions);
|
||||
};
|
||||
|
||||
PluginManager.prototype.removePlugin = function (plugin, uninstallOptions) {
|
||||
return this.doOperation(PluginManager.UNINSTALL, plugin, uninstallOptions);
|
||||
};
|
72
node_modules/cordova-common/src/events.js
generated
vendored
Normal file
72
node_modules/cordova-common/src/events.js
generated
vendored
Normal file
@ -0,0 +1,72 @@
|
||||
/**
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
var EventEmitter = require('events').EventEmitter;
|
||||
|
||||
var INSTANCE = new EventEmitter();
|
||||
INSTANCE.setMaxListeners(20);
|
||||
var EVENTS_RECEIVER;
|
||||
|
||||
module.exports = INSTANCE;
|
||||
|
||||
/**
|
||||
* Sets up current instance to forward emitted events to another EventEmitter
|
||||
* instance.
|
||||
*
|
||||
* @param {EventEmitter} [eventEmitter] The emitter instance to forward
|
||||
* events to. Falsy value, when passed, disables forwarding.
|
||||
*/
|
||||
module.exports.forwardEventsTo = function (eventEmitter) {
|
||||
|
||||
// If no argument is specified disable events forwarding
|
||||
if (!eventEmitter) {
|
||||
EVENTS_RECEIVER = undefined;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(eventEmitter instanceof EventEmitter)) { throw new Error('Cordova events can be redirected to another EventEmitter instance only'); }
|
||||
|
||||
// CB-10940 Skipping forwarding to self to avoid infinite recursion.
|
||||
// This is the case when the modules are npm-linked.
|
||||
if (this !== eventEmitter) {
|
||||
EVENTS_RECEIVER = eventEmitter;
|
||||
} else {
|
||||
// Reset forwarding if we are subscribing to self
|
||||
EVENTS_RECEIVER = undefined;
|
||||
}
|
||||
};
|
||||
|
||||
var emit = INSTANCE.emit;
|
||||
|
||||
/**
|
||||
* This method replaces original 'emit' method to allow events forwarding.
|
||||
*
|
||||
* @return {eventEmitter} Current instance to allow calls chaining, as
|
||||
* original 'emit' does
|
||||
*/
|
||||
module.exports.emit = function () {
|
||||
|
||||
var args = Array.prototype.slice.call(arguments);
|
||||
|
||||
if (EVENTS_RECEIVER) {
|
||||
EVENTS_RECEIVER.emit.apply(EVENTS_RECEIVER, args);
|
||||
}
|
||||
|
||||
return emit.apply(this, args);
|
||||
};
|
189
node_modules/cordova-common/src/superspawn.js
generated
vendored
Normal file
189
node_modules/cordova-common/src/superspawn.js
generated
vendored
Normal file
@ -0,0 +1,189 @@
|
||||
/**
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
var child_process = require('child_process');
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var _ = require('underscore');
|
||||
var Q = require('q');
|
||||
var shell = require('shelljs');
|
||||
var events = require('./events');
|
||||
var iswin32 = process.platform === 'win32';
|
||||
|
||||
// On Windows, spawn() for batch files requires absolute path & having the extension.
|
||||
function resolveWindowsExe (cmd) {
|
||||
var winExtensions = ['.exe', '.bat', '.cmd', '.js', '.vbs'];
|
||||
function isValidExe (c) {
|
||||
return winExtensions.indexOf(path.extname(c)) !== -1 && fs.existsSync(c);
|
||||
}
|
||||
if (isValidExe(cmd)) {
|
||||
return cmd;
|
||||
}
|
||||
cmd = shell.which(cmd) || cmd;
|
||||
if (!isValidExe(cmd)) {
|
||||
winExtensions.some(function (ext) {
|
||||
if (fs.existsSync(cmd + ext)) {
|
||||
cmd = cmd + ext;
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
return cmd;
|
||||
}
|
||||
|
||||
function maybeQuote (a) {
|
||||
if (/^[^"].*[ &].*[^"]/.test(a)) return '"' + a + '"';
|
||||
return a;
|
||||
}
|
||||
|
||||
/**
|
||||
* A special implementation for child_process.spawn that handles
|
||||
* Windows-specific issues with batch files and spaces in paths. Returns a
|
||||
* promise that succeeds only for return code 0. It is also possible to
|
||||
* subscribe on spawned process' stdout and stderr streams using progress
|
||||
* handler for resultant promise.
|
||||
*
|
||||
* @example spawn('mycommand', [], {stdio: 'pipe'}) .progress(function (stdio){
|
||||
* if (stdio.stderr) { console.error(stdio.stderr); } })
|
||||
* .then(function(result){ // do other stuff })
|
||||
*
|
||||
* @param {String} cmd A command to spawn
|
||||
* @param {String[]} [args=[]] An array of arguments, passed to spawned
|
||||
* process
|
||||
* @param {Object} [opts={}] A configuration object
|
||||
* @param {String|String[]|Object} opts.stdio Property that configures how
|
||||
* spawned process' stdio will behave. Has the same meaning and possible
|
||||
* values as 'stdio' options for child_process.spawn method
|
||||
* (https://nodejs.org/api/child_process.html#child_process_options_stdio).
|
||||
* @param {Object} [env={}] A map of extra environment variables
|
||||
* @param {String} [cwd=process.cwd()] Working directory for the command
|
||||
* @param {Boolean} [chmod=false] If truthy, will attempt to set the execute
|
||||
* bit before executing on non-Windows platforms
|
||||
*
|
||||
* @return {Promise} A promise that is either fulfilled if the spawned
|
||||
* process is exited with zero error code or rejected otherwise. If the
|
||||
* 'stdio' option set to 'default' or 'pipe', the promise also emits progress
|
||||
* messages with the following contents:
|
||||
* {
|
||||
* 'stdout': ...,
|
||||
* 'stderr': ...
|
||||
* }
|
||||
*/
|
||||
exports.spawn = function (cmd, args, opts) {
|
||||
args = args || [];
|
||||
opts = opts || {};
|
||||
var spawnOpts = {};
|
||||
var d = Q.defer();
|
||||
|
||||
if (iswin32) {
|
||||
cmd = resolveWindowsExe(cmd);
|
||||
// If we couldn't find the file, likely we'll end up failing,
|
||||
// but for things like "del", cmd will do the trick.
|
||||
if (path.extname(cmd) !== '.exe') {
|
||||
var cmdArgs = '"' + [cmd].concat(args).map(maybeQuote).join(' ') + '"';
|
||||
// We need to use /s to ensure that spaces are parsed properly with cmd spawned content
|
||||
args = [['/s', '/c', cmdArgs].join(' ')];
|
||||
cmd = 'cmd';
|
||||
spawnOpts.windowsVerbatimArguments = true;
|
||||
} else if (!fs.existsSync(cmd)) {
|
||||
// We need to use /s to ensure that spaces are parsed properly with cmd spawned content
|
||||
args = ['/s', '/c', cmd].concat(args).map(maybeQuote);
|
||||
}
|
||||
}
|
||||
|
||||
if (opts.stdio !== 'default') {
|
||||
// Ignore 'default' value for stdio because it corresponds to child_process's default 'pipe' option
|
||||
spawnOpts.stdio = opts.stdio;
|
||||
}
|
||||
|
||||
if (opts.cwd) {
|
||||
spawnOpts.cwd = opts.cwd;
|
||||
}
|
||||
|
||||
if (opts.env) {
|
||||
spawnOpts.env = _.extend(_.extend({}, process.env), opts.env);
|
||||
}
|
||||
|
||||
if (opts.chmod && !iswin32) {
|
||||
try {
|
||||
// This fails when module is installed in a system directory (e.g. via sudo npm install)
|
||||
fs.chmodSync(cmd, '755');
|
||||
} catch (e) {
|
||||
// If the perms weren't set right, then this will come as an error upon execution.
|
||||
}
|
||||
}
|
||||
|
||||
events.emit(opts.printCommand ? 'log' : 'verbose', 'Running command: ' + maybeQuote(cmd) + ' ' + args.map(maybeQuote).join(' '));
|
||||
|
||||
var child = child_process.spawn(cmd, args, spawnOpts);
|
||||
var capturedOut = '';
|
||||
var capturedErr = '';
|
||||
|
||||
if (child.stdout) {
|
||||
child.stdout.setEncoding('utf8');
|
||||
child.stdout.on('data', function (data) {
|
||||
capturedOut += data;
|
||||
d.notify({'stdout': data});
|
||||
});
|
||||
}
|
||||
|
||||
if (child.stderr) {
|
||||
child.stderr.setEncoding('utf8');
|
||||
child.stderr.on('data', function (data) {
|
||||
capturedErr += data;
|
||||
d.notify({'stderr': data});
|
||||
});
|
||||
}
|
||||
|
||||
child.on('close', whenDone);
|
||||
child.on('error', whenDone);
|
||||
function whenDone (arg) {
|
||||
child.removeListener('close', whenDone);
|
||||
child.removeListener('error', whenDone);
|
||||
var code = typeof arg === 'number' ? arg : arg && arg.code;
|
||||
|
||||
events.emit('verbose', 'Command finished with error code ' + code + ': ' + cmd + ' ' + args);
|
||||
if (code === 0) {
|
||||
d.resolve(capturedOut.trim());
|
||||
} else {
|
||||
var errMsg = cmd + ': Command failed with exit code ' + code;
|
||||
if (capturedErr) {
|
||||
errMsg += ' Error output:\n' + capturedErr.trim();
|
||||
}
|
||||
var err = new Error(errMsg);
|
||||
if (capturedErr) {
|
||||
err.stderr = capturedErr;
|
||||
}
|
||||
if (capturedOut) {
|
||||
err.stdout = capturedOut;
|
||||
}
|
||||
err.code = code;
|
||||
d.reject(err);
|
||||
}
|
||||
}
|
||||
|
||||
return d.promise;
|
||||
};
|
||||
|
||||
exports.maybeSpawn = function (cmd, args, opts) {
|
||||
if (fs.existsSync(cmd)) {
|
||||
return exports.spawn(cmd, args, opts);
|
||||
}
|
||||
return Q(null);
|
||||
};
|
32
node_modules/cordova-common/src/util/addProperty.js
generated
vendored
Normal file
32
node_modules/cordova-common/src/util/addProperty.js
generated
vendored
Normal file
@ -0,0 +1,32 @@
|
||||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
module.exports = function addProperty (module, property, modulePath, obj) {
|
||||
|
||||
obj = obj || module.exports;
|
||||
// Add properties as getter to delay load the modules on first invocation
|
||||
Object.defineProperty(obj, property, {
|
||||
configurable: true,
|
||||
get: function () {
|
||||
var delayLoadedModule = module.require(modulePath);
|
||||
obj[property] = delayLoadedModule;
|
||||
return delayLoadedModule;
|
||||
}
|
||||
});
|
||||
};
|
96
node_modules/cordova-common/src/util/plist-helpers.js
generated
vendored
Normal file
96
node_modules/cordova-common/src/util/plist-helpers.js
generated
vendored
Normal file
@ -0,0 +1,96 @@
|
||||
/**
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
/* eslint no-useless-escape: 0 */
|
||||
|
||||
// contains PLIST utility functions
|
||||
var __ = require('underscore');
|
||||
var plist = require('plist');
|
||||
|
||||
// adds node to doc at selector
|
||||
module.exports.graftPLIST = graftPLIST;
|
||||
function graftPLIST (doc, xml, selector) {
|
||||
var obj = plist.parse('<plist>' + xml + '</plist>');
|
||||
|
||||
var node = doc[selector];
|
||||
if (node && Array.isArray(node) && Array.isArray(obj)) {
|
||||
node = node.concat(obj);
|
||||
for (var i = 0; i < node.length; i++) {
|
||||
for (var j = i + 1; j < node.length; ++j) {
|
||||
if (nodeEqual(node[i], node[j])) { node.splice(j--, 1); }
|
||||
}
|
||||
}
|
||||
doc[selector] = node;
|
||||
} else {
|
||||
// plist uses objects for <dict>. If we have two dicts we merge them instead of
|
||||
// overriding the old one. See CB-6472
|
||||
if (node && __.isObject(node) && __.isObject(obj) && !__.isDate(node) && !__.isDate(obj)) { // arrays checked above
|
||||
__.extend(obj, node);
|
||||
}
|
||||
doc[selector] = obj;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// removes node from doc at selector
|
||||
module.exports.prunePLIST = prunePLIST;
|
||||
function prunePLIST (doc, xml, selector) {
|
||||
var obj = plist.parse('<plist>' + xml + '</plist>');
|
||||
|
||||
pruneOBJECT(doc, selector, obj);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function pruneOBJECT (doc, selector, fragment) {
|
||||
if (Array.isArray(fragment) && Array.isArray(doc[selector])) {
|
||||
var empty = true;
|
||||
for (var i in fragment) {
|
||||
for (var j in doc[selector]) {
|
||||
empty = pruneOBJECT(doc[selector], j, fragment[i]) && empty;
|
||||
}
|
||||
}
|
||||
if (empty) {
|
||||
delete doc[selector];
|
||||
return true;
|
||||
}
|
||||
} else if (nodeEqual(doc[selector], fragment)) {
|
||||
delete doc[selector];
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function nodeEqual (node1, node2) {
|
||||
if (typeof node1 !== typeof node2) { return false; } else if (typeof node1 === 'string') {
|
||||
node2 = escapeRE(node2).replace(/\\\$\S+/gm, '(.*?)');
|
||||
return new RegExp('^' + node2 + '$').test(node1);
|
||||
} else {
|
||||
for (var key in node2) {
|
||||
if (!nodeEqual(node1[key], node2[key])) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// escape string for use in regex
|
||||
function escapeRE (str) {
|
||||
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
|
||||
}
|
365
node_modules/cordova-common/src/util/xml-helpers.js
generated
vendored
Normal file
365
node_modules/cordova-common/src/util/xml-helpers.js
generated
vendored
Normal file
@ -0,0 +1,365 @@
|
||||
/**
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* contains XML utility functions, some of which are specific to elementtree
|
||||
*/
|
||||
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var _ = require('underscore');
|
||||
var et = require('elementtree');
|
||||
|
||||
/* eslint-disable no-useless-escape */
|
||||
var ROOT = /^\/([^\/]*)/;
|
||||
var ABSOLUTE = /^\/([^\/]*)\/(.*)/;
|
||||
/* eslint-enable no-useless-escape */
|
||||
|
||||
module.exports = {
|
||||
// compare two et.XML nodes, see if they match
|
||||
// compares tagName, text, attributes and children (recursively)
|
||||
equalNodes: function (one, two) {
|
||||
if (one.tag !== two.tag) {
|
||||
return false;
|
||||
} else if (one.text.trim() !== two.text.trim()) {
|
||||
return false;
|
||||
} else if (one._children.length !== two._children.length) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!attribMatch(one, two)) return false;
|
||||
|
||||
for (var i = 0; i < one._children.length; i++) {
|
||||
if (!module.exports.equalNodes(one._children[i], two._children[i])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
// adds node to doc at selector, creating parent if it doesn't exist
|
||||
graftXML: function (doc, nodes, selector, after) {
|
||||
var parent = module.exports.resolveParent(doc, selector);
|
||||
if (!parent) {
|
||||
// Try to create the parent recursively if necessary
|
||||
try {
|
||||
var parentToCreate = et.XML('<' + path.basename(selector) + '>');
|
||||
var parentSelector = path.dirname(selector);
|
||||
|
||||
this.graftXML(doc, [parentToCreate], parentSelector);
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
parent = module.exports.resolveParent(doc, selector);
|
||||
if (!parent) return false;
|
||||
}
|
||||
|
||||
nodes.forEach(function (node) {
|
||||
// check if child is unique first
|
||||
if (uniqueChild(node, parent)) {
|
||||
var children = parent.getchildren();
|
||||
var insertIdx = after ? findInsertIdx(children, after) : children.length;
|
||||
|
||||
// TODO: replace with parent.insert after the bug in ElementTree is fixed
|
||||
parent.getchildren().splice(insertIdx, 0, node);
|
||||
}
|
||||
});
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
// adds new attributes to doc at selector
|
||||
// Will only merge if attribute has not been modified already or --force is used
|
||||
graftXMLMerge: function (doc, nodes, selector, xml) {
|
||||
var target = module.exports.resolveParent(doc, selector);
|
||||
if (!target) return false;
|
||||
|
||||
// saves the attributes of the original xml before making changes
|
||||
xml.oldAttrib = _.extend({}, target.attrib);
|
||||
|
||||
nodes.forEach(function (node) {
|
||||
var attributes = node.attrib;
|
||||
for (var attribute in attributes) {
|
||||
target.attrib[attribute] = node.attrib[attribute];
|
||||
}
|
||||
});
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
// overwrite all attributes to doc at selector with new attributes
|
||||
// Will only overwrite if attribute has not been modified already or --force is used
|
||||
graftXMLOverwrite: function (doc, nodes, selector, xml) {
|
||||
var target = module.exports.resolveParent(doc, selector);
|
||||
if (!target) return false;
|
||||
|
||||
// saves the attributes of the original xml before making changes
|
||||
xml.oldAttrib = _.extend({}, target.attrib);
|
||||
|
||||
// remove old attributes from target
|
||||
var targetAttributes = target.attrib;
|
||||
for (var targetAttribute in targetAttributes) {
|
||||
delete targetAttributes[targetAttribute];
|
||||
}
|
||||
|
||||
// add new attributes to target
|
||||
nodes.forEach(function (node) {
|
||||
var attributes = node.attrib;
|
||||
for (var attribute in attributes) {
|
||||
target.attrib[attribute] = node.attrib[attribute];
|
||||
}
|
||||
});
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
// removes node from doc at selector
|
||||
pruneXML: function (doc, nodes, selector) {
|
||||
var parent = module.exports.resolveParent(doc, selector);
|
||||
if (!parent) return false;
|
||||
|
||||
nodes.forEach(function (node) {
|
||||
var matchingKid = null;
|
||||
if ((matchingKid = findChild(node, parent)) !== null) {
|
||||
// stupid elementtree takes an index argument it doesn't use
|
||||
// and does not conform to the python lib
|
||||
parent.remove(matchingKid);
|
||||
}
|
||||
});
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
// restores attributes from doc at selector
|
||||
pruneXMLRestore: function (doc, selector, xml) {
|
||||
var target = module.exports.resolveParent(doc, selector);
|
||||
if (!target) return false;
|
||||
|
||||
if (xml.oldAttrib) {
|
||||
target.attrib = _.extend({}, xml.oldAttrib);
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
pruneXMLRemove: function (doc, selector, nodes) {
|
||||
var target = module.exports.resolveParent(doc, selector);
|
||||
if (!target) return false;
|
||||
|
||||
nodes.forEach(function (node) {
|
||||
var attributes = node.attrib;
|
||||
for (var attribute in attributes) {
|
||||
if (target.attrib[attribute]) {
|
||||
delete target.attrib[attribute];
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return true;
|
||||
|
||||
},
|
||||
|
||||
parseElementtreeSync: function (filename) {
|
||||
var contents = fs.readFileSync(filename, 'utf-8');
|
||||
if (contents) {
|
||||
// Windows is the BOM. Skip the Byte Order Mark.
|
||||
contents = contents.substring(contents.indexOf('<'));
|
||||
}
|
||||
return new et.ElementTree(et.XML(contents));
|
||||
},
|
||||
|
||||
resolveParent: function (doc, selector) {
|
||||
var parent, tagName, subSelector;
|
||||
|
||||
// handle absolute selector (which elementtree doesn't like)
|
||||
if (ROOT.test(selector)) {
|
||||
tagName = selector.match(ROOT)[1];
|
||||
// test for wildcard "any-tag" root selector
|
||||
if (tagName === '*' || tagName === doc._root.tag) {
|
||||
parent = doc._root;
|
||||
|
||||
// could be an absolute path, but not selecting the root
|
||||
if (ABSOLUTE.test(selector)) {
|
||||
subSelector = selector.match(ABSOLUTE)[2];
|
||||
parent = parent.find(subSelector);
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
parent = doc.find(selector);
|
||||
}
|
||||
return parent;
|
||||
}
|
||||
};
|
||||
|
||||
function findChild (node, parent) {
|
||||
var matchingKids = parent.findall(node.tag);
|
||||
var i;
|
||||
var j;
|
||||
|
||||
for (i = 0, j = matchingKids.length; i < j; i++) {
|
||||
if (module.exports.equalNodes(node, matchingKids[i])) {
|
||||
return matchingKids[i];
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function uniqueChild (node, parent) {
|
||||
var matchingKids = parent.findall(node.tag);
|
||||
var i = 0;
|
||||
|
||||
if (matchingKids.length === 0) {
|
||||
return true;
|
||||
} else {
|
||||
for (i; i < matchingKids.length; i++) {
|
||||
if (module.exports.equalNodes(node, matchingKids[i])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Find the index at which to insert an entry. After is a ;-separated priority list
|
||||
// of tags after which the insertion should be made. E.g. If we need to
|
||||
// insert an element C, and the rule is that the order of children has to be
|
||||
// As, Bs, Cs. After will be equal to "C;B;A".
|
||||
function findInsertIdx (children, after) {
|
||||
var childrenTags = children.map(function (child) { return child.tag; });
|
||||
var afters = after.split(';');
|
||||
var afterIndexes = afters.map(function (current) { return childrenTags.lastIndexOf(current); });
|
||||
var foundIndex = _.find(afterIndexes, function (index) { return index !== -1; });
|
||||
|
||||
// add to the beginning if no matching nodes are found
|
||||
return typeof foundIndex === 'undefined' ? 0 : foundIndex + 1;
|
||||
}
|
||||
|
||||
var BLACKLIST = ['platform', 'feature', 'plugin', 'engine'];
|
||||
var SINGLETONS = ['content', 'author', 'name'];
|
||||
function mergeXml (src, dest, platform, clobber) {
|
||||
// Do nothing for blacklisted tags.
|
||||
if (BLACKLIST.indexOf(src.tag) !== -1) return;
|
||||
|
||||
// Handle attributes
|
||||
Object.getOwnPropertyNames(src.attrib).forEach(function (attribute) {
|
||||
if (clobber || !dest.attrib[attribute]) {
|
||||
dest.attrib[attribute] = src.attrib[attribute];
|
||||
}
|
||||
});
|
||||
// Handle text
|
||||
if (src.text && (clobber || !dest.text)) {
|
||||
dest.text = src.text;
|
||||
}
|
||||
// Handle children
|
||||
src.getchildren().forEach(mergeChild);
|
||||
|
||||
// Handle platform
|
||||
if (platform) {
|
||||
src.findall('platform[@name="' + platform + '"]').forEach(function (platformElement) {
|
||||
platformElement.getchildren().forEach(mergeChild);
|
||||
});
|
||||
}
|
||||
|
||||
// Handle duplicate preference tags (by name attribute)
|
||||
removeDuplicatePreferences(dest);
|
||||
|
||||
function mergeChild (srcChild) {
|
||||
var srcTag = srcChild.tag;
|
||||
var destChild = new et.Element(srcTag);
|
||||
var foundChild;
|
||||
var query = srcTag + '';
|
||||
var shouldMerge = true;
|
||||
|
||||
if (BLACKLIST.indexOf(srcTag) !== -1) return;
|
||||
|
||||
if (SINGLETONS.indexOf(srcTag) !== -1) {
|
||||
foundChild = dest.find(query);
|
||||
if (foundChild) {
|
||||
destChild = foundChild;
|
||||
dest.remove(destChild);
|
||||
}
|
||||
} else {
|
||||
// Check for an exact match and if you find one don't add
|
||||
var mergeCandidates = dest.findall(query)
|
||||
.filter(function (foundChild) {
|
||||
return foundChild && textMatch(srcChild, foundChild) && attribMatch(srcChild, foundChild);
|
||||
});
|
||||
|
||||
if (mergeCandidates.length > 0) {
|
||||
destChild = mergeCandidates[0];
|
||||
dest.remove(destChild);
|
||||
shouldMerge = false;
|
||||
}
|
||||
}
|
||||
|
||||
mergeXml(srcChild, destChild, platform, clobber && shouldMerge);
|
||||
dest.append(destChild);
|
||||
}
|
||||
|
||||
function removeDuplicatePreferences (xml) {
|
||||
// reduce preference tags to a hashtable to remove dupes
|
||||
var prefHash = xml.findall('preference[@name][@value]').reduce(function (previousValue, currentValue) {
|
||||
previousValue[ currentValue.attrib.name ] = currentValue.attrib.value;
|
||||
return previousValue;
|
||||
}, {});
|
||||
|
||||
// remove all preferences
|
||||
xml.findall('preference[@name][@value]').forEach(function (pref) {
|
||||
xml.remove(pref);
|
||||
});
|
||||
|
||||
// write new preferences
|
||||
Object.keys(prefHash).forEach(function (key) {
|
||||
var element = et.SubElement(xml, 'preference');
|
||||
element.set('name', key);
|
||||
element.set('value', this[key]);
|
||||
}, prefHash);
|
||||
}
|
||||
}
|
||||
|
||||
// Expose for testing.
|
||||
module.exports.mergeXml = mergeXml;
|
||||
|
||||
function textMatch (elm1, elm2) {
|
||||
var text1 = elm1.text ? elm1.text.replace(/\s+/, '') : '';
|
||||
var text2 = elm2.text ? elm2.text.replace(/\s+/, '') : '';
|
||||
return (text1 === '' || text1 === text2);
|
||||
}
|
||||
|
||||
function attribMatch (one, two) {
|
||||
var oneAttribKeys = Object.keys(one.attrib);
|
||||
var twoAttribKeys = Object.keys(two.attrib);
|
||||
|
||||
if (oneAttribKeys.length !== twoAttribKeys.length) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (var i = 0; i < oneAttribKeys.length; i++) {
|
||||
var attribName = oneAttribKeys[i];
|
||||
|
||||
if (one.attrib[attribName] !== two.attrib[attribName]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
1
node_modules/cordova-registry-mapper/.npmignore
generated
vendored
Normal file
1
node_modules/cordova-registry-mapper/.npmignore
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
node_modules
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user