Compare commits

...

95 Commits
6.0.0 ... 6.2.x

Author SHA1 Message Date
filmaj
c0df73c3c1 Set VERSION to 6.2.3 (via coho) 2017-05-02 16:19:19 -07:00
filmaj
211a7fc6a8 Update JS snapshot to version 6.2.3 (via coho) 2017-05-02 16:19:19 -07:00
filmaj
ce67804b65 Set version to 6.2.3 2017-05-02 16:03:36 -07:00
filmaj
f3ded26e35 CB-12746: updated release notes for impending 6.2.3 release, since some of the reported changes did not make it into 6.2.2. 2017-05-02 16:01:31 -07:00
filmaj
4b688f8715 CB-12746: decrement working dev version on master to 6.2.4-dev, to align with impending patch release. 2017-05-02 16:00:43 -07:00
Simon MacDonald
e3b3bcd75f CB-12015: initial-scale values less than 1.0 are ignored on Android
This closes #376
2017-05-02 15:59:34 -07:00
Steve Gill
5a7590397d CB-12697 Updated checked-in node_modules 2017-05-02 15:59:23 -07:00
filmaj
af31c83ec1 CB-12640: better handling of unrecognized commands on windows. removed error checking in emulator image listing when shelling out, as we already defensively dont shell out if the program is not on the PATH / not recognized. added additional test for windows unrecognized command errors for target listing. fixed up spying in a test. 2017-05-02 15:59:16 -07:00
filmaj
bd94735ba2 CB-12640: flipped avd parsing logic so that it always tries to use avdmanager to retrieve avds first, then falls back to android command if avdmanager cannot be found (and errors with ENOENT). updated tests - and added explicit tests to ensure to shell out to singular forms of sub-commands when executing android 2017-05-02 15:59:08 -07:00
filmaj
46e47a3c5c CB-12640: support for android sdk tools 26.0.1. simplified target parsing by using avdmanager instead of sdkmanager. flipped target parsing logic so that it always tries to use avdmanager to retrieve targets first, then falls back to android command if avdmanager cannot be found (and errors with ENOENT). updated tests. 2017-05-02 15:58:56 -07:00
Steve Gill
814aca2b68 Set VERSION to 6.2.2 (via coho) 2017-04-24 22:05:42 -07:00
Steve Gill
cf159c1ae3 Update JS snapshot to version 6.2.2 (via coho) 2017-04-24 22:05:42 -07:00
Steve Gill
4868d5e59e updated build.gradle version info for bintray upload 2017-04-06 19:03:10 -05:00
Steve Gill
34c7e8a534 updated build.gradle version for bintray publish 2017-04-04 13:37:06 -05:00
Steve Gill
d36cfeafa2 CB-12627 Updated RELEASENOTES and Version for release 6.2.1 2017-04-02 18:59:56 -05:00
Steve Gill
d2c71e7d75 CB-12621: reverted elementtree dep to 0.1.6 2017-04-02 18:59:41 -05:00
Steve Gill
fc8cd37495 Set VERSION to 6.2.1 (via coho) 2017-04-02 17:43:13 -05:00
Steve Gill
3f1113ed8f Update JS snapshot to version 6.2.1 (via coho) 2017-04-02 17:43:13 -05:00
Steve Gill
4d55fdb3e5 Set VERSION to 6.2.0 (via coho) 2017-03-28 15:24:44 -07:00
Steve Gill
b175d611bd Update JS snapshot to version 6.2.0 (via coho) 2017-03-28 15:18:35 -07:00
Steve Gill
6d084428a8 CB-12609 Updated RELEASENOTES and Version for release 6.2.0 2017-03-28 15:17:52 -07:00
Steve Gill
312efc3878 CB-12609: added missing license headers 2017-03-28 15:03:47 -07:00
Joe Bowser
301faebfcc CB-12614: Adding headers to tests 2017-03-28 14:27:57 -07:00
Steve Gill
a8af103ff4 CB-12609: checking in updated node_modules 2017-03-27 22:23:09 -07:00
Darryl Pogue
0df50c3f33 CB-8978 Prepare copy resource-files from config.xml
This closes #321
2017-03-27 22:13:13 -07:00
Alexander Sorokin
08c80f77a9 CB-12605 Fix a requirements check failure on Windows 2017-03-27 11:47:32 +03:00
Joe Bowser
ea8d65d7fc CB-12595: Remove the console.log stuff
This closes #370
2017-03-24 10:22:11 -07:00
Joe Bowser
e3198b0f6b CB-12595: Ugly code, but this should find an Android Studio installation and use the sweet gradle center found inside 2017-03-24 10:22:07 -07:00
Josh Jackson
19220de388 testMultipartPopAndEncodeAsJs under newer test system
This closes #358
2017-03-22 10:54:48 -07:00
Josh Jackson
52878d6c5b MultipartMessageTest 2017-03-22 10:54:42 -07:00
Josh Jackson
abfece70c1 Shorter method name 2017-03-22 10:54:41 -07:00
Josh Jackson
33da6e9eb8 Fix encoding of multipart messages. 2017-03-22 10:54:41 -07:00
Joe Bowser
4919a2d2a8 Bumping up the test gradle versions 2017-03-22 10:53:58 -07:00
filmaj
2f2e8a560d CB-12546: account for quotes when detecting android command error for Windows. 2017-03-20 10:09:46 -07:00
filmaj
884818934f CB-12546: on create, update the require path for certain helper modules as directory structure differs. big ol TODO dropped as it _is_ kinda weird. 2017-03-20 10:09:45 -07:00
filmaj
1d8e6f53a1 CB-12546: sort detected targets by numerical suffix when reporting most recent version of android sdk target installed. 2017-03-20 10:09:45 -07:00
filmaj
3554267adf CB-12546: more specs for android_sdk and check_reqs. added fixtures for sdk targets. refactored target listing. 2017-03-20 10:09:45 -07:00
filmaj
f7687a2567 CB-12546: use android_sdk list_targets instead of rewriting the same thing again. 2017-03-20 10:09:45 -07:00
filmaj
ebd4a02d2c CB-12546: switch to superspawn for shelling out where possible. rework android sdk module to work with new sdk. 2017-03-20 10:09:45 -07:00
filmaj
4a354bba86 CB-12546: based on android command exit code and stdout, conditionally try to invoke avdmanager to list out AVD images. tweak relevant test to match behaviour. small tweak to use exposed methods for checking platform (for easier future stubbing). 2017-03-20 10:08:36 -07:00
filmaj
d40c22441f CB-12546: move check_reqs to templates directory and update module references. 2017-03-20 10:08:36 -07:00
filmaj
6395eda0c8 CB-12546: emulator specs. 2017-03-20 10:08:36 -07:00
filmaj
eb6ada8091 CB-12546: more robust sdk location detection. ANDROID_HOME now can be set from location of either of adb, android or avdmanager commands. slightly rework logic of infering ANDROID_HOME + setting up PATH to hopefully separate the logic into clearer sections. check_reqs.check_android now validates SDK Tools 25.3.1 binaries/structure. added specs for check_reqs.check_android. move android sdk version script. expose some helper functions as module methods to help with mocking. 2017-03-20 10:08:35 -07:00
filmaj
a7ef686a27 CB-12546: leverage avdmanager if android warns it is no longer
useful, which happens in Android SDK Tools 25.3.1.
explicitly set the CWD of the spawned emulator process to workaround a recent google android sdk bug.
rename android_sdk_version.js to android_sdk.js, to better reflect its contents.
have create.js copy over the android_sdk_version batch file.
2017-03-20 10:08:35 -07:00
Alexander Sorokin
e2af492a63 CB-12587 A (not so) quick fix for get_gradle_wrapper() call 2017-03-20 15:22:37 +03:00
Joe Bowser
84de9ee0da CB-12574 - Bumping Version
This closes #368
2017-03-15 13:31:24 -07:00
Joe Bowser
e182e669f0 CB-12524: Put the script in the wrong spot, oops
This closes #367
2017-03-13 13:51:37 -07:00
Joe Bowser
a9a28d3e77 CB-12524: Workaround for obsolete gradle on integration servers 2017-03-13 13:51:37 -07:00
Joe Bowser
6a77acdbf2 CB-12524: Thwarted by JSHint again, accidentally deleted the wrong message 2017-03-13 13:51:37 -07:00
Joe Bowser
028725468a CB-12524: Removing the downgrade test, because thanks to Google's Tool Change, this will forever fail. 2017-03-13 13:51:37 -07:00
Joe Bowser
9dbffa6ee8 CB-12524: Forgot to check for the android command on the target check 2017-03-13 13:51:37 -07:00
Joe Bowser
2d3f3cae13 CB-12524: Set Gradle to always build in the project directory since our tests don't run scripts from the project directory by default 2017-03-13 13:51:36 -07:00
Joe Bowser
fb9f0f3ee8 CB-12524: I need travis to install a wrapper on this, since travis fails the gradle check 2017-03-13 13:51:36 -07:00
Joe Bowser
ab276504fd CB-12524: Windows functionality for Gradle execution 2017-03-13 13:51:36 -07:00
Joe Bowser
3cc4e5b440 CB-12524: This now fetches the template from inside of the Android Studio directory, and falls back to a locally installed Gradle instance 2017-03-13 13:51:36 -07:00
Joe Bowser
b2664bc469 CB-12524: Test distributing a wrapper in the framework directory 2017-03-13 13:51:36 -07:00
Bharath Hariharan
7d5afdebe1 Updating version
This closes #364
2017-02-27 16:03:44 -08:00
Joe Bowser
3bbc7fb328 CB-12465: Writing new JUnit Test Instrumentation to replace tests and retire problmatic tests
This closes #363
2017-02-27 09:28:02 -08:00
Bharath Hariharan
ac6ad2dea1 Adding Binary plugin to class path
This closes #361
2017-02-22 16:47:59 -08:00
Bharath Hariharan
0b116f1b5c Updating Maven settings 2017-02-14 16:31:27 -08:00
Bharath Hariharan
acdb934ef9 Add the ability to publish to Bintray jCenter repo 2017-02-13 16:37:39 -08:00
Steve Gill
5591a1a4e8 Update JS snapshot to version 6.2.0-dev (via coho) 2017-01-26 16:30:33 -08:00
Steve Gill
124574bb3a Set VERSION to 6.2.0-dev (via coho) 2017-01-26 16:30:31 -08:00
Steve Gill
a2cfaab7f4 CB-12403 Updated RELEASENOTES and Version for release 6.1.2 2017-01-26 15:21:50 -08:00
Joe Bowser
6355425a6f Change to https by default 2017-01-20 09:31:31 -08:00
audreyso
2d96995801 CB:12018 : added dev dependencies to gitignore
This closes #355
2017-01-17 09:38:14 -08:00
audreyso
3fc4daa447 CB-12018 : updated tests to work with jasmine (promise matcher tests commented out for now) 2017-01-11 17:07:17 -08:00
Julio César
c7ff24b983 Closing invalid pull request: close #350 2017-01-10 19:22:44 +01:00
Jesse MacFadyen
3f674faf30 Merge branch 'CB-5968' of https://github.com/sterlingann/cordova-android 2017-01-08 22:42:18 -08:00
Steve Gill
b9ad1b6b26 Update JS snapshot to version 6.2.0-dev (via coho) 2017-01-03 17:45:55 -08:00
Steve Gill
676f0ddc2e CB-12314 updated release notes for 6.1.1 release 2017-01-03 17:45:15 -08:00
daserge
6c60dc5dc8 CB-12159 Android: Keystore password prompt won't show up
This closes #351
2016-12-08 09:51:24 -08:00
Joe Bowser
1af5ade39a Adding isClean to the spec, this really should have failed a few commits ago
This closes #349
2016-12-05 15:32:18 -08:00
Joe Bowser
ad40d33400 Need to pass lint 2016-11-21 16:36:20 -08:00
Joe Bowser
5017e2302b CB-12169: Check for build directory before running a clean 2016-11-21 14:46:09 -08:00
Joe Bowser
3bfeda4a3b Updating the timeout due to known travis issues 2016-11-03 11:35:42 -07:00
Jesse MacFadyen
348b1b4dda Do not test for non-existent build folder
This closes #348
2016-11-03 11:23:05 -07:00
Jesse MacFadyen
0fd7e7f040 Fixed AndroidStudio tests to actually run, removed app/src/main/assets/ as a requirement and added app/src/main/res instead, added placeholder for build/ folder, Removed dupe gitignore 2016-11-02 19:46:33 -07:00
Joe Bowser
cfa0fa7243 Update JS snapshot to version 6.2.0-dev (via coho) 2016-11-02 16:32:16 -07:00
Joe Bowser
6a63d9df0a Set VERSION to 6.2.0-dev (via coho) 2016-11-02 16:32:15 -07:00
Jesse MacFadyen
36646eb527 rewrite to use retro js
This closes #347
2016-11-02 16:30:14 -07:00
Joe Bowser
48940bf4c0 CB-12109 Updated RELEASENOTES and Version for release 6.1.0 2016-11-02 14:29:49 -07:00
Joe Bowser
5346a386f7 CB-12108: Updating gradle files to work with the latest version of Android Studio, since a patch release breaks this, and Gradle complains if you add the plus 2016-11-02 14:19:21 -07:00
Joe Bowser
b3201ad073 CB-12102: Bump travis to build to API 25 2016-11-01 16:39:09 -07:00
Joe Bowser
35b0ba6d07 Bumping up the version 2016-11-01 16:39:09 -07:00
Joe Bowser
3c087c6716 CB-12101: Spot fix to go into next patch release
This closes #346
2016-11-01 16:37:39 -07:00
Darryl Pogue
854946e313 CB-12077: Fix paths for Android icons/splashscreens
This closes #343
2016-10-31 11:31:26 -07:00
Sterling
d6a1d7a913 updated xxhdpi mipmap icon to 144x144 2016-10-28 21:57:54 -07:00
Sterling
700b425774 replaced with unstretched images 2016-10-28 17:20:56 -07:00
Sterling
e31634b0fb created directories and corresponding images for xxhdpi and xxxhdpi, both drawables and mipmaps 2016-10-28 17:03:45 -07:00
Steve Gill
1f06176149 added framework/build to .ratignore 2016-10-24 11:54:00 -07:00
Joe Bowser
e628026cf0 Fix for broken testUrl test 2016-10-20 12:47:33 -07:00
Joe Bowser
3a512c300e Last minute change of test targets 2016-10-20 12:25:47 -07:00
Joe Bowser
7f9e7c73ab Update JS snapshot to version 6.1.0-dev (via coho) 2016-10-20 11:49:04 -07:00
Joe Bowser
3e7be6cc0f Set VERSION to 6.1.0-dev (via coho) 2016-10-20 11:49:03 -07:00
200 changed files with 5657 additions and 3396 deletions

6
.gitignore vendored
View File

@@ -40,10 +40,9 @@ Desktop.ini
*.iml
.idea
npm-debug.log
/framework/build
node_modules/jshint
node_modules/promise-matchers
node_modules/jasmine-node
node_modules/jasmine
node_modules/rewire
node_modules/istanbul
node_modules/.bin/cake
@@ -54,7 +53,7 @@ node_modules/.bin/esparse
node_modules/.bin/esvalidate
node_modules/.bin/handlebars
node_modules/.bin/istanbul
node_modules/.bin/jasmine-node
node_modules/.bin/jasmine
node_modules/.bin/js-yaml
node_modules/.bin/jshint
node_modules/.bin/mkdirp
@@ -129,5 +128,6 @@ node_modules/which/
node_modules/window-size/
node_modules/wordwrap/
node_modules/yargs/
node_modules/jasmine-core/
node_modules/fs.realpath/
/coverage

View File

@@ -4,3 +4,5 @@ gen
proguard-project.txt
spec
appveyor.yml
framework/build
ic_launcher.png

View File

@@ -5,10 +5,11 @@ jdk:
before_install:
- nvm install 6
- node --version
- gradle --version
install:
- npm install
- npm install -g codecov
- echo y | android update sdk -u --filter android-22,android-23,android-24
- echo y | android update sdk -u --filter android-22,android-23,android-24,android-25
android:
components:
- tools

View File

@@ -20,6 +20,48 @@
-->
## Release Notes for Cordova (Android) ##
### 6.2.3 (May 2, 2017)
* [CB-12640](https://issues.apache.org/jira/browse/CB-12640) better handling of unrecognized Android SDK commands on **Windows**.
* [CB-12640](https://issues.apache.org/jira/browse/CB-12640) flipped avd parsing logic so that it always tries to use avdmanager to retrieve avds first, then falls back to android command if avdmanager cannot be found (and errors with ENOENT). updated tests - and added explicit tests to ensure to shell out to singular forms of sub-commands when executing `android`
* [CB-12640](https://issues.apache.org/jira/browse/CB-12640) support for android sdk tools 26.0.1.
### 6.2.2 (Apr 24, 2017)
* [CB-12697](https://issues.apache.org/jira/browse/CB-12697) Updated checked-in `node_modules`
### 6.2.1 (Apr 02, 2017)
* [CB-12621](https://issues.apache.org/jira/browse/CB-12621) reverted elementtree dep to 0.1.6
### 6.2.0 (Mar 28, 2017)
* [CB-12614](https://issues.apache.org/jira/browse/CB-12614) Adding headers to tests
* [CB-8978](https://issues.apache.org/jira/browse/CB-8978) Prepare copy `resource-files` from `config.xml`
* [CB-12605](https://issues.apache.org/jira/browse/CB-12605) Fix a requirements check failure on **Windows**
* [CB-12595](https://issues.apache.org/jira/browse/CB-12595) This should find an **Android Studio** installation and use the sweet gradle center found inside
* [CB-12546](https://issues.apache.org/jira/browse/CB-12546) leverage `avdmanager` if `android` warns it is no longer useful, which happens in **Android SDK Tools 25.3.1**. Explicitly set the `CWD` of the spawned emulator process to workaround a recent google android sdk bug. Rename `android_sdk_version.js` to `android_sdk.js`, to better reflect its contents. Have `create.js` copy over the `android_sdk_version` batch file.
* [CB-12524](https://issues.apache.org/jira/browse/CB-12524) Fix for missing gradle template error. This now fetches the template from inside of the **Android Studio** directory, and falls back to a locally installed Gradle instance
* [CB-12465](https://issues.apache.org/jira/browse/CB-12465) Writing new JUnit Test Instrumentation to replace tests and retire problmatic tests
### 6.1.2 (Jan 26, 2017)
* **Security** Change to `https` by default
* [CB-12018](https://issues.apache.org/jira/browse/CB-12018): updated tests to work with jasmine (promise matcher tests commented out for now)
* created directories and corresponding images for `xxhdpi` and `xxxhdpi`, both drawables and `mipmaps`
### 6.1.1 (Jan 03, 2017)
* [CB-12159](https://issues.apache.org/jira/browse/CB-12159) **Android** Keystore password prompt won't show up
* [CB-12169](https://issues.apache.org/jira/browse/CB-12169) Check for build directory before running a clean
* Fixed `AndroidStudio` tests to actually run, removed `app/src/main/assets/` as a requirement and added `app/src/main/res` instead, added placeholder for `build/` folder, Removed dupe `gitignore`
### 6.1.0 (Nov 02, 2016)
* [CB-12108](https://issues.apache.org/jira/browse/CB-12108) Updating gradle files to work with the latest version of Android Studio
* [CB-12102](https://issues.apache.org/jira/browse/CB-12102) Bump travis to build to API 25
* Bumping up the version
* [CB-12101](https://issues.apache.org/jira/browse/CB-12101) Fix so that CLI builds don't conflict with Android Studio builds
* [CB-12077](https://issues.apache.org/jira/browse/CB-12077) Fix paths for Android icons/splashscreens
* added framework/build to .ratignore
* Fix for broken testUrl test
* Last minute change of test targets
* Update JS snapshot to version 6.1.0-dev (via coho)
* Set VERSION to 6.1.0-dev (via coho)
### 6.0.0 (Oct 20, 2016)
This release adds significant functionality, and also introduces a number
@@ -39,31 +81,31 @@ Changes For Third-Party WebView Developers:
#### Curated Changes from the Git Commit Logs ####
* Updating the gradle build for test to use the latest
* CB-11083: Fixing syncronous file check and future-proofing the JS for Travis
* CB-11083: Reading files to check for CordovaLib dependency, if so, we exclude CordovaLib to be safe
* CB-11083: Plugin build script for dependencies without a gradle file
* CB-11083: The GradleBuidler can tell the difference between a Cordova Plugin Framework and a regular framework based on the name
* CB-11083 Fix to deal with custom frameworks with their own Gradle configuration
* CB-12003 updated node_modules
* CB-11771 Deep symlink directories to target project instead of linking the directory itself
* CB-11880 android: Fail-safe for cordova.exec()
* CB-11999 add message, catch exception if require fails
* [CB-11083](https://issues.apache.org/jira/browse/CB-11083) Fixing syncronous file check and future-proofing the JS for Travis
* [CB-11083](https://issues.apache.org/jira/browse/CB-11083) Reading files to check for CordovaLib dependency, if so, we exclude CordovaLib to be safe
* [CB-11083](https://issues.apache.org/jira/browse/CB-11083) Plugin build script for dependencies without a gradle file
* [CB-11083](https://issues.apache.org/jira/browse/CB-11083) The GradleBuidler can tell the difference between a Cordova Plugin Framework and a regular framework based on the name
* [CB-11083](https://issues.apache.org/jira/browse/CB-11083) Fix to deal with custom frameworks with their own Gradle configuration
* [CB-12003](https://issues.apache.org/jira/browse/CB-12003) updated node_modules
* [CB-11771](https://issues.apache.org/jira/browse/CB-11771) Deep symlink directories to target project instead of linking the directory itself
* [CB-11880](https://issues.apache.org/jira/browse/CB-11880) android: Fail-safe for cordova.exec()
* [CB-11999](https://issues.apache.org/jira/browse/CB-11999) add message, catch exception if require fails
* fix issue with app_name containing apostrophes
* CB-8722 - Move icons from drawable to mipmap
* CB-11964 Call clean after plugin install and mock it in tests
* [CB-8722](https://issues.apache.org/jira/browse/CB-8722) - Move icons from drawable to mipmap
* [CB-11964](https://issues.apache.org/jira/browse/CB-11964) Call clean after plugin install and mock it in tests
* Did a try/catch to deal with the unit tests vs actual project environment, code duplication is needed because of builderEnv
* CB-11964: Do a clean when installing a plugin to et around the bug
* CB-11921 - Add github pull request template
* CB-11935 Does a best-effort attempt to pause any processing that can be paused safely, such as animations and geolocation.
* CB-11640: Fixing check_reqs.js so it actually works
* CB-11640: Changing requirements check to ask for Java 8
* CB-11869 Fix cordova-js android exec tests
* CB-11907: Bumping Gradle to work with Android Studio 2.2 and the Android Gradle Plugin
* [CB-11964](https://issues.apache.org/jira/browse/CB-11964) Do a clean when installing a plugin to et around the bug
* [CB-11921](https://issues.apache.org/jira/browse/CB-11921) - Add github pull request template
* [CB-11935](https://issues.apache.org/jira/browse/CB-11935) Does a best-effort attempt to pause any processing that can be paused safely, such as animations and geolocation.
* [CB-11640](https://issues.apache.org/jira/browse/CB-11640) Fixing check_reqs.js so it actually works
* [CB-11640](https://issues.apache.org/jira/browse/CB-11640) Changing requirements check to ask for Java 8
* [CB-11869](https://issues.apache.org/jira/browse/CB-11869) Fix cordova-js android exec tests
* [CB-11907](https://issues.apache.org/jira/browse/CB-11907) Bumping Gradle to work with Android Studio 2.2 and the Android Gradle Plugin
* Enable background start of Cordova Android apps
* fixing jshint issues
* replace Integer.parseInt with BigInteger so that you can use longer Android version codes
* CB-11828: Adding dirty userAgent checking to see if we're running Jellybean or not for bridge modes
* CB-11828: Switching default bridge back to ONLINE_BRIDGE
* [CB-11828](https://issues.apache.org/jira/browse/CB-11828) Adding dirty userAgent checking to see if we're running Jellybean or not for bridge modes
* [CB-11828](https://issues.apache.org/jira/browse/CB-11828) Switching default bridge back to ONLINE_BRIDGE
* Add gradle build flag to enable dex in process for large projects
* added ability for cordova activity to be viewed in a real full screen regardless of android version (as was the case in previous cordova versions)
* Updating travis
@@ -71,23 +113,23 @@ Changes For Third-Party WebView Developers:
* Bump Target and Min API levels
* Make evaluateJavaScript brige default
* Creating an evaluateJavascript branch
* CB-11727 - travis ci setup is still using 0.10.32 node
* CB-11726 - Update appveyor node versions to 4 and 6, so they will always use the latest versions
* [CB-11727](https://issues.apache.org/jira/browse/CB-11727) - travis ci setup is still using 0.10.32 node
* [CB-11726](https://issues.apache.org/jira/browse/CB-11726) - Update appveyor node versions to 4 and 6, so they will always use the latest versions
* Close invalid PRs
* CB-11683 Fixed linking to directories during plugin installation.
* fixed CB-11078 Empty string for BackgroundColor preference crashes application This closes #316
* [CB-11683](https://issues.apache.org/jira/browse/CB-11683) Fixed linking to directories during plugin installation.
* fixed [CB-11078](https://issues.apache.org/jira/browse/CB-11078) Empty string for BackgroundColor preference crashes application This closes #316
* Update JS snapshot to version 5.3.0-dev (via coho)
* Set VERSION to 5.3.0-dev (via coho)
* CB-11626 Updated RELEASENOTES and Version for release 5.2.2
* [CB-11626](https://issues.apache.org/jira/browse/CB-11626) Updated RELEASENOTES and Version for release 5.2.2
* updated cordoova-common to 1.4.0
* This closes #195
* Updaing the gradle for the tests to the latest
* CB-11550 Updated RELEASENOTES for release 5.2.1
* CB-9489 Fixed "endless waiting for emulator" issue
* [CB-11550](https://issues.apache.org/jira/browse/CB-11550) Updated RELEASENOTES for release 5.2.1
* [CB-9489](https://issues.apache.org/jira/browse/CB-9489) Fixed "endless waiting for emulator" issue
* Update JS snapshot to version 5.3.0-dev (via coho)
* Set VERSION to 5.3.0-dev (via coho)
* CB-11444 Updated RELEASENOTES and Version for release 5.2.0
* CB-11481: android-library is deprecated use com.android.library instead
* [CB-11444](https://issues.apache.org/jira/browse/CB-11444) Updated RELEASENOTES and Version for release 5.2.0
* [CB-11481](https://issues.apache.org/jira/browse/CB-11481) android-library is deprecated use com.android.library instead
### 5.2.2 (Jul 26, 2016)
* [CB-11615](https://issues.apache.org/jira/browse/CB-11615) updated `cordoova-common` to `1.4.0`

View File

@@ -1 +1 @@
5.3.0-dev
6.2.3

View File

@@ -19,10 +19,10 @@
under the License.
*/
var android_sdk_version = require('./lib/android_sdk_version');
var android_sdk = require('./templates/cordova/lib/android_sdk');
android_sdk_version.run().done(null, function(err) {
console.log(err);
android_sdk.print_newest_available_sdk_target().done(null, function(err) {
console.error(err);
process.exit(2);
});

View File

@@ -19,7 +19,7 @@
under the License.
*/
var check_reqs = require('./lib/check_reqs');
var check_reqs = require('./templates/cordova/lib/check_reqs');
check_reqs.run().done(
function success() {

View File

@@ -1,64 +0,0 @@
#!/usr/bin/env node
/*
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'),
Q = require('q');
var get_highest_sdk = function(results){
var reg = /\d+/;
var apiLevels = [];
for(var i=0;i<results.length;i++){
apiLevels[i] = parseInt(results[i].match(reg)[0]);
}
apiLevels.sort(function(a,b){return b-a;});
console.log(apiLevels[0]);
};
var get_sdks = function() {
var d = Q.defer();
child_process.exec('android list targets', function(err, stdout, stderr) {
if (err) d.reject(stderr);
else d.resolve(stdout);
});
return d.promise.then(function(output) {
var reg = /android-\d+/gi;
var results = output.match(reg);
if(results.length===0){
return Q.reject(new Error('No android sdks installed.'));
}else{
get_highest_sdk(results);
}
return Q();
}, function(stderr) {
if (stderr.match(/command\snot\sfound/) || stderr.match(/'android' is not recognized/)) {
return Q.reject(new Error('The command \"android\" failed. Make sure you have the latest Android SDK installed, and the \"android\" command (inside the tools/ folder) is added to your path.'));
} else {
return Q.reject(new Error('An error occurred while listing Android targets'));
}
});
};
module.exports.run = function() {
return Q.all([get_sdks()]);
};

View File

@@ -23,7 +23,7 @@ var shell = require('shelljs'),
Q = require('q'),
path = require('path'),
fs = require('fs'),
check_reqs = require('./check_reqs'),
check_reqs = require('./../templates/cordova/lib/check_reqs'),
ROOT = path.join(__dirname, '..', '..');
var MIN_SDK_VERSION = 16;
@@ -134,20 +134,29 @@ function copyBuildRules(projectPath) {
var srcDir = path.join(ROOT, 'bin', 'templates', 'project');
shell.cp('-f', path.join(srcDir, 'build.gradle'), projectPath);
shell.cp('-f', path.join(srcDir, 'wrapper.gradle'), projectPath);
}
function copyScripts(projectPath) {
var srcScriptsDir = path.join(ROOT, 'bin', 'templates', 'cordova');
var bin = path.join(ROOT, 'bin');
var srcScriptsDir = path.join(bin, 'templates', 'cordova');
var destScriptsDir = path.join(projectPath, 'cordova');
// Delete old scripts directory if this is an update.
shell.rm('-rf', destScriptsDir);
// Copy in the new ones.
shell.cp('-r', srcScriptsDir, projectPath);
shell.cp('-r', path.join(ROOT, 'node_modules'), destScriptsDir);
shell.cp(path.join(ROOT, 'bin', 'check_reqs*'), destScriptsDir);
shell.cp(path.join(ROOT, 'bin', 'lib', 'check_reqs.js'), path.join(projectPath, 'cordova', 'lib', 'check_reqs.js'));
shell.cp(path.join(ROOT, 'bin', 'android_sdk_version'), path.join(destScriptsDir, 'android_sdk_version'));
shell.cp(path.join(ROOT, 'bin', 'lib', 'android_sdk_version.js'), path.join(projectPath, 'cordova', 'lib', 'android_sdk_version.js'));
shell.cp(path.join(bin, 'check_reqs*'), destScriptsDir);
shell.cp(path.join(bin, 'android_sdk_version*'), destScriptsDir);
var check_reqs = path.join(destScriptsDir, 'check_reqs');
var android_sdk_version = path.join(destScriptsDir, 'android_sdk_version');
// TODO: the two files being edited on-the-fly here are shared between
// platform and project-level commands. the below `sed` is updating the
// `require` path for the two libraries. if there's a better way to share
// modules across both the repo and generated projects, we should make sure
// to remove/update this.
shell.sed('-i', /templates\/cordova\//, '', android_sdk_version);
shell.sed('-i', /templates\/cordova\//, '', check_reqs);
}
/**

View File

@@ -66,12 +66,13 @@ function Api(platform, platformRootDir, events) {
this.locations = {
root: self.root,
www: path.join(self.root, 'assets/www'),
res: path.relative(self.root, path.join(self.root, 'res')),
res: path.join(self.root, 'res'),
platformWww: path.join(self.root, 'platform_www'),
configXml: path.join(self.root, 'res/xml/config.xml'),
defaultConfigXml: path.join(self.root, 'cordova/defaults.xml'),
strings: path.join(self.root, 'res/values/strings.xml'),
manifest: path.join(self.root, 'AndroidManifest.xml'),
build: path.join(self.root, 'build'),
// NOTE: Due to platformApi spec we need to return relative paths here
cordovaJs: 'bin/templates/project/assets/www/cordova.js',
cordovaJsSrc: 'cordova-js-src'
@@ -85,7 +86,7 @@ function Api(platform, platformRootDir, events) {
this.locations.strings = path.join(self.root, 'app/src/main/res/xml/strings.xml');
this.locations.manifest = path.join(self.root, 'app/src/main/AndroidManifest.xml');
this.locations.www = path.join(self.root, 'app/src/main/assets/www');
this.locations.res = path.relative(self.root, path.join(self.root, 'app/src/main/res'));
this.locations.res = path.join(self.root, 'app/src/main/res');
}
}
@@ -241,10 +242,12 @@ Api.prototype.addPlugin = function (plugin, installOptions) {
// Do some basic argument parsing
var opts = {};
// Skip cleaning prepared files when not invoking via cordova CLI.
// Skip cleaning prepared files when not invoking via cordova CLI.
opts.noPrepare = true;
return self.clean(opts);
if(!AndroidStudio.isAndroidStudioProject(self.root) && !project.isClean()) {
return self.clean(opts);
}
})
.then(function () {
return PluginManager.get(self.platform, self.locations, project)
@@ -395,6 +398,8 @@ Api.prototype.clean = function(cleanOptions) {
});
};
/**
* Performs a requirements check for current platform. Each platform defines its
* own set of requirements, which should be resolved before platform can be

View File

@@ -197,5 +197,14 @@ AndroidProject.prototype.getUninstaller = function (type) {
return pluginHandlers.getUninstaller(type);
};
/*
* This checks if an Android project is clean or has old build artifacts
*/
AndroidProject.prototype.isClean = function() {
var build_path = path.join(this.projectDir, 'build');
//If the build directory doesn't exist, it's clean
return !(fs.existsSync(build_path));
};
module.exports = AndroidProject;

View File

@@ -4,26 +4,39 @@
* @param {String} root Root folder of the project
*/
/*jshint esversion: 6 */
/*jshint esnext: false */
var path = require('path');
var fs = require('fs');
var CordovaError = require('cordova-common').CordovaError;
function isAndroidStudioProject(root) {
module.exports.isAndroidStudioProject = function isAndroidStudioProject(root) {
var eclipseFiles = ['AndroidManifest.xml', 'libs', 'res', 'project.properties', 'platform_www'];
var androidStudioFiles = ['app', 'gradle', 'build', 'app/src/main/assets'];
var file;
for(file of eclipseFiles) {
if(fs.existsSync(path.join(root, file))) {
return false;
}
}
for(file of androidStudioFiles) {
if(!fs.existsSync(path.join(root, file))) {
return false;
}
}
return true;
}
var androidStudioFiles = ['app', 'gradle', 'app/src/main/res'];
module.exports.isAndroidStudioProject = isAndroidStudioProject;
// assume it is an AS project and not an Eclipse project
var isEclipse = false;
var isAS = true;
if(!fs.existsSync(root)) {
throw new CordovaError('AndroidStudio.js:inAndroidStudioProject root does not exist: ' + root);
}
// if any of the following exists, then we are not an ASProj
eclipseFiles.forEach(function(file) {
if(fs.existsSync(path.join(root, file))) {
isEclipse = true;
}
});
// if it is NOT an eclipse project, check that all required files exist
if(!isEclipse) {
androidStudioFiles.forEach(function(file){
if(!fs.existsSync(path.join(root, file))) {
console.log('missing file :: ' + file);
isAS = false;
}
});
}
return (!isEclipse && isAS);
};

106
bin/templates/cordova/lib/android_sdk.js vendored Executable file
View File

@@ -0,0 +1,106 @@
/*
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'),
superspawn = require('cordova-common').superspawn;
var suffix_number_regex = /(\d+)$/;
// Used for sorting Android targets, example strings to sort:
// android-19
// android-L
// Google Inc.:Google APIs:20
// Google Inc.:Glass Development Kit Preview:20
// The idea is to sort based on largest "suffix" number - meaning the bigger
// the number at the end, the more recent the target, the closer to the
// start of the array.
function sort_by_largest_numerical_suffix(a, b) {
var suffix_a = a.match(suffix_number_regex);
var suffix_b = b.match(suffix_number_regex);
if (suffix_a && suffix_b) {
// If the two targets being compared have suffixes, return less than
// zero, or greater than zero, based on which suffix is larger.
return (parseInt(suffix_a[1]) > parseInt(suffix_b[1]) ? -1 : 1);
} else {
// If no suffix numbers were detected, leave the order as-is between
// elements a and b.
return 0;
}
}
module.exports.print_newest_available_sdk_target = function() {
return module.exports.list_targets()
.then(function(targets) {
targets.sort(sort_by_largest_numerical_suffix);
console.log(targets[0]);
});
};
module.exports.version_string_to_api_level = {
'4.0': 14,
'4.0.3': 15,
'4.1': 16,
'4.2': 17,
'4.3': 18,
'4.4': 19,
'4.4W': 20,
'5.0': 21,
'5.1': 22,
'6.0': 23,
'7.0': 24,
'7.1.1': 25
};
function parse_targets(output) {
var target_out = output.split('\n');
var targets = [];
for (var i = target_out.length - 1; i >= 0; i--) {
if(target_out[i].match(/id:/)) { // if "id:" is in the line...
targets.push(target_out[i].match(/"(.+)"/)[1]); //.. match whatever is in quotes.
}
}
return targets;
}
module.exports.list_targets_with_android = function() {
return superspawn.spawn('android', ['list', 'target'])
.then(parse_targets);
};
module.exports.list_targets_with_avdmanager = function() {
return superspawn.spawn('avdmanager', ['list', 'target'])
.then(parse_targets);
};
module.exports.list_targets = function() {
return module.exports.list_targets_with_avdmanager()
.catch(function(err) {
// If there's an error, like avdmanager could not be found, we can try
// as a last resort, to run `android`, in case this is a super old
// SDK installation.
if (err && (err.code == 'ENOENT' || (err.stderr && err.stderr.match(/not recognized/)))) {
return module.exports.list_targets_with_android();
} else throw err;
})
.then(function(targets) {
if (targets.length === 0) {
return Q.reject(new Error('No android targets (SDKs) installed!'));
}
return targets;
});
};

View File

@@ -65,6 +65,21 @@ GradleBuilder.prototype.getArgs = function(cmd, opts) {
return args;
};
/*
* This returns a promise
*/
GradleBuilder.prototype.runGradleWrapper = function(gradle_cmd) {
var gradlePath = path.join(this.root, 'gradlew');
var wrapperGradle = path.join(this.root, 'wrapper.gradle');
if(fs.existsSync(gradlePath)) {
//Literally do nothing, for some reason this works, while !fs.existsSync didn't on Windows
} else {
return spawn(gradle_cmd, ['-p', this.root, 'wrapper', '-b', wrapperGradle], {stdio: 'inherit'});
}
};
// Makes the project buildable, minus the gradle wrapper.
GradleBuilder.prototype.prepBuildFiles = function() {
// Update the version of build.gradle in each dependent library.
@@ -159,17 +174,15 @@ GradleBuilder.prototype.prepBuildFiles = function() {
GradleBuilder.prototype.prepEnv = function(opts) {
var self = this;
return check_reqs.check_gradle()
.then(function() {
return self.prepBuildFiles();
}).then(function() {
// Copy the gradle wrapper on each build so that:
// A) we don't require the Android SDK at project creation time, and
// B) we always use the SDK's latest version of it.
// check_reqs ensures that this is set.
/*jshint -W069 */
var sdkDir = process.env['ANDROID_HOME'];
/*jshint +W069 */
var wrapperDir = path.join(sdkDir, 'tools', 'templates', 'gradle', 'wrapper');
.then(function(gradlePath) {
return self.runGradleWrapper(gradlePath);
}).then(function() {
return self.prepBuildFiles();
}).then(function() {
// We now copy the gradle out of the framework
// This is a dirty patch to get the build working
/*
var wrapperDir = path.join(self.root, 'CordovaLib');
if (process.platform == 'win32') {
shell.rm('-f', path.join(self.root, 'gradlew.bat'));
shell.cp(path.join(wrapperDir, 'gradlew.bat'), self.root);
@@ -180,13 +193,13 @@ GradleBuilder.prototype.prepEnv = function(opts) {
shell.rm('-rf', path.join(self.root, 'gradle', 'wrapper'));
shell.mkdir('-p', path.join(self.root, 'gradle'));
shell.cp('-r', path.join(wrapperDir, 'gradle', 'wrapper'), path.join(self.root, 'gradle'));
*/
// If the gradle distribution URL is set, make sure it points to version we want.
// If it's not set, do nothing, assuming that we're using a future version of gradle that we don't want to mess with.
// For some reason, using ^ and $ don't work. This does the job, though.
var distributionUrlRegex = /distributionUrl.*zip/;
/*jshint -W069 */
var distributionUrl = process.env['CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL'] || 'http\\://services.gradle.org/distributions/gradle-2.14.1-all.zip';
var distributionUrl = process.env['CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL'] || 'https\\://services.gradle.org/distributions/gradle-3.3-all.zip';
/*jshint +W069 */
var gradleWrapperPropertiesPath = path.join(self.root, 'gradle', 'wrapper', 'gradle-wrapper.properties');
shell.chmod('u+w', gradleWrapperPropertiesPath);

View File

@@ -26,10 +26,12 @@ var shelljs = require('shelljs'),
Q = require('q'),
path = require('path'),
fs = require('fs'),
ROOT = path.join(__dirname, '..', '..');
os = require('os'),
REPO_ROOT = path.join(__dirname, '..', '..', '..', '..'),
PROJECT_ROOT = path.join(__dirname, '..', '..');
var CordovaError = require('cordova-common').CordovaError;
var isWindows = process.platform == 'win32';
var superspawn = require('cordova-common').superspawn;
var android_sdk = require('./android_sdk');
function forgivingWhichSync(cmd) {
try {
@@ -50,7 +52,16 @@ function tryCommand(cmd, errMsg, catchStderr) {
return d.promise;
}
// Get valid target from framework/project.properties
module.exports.isWindows = function() {
return (os.platform() == 'win32');
};
module.exports.isDarwin = function() {
return (os.platform() == 'darwin');
};
// Get valid target from framework/project.properties if run from this repo
// Otherwise get target from project.properties file within a generated cordova-android project
module.exports.get_target = function() {
function extractFromFile(filePath) {
var target = shelljs.grep(/\btarget=/, filePath);
@@ -59,38 +70,83 @@ module.exports.get_target = function() {
}
return target.split('=')[1].trim();
}
if (fs.existsSync(path.join(ROOT, 'framework', 'project.properties'))) {
return extractFromFile(path.join(ROOT, 'framework', 'project.properties'));
var repo_file = path.join(REPO_ROOT, 'framework', 'project.properties');
if (fs.existsSync(repo_file)) {
return extractFromFile(repo_file);
}
if (fs.existsSync(path.join(ROOT, 'project.properties'))) {
// if no target found, we're probably in a project and project.properties is in ROOT.
return extractFromFile(path.join(ROOT, 'project.properties'));
var project_file = path.join(PROJECT_ROOT, 'project.properties');
if (fs.existsSync(project_file)) {
// if no target found, we're probably in a project and project.properties is in PROJECT_ROOT.
return extractFromFile(project_file);
}
throw new Error('Could not find android target. File missing: ' + path.join(ROOT, 'project.properties'));
throw new Error('Could not find android target in either ' + repo_file + ' nor ' + project_file);
};
// Returns a promise. Called only by build and clean commands.
module.exports.check_ant = function() {
return tryCommand('ant -version', 'Failed to run "ant -version", make sure you have ant installed and added to your PATH.')
.then(function (output) {
return superspawn.spawn('ant', ['-version'])
.then(function(output) {
// Parse Ant version from command output
return /version ((?:\d+\.)+(?:\d+))/i.exec(output)[1];
}).catch(function(err) {
throw new CordovaError('Failed to run `ant -version`. Make sure you have `ant` on your $PATH.');
});
};
module.exports.get_gradle_wrapper = function() {
var androidStudioPath;
var i = 0;
var foundStudio = false;
var program_dir;
if (module.exports.isDarwin()) {
program_dir = fs.readdirSync('/Applications');
while (i < program_dir.length && !foundStudio) {
if (program_dir[i].startsWith('Android Studio')) {
//TODO: Check for a specific Android Studio version, make sure it's not Canary
androidStudioPath = path.join('/Applications', program_dir[i], 'Contents', 'gradle');
foundStudio = true;
} else { ++i; }
}
} else if (module.exports.isWindows()) {
var androidPath = path.join(process.env['ProgramFiles'], 'Android') + '/';
if (fs.existsSync(androidPath)) {
program_dir = fs.readdirSync(androidPath);
while (i < program_dir.length && !foundStudio) {
if (program_dir[i].startsWith('Android Studio')) {
foundStudio = true;
androidStudioPath = path.join(process.env['ProgramFiles'], 'Android', program_dir[i], 'gradle');
} else { ++i; }
}
}
}
if (androidStudioPath !== null && fs.existsSync(androidStudioPath)) {
var dirs = fs.readdirSync(androidStudioPath);
if(dirs[0].split('-')[0] == 'gradle') {
return path.join(androidStudioPath, dirs[0], 'bin', 'gradle');
}
} else {
//OK, let's try to check for Gradle!
return forgivingWhichSync('gradle');
}
};
// Returns a promise. Called only by build and clean commands.
module.exports.check_gradle = function() {
var sdkDir = process.env['ANDROID_HOME'];
var d = Q.defer();
if (!sdkDir)
return Q.reject(new CordovaError('Could not find gradle wrapper within Android SDK. Could not find Android SDK directory.\n' +
'Might need to install Android SDK or set up \'ANDROID_HOME\' env variable.'));
var wrapperDir = path.join(sdkDir, 'tools', 'templates', 'gradle', 'wrapper');
if (!fs.existsSync(wrapperDir)) {
return Q.reject(new CordovaError('Could not find gradle wrapper within Android SDK. Might need to update your Android SDK.\n' +
'Looked here: ' + wrapperDir));
}
return Q.when();
var gradlePath = module.exports.get_gradle_wrapper();
if (gradlePath.length !== 0)
d.resolve(gradlePath);
else
d.reject(new CordovaError('Could not find an installed version of Gradle either in Android Studio,\n' +
'or on your system to install the gradle wrapper. Please include gradle \n' +
'in your path, or install Android Studio'));
return d.promise;
};
// Returns a promise.
@@ -105,12 +161,15 @@ module.exports.check_java = function() {
}
} else {
if (javacPath) {
var msg = 'Failed to find \'JAVA_HOME\' environment variable. Try setting setting it manually.';
// OS X has a command for finding JAVA_HOME.
if (fs.existsSync('/usr/libexec/java_home')) {
return tryCommand('/usr/libexec/java_home', msg)
var find_java = '/usr/libexec/java_home';
var default_java_error_msg = 'Failed to find \'JAVA_HOME\' environment variable. Try setting setting it manually.';
if (fs.existsSync(find_java)) {
return superspawn.spawn(find_java)
.then(function(stdout) {
process.env['JAVA_HOME'] = stdout.trim();
}).catch(function(err) {
throw new CordovaError(default_java_error_msg);
});
} else {
// See if we can derive it from javac's location.
@@ -119,10 +178,10 @@ module.exports.check_java = function() {
if (fs.existsSync(path.join(maybeJavaHome, 'lib', 'tools.jar'))) {
process.env['JAVA_HOME'] = maybeJavaHome;
} else {
throw new CordovaError(msg);
throw new CordovaError(default_java_error_msg);
}
}
} else if (isWindows) {
} else if (module.exports.isWindows()) {
// Try to auto-detect java in the default install paths.
var oldSilent = shelljs.config.silent;
shelljs.config.silent = true;
@@ -142,28 +201,29 @@ module.exports.check_java = function() {
}
}
}).then(function() {
var msg =
'Failed to run "javac -version", make sure that you have a JDK installed.\n' +
'You can get it from: http://www.oracle.com/technetwork/java/javase/downloads.\n';
if (process.env['JAVA_HOME']) {
msg += 'Your JAVA_HOME is invalid: ' + process.env['JAVA_HOME'] + '\n';
}
// We use tryCommand with catchStderr = true, because
// javac writes version info to stderr instead of stdout
return tryCommand('javac -version', msg, true)
.then(function (output) {
//Let's check for at least Java 8, and keep it future proof so we can support Java 10
var match = /javac ((?:1\.)(?:[8-9]\.)(?:\d+))|((?:1\.)(?:[1-9]\d+\.)(?:\d+))/i.exec(output);
return match && match[1];
});
var msg =
'Failed to run "javac -version", make sure that you have a JDK installed.\n' +
'You can get it from: http://www.oracle.com/technetwork/java/javase/downloads.\n';
if (process.env['JAVA_HOME']) {
msg += 'Your JAVA_HOME is invalid: ' + process.env['JAVA_HOME'] + '\n';
}
// We use tryCommand with catchStderr = true, because
// javac writes version info to stderr instead of stdout
return tryCommand('javac -version', msg, true)
.then(function (output) {
//Let's check for at least Java 8, and keep it future proof so we can support Java 10
var match = /javac ((?:1\.)(?:[8-9]\.)(?:\d+))|((?:1\.)(?:[1-9]\d+\.)(?:\d+))/i.exec(output);
return match && match[1];
});
});
};
// Returns a promise.
module.exports.check_android = function() {
return Q().then(function() {
var androidCmdPath = forgivingWhichSync('android');
var adbInPath = !!forgivingWhichSync('adb');
var adbInPath = forgivingWhichSync('adb');
var avdmanagerInPath = forgivingWhichSync('avdmanager');
var hasAndroidHome = !!process.env['ANDROID_HOME'] && fs.existsSync(process.env['ANDROID_HOME']);
function maybeSetAndroidHome(value) {
if (!hasAndroidHome && fs.existsSync(value)) {
@@ -171,8 +231,10 @@ module.exports.check_android = function() {
process.env['ANDROID_HOME'] = value;
}
}
if (!hasAndroidHome && !androidCmdPath) {
if (isWindows) {
// First ensure ANDROID_HOME is set
// If we have no hints (nothing in PATH), try a few default locations
if (!hasAndroidHome && !androidCmdPath && !adbInPath && !avdmanagerInPath) {
if (module.exports.isWindows()) {
// Android Studio 1.0 installer
maybeSetAndroidHome(path.join(process.env['LOCALAPPDATA'], 'Android', 'sdk'));
maybeSetAndroidHome(path.join(process.env['ProgramFiles'], 'Android', 'sdk'));
@@ -182,7 +244,7 @@ module.exports.check_android = function() {
// Stand-alone installer
maybeSetAndroidHome(path.join(process.env['LOCALAPPDATA'], 'Android', 'android-sdk'));
maybeSetAndroidHome(path.join(process.env['ProgramFiles'], 'Android', 'android-sdk'));
} else if (process.platform == 'darwin') {
} else if (module.exports.isDarwin()) {
// Android Studio 1.0 installer
maybeSetAndroidHome(path.join(process.env['HOME'], 'Library', 'Android', 'sdk'));
// Android Studio pre-1.0 installer
@@ -197,26 +259,42 @@ module.exports.check_android = function() {
maybeSetAndroidHome(path.join(process.env['HOME'], 'android-sdk'));
}
}
if (hasAndroidHome && !androidCmdPath) {
process.env['PATH'] += path.delimiter + path.join(process.env['ANDROID_HOME'], 'tools');
}
if (androidCmdPath && !hasAndroidHome) {
var parentDir = path.dirname(androidCmdPath);
var grandParentDir = path.dirname(parentDir);
if (path.basename(parentDir) == 'tools') {
process.env['ANDROID_HOME'] = path.dirname(parentDir);
hasAndroidHome = true;
} else if (fs.existsSync(path.join(grandParentDir, 'tools', 'android'))) {
process.env['ANDROID_HOME'] = grandParentDir;
hasAndroidHome = true;
} else {
throw new CordovaError('Failed to find \'ANDROID_HOME\' environment variable. Try setting setting it manually.\n' +
'Detected \'android\' command at ' + parentDir + ' but no \'tools\' directory found near.\n' +
'Try reinstall Android SDK or update your PATH to include path to valid SDK directory.');
if (!hasAndroidHome) {
// If we dont have ANDROID_HOME, but we do have some tools on the PATH, try to infer from the tooling PATH.
var parentDir, grandParentDir;
if (androidCmdPath) {
parentDir = path.dirname(androidCmdPath);
grandParentDir = path.dirname(parentDir);
if (path.basename(parentDir) == 'tools' || fs.existsSync(path.join(grandParentDir, 'tools', 'android'))) {
maybeSetAndroidHome(grandParentDir);
} else {
throw new CordovaError('Failed to find \'ANDROID_HOME\' environment variable. Try setting setting it manually.\n' +
'Detected \'android\' command at ' + parentDir + ' but no \'tools\' directory found near.\n' +
'Try reinstall Android SDK or update your PATH to include valid path to SDK' + path.sep + 'tools directory.');
}
}
if (adbInPath) {
parentDir = path.dirname(adbInPath);
grandParentDir = path.dirname(parentDir);
if (path.basename(parentDir) == 'platform-tools') {
maybeSetAndroidHome(grandParentDir);
} else {
throw new CordovaError('Failed to find \'ANDROID_HOME\' environment variable. Try setting setting it manually.\n' +
'Detected \'adb\' command at ' + parentDir + ' but no \'platform-tools\' directory found near.\n' +
'Try reinstall Android SDK or update your PATH to include valid path to SDK' + path.sep + 'platform-tools directory.');
}
}
if (avdmanagerInPath) {
parentDir = path.dirname(avdmanagerInPath);
grandParentDir = path.dirname(parentDir);
if (path.basename(parentDir) == 'bin' && path.basename(grandParentDir) == 'tools') {
maybeSetAndroidHome(path.dirname(grandParentDir));
} else {
throw new CordovaError('Failed to find \'ANDROID_HOME\' environment variable. Try setting setting it manually.\n' +
'Detected \'avdmanager\' command at ' + parentDir + ' but no \'tools' + path.sep + 'bin\' directory found near.\n' +
'Try reinstall Android SDK or update your PATH to include valid path to SDK' + path.sep + 'tools' + path.sep + 'bin directory.');
}
}
}
if (hasAndroidHome && !adbInPath) {
process.env['PATH'] += path.delimiter + path.join(process.env['ANDROID_HOME'], 'platform-tools');
}
if (!process.env['ANDROID_HOME']) {
throw new CordovaError('Failed to find \'ANDROID_HOME\' environment variable. Try setting setting it manually.\n' +
@@ -226,13 +304,27 @@ module.exports.check_android = function() {
throw new CordovaError('\'ANDROID_HOME\' environment variable is set to non-existent path: ' + process.env['ANDROID_HOME'] +
'\nTry update it manually to point to valid SDK directory.');
}
// Next let's make sure relevant parts of the SDK tooling is in our PATH
if (hasAndroidHome && !androidCmdPath) {
process.env['PATH'] += path.delimiter + path.join(process.env['ANDROID_HOME'], 'tools');
}
if (hasAndroidHome && !adbInPath) {
process.env['PATH'] += path.delimiter + path.join(process.env['ANDROID_HOME'], 'platform-tools');
}
if (hasAndroidHome && !avdmanagerInPath) {
process.env['PATH'] += path.delimiter + path.join(process.env['ANDROID_HOME'], 'tools', 'bin');
}
return hasAndroidHome;
});
};
// TODO: is this actually needed?
module.exports.getAbsoluteAndroidCmd = function () {
var cmd = forgivingWhichSync('android');
if (process.platform === 'win32') {
if (cmd.length === 0) {
cmd = forgivingWhichSync('sdkmanager');
}
if (module.exports.isWindows()) {
return '"' + cmd + '"';
}
return cmd.replace(/(\s)/g, '\\$1');
@@ -244,20 +336,17 @@ module.exports.check_android_target = function(originalError) {
// android-L
// Google Inc.:Google APIs:20
// Google Inc.:Glass Development Kit Preview:20
var valid_target = module.exports.get_target();
var msg = 'Android SDK not found. Make sure that it is installed. If it is not at the default location, set the ANDROID_HOME environment variable.';
return tryCommand('android list targets --compact', msg)
.then(function(output) {
var targets = output.split('\n');
if (targets.indexOf(valid_target) >= 0) {
var desired_api_level = module.exports.get_target();
return android_sdk.list_targets()
.then(function(targets) {
if (targets.indexOf(desired_api_level) >= 0) {
return targets;
}
var androidCmd = module.exports.getAbsoluteAndroidCmd();
var msg = 'Please install Android target: "' + valid_target + '".\n\n' +
var msg = 'Please install Android target / API level: "' + desired_api_level + '".\n\n' +
'Hint: Open the SDK manager by running: ' + androidCmd + '\n' +
'You will require:\n' +
'1. "SDK Platform" for ' + valid_target + '\n' +
'1. "SDK Platform" for API level ' + desired_api_level + '\n' +
'2. "Android SDK Platform-tools (latest)\n' +
'3. "Android SDK Build-tools" (latest)';
if (originalError) {
@@ -278,7 +367,6 @@ module.exports.run = function() {
throw new CordovaError('Requirements check failed for JDK 1.8 or greater');
}
if (!values[1]) {
throw new CordovaError('Requirements check failed for Android SDK');
}

View File

@@ -27,11 +27,15 @@ var path = require('path');
var Adb = require('./Adb');
var AndroidManifest = require('./AndroidManifest');
var events = require('cordova-common').events;
var spawn = require('cordova-common').superspawn.spawn;
var superspawn = require('cordova-common').superspawn;
var CordovaError = require('cordova-common').CordovaError;
var shelljs = require('shelljs');
var android_sdk = require('./android_sdk');
var check_reqs = require('./check_reqs');
var Q = require('q');
var os = require('os');
var fs = require('fs');
var child_process = require('child_process');
// constants
@@ -42,18 +46,77 @@ var NUM_INSTALL_RETRIES = 3;
var CHECK_BOOTED_INTERVAL = 3 * ONE_SECOND; // in milliseconds
var EXEC_KILL_SIGNAL = 'SIGKILL';
/**
* Returns a Promise for a list of emulator images in the form of objects
* {
name : <emulator_name>,
path : <path_to_emulator_image>,
target : <api_target>,
abi : <cpu>,
skin : <skin>
}
*/
module.exports.list_images = function() {
return spawn('android', ['list', 'avds'])
function forgivingWhichSync(cmd) {
try {
return fs.realpathSync(shelljs.which(cmd));
} catch (e) {
return '';
}
}
module.exports.list_images_using_avdmanager = function () {
return superspawn.spawn('avdmanager', ['list', 'avd'])
.then(function(output) {
var response = output.split('\n');
var emulator_list = [];
for (var i = 1; i < response.length; i++) {
// To return more detailed information use img_obj
var img_obj = {};
if (response[i].match(/Name:\s/)) {
img_obj['name'] = response[i].split('Name: ')[1].replace('\r', '');
if (response[i + 1].match(/Device:\s/)) {
i++;
img_obj['device'] = response[i].split('Device: ')[1].replace('\r', '');
}
if (response[i + 1].match(/Path:\s/)) {
i++;
img_obj['path'] = response[i].split('Path: ')[1].replace('\r', '');
}
if (response[i + 1].match(/Target:\s/)) {
i++;
if (response[i + 1].match(/ABI:\s/)) {
img_obj['abi'] = response[i + 1].split('ABI: ')[1].replace('\r', '');
}
// This next conditional just aims to match the old output of `android list avd`
// We do so so that we don't have to change the logic when parsing for the
// best emulator target to spawn (see below in `best_image`)
// This allows us to transitionally support both `android` and `avdmanager` binaries,
// depending on what SDK version the user has
if (response[i + 1].match(/Based\son:\s/)) {
img_obj['target'] = response[i + 1].split('Based on:')[1];
if (img_obj['target'].match(/Tag\/ABI:\s/)) {
img_obj['target'] = img_obj['target'].split('Tag/ABI:')[0].replace('\r', '').trim();
if (img_obj['target'].indexOf('(') > -1) {
img_obj['target'] = img_obj['target'].substr(0, img_obj['target'].indexOf('(') - 1).trim();
}
}
var version_string = img_obj['target'].replace(/Android\s+/, '');
var api_level = android_sdk.version_string_to_api_level[version_string];
if (api_level) {
img_obj['target'] += ' (API level ' + api_level + ')';
}
}
}
if (response[i + 1].match(/Skin:\s/)) {
i++;
img_obj['skin'] = response[i].split('Skin: ')[1].replace('\r', '');
}
emulator_list.push(img_obj);
}
/* To just return a list of names use this
if (response[i].match(/Name:\s/)) {
emulator_list.push(response[i].split('Name: ')[1].replace('\r', '');
}*/
}
return emulator_list;
});
};
module.exports.list_images_using_android = function() {
return superspawn.spawn('android', ['list', 'avd'])
.then(function(output) {
var response = output.split('\n');
var emulator_list = [];
@@ -96,6 +159,29 @@ module.exports.list_images = function() {
});
};
/**
* Returns a Promise for a list of emulator images in the form of objects
* {
name : <emulator_name>,
device : <device>,
path : <path_to_emulator_image>,
target : <api_target>,
abi : <cpu>,
skin : <skin>
}
*/
module.exports.list_images = function() {
if (forgivingWhichSync('avdmanager')) {
return module.exports.list_images_using_avdmanager();
} else if (forgivingWhichSync('android')) {
return module.exports.list_images_using_android();
} else {
return Q().then(function() {
throw new CordovaError('Could not find either `android` or `avdmanager` on your $PATH! Are you sure the Android SDK is installed and available?');
});
}
};
/**
* Will return the closest avd to the projects target
* or undefined if no avds exist.
@@ -109,8 +195,7 @@ module.exports.best_image = function() {
var closest = 9999;
var best = images[0];
// Loading check_reqs at run-time to avoid test-time vs run-time directory structure difference issue
var project_target = require('./check_reqs').get_target().replace('android-', '');
var project_target = check_reqs.get_target().replace('android-', '');
for (var i in images) {
var target = images[i].target;
if(target) {
@@ -133,8 +218,9 @@ module.exports.list_started = function() {
};
// Returns a promise.
// TODO: we should remove this, there's a more robust method under android_sdk.js
module.exports.list_targets = function() {
return spawn('android', ['list', 'targets'], {cwd: os.tmpdir()})
return superspawn.spawn('android', ['list', 'targets'], {cwd: os.tmpdir()})
.then(function(output) {
var target_out = output.split('\n');
var targets = [];
@@ -189,8 +275,7 @@ module.exports.start = function(emulator_ID, boot_timeout) {
return best.name;
}
// Loading check_reqs at run-time to avoid test-time vs run-time directory structure difference issue
var androidCmd = require('./check_reqs').getAbsoluteAndroidCmd();
var androidCmd = check_reqs.getAbsoluteAndroidCmd();
return Q.reject(new CordovaError('No emulator images (avds) found.\n' +
'1. Download desired System Image by running: ' + androidCmd + ' sdk\n' +
'2. Create an AVD by running: ' + androidCmd + ' avd\n' +
@@ -199,10 +284,13 @@ module.exports.start = function(emulator_ID, boot_timeout) {
}).then(function(emulatorId) {
return self.get_available_port()
.then(function (port) {
// Figure out the directory the emulator binary runs in, and set the cwd to that directory.
// Workaround for https://code.google.com/p/android/issues/detail?id=235461
var emulator_dir = path.dirname(shelljs.which('emulator'));
var args = ['-avd', emulatorId, '-port', port];
// Don't wait for it to finish, since the emulator will probably keep running for a long time.
child_process
.spawn('emulator', args, { stdio: 'inherit', detached: true })
.spawn('emulator', args, { stdio: 'inherit', detached: true, cwd: emulator_dir })
.unref();
// wait for emulator to start
@@ -294,7 +382,7 @@ module.exports.wait_for_boot = function(emulator_id, time_remaining) {
module.exports.create_image = function(name, target) {
console.log('Creating new avd named ' + name);
if (target) {
return spawn('android', ['create', 'avd', '--name', name, '--target', target])
return superspawn.spawn('android', ['create', 'avd', '--name', name, '--target', target])
.then(null, function(error) {
console.error('ERROR : Failed to create emulator image : ');
console.error(' Do you have the latest android targets including ' + target + '?');
@@ -302,7 +390,8 @@ module.exports.create_image = function(name, target) {
});
} else {
console.log('WARNING : Project target not found, creating avd with a different target but the project may fail to install.');
return spawn('android', ['create', 'avd', '--name', name, '--target', this.list_targets()[0]])
// TODO: there's a more robust method for finding targets in android_sdk.js
return superspawn.spawn('android', ['create', 'avd', '--name', name, '--target', this.list_targets()[0]])
.then(function() {
// TODO: This seems like another error case, even though it always happens.
console.error('ERROR : Unable to create an avd emulator, no targets found.');

View File

@@ -22,7 +22,7 @@
var devices = require('./device');
// Usage support for when args are given
require('../lib/check_reqs').check_android().then(function() {
require('./check_reqs').check_android().then(function() {
devices.list().done(function(device_list) {
device_list && device_list.forEach(function(dev) {
console.log(dev);

View File

@@ -22,7 +22,7 @@
var emulators = require('./emulator');
// Usage support for when args are given
require('../lib/check_reqs').check_android().then(function() {
require('./check_reqs').check_android().then(function() {
emulators.list_images().done(function(emulator_list) {
emulator_list && emulator_list.forEach(function(emu) {
console.log(emu.name);

View File

@@ -22,7 +22,7 @@
var emulators = require('./emulator');
// Usage support for when args are given
require('../lib/check_reqs').check_android().then(function() {
require('./check_reqs').check_android().then(function() {
emulators.list_started().done(function(emulator_list) {
emulator_list && emulator_list.forEach(function(emu) {
console.log(emu);

View File

@@ -46,8 +46,9 @@ module.exports.prepare = function (cordovaProject, options) {
return updateProjectAccordingTo(self._config, self.locations);
})
.then(function () {
updateIcons(cordovaProject, self.locations.res);
updateSplashes(cordovaProject, self.locations.res);
updateIcons(cordovaProject, path.relative(cordovaProject.root, self.locations.res));
updateSplashes(cordovaProject, path.relative(cordovaProject.root, self.locations.res));
updateFileResources(cordovaProject, path.relative(cordovaProject.root, self.locations.root));
})
.then(function () {
events.emit('verbose', 'Prepared android project successfully');
@@ -70,8 +71,9 @@ module.exports.clean = function (options) {
var self = this;
return Q().then(function () {
cleanWww(projectRoot, self.locations);
cleanIcons(projectRoot, projectConfig, self.locations.res);
cleanSplashes(projectRoot, projectConfig, self.locations.res);
cleanIcons(projectRoot, projectConfig, path.relative(projectRoot, self.locations.res));
cleanSplashes(projectRoot, projectConfig, path.relative(projectRoot, self.locations.res));
cleanFileResources(projectRoot, projectConfig, path.relative(projectRoot, self.locations.root));
});
};
@@ -401,6 +403,44 @@ function mapImageResources(rootDir, subDir, type, resourceName) {
return pathMap;
}
function updateFileResources(cordovaProject, platformDir) {
var files = cordovaProject.projectConfig.getFileResources('android');
// if there are resource-file elements in config.xml
if (files.length === 0) {
events.emit('verbose', 'This app does not have additional resource files defined');
return;
}
var resourceMap = {};
files.forEach(function(res) {
var targetPath = path.join(platformDir, res.target);
resourceMap[targetPath] = res.src;
});
events.emit('verbose', 'Updating resource files at ' + platformDir);
FileUpdater.updatePaths(
resourceMap, { rootDir: cordovaProject.root }, logFileOp);
}
function cleanFileResources(projectRoot, projectConfig, platformDir) {
var files = projectConfig.getFileResources('android');
if (files.length > 0) {
events.emit('verbose', 'Cleaning resource files at ' + platformDir);
var resourceMap = {};
files.forEach(function(res) {
var filePath = path.join(platformDir, res.target);
resourceMap[filePath] = null;
});
FileUpdater.updatePaths(
resourceMap, { rootDir: projectRoot, all: true}, logFileOp);
}
}
/**
* Gets and validates 'AndroidLaunchMode' prepference from config.xml. Returns
* preference value and warns if it doesn't seems to be valid

View File

@@ -20,7 +20,7 @@
*/
// Coho updates this line:
var VERSION = "5.3.0-dev";
var VERSION = "6.2.3";
module.exports.version = VERSION;

View File

@@ -1,5 +1,5 @@
// Platform: android
// 0030f1d859d2a8360b621b0d48072f3f08eb6925
// 7ef9f9c03167a4dde4372d869472241b6816fee9
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
@@ -19,7 +19,7 @@
under the License.
*/
;(function() {
var PLATFORM_VERSION_BUILD_LABEL = '5.3.0-dev';
var PLATFORM_VERSION_BUILD_LABEL = '6.2.3';
// file: src/scripts/require.js
/*jshint -W079 */
@@ -330,7 +330,7 @@ module.exports = cordova;
});
// file: F:/coho/cordova-android/cordova-js-src/android/nativeapiprovider.js
// file: /Users/maj/src/cordova-android/cordova-js-src/android/nativeapiprovider.js
define("cordova/android/nativeapiprovider", function(require, exports, module) {
/**
@@ -353,7 +353,7 @@ module.exports = {
});
// file: F:/coho/cordova-android/cordova-js-src/android/promptbasednativeapi.js
// file: /Users/maj/src/cordova-android/cordova-js-src/android/promptbasednativeapi.js
define("cordova/android/promptbasednativeapi", function(require, exports, module) {
/**
@@ -742,8 +742,13 @@ var Channel = function(type, sticky) {
}
};
function forceFunction(f) {
if (typeof f != 'function') throw "Function required as first argument!";
function checkSubscriptionArgument(argument) {
if (typeof argument !== "function" && typeof argument.handleEvent !== "function") {
throw new Error(
"Must provide a function or an EventListener object " +
"implementing the handleEvent interface."
);
}
}
/**
@@ -753,28 +758,39 @@ function forceFunction(f) {
* and a guid that can be used to stop subscribing to the channel.
* Returns the guid.
*/
Channel.prototype.subscribe = function(f, c) {
// need a function to call
forceFunction(f);
Channel.prototype.subscribe = function(eventListenerOrFunction, eventListener) {
checkSubscriptionArgument(eventListenerOrFunction);
var handleEvent, guid;
if (eventListenerOrFunction && typeof eventListenerOrFunction === "object") {
// Received an EventListener object implementing the handleEvent interface
handleEvent = eventListenerOrFunction.handleEvent;
eventListener = eventListenerOrFunction;
} else {
// Received a function to handle event
handleEvent = eventListenerOrFunction;
}
if (this.state == 2) {
f.apply(c || this, this.fireArgs);
handleEvent.apply(eventListener || this, this.fireArgs);
return;
}
var func = f,
guid = f.observer_guid;
if (typeof c == "object") { func = utils.close(c, f); }
guid = eventListenerOrFunction.observer_guid;
if (typeof eventListener === "object") {
handleEvent = utils.close(eventListener, handleEvent);
}
if (!guid) {
// first time any channel has seen this subscriber
// First time any channel has seen this subscriber
guid = '' + nextGuid++;
}
func.observer_guid = guid;
f.observer_guid = guid;
handleEvent.observer_guid = guid;
eventListenerOrFunction.observer_guid = guid;
// Don't add the same handler more than once.
if (!this.handlers[guid]) {
this.handlers[guid] = func;
this.handlers[guid] = handleEvent;
this.numHandlers++;
if (this.numHandlers == 1) {
this.onHasSubscribersChange && this.onHasSubscribersChange();
@@ -785,12 +801,20 @@ Channel.prototype.subscribe = function(f, c) {
/**
* Unsubscribes the function with the given guid from the channel.
*/
Channel.prototype.unsubscribe = function(f) {
// need a function to unsubscribe
forceFunction(f);
Channel.prototype.unsubscribe = function(eventListenerOrFunction) {
checkSubscriptionArgument(eventListenerOrFunction);
var handleEvent, guid, handler;
var guid = f.observer_guid,
handler = this.handlers[guid];
if (eventListenerOrFunction && typeof eventListenerOrFunction === "object") {
// Received an EventListener object implementing the handleEvent interface
handleEvent = eventListenerOrFunction.handleEvent;
} else {
// Received a function to handle event
handleEvent = eventListenerOrFunction;
}
guid = handleEvent.observer_guid;
handler = this.handlers[guid];
if (handler) {
delete this.handlers[guid];
this.numHandlers--;
@@ -862,7 +886,7 @@ module.exports = channel;
});
// file: F:/coho/cordova-android/cordova-js-src/exec.js
// file: /Users/maj/src/cordova-android/cordova-js-src/exec.js
define("cordova/exec", function(require, exports, module) {
/**
@@ -924,6 +948,9 @@ function androidExec(success, fail, service, action, args) {
androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT);
}
// If args is not provided, default to an empty array
args = args || [];
// Process any ArrayBuffers in the args into a string.
for (var i = 0; i < args.length; i++) {
if (utils.typeName(args[i]) == 'ArrayBuffer') {
@@ -1622,7 +1649,7 @@ exports.reset();
});
// file: F:/coho/cordova-android/cordova-js-src/platform.js
// file: /Users/maj/src/cordova-android/cordova-js-src/platform.js
define("cordova/platform", function(require, exports, module) {
// The last resume event that was received that had the result of a plugin call.
@@ -1732,7 +1759,7 @@ function onMessageFromNative(msg) {
});
// file: F:/coho/cordova-android/cordova-js-src/plugin/android/app.js
// file: /Users/maj/src/cordova-android/cordova-js-src/plugin/android/app.js
define("cordova/plugin/android/app", function(require, exports, module) {
var exec = require('cordova/exec');
@@ -2094,7 +2121,10 @@ utils.clone = function(obj) {
retVal = {};
for(i in obj){
if((!(i in retVal) || retVal[i] != obj[i]) && typeof obj[i] != 'undefined') {
// https://issues.apache.org/jira/browse/CB-11522 'unknown' type may be returned in
// custom protocol activation case on Windows Phone 8.1 causing "No such interface supported" exception
// on cloning.
if((!(i in retVal) || retVal[i] != obj[i]) && typeof obj[i] != 'undefined' && typeof obj[i] != 'unknown') {
retVal[i] = utils.clone(obj[i]);
}
}

View File

@@ -30,7 +30,7 @@ buildscript {
// http://tools.android.com/tech-docs/new-build-system/version-compatibility
// and https://issues.apache.org/jira/browse/CB-8143
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0'
classpath 'com.android.tools.build:gradle:2.2.3'
}
}
@@ -264,7 +264,7 @@ def promptForReleaseKeyPassword() {
gradle.taskGraph.whenReady { taskGraph ->
taskGraph.getAllTasks().each() { task ->
if (task.name == 'validateReleaseSigning') {
if (task.name == 'validateReleaseSigning' || task.name == 'validateSigningRelease') {
promptForReleaseKeyPassword()
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1 @@
//This file is intentionally just a comment

View File

@@ -16,27 +16,32 @@
under the License.
*/
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
}
}
apply plugin: 'com.android.library'
ext {
apply from: 'cordova.gradle'
cdvCompileSdkVersion = privateHelpers.getProjectTarget()
cdvBuildToolsVersion = privateHelpers.findLatestInstalledBuildTools()
}
buildscript {
repositories {
mavenCentral()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3'
}
}
apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
group = 'org.apache.cordova'
version = '6.2.3'
android {
compileSdkVersion cdvCompileSdkVersion
buildToolsVersion cdvBuildToolsVersion
@@ -58,4 +63,73 @@ android {
assets.srcDirs = ['assets']
}
}
packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/NOTICE'
}
}
install {
repositories.mavenInstaller {
pom {
project {
packaging 'aar'
name 'Cordova'
url 'https://cordova.apache.org'
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
developers {
developer {
id 'stevengill'
name 'Steve Gill'
}
}
scm {
connection 'https://git-wip-us.apache.org/repos/asf?p=cordova-android.git'
developerConnection 'https://git-wip-us.apache.org/repos/asf?p=cordova-android.git'
url 'https://git-wip-us.apache.org/repos/asf?p=cordova-android'
}
}
}
}
}
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
artifacts {
archives sourcesJar
}
bintray {
user = System.getenv('BINTRAY_USER')
key = System.getenv('BINTRAY_KEY')
configurations = ['archives']
pkg {
repo = 'maven'
name = 'cordova-android'
userOrg = 'cordova'
licenses = ['Apache-2.0']
vcsUrl = 'https://git-wip-us.apache.org/repos/asf?p=cordova-android.git'
websiteUrl = 'https://cordova.apache.org'
issueTrackerUrl = 'https://issues.apache.org/jira/browse/CB'
publicDownloadNumbers = true
licenses = ['Apache-2.0']
labels = ['android', 'cordova', 'phonegap']
version {
name = '6.2.3'
released = new Date()
vcsTag = '6.2.3'
}
}
}

View File

@@ -0,0 +1,6 @@
#Mon Dec 28 10:00:20 PST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip

View File

@@ -10,7 +10,7 @@
# Indicates whether an apk should be generated for each density.
split.density=false
# Project target.
target=android-24
target=android-25
apk-configurations=
renderscript.opt.level=O0
android.library=true

View File

@@ -31,7 +31,7 @@ import android.webkit.WebChromeClient.CustomViewCallback;
* are not expected to implement it.
*/
public interface CordovaWebView {
public static final String CORDOVA_VERSION = "5.3.0-dev";
public static final String CORDOVA_VERSION = "6.2.3";
void init(CordovaInterface cordova, List<PluginEntry> pluginEntries, CordovaPreferences preferences);

View File

@@ -488,6 +488,34 @@ public class NativeToJsMessageQueue {
encodeAsMessageHelper(sb, pluginResult);
}
void buildJsMessage(StringBuilder sb) {
switch (pluginResult.getMessageType()) {
case PluginResult.MESSAGE_TYPE_MULTIPART:
int size = pluginResult.getMultipartMessagesSize();
for (int i=0; i<size; i++) {
PluginResult subresult = pluginResult.getMultipartMessage(i);
JsMessage submessage = new JsMessage(subresult, jsPayloadOrCallbackId);
submessage.buildJsMessage(sb);
if (i < (size-1)) {
sb.append(",");
}
}
break;
case PluginResult.MESSAGE_TYPE_BINARYSTRING:
sb.append("atob('")
.append(pluginResult.getMessage())
.append("')");
break;
case PluginResult.MESSAGE_TYPE_ARRAYBUFFER:
sb.append("cordova.require('cordova/base64').toArrayBuffer('")
.append(pluginResult.getMessage())
.append("')");
break;
default:
sb.append(pluginResult.getMessage());
}
}
void encodeAsJsMessage(StringBuilder sb) {
if (pluginResult == null) {
sb.append(jsPayloadOrCallbackId);
@@ -495,29 +523,16 @@ public class NativeToJsMessageQueue {
int status = pluginResult.getStatus();
boolean success = (status == PluginResult.Status.OK.ordinal()) || (status == PluginResult.Status.NO_RESULT.ordinal());
sb.append("cordova.callbackFromNative('")
.append(jsPayloadOrCallbackId)
.append("',")
.append(success)
.append(",")
.append(status)
.append(",[");
switch (pluginResult.getMessageType()) {
case PluginResult.MESSAGE_TYPE_BINARYSTRING:
sb.append("atob('")
.append(pluginResult.getMessage())
.append("')");
break;
case PluginResult.MESSAGE_TYPE_ARRAYBUFFER:
sb.append("cordova.require('cordova/base64').toArrayBuffer('")
.append(pluginResult.getMessage())
.append("')");
break;
default:
sb.append(pluginResult.getMessage());
}
.append(jsPayloadOrCallbackId)
.append("',")
.append(success)
.append(",")
.append(status)
.append(",[");
buildJsMessage(sb);
sb.append("],")
.append(pluginResult.getKeepCallback())
.append(");");
.append(pluginResult.getKeepCallback())
.append(");");
}
}
}

View File

@@ -210,6 +210,11 @@ public class SystemWebViewEngine implements CordovaWebViewEngine {
settings.setAppCachePath(databasePath);
settings.setAppCacheEnabled(true);
// Enable scaling
// Fix for CB-12015
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);
// Fix for CB-1405
// Google issue 4641
String defaultUserAgent = settings.getUserAgentString();

1
node_modules/abbrev/abbrev.js generated vendored
View File

@@ -1,4 +1,3 @@
module.exports = exports = abbrev.abbrev = abbrev
abbrev.monkeyPatch = monkeyPatch

31
node_modules/abbrev/package.json generated vendored
View File

@@ -14,20 +14,19 @@
]
],
"_from": "abbrev@>=1.0.0 <2.0.0",
"_id": "abbrev@1.0.9",
"_id": "abbrev@1.1.0",
"_inCache": true,
"_installable": true,
"_location": "/abbrev",
"_nodeVersion": "4.4.4",
"_nodeVersion": "8.0.0-pre",
"_npmOperationalInternal": {
"host": "packages-16-east.internal.npmjs.com",
"tmp": "tmp/abbrev-1.0.9.tgz_1466016055839_0.7825860097073019"
"host": "packages-12-west.internal.npmjs.com",
"tmp": "tmp/abbrev-1.1.0.tgz_1487054000015_0.9229173036292195"
},
"_npmUser": {
"name": "isaacs",
"email": "i@izs.me"
},
"_npmVersion": "3.9.1",
"_npmVersion": "4.3.0",
"_phantomChildren": {},
"_requested": {
"raw": "abbrev@1",
@@ -39,11 +38,10 @@
"type": "range"
},
"_requiredBy": [
"/istanbul",
"/nopt"
],
"_resolved": "http://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
"_shasum": "91b4792588a7738c25f35dd6f63752a2f8776135",
"_resolved": "http://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz",
"_shasum": "d0554c2256636e2f56e7c2e5ad183f859428d81f",
"_shrinkwrap": null,
"_spec": "abbrev@1",
"_where": "/Users/steveng/repo/cordova/cordova-android/node_modules/nopt",
@@ -57,17 +55,17 @@
"dependencies": {},
"description": "Like ruby's abbrev module, but in js",
"devDependencies": {
"tap": "^5.7.2"
"tap": "^10.1"
},
"directories": {},
"dist": {
"shasum": "91b4792588a7738c25f35dd6f63752a2f8776135",
"tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz"
"shasum": "d0554c2256636e2f56e7c2e5ad183f859428d81f",
"tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz"
},
"files": [
"abbrev.js"
],
"gitHead": "c386cd9dbb1d8d7581718c54d4ba944cc9298d6f",
"gitHead": "7136d4d95449dc44115d4f78b80ec907724f64e0",
"homepage": "https://github.com/isaacs/abbrev-js#readme",
"license": "ISC",
"main": "abbrev.js",
@@ -85,7 +83,10 @@
"url": "git+ssh://git@github.com/isaacs/abbrev-js.git"
},
"scripts": {
"test": "tap test.js --cov"
"postpublish": "git push origin --all; git push origin --tags",
"postversion": "npm publish",
"preversion": "npm test",
"test": "tap test.js --100"
},
"version": "1.0.9"
"version": "1.1.0"
}

1
node_modules/ansi/package.json generated vendored
View File

@@ -16,7 +16,6 @@
"_from": "ansi@>=0.3.1 <0.4.0",
"_id": "ansi@0.3.1",
"_inCache": true,
"_installable": true,
"_location": "/ansi",
"_nodeVersion": "5.3.0",
"_npmUser": {

View File

@@ -16,7 +16,6 @@
"_from": "balanced-match@>=0.4.1 <0.5.0",
"_id": "balanced-match@0.4.2",
"_inCache": true,
"_installable": true,
"_location": "/balanced-match",
"_nodeVersion": "4.4.7",
"_npmOperationalInternal": {

View File

@@ -16,7 +16,6 @@
"_from": "base64-js@0.0.8",
"_id": "base64-js@0.0.8",
"_inCache": true,
"_installable": true,
"_location": "/base64-js",
"_nodeVersion": "0.10.35",
"_npmUser": {

17
node_modules/big-integer/.npmignore generated vendored
View File

@@ -1,17 +0,0 @@
/.travis.yml
/.npmignore
/.gitignore
/spec
/benchmark
/big-integer*.tgz
/my.conf.js
/node_modules
/*.csproj*
/*.sh
/*.suo
/bin
/coverage
/*.bat
/obj
/Properties
/Web.*

View File

@@ -118,7 +118,7 @@ var bigInt = (function (undefined) {
}
BigInteger.prototype.add = function (v) {
var value, n = parseValue(v);
var n = parseValue(v);
if (this.sign !== n.sign) {
return this.subtract(n.negate());
}
@@ -177,7 +177,7 @@ var bigInt = (function (undefined) {
}
function subtractAny(a, b, sign) {
var value, isSmall;
var value;
if (compareAbs(a, b) >= 0) {
value = subtract(a,b);
} else {
@@ -326,7 +326,7 @@ var bigInt = (function (undefined) {
}
BigInteger.prototype.multiply = function (v) {
var value, n = parseValue(v),
var n = parseValue(v),
a = this.value, b = n.value,
sign = this.sign !== n.sign,
abs;
@@ -467,6 +467,7 @@ var bigInt = (function (undefined) {
guess, xlen, highx, highy, check;
while (a_l) {
part.unshift(a[--a_l]);
trim(part);
if (compareAbs(part, b) < 0) {
result.push(0);
continue;
@@ -825,19 +826,24 @@ var bigInt = (function (undefined) {
BigInteger.prototype.modInv = function (n) {
var t = bigInt.zero, newT = bigInt.one, r = parseValue(n), newR = this.abs(), q, lastT, lastR;
while (!newR.equals(bigInt.zero)) {
q = r.divide(newR);
lastT = t;
lastR = r;
t = newT;
r = newR;
newT = lastT.subtract(q.multiply(newT));
newR = lastR.subtract(q.multiply(newR));
q = r.divide(newR);
lastT = t;
lastR = r;
t = newT;
r = newR;
newT = lastT.subtract(q.multiply(newT));
newR = lastR.subtract(q.multiply(newR));
}
if (!r.equals(1)) throw new Error(this.toString() + " and " + n.toString() + " are not co-prime");
if (t.compare(0) === -1) {
t = t.add(n);
t = t.add(n);
}
if (this.isNegative()) {
return t.negate();
}
return t;
}
};
SmallInteger.prototype.modInv = BigInteger.prototype.modInv;
BigInteger.prototype.next = function () {
@@ -976,7 +982,7 @@ var bigInt = (function (undefined) {
b = parseValue(b);
return a.greater(b) ? a : b;
}
function min(a,b) {
function min(a, b) {
a = parseValue(a);
b = parseValue(b);
return a.lesser(b) ? a : b;
@@ -1031,8 +1037,7 @@ var bigInt = (function (undefined) {
return low.add(typeof result === "number" ? new SmallInteger(result) : new BigInteger(result, false));
}
var parseBase = function (text, base) {
var val = Integer[0], pow = Integer[1],
length = text.length;
var length = text.length;
if (2 <= base && base <= 36) {
if (length <= LOG_MAX_INT / Math.log(base)) {
return new SmallInteger(parseInt(text, base));
@@ -1054,13 +1059,17 @@ var bigInt = (function (undefined) {
}
else throw new Error(c + " is not a valid character");
}
digits.reverse();
for (i = 0; i < digits.length; i++) {
return parseBaseFromArray(digits, base, isNegative);
};
function parseBaseFromArray(digits, base, isNegative) {
var val = Integer[0], pow = Integer[1], i;
for (i = digits.length - 1; i >= 0; i--) {
val = val.add(digits[i].times(pow));
pow = pow.times(base);
}
return isNegative ? val.negate() : val;
};
}
function stringify(digit) {
var v = digit.value;
@@ -1204,6 +1213,11 @@ var bigInt = (function (undefined) {
Integer.lcm = lcm;
Integer.isInstance = function (x) { return x instanceof BigInteger || x instanceof SmallInteger; };
Integer.randBetween = randBetween;
Integer.fromArray = function (digits, base, isNegative) {
return parseBaseFromArray(digits.map(parseValue), parseValue(base || 10), isNegative);
};
return Integer;
})();
@@ -1211,3 +1225,10 @@ var bigInt = (function (undefined) {
if (typeof module !== "undefined" && module.hasOwnProperty("exports")) {
module.exports = bigInt;
}
//amd check
if ( typeof define === "function" && define.amd ) {
define( "big-integer", [], function() {
return bigInt;
});
}

File diff suppressed because one or more lines are too long

24
node_modules/big-integer/LICENSE generated vendored Normal file
View 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>

7
node_modules/big-integer/README.md generated vendored
View File

@@ -421,6 +421,13 @@ Performs the bitwise XOR operation. The operands are treated as if they were rep
### 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`.

View File

@@ -14,20 +14,19 @@
]
],
"_from": "big-integer@>=1.6.7 <2.0.0",
"_id": "big-integer@1.6.16",
"_id": "big-integer@1.6.22",
"_inCache": true,
"_installable": true,
"_location": "/big-integer",
"_nodeVersion": "4.4.5",
"_nodeVersion": "6.9.4",
"_npmOperationalInternal": {
"host": "packages-16-east.internal.npmjs.com",
"tmp": "tmp/big-integer-1.6.16.tgz_1473665148825_0.5824211346916854"
"host": "packages-12-west.internal.npmjs.com",
"tmp": "tmp/big-integer-1.6.22.tgz_1493091323169_0.5048394540790468"
},
"_npmUser": {
"name": "peterolson",
"email": "peter.e.c.olson+npm@gmail.com"
},
"_npmVersion": "2.15.5",
"_npmVersion": "3.10.10",
"_phantomChildren": {},
"_requested": {
"raw": "big-integer@^1.6.7",
@@ -41,8 +40,8 @@
"_requiredBy": [
"/bplist-parser"
],
"_resolved": "http://registry.npmjs.org/big-integer/-/big-integer-1.6.16.tgz",
"_shasum": "0ca30b58013db46b10084a09242ca1d8954724cc",
"_resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.22.tgz",
"_shasum": "487c95fce886022ea48ff5f19e388932df46dd2e",
"_shrinkwrap": null,
"_spec": "big-integer@^1.6.7",
"_where": "/Users/steveng/repo/cordova/cordova-android/node_modules/bplist-parser",
@@ -64,17 +63,18 @@
"karma": "^0.13.3",
"karma-coverage": "^0.4.2",
"karma-jasmine": "^0.3.6",
"karma-phantomjs-launcher": "~0.1"
"karma-phantomjs-launcher": "~0.1",
"uglifyjs": "^2.4.10"
},
"directories": {},
"dist": {
"shasum": "0ca30b58013db46b10084a09242ca1d8954724cc",
"tarball": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.16.tgz"
"shasum": "487c95fce886022ea48ff5f19e388932df46dd2e",
"tarball": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.22.tgz"
},
"engines": {
"node": ">=0.6"
},
"gitHead": "09b50ab4e701a2ec4d403fa3ecf12ae327227190",
"gitHead": "40483b881b4380931e5af6f2f8a161b6caa71690",
"homepage": "https://github.com/peterolson/BigInteger.js#readme",
"keywords": [
"math",
@@ -103,7 +103,8 @@
"url": "git+ssh://git@github.com/peterolson/BigInteger.js.git"
},
"scripts": {
"minify": "uglifyjs BigInteger.js -o BigInteger.min.js",
"test": "karma start my.conf.js"
},
"version": "1.6.16"
"version": "1.6.22"
}

View File

@@ -16,7 +16,6 @@
"_from": "bplist-parser@>=0.1.0 <0.2.0",
"_id": "bplist-parser@0.1.1",
"_inCache": true,
"_installable": true,
"_location": "/bplist-parser",
"_nodeVersion": "5.1.0",
"_npmUser": {

View File

@@ -5,6 +5,7 @@ as known from sh/bash, in JavaScript.
[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion)
[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion)
[![Greenkeeper badge](https://badges.greenkeeper.io/juliangruber/brace-expansion.svg)](https://greenkeeper.io/)
[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion)

View File

@@ -106,7 +106,7 @@ function expand(str, isTop) {
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 = /^(.*,)+(.+)?$/.test(m.body);
var isOptions = m.body.indexOf(',') >= 0;
if (!isSequence && !isOptions) {
// {a},b}
if (m.post.match(/,.*\}/)) {

View File

@@ -14,20 +14,19 @@
]
],
"_from": "brace-expansion@>=1.0.0 <2.0.0",
"_id": "brace-expansion@1.1.6",
"_id": "brace-expansion@1.1.7",
"_inCache": true,
"_installable": true,
"_location": "/brace-expansion",
"_nodeVersion": "4.4.7",
"_nodeVersion": "7.8.0",
"_npmOperationalInternal": {
"host": "packages-16-east.internal.npmjs.com",
"tmp": "tmp/brace-expansion-1.1.6.tgz_1469047715600_0.9362958471756428"
"host": "packages-12-west.internal.npmjs.com",
"tmp": "tmp/brace-expansion-1.1.7.tgz_1491552830231_0.7213963181711733"
},
"_npmUser": {
"name": "juliangruber",
"email": "julian@juliangruber.com"
},
"_npmVersion": "2.15.8",
"_npmVersion": "4.2.0",
"_phantomChildren": {},
"_requested": {
"raw": "brace-expansion@^1.0.0",
@@ -41,8 +40,8 @@
"_requiredBy": [
"/minimatch"
],
"_resolved": "http://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz",
"_shasum": "7197d7eaa9b87e648390ea61fc66c84427420df9",
"_resolved": "http://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz",
"_shasum": "3effc3c50e000531fb720eaff80f0ae8ef23cf59",
"_shrinkwrap": null,
"_spec": "brace-expansion@^1.0.0",
"_where": "/Users/steveng/repo/cordova/cordova-android/node_modules/minimatch",
@@ -60,14 +59,15 @@
},
"description": "Brace expansion as known from sh/bash",
"devDependencies": {
"matcha": "^0.7.0",
"tape": "^4.6.0"
},
"directories": {},
"dist": {
"shasum": "7197d7eaa9b87e648390ea61fc66c84427420df9",
"tarball": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz"
"shasum": "3effc3c50e000531fb720eaff80f0ae8ef23cf59",
"tarball": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz"
},
"gitHead": "791262fa06625e9c5594cde529a21d82086af5f2",
"gitHead": "892512024872ca7680554be90f6e8ce065053372",
"homepage": "https://github.com/juliangruber/brace-expansion",
"keywords": [],
"license": "MIT",
@@ -90,6 +90,7 @@
"url": "git://github.com/juliangruber/brace-expansion.git"
},
"scripts": {
"bench": "matcha test/perf/bench.js",
"gentest": "bash test/generate.sh",
"test": "tape test/*.js"
},
@@ -109,5 +110,5 @@
"android-browser/4.2..latest"
]
},
"version": "1.1.6"
"version": "1.1.7"
}

View File

@@ -16,7 +16,6 @@
"_from": "concat-map@0.0.1",
"_id": "concat-map@0.0.1",
"_inCache": true,
"_installable": true,
"_location": "/concat-map",
"_npmUser": {
"name": "substack",

View File

@@ -1,2 +1,3 @@
fixtures
coverage
jasmine.json

View File

@@ -20,6 +20,23 @@
-->
# Cordova-common Release Notes
### 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`

View File

@@ -2,49 +2,48 @@
"_args": [
[
{
"raw": "cordova-common@^1.5.0",
"raw": "cordova-common@^2.0.1",
"scope": null,
"escapedName": "cordova-common",
"name": "cordova-common",
"rawSpec": "^1.5.0",
"spec": ">=1.5.0 <2.0.0",
"rawSpec": "^2.0.1",
"spec": ">=2.0.1 <3.0.0",
"type": "range"
},
"/Users/steveng/repo/cordova/cordova-android"
]
],
"_from": "cordova-common@>=1.5.0 <2.0.0",
"_id": "cordova-common@1.5.1",
"_from": "cordova-common@>=2.0.1 <3.0.0",
"_id": "cordova-common@2.0.2",
"_inCache": true,
"_installable": true,
"_location": "/cordova-common",
"_nodeVersion": "6.6.0",
"_nodeVersion": "4.7.3",
"_npmOperationalInternal": {
"host": "packages-12-west.internal.npmjs.com",
"tmp": "tmp/cordova-common-1.5.1.tgz_1476725179180_0.39604957425035536"
"tmp": "tmp/cordova-common-2.0.2.tgz_1492453798445_0.6290795875247568"
},
"_npmUser": {
"name": "stevegill",
"email": "stevengill97@gmail.com"
"name": "shazron",
"email": "shazron@gmail.com"
},
"_npmVersion": "3.10.3",
"_npmVersion": "2.15.11",
"_phantomChildren": {},
"_requested": {
"raw": "cordova-common@^1.5.0",
"raw": "cordova-common@^2.0.1",
"scope": null,
"escapedName": "cordova-common",
"name": "cordova-common",
"rawSpec": "^1.5.0",
"spec": ">=1.5.0 <2.0.0",
"rawSpec": "^2.0.1",
"spec": ">=2.0.1 <3.0.0",
"type": "range"
},
"_requiredBy": [
"/"
],
"_resolved": "file:cordova-dist/tools/cordova-common-1.5.1.tgz",
"_shasum": "6770de0d6200ad6f94a1abe8939b5bd9ece139e3",
"_resolved": "http://registry.npmjs.org/cordova-common/-/cordova-common-2.0.2.tgz",
"_shasum": "57467976b8afd5e0bd0a13111b66a420441601cb",
"_shrinkwrap": null,
"_spec": "cordova-common@^1.5.0",
"_spec": "cordova-common@^2.0.1",
"_where": "/Users/steveng/repo/cordova/cordova-android",
"author": {
"name": "Apache Software Foundation"
@@ -71,20 +70,20 @@
},
"description": "Apache Cordova tools and platforms shared routines",
"devDependencies": {
"istanbul": "^0.3.17",
"jasmine-node": "^1.14.5",
"istanbul": "^0.4.5",
"jasmine": "^2.5.2",
"jshint": "^2.8.0",
"promise-matchers": "^0.9.6",
"rewire": "^2.5.1"
},
"directories": {},
"dist": {
"shasum": "6770de0d6200ad6f94a1abe8939b5bd9ece139e3",
"tarball": "https://registry.npmjs.org/cordova-common/-/cordova-common-1.5.1.tgz"
"shasum": "57467976b8afd5e0bd0a13111b66a420441601cb",
"tarball": "https://registry.npmjs.org/cordova-common/-/cordova-common-2.0.2.tgz"
},
"engineStrict": true,
"engines": {
"node": ">=0.9.9"
"node": ">=4.0.0"
},
"license": "Apache-2.0",
"main": "cordova-common.js",
@@ -93,6 +92,10 @@
"name": "bowserj",
"email": "bowserj@apache.org"
},
{
"name": "filmaj",
"email": "maj.fil@gmail.com"
},
{
"name": "kotikov.vladimir",
"email": "kotikov.vladimir@gmail.com"
@@ -122,10 +125,10 @@
"url": "git://git-wip-us.apache.org/repos/asf/cordova-common.git"
},
"scripts": {
"cover": "node node_modules/istanbul/lib/cli.js cover --root src --print detail node_modules/jasmine-node/bin/jasmine-node -- spec",
"jasmine": "node node_modules/jasmine-node/bin/jasmine-node --captureExceptions --color spec",
"jshint": "node node_modules/jshint/bin/jshint src && node node_modules/jshint/bin/jshint spec",
"cover": "istanbul cover --root src --print detail jasmine",
"jasmine": "jasmine --captureExceptions --color",
"jshint": "jshint src && jshint spec",
"test": "npm run jshint && npm run jasmine"
},
"version": "1.5.1"
"version": "2.0.2"
}

View File

@@ -1,21 +1,21 @@
/*
*
* Copyright 2013 Anis Kadri
*
* 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.
*
*/
/**
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:
@@ -31,11 +31,8 @@
/* jshint sub:true */
var fs = require('fs'),
path = require('path'),
var path = require('path'),
et = require('elementtree'),
semver = require('semver'),
events = require('../events'),
ConfigKeeper = require('./ConfigKeeper'),
CordovaLogger = require('../CordovaLogger');
@@ -109,18 +106,6 @@ function remove_plugin_changes(pluginInfo, is_top_level) {
var munge = mungeutil.decrement_munge(global_munge, config_munge);
for (var file in munge.files) {
// CB-6976 Windows Universal Apps. Compatibility fix for existing plugins.
if (self.platform == 'windows' && file == 'package.appxmanifest' &&
!fs.existsSync(path.join(self.project_dir, 'package.appxmanifest'))) {
// New windows template separate manifest files for Windows10, Windows8.1 and WP8.1
var substs = ['package.phone.appxmanifest', 'package.windows.appxmanifest', 'package.windows10.appxmanifest'];
/* jshint loopfunc:true */
substs.forEach(function(subst) {
events.emit('verbose', 'Applying munge to ' + subst);
self.apply_file_munge(subst, munge.files[file], true);
});
/* jshint loopfunc:false */
}
self.apply_file_munge(file, munge.files[file], /* remove = */ true);
}
@@ -250,18 +235,6 @@ function munge_helper(should_increment, self, platform_config, config_munge) {
}
for (var file in munge.files) {
// CB-6976 Windows Universal Apps. Compatibility fix for existing plugins.
if (self.platform == 'windows' && file == 'package.appxmanifest' &&
!fs.existsSync(path.join(self.project_dir, 'package.appxmanifest'))) {
var substs = ['package.phone.appxmanifest', 'package.windows.appxmanifest', 'package.windows10.appxmanifest'];
/* jshint loopfunc:true */
substs.forEach(function(subst) {
events.emit('verbose', 'Applying munge to ' + subst);
self.apply_file_munge(subst, munge.files[file]);
});
/* jshint loopfunc:false */
}
self.apply_file_munge(file, munge.files[file]);
}
@@ -333,92 +306,6 @@ function generate_plugin_config_munge(pluginInfo, vars, edit_config_changes) {
Array.prototype.push.apply(changes, edit_config_changes);
}
// Demux 'package.appxmanifest' into relevant platform-specific appx manifests.
// Only spend the cycles if there are version-specific plugin settings
if (self.platform === 'windows' &&
changes.some(function(change) {
return ((typeof change.versions !== 'undefined') ||
(typeof change.deviceTarget !== 'undefined'));
}))
{
var manifests = {
'windows': {
'8.1.0': 'package.windows.appxmanifest',
'10.0.0': 'package.windows10.appxmanifest'
},
'phone': {
'8.1.0': 'package.phone.appxmanifest',
'10.0.0': 'package.windows10.appxmanifest'
},
'all': {
'8.1.0': ['package.windows.appxmanifest', 'package.phone.appxmanifest'],
'10.0.0': 'package.windows10.appxmanifest'
}
};
var oldChanges = changes;
changes = [];
oldChanges.forEach(function(change, changeIndex) {
// Only support semver/device-target demux for package.appxmanifest
// Pass through in case something downstream wants to use it
if (change.target !== 'package.appxmanifest') {
changes.push(change);
return;
}
var hasVersion = (typeof change.versions !== 'undefined');
var hasTargets = (typeof change.deviceTarget !== 'undefined');
// No semver/device-target for this config-file, pass it through
if (!(hasVersion || hasTargets)) {
changes.push(change);
return;
}
var targetDeviceSet = hasTargets ? change.deviceTarget : 'all';
if (['windows', 'phone', 'all'].indexOf(targetDeviceSet) === -1) {
// target-device couldn't be resolved, fix it up here to a valid value
targetDeviceSet = 'all';
}
var knownWindowsVersionsForTargetDeviceSet = Object.keys(manifests[targetDeviceSet]);
// at this point, 'change' targets package.appxmanifest and has a version attribute
knownWindowsVersionsForTargetDeviceSet.forEach(function(winver) {
// This is a local function that creates the new replacement representing the
// mutation. Used to save code further down.
var createReplacement = function(manifestFile, originalChange) {
var replacement = {
target: manifestFile,
parent: originalChange.parent,
after: originalChange.after,
xmls: originalChange.xmls,
versions: originalChange.versions,
deviceTarget: originalChange.deviceTarget
};
return replacement;
};
// version doesn't satisfy, so skip
if (hasVersion && !semver.satisfies(winver, change.versions)) {
return;
}
var versionSpecificManifests = manifests[targetDeviceSet][winver];
if (versionSpecificManifests.constructor === Array) {
// e.g. all['8.1.0'] === ['pkg.windows.appxmanifest', 'pkg.phone.appxmanifest']
versionSpecificManifests.forEach(function(manifestFile) {
changes.push(createReplacement(manifestFile, change));
});
}
else {
// versionSpecificManifests is actually a single string
changes.push(createReplacement(versionSpecificManifests, change));
}
});
});
}
changes.forEach(function(change) {
change.xmls.forEach(function(xml) {
// 1. stringify each xml

View File

@@ -116,6 +116,16 @@ ConfigParser.prototype = {
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'));
},
@@ -256,6 +266,30 @@ ConfigParser.prototype = {
return this.getStaticResources(platform, 'splash');
},
/**
* Returns all resource-files for a specific platform.
* @param {string} platform Platform name
* @return {Resource[]} Array of resource file objects.
*/
getFileResources: function(platform) {
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
};
});
}
return fileResources;
},
/**
* Returns all hook scripts for the hook type specified.
* @param {String} hook The hook type.

View File

@@ -108,6 +108,7 @@ function PluginInfo(dirname) {
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
@@ -225,7 +226,8 @@ function PluginInfo(dirname) {
target: tag.attrib.target,
versions: tag.attrib.versions,
deviceTarget: tag.attrib['device-target'],
arch: tag.attrib.arch
arch: tag.attrib.arch,
reference: tag.attrib.reference
};
});
return resourceFiles;
@@ -317,13 +319,15 @@ function PluginInfo(dirname) {
type: el.attrib.type,
parent: el.attrib.parent,
custom: isStrTrue(el.attrib.custom),
embed: isStrTrue(el.attrib.embed),
src: el.attrib.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
arch: el.attrib.arch,
implementation: el.attrib.implementation
};
return ret;
});

View File

@@ -20,6 +20,7 @@
var EventEmitter = require('events').EventEmitter;
var INSTANCE = new EventEmitter();
INSTANCE.setMaxListeners(20);
var EVENTS_RECEIVER;
module.exports = INSTANCE;

View File

@@ -167,6 +167,12 @@ exports.spawn = function(cmd, args, opts) {
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);
}

View File

@@ -1,21 +1,21 @@
/*
*
* Copyright 2013 Brett Rudd
*
* 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.
*
*/
/**
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 PLIST utility functions
var __ = require('underscore');

View File

@@ -1,21 +1,21 @@
/*
*
* Copyright 2013 Anis Kadri
*
* 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.
*
*/
/**
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 */

View File

@@ -16,7 +16,6 @@
"_from": "cordova-registry-mapper@>=1.1.8 <2.0.0",
"_id": "cordova-registry-mapper@1.1.15",
"_inCache": true,
"_installable": true,
"_location": "/cordova-registry-mapper",
"_nodeVersion": "5.4.1",
"_npmUser": {

View File

@@ -2,21 +2,20 @@
"_args": [
[
{
"raw": "elementtree@^0.1.6",
"raw": "elementtree@0.1.6",
"scope": null,
"escapedName": "elementtree",
"name": "elementtree",
"rawSpec": "^0.1.6",
"spec": ">=0.1.6 <0.2.0",
"type": "range"
"rawSpec": "0.1.6",
"spec": "0.1.6",
"type": "version"
},
"/Users/steveng/repo/cordova/cordova-android"
]
],
"_from": "elementtree@>=0.1.6 <0.2.0",
"_from": "elementtree@0.1.6",
"_id": "elementtree@0.1.6",
"_inCache": true,
"_installable": true,
"_location": "/elementtree",
"_npmUser": {
"name": "rphillips",
@@ -25,13 +24,13 @@
"_npmVersion": "1.3.24",
"_phantomChildren": {},
"_requested": {
"raw": "elementtree@^0.1.6",
"raw": "elementtree@0.1.6",
"scope": null,
"escapedName": "elementtree",
"name": "elementtree",
"rawSpec": "^0.1.6",
"spec": ">=0.1.6 <0.2.0",
"type": "range"
"rawSpec": "0.1.6",
"spec": "0.1.6",
"type": "version"
},
"_requiredBy": [
"/",
@@ -40,7 +39,7 @@
"_resolved": "http://registry.npmjs.org/elementtree/-/elementtree-0.1.6.tgz",
"_shasum": "2ac4c46ea30516c8c4cbdb5e3ac7418e592de20c",
"_shrinkwrap": null,
"_spec": "elementtree@^0.1.6",
"_spec": "elementtree@0.1.6",
"_where": "/Users/steveng/repo/cordova/cordova-android",
"author": {
"name": "Rackspace US, Inc."

4
node_modules/glob/package.json generated vendored
View File

@@ -16,7 +16,6 @@
"_from": "glob@>=5.0.13 <6.0.0",
"_id": "glob@5.0.15",
"_inCache": true,
"_installable": true,
"_location": "/glob",
"_nodeVersion": "4.0.0",
"_npmUser": {
@@ -35,8 +34,7 @@
"type": "range"
},
"_requiredBy": [
"/cordova-common",
"/istanbul"
"/cordova-common"
],
"_resolved": "http://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
"_shasum": "1bc936b9e02f4a603fcc222ecf7633d30b8b93b1",

2
node_modules/inflight/package.json generated vendored
View File

@@ -16,7 +16,6 @@
"_from": "inflight@>=1.0.4 <2.0.0",
"_id": "inflight@1.0.6",
"_inCache": true,
"_installable": true,
"_location": "/inflight",
"_nodeVersion": "6.5.0",
"_npmOperationalInternal": {
@@ -39,7 +38,6 @@
"type": "range"
},
"_requiredBy": [
"/cli/glob",
"/glob"
],
"_resolved": "http://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",

6
node_modules/inherits/package.json generated vendored
View File

@@ -16,7 +16,6 @@
"_from": "inherits@>=2.0.0 <3.0.0",
"_id": "inherits@2.0.3",
"_inCache": true,
"_installable": true,
"_location": "/inherits",
"_nodeVersion": "6.5.0",
"_npmOperationalInternal": {
@@ -39,10 +38,7 @@
"type": "range"
},
"_requiredBy": [
"/cli/glob",
"/fileset/glob",
"/glob",
"/readable-stream"
"/glob"
],
"_resolved": "http://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"_shasum": "633c2c83e3da42a502f52466022480f4208261de",

1
node_modules/lodash/package.json generated vendored
View File

@@ -16,7 +16,6 @@
"_from": "lodash@>=3.5.0 <4.0.0",
"_id": "lodash@3.10.1",
"_inCache": true,
"_installable": true,
"_location": "/lodash",
"_nodeVersion": "0.12.5",
"_npmUser": {

View File

@@ -16,7 +16,6 @@
"_from": "minimatch@>=3.0.0 <4.0.0",
"_id": "minimatch@3.0.3",
"_inCache": true,
"_installable": true,
"_location": "/minimatch",
"_nodeVersion": "4.4.4",
"_npmOperationalInternal": {
@@ -39,10 +38,8 @@
"type": "range"
},
"_requiredBy": [
"/cli/glob",
"/cordova-common",
"/glob",
"/jshint"
"/glob"
],
"_resolved": "http://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
"_shasum": "2a4e4090b96b2db06a9d7df01055a62a77c9b774",

4
node_modules/nopt/package.json generated vendored
View File

@@ -16,7 +16,6 @@
"_from": "nopt@>=3.0.1 <4.0.0",
"_id": "nopt@3.0.6",
"_inCache": true,
"_installable": true,
"_location": "/nopt",
"_nodeVersion": "4.2.1",
"_npmUser": {
@@ -35,8 +34,7 @@
"type": "range"
},
"_requiredBy": [
"/",
"/istanbul"
"/"
],
"_resolved": "http://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
"_shasum": "c6465dbf08abcd4db359317f79ac68a646b28ff9",

5
node_modules/once/package.json generated vendored
View File

@@ -16,7 +16,6 @@
"_from": "once@>=1.3.0 <2.0.0",
"_id": "once@1.4.0",
"_inCache": true,
"_installable": true,
"_location": "/once",
"_nodeVersion": "6.5.0",
"_npmOperationalInternal": {
@@ -39,10 +38,8 @@
"type": "range"
},
"_requiredBy": [
"/cli/glob",
"/glob",
"/inflight",
"/istanbul"
"/inflight"
],
"_resolved": "http://registry.npmjs.org/once/-/once-1.4.0.tgz",
"_shasum": "583b1aa775961d4b113ac17d9c50baef9dd76bd1",

View File

@@ -16,7 +16,6 @@
"_from": "os-homedir@>=1.0.0 <2.0.0",
"_id": "os-homedir@1.0.2",
"_inCache": true,
"_installable": true,
"_location": "/os-homedir",
"_nodeVersion": "6.6.0",
"_npmOperationalInternal": {

View File

@@ -16,7 +16,6 @@
"_from": "os-tmpdir@>=1.0.0 <2.0.0",
"_id": "os-tmpdir@1.0.2",
"_inCache": true,
"_installable": true,
"_location": "/os-tmpdir",
"_nodeVersion": "6.6.0",
"_npmOperationalInternal": {

27
node_modules/osenv/package.json generated vendored
View File

@@ -14,16 +14,19 @@
]
],
"_from": "osenv@>=0.1.3 <0.2.0",
"_id": "osenv@0.1.3",
"_id": "osenv@0.1.4",
"_inCache": true,
"_installable": true,
"_location": "/osenv",
"_nodeVersion": "2.2.1",
"_nodeVersion": "6.5.0",
"_npmOperationalInternal": {
"host": "packages-18-east.internal.npmjs.com",
"tmp": "tmp/osenv-0.1.4.tgz_1481655889868_0.3980878754518926"
},
"_npmUser": {
"name": "isaacs",
"email": "isaacs@npmjs.com"
"email": "i@izs.me"
},
"_npmVersion": "3.0.0",
"_npmVersion": "3.10.9",
"_phantomChildren": {},
"_requested": {
"raw": "osenv@^0.1.3",
@@ -37,8 +40,8 @@
"_requiredBy": [
"/cordova-common"
],
"_resolved": "http://registry.npmjs.org/osenv/-/osenv-0.1.3.tgz",
"_shasum": "83cf05c6d6458fc4d5ac6362ea325d92f2754217",
"_resolved": "http://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz",
"_shasum": "42fe6d5953df06c8064be6f176c3d05aaaa34644",
"_shrinkwrap": null,
"_spec": "osenv@^0.1.3",
"_where": "/Users/steveng/repo/cordova/cordova-android/node_modules/cordova-common",
@@ -56,16 +59,16 @@
},
"description": "Look up environment settings specific to different operating systems",
"devDependencies": {
"tap": "^1.2.0"
"tap": "^8.0.1"
},
"directories": {
"test": "test"
},
"dist": {
"shasum": "83cf05c6d6458fc4d5ac6362ea325d92f2754217",
"tarball": "https://registry.npmjs.org/osenv/-/osenv-0.1.3.tgz"
"shasum": "42fe6d5953df06c8064be6f176c3d05aaaa34644",
"tarball": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz"
},
"gitHead": "f746b3405d8f9e28054d11b97e1436f6a15016c4",
"gitHead": "ef718f0d20e38d45ec452b7faeefc692d3cd1062",
"homepage": "https://github.com/npm/osenv#readme",
"keywords": [
"environment",
@@ -106,5 +109,5 @@
"scripts": {
"test": "tap test/*.js"
},
"version": "0.1.3"
"version": "0.1.4"
}

12
node_modules/osenv/test/unix.js generated vendored
View File

@@ -2,14 +2,14 @@
// pretending to be another platform is too hacky, since it breaks
// how the underlying system looks up module paths and runs
// child processes, and all that stuff is cached.
if (process.platform === 'win32') {
console.log('TAP Version 13\n' +
'1..0\n' +
'# Skip unix tests, this is not unix\n')
return
}
var tap = require('tap')
if (process.platform === 'win32') {
tap.plan(0, 'Skip unix tests, this is not unix')
process.exit(0)
}
// like unix, but funny
process.env.USER = 'sirUser'
process.env.HOME = '/home/sirUser'

View File

@@ -16,7 +16,6 @@
"_from": "path-is-absolute@>=1.0.0 <2.0.0",
"_id": "path-is-absolute@1.0.1",
"_inCache": true,
"_installable": true,
"_location": "/path-is-absolute",
"_nodeVersion": "6.6.0",
"_npmOperationalInternal": {
@@ -39,7 +38,6 @@
"type": "range"
},
"_requiredBy": [
"/cli/glob",
"/glob"
],
"_resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",

1
node_modules/plist/package.json generated vendored
View File

@@ -16,7 +16,6 @@
"_from": "plist@>=1.2.0 <2.0.0",
"_id": "plist@1.2.0",
"_inCache": true,
"_installable": true,
"_location": "/plist",
"_nodeVersion": "5.0.0",
"_npmUser": {

View File

@@ -16,7 +16,6 @@
"_from": "properties-parser@>=0.2.3 <0.3.0",
"_id": "properties-parser@0.2.3",
"_inCache": true,
"_installable": true,
"_location": "/properties-parser",
"_npmUser": {
"name": "xavi",

6
node_modules/q/CHANGES.md generated vendored
View File

@@ -1,3 +1,9 @@
## 1.5.0
- Q.any gives an error message from the last rejected promise
- Throw if callback supplied to "finally" is invalid (@grahamrhay)
- Long stack trace improvements, can now construct long stack traces
across rethrows.
## 1.4.1

2
node_modules/q/LICENSE generated vendored
View File

@@ -1,4 +1,4 @@
Copyright 20092014 Kristopher Michael Kowal. All rights reserved.
Copyright 20092017 Kristopher Michael Kowal. 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

19
node_modules/q/README.md generated vendored
View File

@@ -1,17 +1,10 @@
[![Build Status](https://secure.travis-ci.org/kriskowal/q.png?branch=master)](http://travis-ci.org/kriskowal/q)
[![Build Status](https://secure.travis-ci.org/kriskowal/q.svg?branch=master)](http://travis-ci.org/kriskowal/q)
[![CDNJS](https://img.shields.io/cdnjs/v/q.js.svg)](https://cdnjs.com/libraries/q.js)
<a href="http://promises-aplus.github.com/promises-spec">
<img src="http://kriskowal.github.io/q/q.png"
align="right" alt="Q logo" />
<img src="http://kriskowal.github.io/q/q.png" align="right" alt="Q logo" />
</a>
*This is Q version 1, from the `v1` branch in Git. This documentation applies to
the latest of both the version 1 and version 0.9 release trains. These releases
are stable. There will be no further releases of 0.9 after 0.9.7 which is nearly
equivalent to version 1.0.0. All further releases of `q@~1.0` will be backward
compatible. The version 2 release train introduces significant and
backward-incompatible changes and is experimental at this time.*
If a function cannot return a value or throw an exception without
blocking, it can return a promise instead. A promise is an object
that represents the return value or the thrown exception that the
@@ -80,7 +73,7 @@ The Q module can be loaded as:
the [q](https://npmjs.org/package/q) package
- An AMD module
- A [component](https://github.com/component/component) as ``microjs/q``
- Using [bower](http://bower.io/) as `q#1.0.1`
- Using [bower](http://bower.io/) as `q#^1.4.1`
- Using [NuGet](http://nuget.org/) as [Q](https://nuget.org/packages/q)
Q can exchange promises with jQuery, Dojo, When.js, WinJS, and more.
@@ -386,7 +379,7 @@ return funcs.reduce(Q.when, Q(initialVal));
### Handling Errors
One sometimes-unintuive aspect of promises is that if you throw an
One sometimes-unintuitive aspect of promises is that if you throw an
exception in the fulfillment handler, it will not be caught by the error
handler.
@@ -876,6 +869,6 @@ You can view the results of the Q test suite [in your browser][tests]!
## License
Copyright 20092015 Kristopher Michael Kowal and contributors
Copyright 20092017 Kristopher Michael Kowal and contributors
MIT License (enclosed)

30
node_modules/q/package.json generated vendored
View File

@@ -14,16 +14,19 @@
]
],
"_from": "q@>=1.4.1 <2.0.0",
"_id": "q@1.4.1",
"_id": "q@1.5.0",
"_inCache": true,
"_installable": true,
"_location": "/q",
"_nodeVersion": "1.8.1",
"_nodeVersion": "6.9.5",
"_npmOperationalInternal": {
"host": "packages-18-east.internal.npmjs.com",
"tmp": "tmp/q-1.5.0.tgz_1490148893963_0.4695124195422977"
},
"_npmUser": {
"name": "kriskowal",
"email": "kris.kowal@cixar.com"
},
"_npmVersion": "2.8.3",
"_npmVersion": "3.10.10",
"_phantomChildren": {},
"_requested": {
"raw": "q@^1.4.1",
@@ -38,8 +41,8 @@
"/",
"/cordova-common"
],
"_resolved": "http://registry.npmjs.org/q/-/q-1.4.1.tgz",
"_shasum": "55705bcd93c5f3673530c2c2cbc0c2b3addc286e",
"_resolved": "http://registry.npmjs.org/q/-/q-1.5.0.tgz",
"_shasum": "dd01bac9d06d30e6f219aecb8253ee9ebdc308f1",
"_shrinkwrap": null,
"_spec": "q@^1.4.1",
"_where": "/Users/steveng/repo/cordova/cordova-android",
@@ -85,8 +88,8 @@
"test": "./spec"
},
"dist": {
"shasum": "55705bcd93c5f3673530c2c2cbc0c2b3addc286e",
"tarball": "https://registry.npmjs.org/q/-/q-1.4.1.tgz"
"shasum": "dd01bac9d06d30e6f219aecb8253ee9ebdc308f1",
"tarball": "https://registry.npmjs.org/q/-/q-1.5.0.tgz"
},
"engines": {
"node": ">=0.6.0",
@@ -97,7 +100,7 @@
"q.js",
"queue.js"
],
"gitHead": "d373079d3620152e3d60e82f27265a09ee0e81bd",
"gitHead": "4fecabe07ff9f3683a3d4548e7f81c2aba693326",
"homepage": "https://github.com/kriskowal/q",
"keywords": [
"q",
@@ -113,10 +116,7 @@
"browser",
"node"
],
"license": {
"type": "MIT",
"url": "http://github.com/kriskowal/q/raw/master/LICENSE"
},
"license": "MIT",
"main": "q.js",
"maintainers": [
{
@@ -148,8 +148,8 @@
"lint": "jshint q.js",
"minify": "grunt",
"prepublish": "grunt",
"test": "jasmine-node spec && promises-aplus-tests spec/aplus-adapter",
"test": "npm ls -s && jasmine-node spec && promises-aplus-tests spec/aplus-adapter && npm run -s lint",
"test-browser": "opener spec/q-spec.html"
},
"version": "1.4.1"
"version": "1.5.0"
}

53
node_modules/q/q.js generated vendored
View File

@@ -1,8 +1,8 @@
// vim:ts=4:sts=4:sw=4:
/*!
*
* Copyright 2009-2012 Kris Kowal under the terms of the MIT
* license found at http://github.com/kriskowal/q/raw/master/LICENSE
* Copyright 2009-2017 Kris Kowal under the terms of the MIT
* license found at https://github.com/kriskowal/q/blob/v1/LICENSE
*
* With parts by Tyler Close
* Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
@@ -190,7 +190,7 @@ var nextTick =(function () {
// `setTimeout`. In this case `setImmediate` is preferred because
// it is faster. Browserify's `process.toString()` yields
// "[object Object]", while in a real Node environment
// `process.nextTick()` yields "[object process]".
// `process.toString()` yields "[object process]".
isNodeJS = true;
requestTick = function () {
@@ -327,6 +327,11 @@ var object_create = Object.create || function (prototype) {
return new Type();
};
var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
obj[prop] = descriptor.value;
return obj;
};
var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
var object_keys = Object.keys || function (object) {
@@ -377,19 +382,20 @@ function makeStackTraceLong(error, promise) {
promise.stack &&
typeof error === "object" &&
error !== null &&
error.stack &&
error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1
error.stack
) {
var stacks = [];
for (var p = promise; !!p; p = p.source) {
if (p.stack) {
if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {
object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});
stacks.unshift(p.stack);
}
}
stacks.unshift(error.stack);
var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
error.stack = filterStackString(concatedStacks);
var stack = filterStackString(concatedStacks);
object_defineProperty(error, "stack", {value: stack, configurable: true});
}
}
@@ -516,6 +522,14 @@ Q.nextTick = nextTick;
*/
Q.longStackSupport = false;
/**
* The counter is used to determine the stopping point for building
* long stack traces. In makeStackTraceLong we walk backwards through
* the linked list of promises, only stacks which were created before
* the rejection are concatenated.
*/
var longStackCounter = 1;
// enable long stacks if Q_DEBUG is set
if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
Q.longStackSupport = true;
@@ -588,6 +602,7 @@ function defer() {
// At the same time, cut off the first line; it's always just
// "[object Promise]\n", as per the `toString`.
promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
promise.stackCounter = longStackCounter++;
}
}
@@ -597,7 +612,12 @@ function defer() {
function become(newPromise) {
resolvedPromise = newPromise;
promise.source = newPromise;
if (Q.longStackSupport && hasStacks) {
// Only hold a reference to the new promise if long stacks
// are enabled to reduce memory usage
promise.source = newPromise;
}
array_reduce(messages, function (undefined, message) {
Q.nextTick(function () {
@@ -725,7 +745,7 @@ Promise.prototype.join = function (that) {
// TODO: "===" should be Object.is or equiv
return x;
} else {
throw new Error("Can't join: not the same: " + x + " " + y);
throw new Error("Q can't join: not the same: " + x + " " + y);
}
});
};
@@ -1622,13 +1642,12 @@ function any(promises) {
function onFulfilled(result) {
deferred.resolve(result);
}
function onRejected() {
function onRejected(err) {
pendingCount--;
if (pendingCount === 0) {
deferred.reject(new Error(
"Can't get fulfillment value from any promise, all " +
"promises were rejected."
));
err.message = ("Q can't get fulfillment value from any promise, all " +
"promises were rejected. Last error message: " + err.message);
deferred.reject(err);
}
}
function onProgress(progress) {
@@ -1752,6 +1771,9 @@ Q["finally"] = function (object, callback) {
Promise.prototype.fin = // XXX legacy
Promise.prototype["finally"] = function (callback) {
if (!callback || typeof callback.apply !== "function") {
throw new Error("Q can't apply finally callback");
}
callback = Q(callback);
return this.then(function (value) {
return callback.fcall().then(function () {
@@ -1915,6 +1937,9 @@ Promise.prototype.nfcall = function (/*...args*/) {
*/
Q.nfbind =
Q.denodeify = function (callback /*...args*/) {
if (callback === undefined) {
throw new Error("Q can't wrap an undefined function");
}
var baseArgs = array_slice(arguments, 1);
return function () {
var nodeArgs = baseArgs.concat(array_slice(arguments));

1
node_modules/sax/package.json generated vendored
View File

@@ -18,7 +18,6 @@
"_from": "sax@0.3.5",
"_id": "sax@0.3.5",
"_inCache": true,
"_installable": true,
"_location": "/sax",
"_nodeVersion": "v0.6.7-pre",
"_npmUser": {

1
node_modules/semver/package.json generated vendored
View File

@@ -16,7 +16,6 @@
"_from": "semver@>=5.0.1 <6.0.0",
"_id": "semver@5.3.0",
"_inCache": true,
"_installable": true,
"_location": "/semver",
"_nodeVersion": "4.4.4",
"_npmOperationalInternal": {

1
node_modules/shelljs/package.json generated vendored
View File

@@ -16,7 +16,6 @@
"_from": "shelljs@>=0.5.3 <0.6.0",
"_id": "shelljs@0.5.3",
"_inCache": true,
"_installable": true,
"_location": "/shelljs",
"_nodeVersion": "1.2.0",
"_npmUser": {

View File

@@ -16,7 +16,6 @@
"_from": "underscore@>=1.8.3 <2.0.0",
"_id": "underscore@1.8.3",
"_inCache": true,
"_installable": true,
"_location": "/underscore",
"_npmUser": {
"name": "jashkenas",
@@ -34,8 +33,7 @@
"type": "range"
},
"_requiredBy": [
"/cordova-common",
"/jasmine-node"
"/cordova-common"
],
"_resolved": "http://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
"_shasum": "4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022",

1
node_modules/unorm/package.json generated vendored
View File

@@ -16,7 +16,6 @@
"_from": "unorm@>=1.3.3 <2.0.0",
"_id": "unorm@1.4.1",
"_inCache": true,
"_installable": true,
"_location": "/unorm",
"_npmUser": {
"name": "walling",

View File

@@ -16,7 +16,6 @@
"_from": "util-deprecate@1.0.2",
"_id": "util-deprecate@1.0.2",
"_inCache": true,
"_installable": true,
"_location": "/util-deprecate",
"_nodeVersion": "4.1.2",
"_npmUser": {

1
node_modules/wrappy/package.json generated vendored
View File

@@ -16,7 +16,6 @@
"_from": "wrappy@>=1.0.0 <2.0.0",
"_id": "wrappy@1.0.2",
"_inCache": true,
"_installable": true,
"_location": "/wrappy",
"_nodeVersion": "5.10.1",
"_npmOperationalInternal": {

View File

@@ -16,7 +16,6 @@
"_from": "xmlbuilder@4.0.0",
"_id": "xmlbuilder@4.0.0",
"_inCache": true,
"_installable": true,
"_location": "/xmlbuilder",
"_npmUser": {
"name": "oozcitak",

46
node_modules/xmldom/dom-parser.js generated vendored
View File

@@ -2,7 +2,7 @@ function DOMParser(options){
this.options = options ||{locator:{}};
}
DOMParser.prototype.parseFromString = function(source,mimeType){
DOMParser.prototype.parseFromString = function(source,mimeType){
var options = this.options;
var sax = new XMLReader();
var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
@@ -25,9 +25,9 @@ DOMParser.prototype.parseFromString = function(source,mimeType){
if(source){
sax.parse(source,defaultNSMap,entityMap);
}else{
sax.errorHandler.error("invalid document source");
sax.errorHandler.error("invalid doc source");
}
return domBuilder.document;
return domBuilder.doc;
}
function buildErrorHandler(errorImpl,domBuilder,locator){
if(!errorImpl){
@@ -77,13 +77,13 @@ function position(locator,node){
*/
DOMHandler.prototype = {
startDocument : function() {
this.document = new DOMImplementation().createDocument(null, null, null);
this.doc = new DOMImplementation().createDocument(null, null, null);
if (this.locator) {
this.document.documentURI = this.locator.systemId;
this.doc.documentURI = this.locator.systemId;
}
},
startElement:function(namespaceURI, localName, qName, attrs) {
var doc = this.document;
var doc = this.doc;
var el = doc.createElementNS(namespaceURI, qName||localName);
var len = attrs.length;
appendElement(this, el);
@@ -95,24 +95,22 @@ DOMHandler.prototype = {
var value = attrs.getValue(i);
var qName = attrs.getQName(i);
var attr = doc.createAttributeNS(namespaceURI, qName);
if( attr.getOffset){
position(attr.getOffset(1),attr)
}
this.locator &&position(attrs.getLocator(i),attr);
attr.value = attr.nodeValue = value;
el.setAttributeNode(attr)
}
},
endElement:function(namespaceURI, localName, qName) {
var current = this.currentElement
var tagName = current.tagName;
this.currentElement = current.parentNode;
var tagName = current.tagName;
this.currentElement = current.parentNode;
},
startPrefixMapping:function(prefix, uri) {
},
endPrefixMapping:function(prefix) {
},
processingInstruction:function(target, data) {
var ins = this.document.createProcessingInstruction(target, data);
var ins = this.doc.createProcessingInstruction(target, data);
this.locator && position(this.locator,ins)
appendElement(this, ins);
},
@@ -121,13 +119,17 @@ DOMHandler.prototype = {
characters:function(chars, start, length) {
chars = _toString.apply(this,arguments)
//console.log(chars)
if(this.currentElement && chars){
if(chars){
if (this.cdata) {
var charNode = this.document.createCDATASection(chars);
this.currentElement.appendChild(charNode);
var charNode = this.doc.createCDATASection(chars);
} else {
var charNode = this.document.createTextNode(chars);
var charNode = this.doc.createTextNode(chars);
}
if(this.currentElement){
this.currentElement.appendChild(charNode);
}else if(/^\s*$/.test(chars)){
this.doc.appendChild(charNode);
//process xml
}
this.locator && position(this.locator,charNode)
}
@@ -135,7 +137,7 @@ DOMHandler.prototype = {
skippedEntity:function(name) {
},
endDocument:function() {
this.document.normalize();
this.doc.normalize();
},
setDocumentLocator:function (locator) {
if(this.locator = locator){// && !('lineNumber' in locator)){
@@ -145,7 +147,7 @@ DOMHandler.prototype = {
//LexicalHandler
comment:function(chars, start, length) {
chars = _toString.apply(this,arguments)
var comm = this.document.createComment(chars);
var comm = this.doc.createComment(chars);
this.locator && position(this.locator,comm)
appendElement(this, comm);
},
@@ -159,7 +161,7 @@ DOMHandler.prototype = {
},
startDTD:function(name, publicId, systemId) {
var impl = this.document.implementation;
var impl = this.doc.implementation;
if (impl && impl.createDocumentType) {
var dt = impl.createDocumentType(name, publicId, systemId);
this.locator && position(this.locator,dt)
@@ -235,15 +237,15 @@ function _toString(chars,start,length){
/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
function appendElement (hander,node) {
if (!hander.currentElement) {
hander.document.appendChild(node);
hander.doc.appendChild(node);
} else {
hander.currentElement.appendChild(node);
}
}//appendChild and setAttributeNS are preformance key
if(typeof require == 'function'){
//if(typeof require == 'function'){
var XMLReader = require('./sax').XMLReader;
var DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation;
exports.XMLSerializer = require('./dom').XMLSerializer ;
exports.DOMParser = DOMParser;
}
//}

163
node_modules/xmldom/dom.js generated vendored
View File

@@ -110,9 +110,9 @@ NodeList.prototype = {
item: function(index) {
return this[index] || null;
},
toString:function(){
toString:function(isHTML,nodeFilter){
for(var buf = [], i = 0;i<this.length;i++){
serializeToString(this[i],buf);
serializeToString(this[i],buf,isHTML,nodeFilter);
}
return buf.join('');
}
@@ -170,6 +170,7 @@ function _addNamedNode(el,list,newAttr,oldAttr){
}
}
function _removeNamedNode(el,list,attr){
//console.log('remove attr:'+attr)
var i = _findNodeIndex(list,attr);
if(i>=0){
var lastIndex = list.length-1
@@ -185,7 +186,7 @@ function _removeNamedNode(el,list,attr){
}
}
}else{
throw DOMException(NOT_FOUND_ERR,new Error())
throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
}
}
NamedNodeMap.prototype = {
@@ -195,9 +196,11 @@ NamedNodeMap.prototype = {
// if(key.indexOf(':')>0 || key == 'xmlns'){
// return null;
// }
//console.log()
var i = this.length;
while(i--){
var attr = this[i];
//console.log(attr.nodeName,key)
if(attr.nodeName == key){
return attr;
}
@@ -379,7 +382,7 @@ Node.prototype = {
}
}
}
el = el.nodeType == 2?el.ownerDocument : el.parentNode;
el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
}
return null;
},
@@ -394,7 +397,7 @@ Node.prototype = {
return map[prefix] ;
}
}
el = el.nodeType == 2?el.ownerDocument : el.parentNode;
el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
}
return null;
},
@@ -579,7 +582,7 @@ Document.prototype = {
}
return newChild;
}
if(this.documentElement == null && newChild.nodeType == 1){
if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
this.documentElement = newChild;
}
@@ -599,7 +602,7 @@ Document.prototype = {
getElementById : function(id){
var rtv = null;
_visitNode(this.documentElement,function(node){
if(node.nodeType == 1){
if(node.nodeType == ELEMENT_NODE){
if(node.getAttribute('id') == id){
rtv = node;
return true;
@@ -748,6 +751,7 @@ Element.prototype = {
return this.attributes.setNamedItemNS(newAttr);
},
removeAttributeNode : function(oldAttr){
//console.log(this == oldAttr.ownerElement)
return this.attributes.removeNamedItem(oldAttr.nodeName);
},
//get real attribute name,and remove it by removeAttributeNode
@@ -792,6 +796,7 @@ Element.prototype = {
}
});
return ls;
});
}
};
@@ -823,10 +828,7 @@ CharacterData.prototype = {
},
appendChild:function(newChild){
//if(!(newChild instanceof CharacterData)){
throw new Error(ExceptionMessage[3])
//}
return Node.prototype.appendChild.apply(this,arguments)
throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
},
deleteData: function(offset, count) {
this.replaceData(offset,count,"");
@@ -908,39 +910,132 @@ function ProcessingInstruction() {
ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
_extends(ProcessingInstruction,Node);
function XMLSerializer(){}
XMLSerializer.prototype.serializeToString = function(node,attributeSorter){
return node.toString(attributeSorter);
XMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){
return nodeSerializeToString.call(node,isHtml,nodeFilter);
}
Node.prototype.toString =function(attributeSorter){
Node.prototype.toString = nodeSerializeToString;
function nodeSerializeToString(isHtml,nodeFilter){
var buf = [];
serializeToString(this,buf,attributeSorter);
var refNode = this.nodeType == 9?this.documentElement:this;
var prefix = refNode.prefix;
var uri = refNode.namespaceURI;
if(uri && prefix == null){
//console.log(prefix)
var prefix = refNode.lookupPrefix(uri);
if(prefix == null){
//isHTML = true;
var visibleNamespaces=[
{namespace:uri,prefix:null}
//{namespace:uri,prefix:''}
]
}
}
serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
//console.log('###',this.nodeType,uri,prefix,buf.join(''))
return buf.join('');
}
function serializeToString(node,buf,attributeSorter,isHTML){
function needNamespaceDefine(node,isHTML, visibleNamespaces) {
var prefix = node.prefix||'';
var uri = node.namespaceURI;
if (!prefix && !uri){
return false;
}
if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace"
|| uri == 'http://www.w3.org/2000/xmlns/'){
return false;
}
var i = visibleNamespaces.length
//console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
while (i--) {
var ns = visibleNamespaces[i];
// get namespace prefix
//console.log(node.nodeType,node.tagName,ns.prefix,prefix)
if (ns.prefix == prefix){
return ns.namespace != uri;
}
}
//console.log(isHTML,uri,prefix=='')
//if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
// return false;
//}
//node.flag = '11111'
//console.error(3,true,node.flag,node.prefix,node.namespaceURI)
return true;
}
function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
if(nodeFilter){
node = nodeFilter(node);
if(node){
if(typeof node == 'string'){
buf.push(node);
return;
}
}else{
return;
}
//buf.sort.apply(attrs, attributeSorter);
}
switch(node.nodeType){
case ELEMENT_NODE:
if (!visibleNamespaces) visibleNamespaces = [];
var startVisibleNamespaces = visibleNamespaces.length;
var attrs = node.attributes;
var len = attrs.length;
var child = node.firstChild;
var nodeName = node.tagName;
isHTML = (htmlns === node.namespaceURI) ||isHTML
buf.push('<',nodeName);
if(attributeSorter){
buf.sort.apply(attrs, attributeSorter);
for(var i=0;i<len;i++){
// add namespaces for attributes
var attr = attrs.item(i);
if (attr.prefix == 'xmlns') {
visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
}else if(attr.nodeName == 'xmlns'){
visibleNamespaces.push({ prefix: '', namespace: attr.value });
}
}
for(var i=0;i<len;i++){
serializeToString(attrs.item(i),buf,attributeSorter,isHTML);
var attr = attrs.item(i);
if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
var prefix = attr.prefix||'';
var uri = attr.namespaceURI;
var ns = prefix ? ' xmlns:' + prefix : " xmlns";
buf.push(ns, '="' , uri , '"');
visibleNamespaces.push({ prefix: prefix, namespace:uri });
}
serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
}
if(child || isHTML && !/^(?:meta|link|img|br|hr|input|button)$/i.test(nodeName)){
// add namespace for current node
if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
var prefix = node.prefix||'';
var uri = node.namespaceURI;
var ns = prefix ? ' xmlns:' + prefix : " xmlns";
buf.push(ns, '="' , uri , '"');
visibleNamespaces.push({ prefix: prefix, namespace:uri });
}
if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
buf.push('>');
//if is cdata child node
if(isHTML && /^script$/i.test(nodeName)){
if(child){
buf.push(child.data);
}
}else{
while(child){
serializeToString(child,buf,attributeSorter,isHTML);
if(child.data){
buf.push(child.data);
}else{
serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
}
child = child.nextSibling;
}
}else
{
while(child){
serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
child = child.nextSibling;
}
}
@@ -948,12 +1043,14 @@ function serializeToString(node,buf,attributeSorter,isHTML){
}else{
buf.push('/>');
}
// remove added visible namespaces
//visibleNamespaces.length = startVisibleNamespaces;
return;
case DOCUMENT_NODE:
case DOCUMENT_FRAGMENT_NODE:
var child = node.firstChild;
while(child){
serializeToString(child,buf,attributeSorter,isHTML);
serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
child = child.nextSibling;
}
return;
@@ -1098,8 +1195,8 @@ try{
},
set:function(data){
switch(this.nodeType){
case 1:
case 11:
case ELEMENT_NODE:
case DOCUMENT_FRAGMENT_NODE:
while(this.firstChild){
this.removeChild(this.firstChild);
}
@@ -1110,7 +1207,7 @@ try{
default:
//TODO:
this.data = data;
this.value = value;
this.value = data;
this.nodeValue = data;
}
}
@@ -1118,8 +1215,8 @@ try{
function getTextContent(node){
switch(node.nodeType){
case 1:
case 11:
case ELEMENT_NODE:
case DOCUMENT_FRAGMENT_NODE:
var buf = [];
node = node.firstChild;
while(node){
@@ -1141,7 +1238,7 @@ try{
}catch(e){//ie8
}
if(typeof require == 'function'){
//if(typeof require == 'function'){
exports.DOMImplementation = DOMImplementation;
exports.XMLSerializer = XMLSerializer;
}
//}

19
node_modules/xmldom/package.json generated vendored
View File

@@ -14,11 +14,14 @@
]
],
"_from": "xmldom@>=0.1.0 <0.2.0",
"_id": "xmldom@0.1.22",
"_id": "xmldom@0.1.27",
"_inCache": true,
"_installable": true,
"_location": "/xmldom",
"_nodeVersion": "5.5.0",
"_npmOperationalInternal": {
"host": "packages-12-west.internal.npmjs.com",
"tmp": "tmp/xmldom-0.1.27.tgz_1480305406093_0.9070004557725042"
},
"_npmUser": {
"name": "jindw",
"email": "jindw@xidea.org"
@@ -37,8 +40,8 @@
"_requiredBy": [
"/plist"
],
"_resolved": "http://registry.npmjs.org/xmldom/-/xmldom-0.1.22.tgz",
"_shasum": "10de4e5e964981f03c8cc72fadc08d14b6c3aa26",
"_resolved": "http://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz",
"_shasum": "d501f97b3bdb403af8ef9ecc20573187aadac0e9",
"_shrinkwrap": null,
"_spec": "xmldom@0.1.x",
"_where": "/Users/steveng/repo/cordova/cordova-android/node_modules/plist",
@@ -75,13 +78,13 @@
},
"directories": {},
"dist": {
"shasum": "10de4e5e964981f03c8cc72fadc08d14b6c3aa26",
"tarball": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.22.tgz"
"shasum": "d501f97b3bdb403af8ef9ecc20573187aadac0e9",
"tarball": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz"
},
"engines": {
"node": ">=0.1"
},
"gitHead": "29a83b315aef56c156602286b2d884a3b4c2521f",
"gitHead": "b53aa82a36160d85faab394035dcd1784764537f",
"homepage": "https://github.com/jindw/xmldom",
"keywords": [
"w3c",
@@ -132,5 +135,5 @@
"scripts": {
"test": "proof platform win32 && proof test */*/*.t.js || t/test"
},
"version": "0.1.22"
"version": "0.1.27"
}

217
node_modules/xmldom/sax.js generated vendored
View File

@@ -2,21 +2,21 @@
//[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
//[5] Name ::= NameStartChar (NameChar)*
var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]///\u10000-\uEFFFF
var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\u00B7\u0300-\u036F\\u203F-\u2040]");
var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
//var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')
//S_TAG, S_ATTR, S_EQ, S_V
//S_ATTR_S, S_E, S_S, S_C
//S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE
//S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE
var S_TAG = 0;//tag name offerring
var S_ATTR = 1;//attr name offerring
var S_ATTR_S=2;//attr name end and space offer
var S_ATTR_SPACE=2;//attr name end and space offer
var S_EQ = 3;//=space?
var S_V = 4;//attr value(no quot value only)
var S_E = 5;//attr value end and no space(quot end)
var S_S = 6;//(attr value end || tag end ) && (space offer)
var S_C = 7;//closed el<el />
var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
var S_ATTR_END = 5;//attr value end and no space(quot end)
var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
var S_TAG_CLOSE = 7;//closed el<el />
function XMLReader(){
@@ -33,7 +33,7 @@ XMLReader.prototype = {
}
}
function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
function fixedFromCharCode(code) {
function fixedFromCharCode(code) {
// String.prototype.fromCharCode does not supports
// > 2 bytes unicode chars directly
if (code > 0xffff) {
@@ -76,7 +76,7 @@ function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
}
var lineStart = 0;
var lineEnd = 0;
var linePattern = /.+(?:\r\n?|\n)|.*$/g
var linePattern = /.*(?:\r\n?|\n)|.*$/g
var locator = domBuilder.locator;
var parseStack = [{currentNSMap:defaultNSMapCopy}]
@@ -87,7 +87,7 @@ function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
var tagStart = source.indexOf('<',start);
if(tagStart<0){
if(!source.substr(start).match(/^\s*$/)){
var doc = domBuilder.document;
var doc = domBuilder.doc;
var text = doc.createTextNode(source.substr(start));
doc.appendChild(text);
domBuilder.currentElement = text;
@@ -102,16 +102,36 @@ function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
var end = source.indexOf('>',tagStart+3);
var tagName = source.substring(tagStart+2,end);
var config = parseStack.pop();
var localNSMap = config.localNSMap;
if(config.tagName != tagName){
errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
}
domBuilder.endElement(config.uri,config.localName,tagName);
if(localNSMap){
for(var prefix in localNSMap){
domBuilder.endPrefixMapping(prefix) ;
}
if(end<0){
tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
//console.error('#@@@@@@'+tagName)
errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
end = tagStart+1+tagName.length;
}else if(tagName.match(/\s</)){
tagName = tagName.replace(/[\s<].*/,'');
errorHandler.error("end tag name: "+tagName+' maybe not complete');
end = tagStart+1+tagName.length;
}
//console.error(parseStack.length,parseStack)
//console.error(config);
var localNSMap = config.localNSMap;
var endMatch = config.tagName == tagName;
var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase()
if(endIgnoreCaseMach){
domBuilder.endElement(config.uri,config.localName,tagName);
if(localNSMap){
for(var prefix in localNSMap){
domBuilder.endPrefixMapping(prefix) ;
}
}
if(!endMatch){
errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
}
}else{
parseStack.push(config)
}
end++;
break;
// end elment
@@ -124,33 +144,40 @@ function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
end = parseDCC(source,tagStart,domBuilder,errorHandler);
break;
default:
locator&&position(tagStart);
var el = new ElementAttributes();
var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
//elStartEnd
var end = parseElementStartPart(source,tagStart,el,entityReplacer,errorHandler);
var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
var len = el.length;
if(locator){
if(len){
//attribute position fixed
for(var i = 0;i<len;i++){
var a = el[i];
position(a.offset);
a.offset = copyLocator(locator,{});
}
}
position(end);
}
if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
el.closed = true;
if(!entityMap.nbsp){
errorHandler.warning('unclosed xml attribute');
}
}
appendElement(el,domBuilder,parseStack);
if(locator && len){
var locator2 = copyLocator(locator,{});
//try{//attribute position fixed
for(var i = 0;i<len;i++){
var a = el[i];
position(a.offset);
a.locator = copyLocator(locator,{});
}
//}catch(e){console.error('@@@@@'+e)}
domBuilder.locator = locator2
if(appendElement(el,domBuilder,currentNSMap)){
parseStack.push(el)
}
domBuilder.locator = locator;
}else{
if(appendElement(el,domBuilder,currentNSMap)){
parseStack.push(el)
}
}
if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
@@ -160,8 +187,10 @@ function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
}
}
}catch(e){
errorHandler.error('element parse error: '+e);
errorHandler.error('element parse error: '+e)
//errorHandler.error('element parse error: '+e);
end = -1;
//throw e;
}
if(end>start){
start = end;
@@ -181,7 +210,7 @@ function copyLocator(f,t){
* @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
* @return end of the elementStartPart(end of elementEndPart for selfClosed el)
*/
function parseElementStartPart(source,start,el,entityReplacer,errorHandler){
function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
var attrName;
var value;
var p = ++start;
@@ -193,7 +222,7 @@ function parseElementStartPart(source,start,el,entityReplacer,errorHandler){
if(s === S_ATTR){//attrName
attrName = source.slice(start,p);
s = S_EQ;
}else if(s === S_ATTR_S){
}else if(s === S_ATTR_SPACE){
s = S_EQ;
}else{
//fatalError: equal must after attrName or space after attrName
@@ -202,25 +231,30 @@ function parseElementStartPart(source,start,el,entityReplacer,errorHandler){
break;
case '\'':
case '"':
if(s === S_EQ){//equal
if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
){//equal
if(s === S_ATTR){
errorHandler.warning('attribute value must after "="')
attrName = source.slice(start,p)
}
start = p+1;
p = source.indexOf(c,start)
if(p>0){
value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
el.add(attrName,value,start-1);
s = S_E;
s = S_ATTR_END;
}else{
//fatalError: no end quot match
throw new Error('attribute value no end \''+c+'\' match');
}
}else if(s == S_V){
}else if(s == S_ATTR_NOQUOT_VALUE){
value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
//console.log(attrName,value,start,p)
el.add(attrName,value,start);
//console.dir(el)
errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
start = p+1;
s = S_E
s = S_ATTR_END
}else{
//fatalError: no equal before
throw new Error('attribute value must after "="');
@@ -230,14 +264,14 @@ function parseElementStartPart(source,start,el,entityReplacer,errorHandler){
switch(s){
case S_TAG:
el.setTagName(source.slice(start,p));
case S_E:
case S_S:
case S_C:
s = S_C;
case S_ATTR_END:
case S_TAG_SPACE:
case S_TAG_CLOSE:
s =S_TAG_CLOSE;
el.closed = true;
case S_V:
case S_ATTR_NOQUOT_VALUE:
case S_ATTR:
case S_ATTR_S:
case S_ATTR_SPACE:
break;
//case S_EQ:
default:
@@ -247,30 +281,36 @@ function parseElementStartPart(source,start,el,entityReplacer,errorHandler){
case ''://end document
//throw new Error('unexpected end of input')
errorHandler.error('unexpected end of input');
if(s == S_TAG){
el.setTagName(source.slice(start,p));
}
return p;
case '>':
switch(s){
case S_TAG:
el.setTagName(source.slice(start,p));
case S_E:
case S_S:
case S_C:
case S_ATTR_END:
case S_TAG_SPACE:
case S_TAG_CLOSE:
break;//normal
case S_V://Compatible state
case S_ATTR_NOQUOT_VALUE://Compatible state
case S_ATTR:
value = source.slice(start,p);
if(value.slice(-1) === '/'){
el.closed = true;
value = value.slice(0,-1)
}
case S_ATTR_S:
if(s === S_ATTR_S){
case S_ATTR_SPACE:
if(s === S_ATTR_SPACE){
value = attrName;
}
if(s == S_V){
if(s == S_ATTR_NOQUOT_VALUE){
errorHandler.warning('attribute "'+value+'" missed quot(")!!');
el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start)
}else{
errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!')
if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!')
}
el.add(value,value,start)
}
break;
@@ -287,64 +327,68 @@ function parseElementStartPart(source,start,el,entityReplacer,errorHandler){
switch(s){
case S_TAG:
el.setTagName(source.slice(start,p));//tagName
s = S_S;
s = S_TAG_SPACE;
break;
case S_ATTR:
attrName = source.slice(start,p)
s = S_ATTR_S;
s = S_ATTR_SPACE;
break;
case S_V:
case S_ATTR_NOQUOT_VALUE:
var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
errorHandler.warning('attribute "'+value+'" missed quot(")!!');
el.add(attrName,value,start)
case S_E:
s = S_S;
case S_ATTR_END:
s = S_TAG_SPACE;
break;
//case S_S:
//case S_TAG_SPACE:
//case S_EQ:
//case S_ATTR_S:
//case S_ATTR_SPACE:
// void();break;
//case S_C:
//case S_TAG_CLOSE:
//ignore warning
}
}else{//not space
//S_TAG, S_ATTR, S_EQ, S_V
//S_ATTR_S, S_E, S_S, S_C
//S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE
//S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE
switch(s){
//case S_TAG:void();break;
//case S_ATTR:void();break;
//case S_V:void();break;
case S_ATTR_S:
errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead!!')
//case S_ATTR_NOQUOT_VALUE:void();break;
case S_ATTR_SPACE:
var tagName = el.tagName;
if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!')
}
el.add(attrName,attrName,start);
start = p;
s = S_ATTR;
break;
case S_E:
case S_ATTR_END:
errorHandler.warning('attribute space is required"'+attrName+'"!!')
case S_S:
case S_TAG_SPACE:
s = S_ATTR;
start = p;
break;
case S_EQ:
s = S_V;
s = S_ATTR_NOQUOT_VALUE;
start = p;
break;
case S_C:
case S_TAG_CLOSE:
throw new Error("elements closed character '/' and '>' must be connected to");
}
}
}
}//end outer switch
//console.log('p++',p)
p++;
}
}
/**
* @return end of the elementStartPart(end of elementEndPart for selfClosed el)
* @return true if has new namespace define
*/
function appendElement(el,domBuilder,parseStack){
function appendElement(el,domBuilder,currentNSMap){
var tagName = el.tagName;
var localNSMap = null;
var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
//var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
var i = el.length;
while(i--){
var a = el[i];
@@ -383,7 +427,7 @@ function appendElement(el,domBuilder,parseStack){
if(prefix === 'xml'){
a.uri = 'http://www.w3.org/XML/1998/namespace';
}if(prefix !== 'xmlns'){
a.uri = currentNSMap[prefix]
a.uri = currentNSMap[prefix || '']
//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
}
@@ -412,7 +456,8 @@ function appendElement(el,domBuilder,parseStack){
}else{
el.currentNSMap = currentNSMap;
el.localNSMap = localNSMap;
parseStack.push(el);
//parseStack.push(el);
return true;
}
}
function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
@@ -442,7 +487,11 @@ function fixSelfClosed(source,elStartEnd,tagName,closeMap){
var pos = closeMap[tagName];
if(pos == null){
//console.log(tagName)
pos = closeMap[tagName] = source.lastIndexOf('</'+tagName+'>')
pos = source.lastIndexOf('</'+tagName+'>')
if(pos<elStartEnd){//忘记闭合
pos = source.lastIndexOf('</'+tagName)
}
closeMap[tagName] =pos
}
return pos<elStartEnd;
//}
@@ -533,7 +582,7 @@ ElementAttributes.prototype = {
},
length:0,
getLocalName:function(i){return this[i].localName},
getOffset:function(i){return this[i].offset},
getLocator:function(i){return this[i].locator},
getQName:function(i){return this[i].qName},
getURI:function(i){return this[i].uri},
getValue:function(i){return this[i].value}
@@ -580,7 +629,5 @@ function split(source,start){
}
}
if(typeof require == 'function'){
exports.XMLReader = XMLReader;
}
exports.XMLReader = XMLReader;

View File

@@ -1,6 +1,6 @@
{
"name": "cordova-android",
"version": "6.0.0",
"version": "6.2.3",
"description": "cordova-android release",
"bin": {
"create": "bin/create"
@@ -16,16 +16,16 @@
"apache"
],
"scripts": {
"test": "npm run jshint && jasmine-node --color spec/unit",
"cover": "istanbul cover --root bin/templates/cordova --print detail node_modules/jasmine-node/bin/jasmine-node -- spec/unit",
"test-build": "jasmine-node --captureExceptions --color spec/e2e",
"jshint": "node node_modules/jshint/bin/jshint bin && node node_modules/jshint/bin/jshint spec"
"test": "npm run jshint && jasmine",
"cover": "istanbul cover --root bin/templates/cordova --print detail jasmine",
"test-build": "jasmine --captureExceptions --color spec/e2e/*.spec.js",
"jshint": "jshint bin && jshint spec"
},
"author": "Apache Software Foundation",
"license": "Apache-2.0",
"dependencies": {
"cordova-common": "^1.5.0",
"elementtree": "^0.1.6",
"cordova-common": "^2.0.1",
"elementtree": "0.1.6",
"nopt": "^3.0.1",
"properties-parser": "^0.2.3",
"q": "^1.4.1",
@@ -41,7 +41,7 @@
],
"devDependencies": {
"istanbul": "^0.4.2",
"jasmine-node": "^1.14.5",
"jasmine": "^2.5.2",
"jshint": "^2.6.0",
"promise-matchers": "~0",
"rewire": "^2.1.3"

View File

@@ -35,42 +35,42 @@ function createAndBuild(projectname, projectid, done) {
describe('create', function() {
it('create project with ascii name, no spaces', function(done) {
it('Test#001 : create project with ascii name, no spaces', function(done) {
var projectname = 'testcreate';
var projectid = 'com.test.create.app1';
createAndBuild(projectname, projectid, done);
}, CREATE_TIMEOUT);
it('create project with ascii name, and spaces', function(done) {
it('Test#002 : create project with ascii name, and spaces', function(done) {
var projectname = 'test create';
var projectid = 'com.test.create.app2';
createAndBuild(projectname, projectid, done);
}, CREATE_TIMEOUT);
it('create project with unicode name, no spaces', function(done) {
it('Test#003 : create project with unicode name, no spaces', function(done) {
var projectname = '応応応応用用用用';
var projectid = 'com.test.create.app3';
createAndBuild(projectname, projectid, done);
}, CREATE_TIMEOUT);
it('create project with unicode name, and spaces', function(done) {
it('Test#004 : create project with unicode name, and spaces', function(done) {
var projectname = '応応応応 用用用用';
var projectid = 'com.test.create.app4';
createAndBuild(projectname, projectid, done);
}, CREATE_TIMEOUT);
it('create project with ascii+unicode name, no spaces', function(done) {
it('Test#005 : create project with ascii+unicode name, no spaces', function(done) {
var projectname = '応応応応hello用用用用';
var projectid = 'com.test.create.app5';
createAndBuild(projectname, projectid, done);
}, CREATE_TIMEOUT);
it('create project with ascii+unicode name, and spaces', function(done) {
it('Test#006 : create project with ascii+unicode name, and spaces', function(done) {
var projectname = '応応応応 hello 用用用用';
var projectid = 'com.test.create.app6';

View File

@@ -20,11 +20,11 @@
var path = require('path'),
actions = require('./helpers/projectActions.js');
var PLUGIN_ADD_TIMEOUT = 60000;
var PLUGIN_ADD_TIMEOUT = 90000;
describe('plugin add', function() {
it('create project and add a plugin with framework', function(done) {
it('Test#001 : create project and add a plugin with framework', function(done) {
var projectname = 'testpluginframework';
var projectid = 'com.test.plugin.framework';
var fakePluginPath = path.join(__dirname, 'fixtures/cordova-plugin-fake');

View File

@@ -56,7 +56,7 @@ function testUpdate(projectname, projectid, createfrom, updatefrom, doBuild, don
describe('preparing fixtures', function () {
it('cloning old platform', function (done) {
it('Test#001 : cloning old platform', function (done) {
var command = util.format('git clone %s --depth=1 --branch %s %s',
PLATFORM_GIT_URL, platformOld.version, platformOld.path);
shell.rm('-rf', platformOld.path);
@@ -70,7 +70,7 @@ describe('preparing fixtures', function () {
describe('update', function() {
it('should update major version and build the project', function(done) {
it('Test#002 : should update major version and build the project', function(done) {
var projectname = 'testupdate';
var projectid = 'com.test.update.app1';
@@ -78,19 +78,11 @@ describe('update', function() {
}, UPDATE_TIMEOUT);
it('should downgrade major version and build the project', function(done) {
var projectname = 'testupdate';
var projectid = 'com.test.update.app2';
testUpdate(projectname, projectid, platformEdge, platformOld, true, done);
}, UPDATE_TIMEOUT);
// TODO: After next Android release, add tests for minor/patch version update
});
describe('cleanup', function () {
it('remove cloned old platform', function() {
it('Test#004 : remove cloned old platform', function() {
shell.rm('-rf', platformOld.path);
});

View File

@@ -0,0 +1 @@
Tests require that this folder exists.

Some files were not shown because too many files have changed in this diff Show More