Merge branch 'sales_pd'
This commit is contained in:
commit
f74b2e83d0
@ -91,8 +91,12 @@
|
||||
<plugin name="cordova-plugin-geolocation" spec="2.4.3">
|
||||
<variable name="GEOLOCATION_USAGE_DESCRIPTION" value="To locate you" />
|
||||
</plugin>
|
||||
<plugin name="cordova-plugin-camera" spec="~4.0.3" />
|
||||
<plugin name="cordova-plugin-app-version" spec="0.1.9" />
|
||||
<plugin name="cordova-sqlite-storage" spec="3.4.0" />
|
||||
<plugin name="cordova-plugin-camera" spec="~4.0.3" />
|
||||
<plugin name="cordova-plugin-request-location-accuracy" spec="2.3.0">
|
||||
<variable name="PLAY_SERVICES_LOCATION_VERSION" value="16.+" />
|
||||
</plugin>
|
||||
<engine name="browser" spec="5.0.4" />
|
||||
<engine name="android" spec="7.1.1" />
|
||||
</widget>
|
||||
|
||||
52
package-lock.json
generated
52
package-lock.json
generated
@ -141,9 +141,9 @@
|
||||
"integrity": "sha512-qLd0nXhLtDzeiavrdIP4ge679L2NYEl0NIRRcNmEyC69zAXv8rNj1ziRsVLPH319sUgYS/AQjbCFACPFls1Spg=="
|
||||
},
|
||||
"@ionic-native/camera": {
|
||||
"version": "4.16.0",
|
||||
"resolved": "https://registry.npmjs.org/@ionic-native/camera/-/camera-4.16.0.tgz",
|
||||
"integrity": "sha512-YNa1C8AK7WtNhWMR/KR8U458bdpezu+7rqAlrZyKjLorBlNjGWUSxh8gigYYEf1My4slV517IvonUS49kR04zw=="
|
||||
"version": "4.20.0",
|
||||
"resolved": "https://registry.npmjs.org/@ionic-native/camera/-/camera-4.20.0.tgz",
|
||||
"integrity": "sha512-WnfQq8RV+7ezOqpCyNx9Xgpy7Y8TZehGLSxZXnCqCbFZ72CpC70Q5AV/eTIRGiKkotx2U6nUopYF+gTj1cunFA=="
|
||||
},
|
||||
"@ionic-native/core": {
|
||||
"version": "4.4.0",
|
||||
@ -165,6 +165,11 @@
|
||||
"resolved": "https://registry.npmjs.org/@ionic-native/launch-navigator/-/launch-navigator-4.16.0.tgz",
|
||||
"integrity": "sha512-cBloEL2mNvgb7s64lGZjszgu3BmB/3ZnQNW/hlj0RB14XcsVZo3Fv2u1licDTjjDYUTqU3ybjAt/oV5EOn+pDg=="
|
||||
},
|
||||
"@ionic-native/location-accuracy": {
|
||||
"version": "4.20.0",
|
||||
"resolved": "https://registry.npmjs.org/@ionic-native/location-accuracy/-/location-accuracy-4.20.0.tgz",
|
||||
"integrity": "sha512-GB0kdW+4cZ4dE4319PsVV2zbRnV8qgBUih57195QSz5FRiFC4E0GPE6cVtUWJBrtvcyAMexk1L45bRlv5lYW3w=="
|
||||
},
|
||||
"@ionic-native/splash-screen": {
|
||||
"version": "4.4.0",
|
||||
"resolved": "https://registry.npmjs.org/@ionic-native/splash-screen/-/splash-screen-4.4.0.tgz",
|
||||
@ -2464,6 +2469,11 @@
|
||||
"resolved": "https://registry.npmjs.org/cordova-plugin-ionic-webview/-/cordova-plugin-ionic-webview-2.2.0.tgz",
|
||||
"integrity": "sha512-mNTJaIRsz83Vntk2d3jrPCnlqEPQsfOJW6U2AzS7WV1T15Jj/STdXI/Uv1vIyvPVd9h1OLF+yu64ZsmQH2VRMQ=="
|
||||
},
|
||||
"cordova-plugin-request-location-accuracy": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/cordova-plugin-request-location-accuracy/-/cordova-plugin-request-location-accuracy-2.3.0.tgz",
|
||||
"integrity": "sha512-Rgr3DnRC8PUQyxmsOs76KxvDJB28MoCoYFfceiGn9Nzwsg6nAJmAwEtrYzm283x1cDhBPvzkZ6lzuldTkmnWjA=="
|
||||
},
|
||||
"cordova-plugin-splashscreen": {
|
||||
"version": "5.0.2",
|
||||
"resolved": "https://registry.npmjs.org/cordova-plugin-splashscreen/-/cordova-plugin-splashscreen-5.0.2.tgz",
|
||||
@ -2479,6 +2489,19 @@
|
||||
"resolved": "https://registry.npmjs.org/cordova-plugin-whitelist/-/cordova-plugin-whitelist-1.3.3.tgz",
|
||||
"integrity": "sha1-tehezbv+Wu3tQKG/TuI3LmfZb7Q="
|
||||
},
|
||||
"cordova-sqlite-storage": {
|
||||
"version": "3.4.0",
|
||||
"resolved": "https://registry.npmjs.org/cordova-sqlite-storage/-/cordova-sqlite-storage-3.4.0.tgz",
|
||||
"integrity": "sha512-Uavq3HulVIYXxTFCp5aafiQhYrZF0/cGlyN76RYhIftcD5IRhza9+ghhV5abJYvuGlzY+p9dM5hPcjnYxfAH+g==",
|
||||
"requires": {
|
||||
"cordova-sqlite-storage-dependencies": "2.1.0"
|
||||
}
|
||||
},
|
||||
"cordova-sqlite-storage-dependencies": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/cordova-sqlite-storage-dependencies/-/cordova-sqlite-storage-dependencies-2.1.0.tgz",
|
||||
"integrity": "sha512-m0cPOWPzckAqS0/e7v+xtcM+FrHrw63qgh5T91JdkXMKCK8sN9bDoqVNJHZ5E9y7sRO7liMUIDm6Dz439RYqGA=="
|
||||
},
|
||||
"core-util-is": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
||||
@ -4952,17 +4975,17 @@
|
||||
"dev": true
|
||||
},
|
||||
"ngx-mat-select-search": {
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmjs.org/ngx-mat-select-search/-/ngx-mat-select-search-1.7.1.tgz",
|
||||
"integrity": "sha512-oys3g/dbehXD0BG/zH9E1JwncROBXWUo6243YrVScvY9I/zFZT4sA2ClY1WALxc807Qvbq3Hs4TTLW/9BnLVSw==",
|
||||
"version": "1.8.0",
|
||||
"resolved": "https://registry.npmjs.org/ngx-mat-select-search/-/ngx-mat-select-search-1.8.0.tgz",
|
||||
"integrity": "sha512-oCuGWn0GYxqpOZ4mdJvHJ0l/vctVQ9kxMKEUy6HZ5bGx4dCBUsolwnQeUDM+vwGtlXoBzYQ27cxYgbfNSyuabg==",
|
||||
"requires": {
|
||||
"tslib": "^1.9.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"tslib": {
|
||||
"version": "1.9.3",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
|
||||
"integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
|
||||
"version": "1.10.0",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
|
||||
"integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -5198,9 +5221,9 @@
|
||||
}
|
||||
},
|
||||
"object-keys": {
|
||||
"version": "1.0.11",
|
||||
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz",
|
||||
"integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0="
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
|
||||
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
|
||||
},
|
||||
"object-visit": {
|
||||
"version": "1.0.1",
|
||||
@ -7491,6 +7514,11 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"watermarkjs": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/watermarkjs/-/watermarkjs-2.0.0.tgz",
|
||||
"integrity": "sha1-adw+sb6qT3DBGJsgLj3mWF7NWyI="
|
||||
},
|
||||
"webpack": {
|
||||
"version": "3.12.0",
|
||||
"resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz",
|
||||
|
||||
16
package.json
16
package.json
@ -24,14 +24,15 @@
|
||||
"@angular/platform-browser": "5.0.3",
|
||||
"@angular/platform-browser-dynamic": "5.0.3",
|
||||
"@ionic-native/app-version": "^4.20.0",
|
||||
"@ionic-native/camera": "^4.16.0",
|
||||
"@ionic-native/camera": "^4.20.0",
|
||||
"@ionic-native/core": "4.4.0",
|
||||
"@ionic-native/fingerprint-aio": "^4.16.0",
|
||||
"@ionic-native/geolocation": "^4.16.0",
|
||||
"@ionic-native/launch-navigator": "^4.16.0",
|
||||
"@ionic-native/location-accuracy": "^4.20.0",
|
||||
"@ionic-native/splash-screen": "4.4.0",
|
||||
"@ionic-native/status-bar": "^4.16.0",
|
||||
"@ionic/storage": "2.1.3",
|
||||
"@ionic/storage": "^2.1.3",
|
||||
"@types/chart.js": "^2.7.40",
|
||||
"amazon-cognito-identity-js": "^3.0.3",
|
||||
"chart.js": "^2.7.3",
|
||||
@ -45,18 +46,21 @@
|
||||
"cordova-plugin-geolocation": "2.4.3",
|
||||
"cordova-plugin-ionic-keyboard": "^2.0.5",
|
||||
"cordova-plugin-ionic-webview": "^2.0.0",
|
||||
"cordova-plugin-request-location-accuracy": "2.3.0",
|
||||
"cordova-plugin-splashscreen": "5.0.2",
|
||||
"cordova-plugin-statusbar": "2.4.2",
|
||||
"cordova-plugin-whitelist": "1.3.3",
|
||||
"cordova-sqlite-storage": "3.4.0",
|
||||
"hammerjs": "^2.0.8",
|
||||
"ionic-angular": "3.9.2",
|
||||
"ionic-img-viewer": "^2.9.0",
|
||||
"ionicons": "3.0.0",
|
||||
"ngx-mat-select-search": "^1.7.1",
|
||||
"ngx-mat-select-search": "^1.8.0",
|
||||
"rxjs": "^6.3.1",
|
||||
"rxjs-compat": "^6.3.1",
|
||||
"sw-toolbox": "3.6.0",
|
||||
"uk.co.workingedge.phonegap.plugin.launchnavigator": "~4.2.2",
|
||||
"watermarkjs": "^2.0.0",
|
||||
"zone.js": "0.8.18"
|
||||
},
|
||||
"devDependencies": {
|
||||
@ -83,7 +87,11 @@
|
||||
"cordova-plugin-geolocation": {
|
||||
"GEOLOCATION_USAGE_DESCRIPTION": "To locate you"
|
||||
},
|
||||
"cordova-plugin-app-version": {}
|
||||
"cordova-plugin-app-version": {},
|
||||
"cordova-sqlite-storage": {},
|
||||
"cordova-plugin-request-location-accuracy": {
|
||||
"PLAY_SERVICES_LOCATION_VERSION": "16.+"
|
||||
}
|
||||
},
|
||||
"platforms": [
|
||||
"browser",
|
||||
|
||||
@ -41,6 +41,13 @@
|
||||
},
|
||||
"cordova-plugin-app-version": {
|
||||
"PACKAGE_NAME": "com.sineedge.pdglender"
|
||||
},
|
||||
"cordova-sqlite-storage": {
|
||||
"PACKAGE_NAME": "com.sineedge.pdglender"
|
||||
},
|
||||
"cordova-plugin-request-location-accuracy": {
|
||||
"PLAY_SERVICES_LOCATION_VERSION": "16.+",
|
||||
"PACKAGE_NAME": "com.sineedge.pdglender"
|
||||
}
|
||||
},
|
||||
"dependent_plugins": {
|
||||
|
||||
@ -39,6 +39,12 @@
|
||||
},
|
||||
"cordova-plugin-app-version": {
|
||||
"PACKAGE_NAME": "com.sineedge.pdglender"
|
||||
},
|
||||
"cordova-sqlite-storage": {
|
||||
"PACKAGE_NAME": "com.sineedge.pdglender"
|
||||
},
|
||||
"cordova-plugin-request-location-accuracy": {
|
||||
"PACKAGE_NAME": "com.sineedge.pdglender"
|
||||
}
|
||||
},
|
||||
"dependent_plugins": {
|
||||
|
||||
390
plugins/cordova-plugin-request-location-accuracy/README.md
Normal file
390
plugins/cordova-plugin-request-location-accuracy/README.md
Normal file
@ -0,0 +1,390 @@
|
||||
Cordova Request Location Accuracy Plugin [](https://www.npmjs.com/package/cordova-plugin-request-location-accuracy) [](https://npm-stat.com/charts.html?package=cordova-plugin-request-location-accuracy)
|
||||
==========================================================================================================================================================================================================================================================================================================================================================================================================
|
||||
<!-- doctoc README.md --maxlevel=3 -->
|
||||
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
|
||||
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
||||
**Table of Contents**
|
||||
|
||||
- [Overview](#overview)
|
||||
- [Why is this plugin not just part of cordova-diagnostic-plugin?](#why-is-this-plugin-not-just-part-of-cordova-diagnostic-plugin)
|
||||
- [Android overview](#android-overview)
|
||||
- [Android Play Services library dependency](#android-play-services-library-dependency)
|
||||
- [iOS overview](#ios-overview)
|
||||
- [iOS "Cancel" button caveat](#ios-cancel-button-caveat)
|
||||
- [Example project](#example-project)
|
||||
- [Installation](#installation)
|
||||
- [Using the Cordova/Phonegap CLI](#using-the-cordovaphonegap-cli)
|
||||
- [PhoneGap Build](#phonegap-build)
|
||||
- [Usage](#usage)
|
||||
- [Android & iOS](#android--ios)
|
||||
- [request()](#request)
|
||||
- [isRequesting()](#isrequesting)
|
||||
- [canRequest()](#canrequest)
|
||||
- [Android-only](#android-only)
|
||||
- [Request constants](#request-constants)
|
||||
- [Callback constants](#callback-constants)
|
||||
- [Full Android & iOS example](#full-android--ios-example)
|
||||
- [License](#license)
|
||||
|
||||
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
||||
|
||||
# Overview
|
||||
|
||||
This Cordova/Phonegap plugin for Android and iOS to request enabling/changing of Location Services by triggering a native dialog from within the app, avoiding the need for the user to leave your app to change location settings manually.
|
||||
|
||||
<!-- DONATE -->
|
||||
[](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=ZRD3W47HQ3EMJ)
|
||||
|
||||
I dedicate a considerable amount of my free time to developing and maintaining this Cordova plugin, along with my other Open Source software.
|
||||
To help ensure this plugin is kept updated, new features are added and bugfixes are implemented quickly, please donate a couple of dollars (or a little more if you can stretch) as this will help me to afford to dedicate time to its maintenance. Please consider donating if you're using this plugin in an app that makes you money, if you're being paid to make the app, if you're asking for new features or priority bug fixes.
|
||||
<!-- END DONATE -->
|
||||
|
||||
## Why is this plugin not just part of [cordova-diagnostic-plugin](https://github.com/dpa99c/cordova-diagnostic-plugin)?
|
||||
|
||||
Because:
|
||||
- you may not wish to use the location features of the diagnostic plugin and therefore may not require it
|
||||
- you may not wish to use the features of this plugin
|
||||
- on Android, the dependency on the Google Play Services library increases the size of the app APK by about 2Mb
|
||||
|
||||
However, since this plugin requires runtime authorization to use location to be granted by the user, you may want to use the diagnostic plugin to check for/request location permission.
|
||||
|
||||
|
||||
## Android overview
|
||||
|
||||
[](https://www.youtube.com/watch?v=pbNdnMDRstg)
|
||||
|
||||
On Android, this plugin allows an app to request a specific accuracy for Location Services.
|
||||
If the requested accuracy is higher than the current Location Mode setting of the device, the user is asked to confirm the change with a Yes/No dialog.
|
||||
|
||||
For example, if a navigation app that requires GPS, the plugin is able to switch on Location Services or change the Location Mode from low accuracy to high accuracy,
|
||||
without the user needing to leave the app to do this manually on the Location Settings page.
|
||||
|
||||
It uses the Google Play Services Location API (v7+) to change the device location settings. In case the user doesn't have an up-to-date version of Google Play Services or there's some other problem accessing it, you may want to use another of my plugins, [cordova.plugins.diagnostic](https://github.com/dpa99c/cordova-diagnostic-plugin) as a fallback. This is able to switch the user directly to the Location Settings page where they can manually change the Location Mode.
|
||||
|
||||
|
||||
|
||||
### Android Play Services library dependency
|
||||
This plugin depends on the Google Play Services library so you must install the "Google Repository" package under the "Extras" section in Android SDK Manager.
|
||||

|
||||
|
||||
#### Play Services version
|
||||
* **IMPORTANT:** This plugin is not directly responsible for, nor cannot it resolve, Android build errors which occur due to version conflicts in Gradle dependencies.
|
||||
* If you encounter Android build errors, please read the section below in detail to understand Gradle version dependencies in relation to this plugin.
|
||||
* Also see the [Android Library Versions guide](https://developers.google.com/android/guides/versioning).
|
||||
* Any issues which are opened which relate to build errors caused by Gradle version conflicts will be closed immediately with a reference given to the following section.
|
||||
|
||||
* This plugin depends on the `play-services-location` component of the [Google Play Services library](https://developers.google.com/android/guides/overview#the_google_play_services_client_library), which is satisfied via Gradle during the Android build process.
|
||||
* By default, [this plugin references](https://github.com/dpa99c/cordova-plugin-request-location-accuracy/blob/master/plugin.xml#L32) the most recently released major version of the `play-services-location` component (currently `v16` - see the [Android Library Release Notes](https://developers.google.com/android/guides/releases) for most recent minor/patch version).
|
||||
* Android build errors can occur if different versions of the same library or component are specified as Gradle dependencies in the same Android project.
|
||||
* You may encounter build errors if your Cordova project includes:
|
||||
* other plugins which specify a different major version of the Play Services library
|
||||
* In this case you may need to specify a custom version of the `play-services-location` component which is referenced by this plugin.
|
||||
* You can do this using the `PLAY_SERVICES_LOCATION_VERSION` plugin variable at plugin installation - see the [installation section](#installation) for an example.
|
||||
* You can find what other versions of the Play Services library are being referenced by looking at the `build.gradle` files in the `platforms/android/` directory of your Cordova project.
|
||||
* Look for entries that contain `com.google.android.gms`, for example `implementation "com.google.android.gms:play-services-location:15.+"`
|
||||
* other plugins which reference the Play Services library but do not allow you to specify a custom version (i.e the version is hard-coded) .
|
||||
* You can use [cordova-android-play-services-gradle-release](https://github.com/dpa99c/cordova-android-play-services-gradle-release) to override the Play Services library version specified by these other plugins in order to align them and prevent build errors.
|
||||
* other plugins which reference the Firebase library (or Google Services plugin), such as:
|
||||
* [phonegap-plugin-push](https://github.com/phonegap/phonegap-plugin-push)
|
||||
* [cordova-plugin-fcm](https://github.com/fechanique/cordova-plugin-fcm)
|
||||
* [cordova-plugin-firebase](https://github.com/arnesson/cordova-plugin-firebase))
|
||||
* This is because the major versions of the Play Services and Firebase libraries need to align.
|
||||
* You can use [cordova-android-firebase-gradle-release](https://github.com/dpa99c/cordova-android-firebase-gradle-release) to override the Firebase library versions specified by other plugins to align with the Play Services library version.
|
||||
* See [#50](https://github.com/dpa99c/cordova-plugin-request-location-accuracy/issues/50#issuecomment-390025013) for an example of this.
|
||||
|
||||
## iOS overview
|
||||
|
||||
[](https://www.youtube.com/watch?v=PBZKH7u5RlQ)
|
||||
|
||||
If Location Services is turned OFF on an iOS device, no app on the device can access the location.
|
||||
|
||||
It is not programmatically possible to switch Location Services ON or to directly open the Location Services page in the Settings app.
|
||||
|
||||
The best that can be done by direct programmatic invocation of the Settings app is to open the app's own permissions page - the [`switchToSettings()`](https://github.com/dpa99c/cordova-diagnostic-plugin#switchtosettings) of [cordova-diagnostic-plugin](https://github.com/dpa99c/cordova-diagnostic-plugin#switchtosettings) enables you to do this. However, the user must still manually navigate from the app permissions page in the Settings app to the Location Services setting on the Privacy page.
|
||||
|
||||
If Location Services is turned OFF, this plugin enables an app to display a native iOS system dialog which gives user the option of directly opening the Privacy page in the Settings app which contains the switch to turn Location Services ON.
|
||||
|
||||
In order to show the native dialog allowing direct opening of the Privacy page, a location must be requested via the native location manager. So why can't you just use [cordova-plugin-geolocation](https://github.com/apache/cordova-plugin-geolocation) to request the location? Because when Location Services is OFF, the app reports that use of location is unauthorized, and [cordova-plugin-geolocation](https://github.com/apache/cordova-plugin-geolocation) will not request a location if it determines location is unauthorized: see [this Cordova issue](https://issues.apache.org/jira/browse/CB-10478).
|
||||
|
||||
### iOS "Cancel" button caveat
|
||||
|
||||
As highlighted by [issue #16](https://github.com/dpa99c/cordova-plugin-request-location-accuracy/issues/16), there is one scenario in which the iOS implementation of this plugin fails: if, upon successfully showing the native dialog, the user presses "Cancel" instead of "Settings", any subsequent requests via this plugin **will not** show the dialog again. Ever! This is because iOS assumes that if the user pressed "Cancel", they don't want your app to use their location, so iOS prevents you from asking them again to switch on Location Services.
|
||||
|
||||
There's no way to tell which button the user pressed in the native dialog or whether "Cancel" was pressed and the dialog is not being shown. Consequently, if the user has pressed "Cancel" in the native dialog, any subsequent calls to the plugin will still result in the success callback being invoked, since (as far as the plugin is concerned), it successfully requested a location from the native location manager.
|
||||
|
||||
The best approach to workaround this is to recheck the state of Location Services using [canRequest()](#canrequest) on each [resume event](https://cordova.apache.org/docs/en/latest/cordova/events/events.html#resume). If the user has pressed "Settings", your app will be put in the background while the Settings app is brought into the foreground, so when the user returns to your app, it will resume from the background.
|
||||
|
||||
# Example project
|
||||
|
||||
An example project illustrating use of this plugin can be found here: [https://github.com/dpa99c/cordova-plugin-request-location-accuracy-example](https://github.com/dpa99c/cordova-plugin-request-location-accuracy-example)
|
||||
|
||||
# Installation
|
||||
|
||||
## Using the Cordova/Phonegap CLI
|
||||
|
||||
# Install with default Play Services Location library version
|
||||
$ cordova plugin add cordova-plugin-request-location-accuracy
|
||||
|
||||
# Install with custom Play Services Location library version
|
||||
$ cordova plugin add cordova-plugin-request-location-accuracy --variable PLAY_SERVICES_LOCATION_VERSION=15.0.0
|
||||
|
||||
## PhoneGap Build
|
||||
Add the following xml to your config.xml to use the latest version of this plugin from [npm](https://www.npmjs.com/package/cordova-plugin-request-location-accuracy):
|
||||
|
||||
<plugin name="cordova-plugin-request-location-accuracy" source="npm" />
|
||||
|
||||
|
||||
|
||||
# Usage
|
||||
|
||||
The plugin is exposed via the `cordova.plugins.locationAccuracy` object.
|
||||
|
||||
## Android & iOS
|
||||
|
||||
### request()
|
||||
|
||||
This is the main plugin method.
|
||||
|
||||
#### Android
|
||||
|
||||
Requests a specific accuracy for Location Services.
|
||||
|
||||
cordova.plugins.locationAccuracy.request(successCallback, errorCallback, accuracy)
|
||||
|
||||
Parameters:
|
||||
|
||||
- {Function} successCallback - callback to be invoked on successful resolution of the requested accuracy.
|
||||
A single object argument will be passed which has two keys:
|
||||
"code" in an integer corresponding to a [SUCCESS constant](#success-constants) and indicates the reason for success;
|
||||
"message" is a string containing a description of the success.
|
||||
- {Function} errorCallback - callback to be invoked on failure to resolve the requested accuracy.
|
||||
A single object argument will be passed which has two keys:
|
||||
"code" in an integer corresponding to an [ERROR constant](#error-constants) and indicates the reason for failure;
|
||||
"message" is a string containing a description of the error.
|
||||
- {Integer} accuracy - The location accuracy to request defined by an integer corresponding to a [REQUEST constant](#request-constants).
|
||||
|
||||
Example usage:
|
||||
|
||||
cordova.plugins.locationAccuracy.canRequest(function(canRequest){
|
||||
if(canRequest){
|
||||
cordova.plugins.locationAccuracy.request(function (success){
|
||||
console.log("Successfully requested accuracy: "+success.message);
|
||||
}, function (error){
|
||||
console.error("Accuracy request failed: error code="+error.code+"; error message="+error.message);
|
||||
if(error.code !== cordova.plugins.locationAccuracy.ERROR_USER_DISAGREED){
|
||||
if(window.confirm("Failed to automatically set Location Mode to 'High Accuracy'. Would you like to switch to the Location Settings page and do this manually?")){
|
||||
cordova.plugins.diagnostic.switchToLocationSettings();
|
||||
}
|
||||
}
|
||||
}, cordova.plugins.locationAccuracy.REQUEST_PRIORITY_HIGH_ACCURACY);
|
||||
}else{
|
||||
// request location permission and try again
|
||||
}
|
||||
});
|
||||
|
||||
#### iOS
|
||||
|
||||
If Location Services is OFF, invokes the native dialog to directly open the Location Services page in the Settings app.
|
||||
|
||||
cordova.plugins.locationAccuracy.request(successCallback, errorCallback)
|
||||
|
||||
Parameters:
|
||||
|
||||
- {Function} successCallback - callback to be invoked on successful request to invoke the dialog.
|
||||
- {Function} errorCallback - callback to be invoked on failure to request a location and invoked the dialog.
|
||||
|
||||
Example usage:
|
||||
|
||||
cordova.plugins.locationAccuracy.canRequest(function(canRequest){
|
||||
if(canRequest){
|
||||
cordova.plugins.locationAccuracy.request(function(){
|
||||
console.log("Successfully made request to invoke native Location Services dialog");
|
||||
}, function(){
|
||||
console.error("Failed to invoke native Location Services dialog");
|
||||
});
|
||||
}else{
|
||||
// request location permission and try again
|
||||
}
|
||||
});
|
||||
|
||||
### isRequesting()
|
||||
|
||||
Indicates if a request is currently in progress.
|
||||
|
||||
cordova.plugins.locationAccuracy.isRequesting(successCallback);
|
||||
|
||||
Parameters:
|
||||
|
||||
- {Function} successCallback - callback to pass result to.
|
||||
This is passed a boolean argument indicating if a request is currently in progress.
|
||||
|
||||
Example usage:
|
||||
|
||||
cordova.plugins.locationAccuracy.isRequesting(function(requesting){
|
||||
console.log("A request " + (requesting ? "is" : "is not") + " currently in progress");
|
||||
});
|
||||
|
||||
### canRequest()
|
||||
|
||||
Indicates if a request is possible to invoke a request.
|
||||
On iOS, this will return true if Location Services is currently OFF and request is not currently in progress.
|
||||
On Android, this will return true if the app has authorization to use location.
|
||||
|
||||
cordova.plugins.locationAccuracy.canRequest(successCallback);
|
||||
|
||||
|
||||
Parameters:
|
||||
|
||||
- {Function} successCallback - callback to pass result to.
|
||||
This is passed a boolean argument indicating if a request can be made.
|
||||
|
||||
Example usage:
|
||||
|
||||
cordova.plugins.locationAccuracy.canRequest(function(canRequest){
|
||||
console.log("A request " + (canRequest ? "can" : "cannot") + " currently be made");
|
||||
});
|
||||
|
||||
## Android-only
|
||||
|
||||
### Request constants
|
||||
|
||||
The location accuracy which is to be requested is defined as a set of REQUEST constants on the `cordova.plugins.locationAccuracy` object:
|
||||
|
||||
- `cordova.plugins.locationAccuracy.REQUEST_PRIORITY_NO_POWER`: Request location mode priority "no power": the best accuracy possible with zero additional power consumption.
|
||||
- `cordova.plugins.locationAccuracy.REQUEST_PRIORITY_LOW_POWER`: Request location mode priority "low power": "city" level accuracy (about 10km accuracy).
|
||||
- `cordova.plugins.locationAccuracy.REQUEST_PRIORITY_BALANCED_POWER_ACCURACY`: Request location mode priority "balanced power": "block" level accuracy (about 100 meter accuracy).
|
||||
- `cordova.plugins.locationAccuracy.REQUEST_PRIORITY_HIGH_ACCURACY`: Request location mode priority "high accuracy": the most accurate locations available. This will use GPS hardware to retrieve positions.
|
||||
|
||||
|
||||
See [https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest#constants](https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest#constants)
|
||||
|
||||
### Callback constants
|
||||
|
||||
Both the `successCallback()` and `errorCallback()` functions will be passed an object which contains both a descriptive message and a code indicating the result of the operation.
|
||||
These constants are defined on the `cordova.plugins.locationAccuracy` object.
|
||||
|
||||
#### Success constants
|
||||
|
||||
The `successCallback()` function will be pass an object where the "code" key may correspond to the following values:
|
||||
|
||||
- `cordova.plugins.locationAccuracy.SUCCESS_SETTINGS_SATISFIED`: Success due to current location settings already satisfying requested accuracy.
|
||||
- `cordova.plugins.locationAccuracy.SUCCESS_USER_AGREED`: Success due to user agreeing to requested accuracy change
|
||||
|
||||
#### Error constants
|
||||
|
||||
The `errorCallback()` function will be pass an object where the "code" key may correspond to the following values:
|
||||
|
||||
- `cordova.plugins.locationAccuracy.ERROR_ALREADY_REQUESTING`: Error due an unresolved request already being in progress.
|
||||
- `cordova.plugins.locationAccuracy.ERROR_INVALID_ACTION`: Error due invalid action requested.
|
||||
- `cordova.plugins.locationAccuracy.ERROR_INVALID_ACCURACY`: Error due invalid accuracy requested.
|
||||
- `cordova.plugins.locationAccuracy.ERROR_EXCEPTION`: Error due to exception in the native code.
|
||||
- `cordova.plugins.locationAccuracy.ERROR_CANNOT_CHANGE_ACCURACY`: Error due to not being able to change location accuracy to requested state.
|
||||
- `cordova.plugins.locationAccuracy.ERROR_USER_DISAGREED`: Error due to user rejecting requested accuracy change.
|
||||
- `cordova.plugins.locationAccuracy.ERROR_GOOGLE_API_CONNECTION_FAILED`: Error due to failure to connect to Google Play Services API. The "message" key will contain a detailed description of the Google Play Services error.
|
||||
|
||||
|
||||
# Full Android & iOS example
|
||||
|
||||
The following example illustrates how to use the plugin cross-platform on both Android & iOS,
|
||||
and also how to use [cordova-diagnostic-plugin](https://github.com/dpa99c/cordova-diagnostic-plugin) to request runtime permission to use location if necessary.
|
||||
|
||||
var platform;
|
||||
function onDeviceReady(){
|
||||
platform = cordova.platformId;
|
||||
}
|
||||
|
||||
|
||||
function onError(error) {
|
||||
console.error("The following error occurred: " + error);
|
||||
}
|
||||
|
||||
function handleLocationAuthorizationStatus(status) {
|
||||
switch (status) {
|
||||
case cordova.plugins.diagnostic.permissionStatus.GRANTED:
|
||||
if(platform === "ios"){
|
||||
onError("Location services is already switched ON");
|
||||
}else{
|
||||
_makeRequest();
|
||||
}
|
||||
break;
|
||||
case cordova.plugins.diagnostic.permissionStatus.NOT_REQUESTED:
|
||||
requestLocationAuthorization();
|
||||
break;
|
||||
case cordova.plugins.diagnostic.permissionStatus.DENIED:
|
||||
if(platform === "android"){
|
||||
onError("User denied permission to use location");
|
||||
}else{
|
||||
_makeRequest();
|
||||
}
|
||||
break;
|
||||
case cordova.plugins.diagnostic.permissionStatus.DENIED_ALWAYS:
|
||||
// Android only
|
||||
onError("User denied permission to use location");
|
||||
break;
|
||||
case cordova.plugins.diagnostic.permissionStatus.GRANTED_WHEN_IN_USE:
|
||||
// iOS only
|
||||
onError("Location services is already switched ON");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function requestLocationAuthorization() {
|
||||
cordova.plugins.diagnostic.requestLocationAuthorization(handleLocationAuthorizationStatus, onError);
|
||||
}
|
||||
|
||||
function requestLocationAccuracy() {
|
||||
cordova.plugins.diagnostic.getLocationAuthorizationStatus(handleLocationAuthorizationStatus, onError);
|
||||
}
|
||||
|
||||
function _makeRequest(){
|
||||
cordova.plugins.locationAccuracy.canRequest(function(canRequest){
|
||||
if (canRequest) {
|
||||
cordova.plugins.locationAccuracy.request(function () {
|
||||
handleSuccess("Location accuracy request successful");
|
||||
}, function (error) {
|
||||
onError("Error requesting location accuracy: " + JSON.stringify(error));
|
||||
if (error) {
|
||||
// Android only
|
||||
onError("error code=" + error.code + "; error message=" + error.message);
|
||||
if (platform === "android" && error.code !== cordova.plugins.locationAccuracy.ERROR_USER_DISAGREED) {
|
||||
if (window.confirm("Failed to automatically set Location Mode to 'High Accuracy'. Would you like to switch to the Location Settings page and do this manually?")) {
|
||||
cordova.plugins.diagnostic.switchToLocationSettings();
|
||||
}
|
||||
}
|
||||
}
|
||||
}, cordova.plugins.locationAccuracy.REQUEST_PRIORITY_HIGH_ACCURACY // iOS will ignore this
|
||||
);
|
||||
} else {
|
||||
// On iOS, this will occur if Location Services is currently on OR a request is currently in progress.
|
||||
// On Android, this will occur if the app doesn't have authorization to use location.
|
||||
onError("Cannot request location accuracy");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Make the request
|
||||
requestLocationAccuracy();
|
||||
|
||||
# License
|
||||
|
||||
The MIT License
|
||||
|
||||
Copyright (c) 2016 Dave Alden (Working Edge Ltd.)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
@ -0,0 +1,66 @@
|
||||
{
|
||||
"_from": "cordova-plugin-request-location-accuracy",
|
||||
"_id": "cordova-plugin-request-location-accuracy@2.3.0",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-Rgr3DnRC8PUQyxmsOs76KxvDJB28MoCoYFfceiGn9Nzwsg6nAJmAwEtrYzm283x1cDhBPvzkZ6lzuldTkmnWjA==",
|
||||
"_location": "/cordova-plugin-request-location-accuracy",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "tag",
|
||||
"registry": true,
|
||||
"raw": "cordova-plugin-request-location-accuracy",
|
||||
"name": "cordova-plugin-request-location-accuracy",
|
||||
"escapedName": "cordova-plugin-request-location-accuracy",
|
||||
"rawSpec": "",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "latest"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"#USER",
|
||||
"/"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/cordova-plugin-request-location-accuracy/-/cordova-plugin-request-location-accuracy-2.3.0.tgz",
|
||||
"_shasum": "46c21ca92e46b7f9a209fbb7f5662562f14cbb97",
|
||||
"_spec": "cordova-plugin-request-location-accuracy",
|
||||
"_where": "/home/rajasekar/project/SineEdge/sineedgelenderapp",
|
||||
"author": {
|
||||
"name": "Dave Alden"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/dpa99c/cordova-plugin-request-location-accuracy/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"cordova": {
|
||||
"id": "cordova-plugin-request-location-accuracy",
|
||||
"platforms": [
|
||||
"android",
|
||||
"ios"
|
||||
]
|
||||
},
|
||||
"cordova_name": "Request Location Accuracy",
|
||||
"deprecated": false,
|
||||
"description": "Cordova/Phonegap plugin for Android to request Location Accuracy mode via Google Play Services.",
|
||||
"homepage": "https://github.com/dpa99c/cordova-plugin-request-location-accuracy#readme",
|
||||
"issue": "https://github.com/dpa99c/cordova-plugin-request-location-accuracy/issues",
|
||||
"keywords": [
|
||||
"ecosystem:cordova",
|
||||
"cordova",
|
||||
"cordova-android",
|
||||
"cordova-ios",
|
||||
"phonegap",
|
||||
"diagnostic",
|
||||
"location",
|
||||
"accuracy",
|
||||
"high accuracy",
|
||||
"fine accuracy",
|
||||
"gps",
|
||||
"settings"
|
||||
],
|
||||
"license": "MIT",
|
||||
"name": "cordova-plugin-request-location-accuracy",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/dpa99c/cordova-plugin-request-location-accuracy.git"
|
||||
},
|
||||
"version": "2.3.0"
|
||||
}
|
||||
53
plugins/cordova-plugin-request-location-accuracy/plugin.xml
Normal file
53
plugins/cordova-plugin-request-location-accuracy/plugin.xml
Normal file
@ -0,0 +1,53 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<plugin xmlns="http://www.phonegap.com/ns/plugins/1.0"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
id="cordova-plugin-request-location-accuracy"
|
||||
version="2.3.0">
|
||||
|
||||
<name>Request Location Accuracy</name>
|
||||
<description>Cordova/Phonegap plugin for Android and iOS to request enabling/changing of Location Services by triggering a native dialog</description>
|
||||
<author>Dave Alden</author>
|
||||
<engines>
|
||||
<engine name="cordova" version=">=3.0.0" />
|
||||
</engines>
|
||||
|
||||
<repo>https://github.com/dpa99c/cordova-plugin-request-location-accuracy.git</repo>
|
||||
<issue>https://github.com/dpa99c/cordova-plugin-request-location-accuracy/issues</issue>
|
||||
<keywords>ecosystem:cordova,cordova,phonegap,android,diagnostic,location,accuracy,high accuracy,fine accuracy,gps,settings</keywords>
|
||||
<license>MIT</license>
|
||||
|
||||
<platform name="android">
|
||||
<config-file target="config.xml" parent="/*">
|
||||
<feature name="RequestLocationAccuracy" >
|
||||
<param name="android-package" value="cordova.plugin.RequestLocationAccuracy"/>
|
||||
</feature>
|
||||
</config-file>
|
||||
|
||||
<js-module src="www/android/RequestLocationAccuracy.js" name="RequestLocationAccuracy">
|
||||
<clobbers target="cordova.plugins.locationAccuracy" />
|
||||
</js-module>
|
||||
|
||||
<source-file src="src/android/RequestLocationAccuracy.java" target-dir="src/cordova/plugin" />
|
||||
|
||||
<preference name="PLAY_SERVICES_LOCATION_VERSION" default="16.+" />
|
||||
<framework src="com.google.android.gms:play-services-location:$PLAY_SERVICES_LOCATION_VERSION" />
|
||||
</platform>
|
||||
|
||||
<platform name="ios">
|
||||
|
||||
<js-module src="www/ios/RequestLocationAccuracy.js" name="RequestLocationAccuracy">
|
||||
<clobbers target="cordova.plugins.locationAccuracy" />
|
||||
</js-module>
|
||||
|
||||
<config-file target="config.xml" parent="/*">
|
||||
<feature name="RequestLocationAccuracy">
|
||||
<param name="ios-package" value="RequestLocationAccuracy"/>
|
||||
</feature>
|
||||
</config-file>
|
||||
|
||||
<header-file src="src/ios/RequestLocationAccuracy.h" />
|
||||
<source-file src="src/ios/RequestLocationAccuracy.m" />
|
||||
|
||||
<framework src="CoreLocation.framework" />
|
||||
</platform>
|
||||
</plugin>
|
||||
@ -0,0 +1,525 @@
|
||||
/*
|
||||
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.
|
||||
*/
|
||||
package cordova.plugin;
|
||||
|
||||
import org.apache.cordova.CordovaWebView;
|
||||
import org.apache.cordova.CallbackContext;
|
||||
import org.apache.cordova.CordovaPlugin;
|
||||
import org.apache.cordova.CordovaInterface;
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Dialog;
|
||||
import android.content.DialogInterface;
|
||||
import android.util.Log;
|
||||
import android.os.Bundle;
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentSender;
|
||||
|
||||
import com.google.android.gms.common.ConnectionResult;
|
||||
import com.google.android.gms.common.GoogleApiAvailability;
|
||||
import com.google.android.gms.common.api.GoogleApiClient;
|
||||
import com.google.android.gms.common.api.PendingResult;
|
||||
import com.google.android.gms.common.api.ResultCallback;
|
||||
import com.google.android.gms.common.api.Status;
|
||||
import com.google.android.gms.location.LocationRequest;
|
||||
import com.google.android.gms.location.LocationServices;
|
||||
import com.google.android.gms.location.LocationSettingsRequest;
|
||||
import com.google.android.gms.location.LocationSettingsResult;
|
||||
import com.google.android.gms.location.LocationSettingsStatusCodes;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
public class RequestLocationAccuracy extends CordovaPlugin implements
|
||||
GoogleApiClient.ConnectionCallbacks,
|
||||
GoogleApiClient.OnConnectionFailedListener,
|
||||
ResultCallback<LocationSettingsResult> {
|
||||
public static final String TAG = "RequestLocationAccuracy";
|
||||
|
||||
/**
|
||||
* Provides the entry point to Google Play services.
|
||||
*/
|
||||
protected GoogleApiClient mGoogleApiClient = null;
|
||||
|
||||
/**
|
||||
* Google API availability
|
||||
*/
|
||||
protected GoogleApiAvailability googleApiAvailability;
|
||||
|
||||
|
||||
/**
|
||||
* Stores parameters for requests to the FusedLocationProviderApi.
|
||||
*/
|
||||
protected LocationRequest mLocationRequest;
|
||||
|
||||
/**
|
||||
* Stores the types of location services the client is interested in using. Used for checking
|
||||
* settings to determine if the device has optimal location settings.
|
||||
*/
|
||||
protected LocationSettingsRequest mLocationSettingsRequest;
|
||||
|
||||
/**
|
||||
* Constant used in the location settings dialog.
|
||||
*/
|
||||
protected static final int REQUEST_CHECK_SETTINGS = 0x1;
|
||||
|
||||
/**
|
||||
* Constant to indicated request for LocationRequest.PRIORITY_NO_POWER
|
||||
*/
|
||||
protected static final int REQUEST_PRIORITY_NO_POWER = 0;
|
||||
|
||||
/**
|
||||
* Constant to indicated request for LocationRequest.PRIORITY_LOW_POWER
|
||||
*/
|
||||
protected static final int REQUEST_PRIORITY_LOW_POWER = 1;
|
||||
|
||||
/**
|
||||
* Constant to indicated request for LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY
|
||||
*/
|
||||
protected static final int REQUEST_PRIORITY_BALANCED_POWER_ACCURACY = 2;
|
||||
|
||||
/**
|
||||
* Constant to indicated request for LocationRequest.HIGH_ACCURACY
|
||||
*/
|
||||
protected static final int REQUEST_PRIORITY_HIGH_ACCURACY = 3;
|
||||
|
||||
/**
|
||||
* Success due to current location settings already satisfying requested
|
||||
* accuracy
|
||||
*/
|
||||
protected static final int SUCCESS_SETTINGS_SATISFIED = 0;
|
||||
|
||||
/**
|
||||
* Success due to user agreeing to requested accuracy change
|
||||
*/
|
||||
protected static final int SUCCESS_USER_AGREED = 1;
|
||||
|
||||
/**
|
||||
* Error due invalid action requested
|
||||
*/
|
||||
protected static final int ERROR_INVALID_ACTION = 0;
|
||||
|
||||
/**
|
||||
* Error due invalid accuracy requested
|
||||
*/
|
||||
protected static final int ERROR_INVALID_ACCURACY = 1;
|
||||
|
||||
/**
|
||||
* Error due to exception
|
||||
*/
|
||||
protected static final int ERROR_EXCEPTION = 2;
|
||||
|
||||
/**
|
||||
* Error due to not being able to change location accuracy to requested state
|
||||
*/
|
||||
protected static final int ERROR_CANNOT_CHANGE_ACCURACY = 3;
|
||||
|
||||
/**
|
||||
* Error due to user rejecting requested accuracy change
|
||||
*/
|
||||
protected static final int ERROR_USER_DISAGREED = 4;
|
||||
|
||||
/**
|
||||
* Error due to failure to connect to Google Play Services API
|
||||
*/
|
||||
protected static final int ERROR_GOOGLE_API_CONNECTION_FAILED = 5;
|
||||
|
||||
/**
|
||||
* Cordova callback context
|
||||
*/
|
||||
protected CallbackContext context = null;
|
||||
|
||||
/**
|
||||
* Indicates a permanent error, so doesn't recheck since the Google APIs won't invoke the listeners on subsequent calls.
|
||||
*/
|
||||
protected ConnectionResult permanentError = null;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
public RequestLocationAccuracy() {}
|
||||
|
||||
|
||||
/**
|
||||
* Sets the context of the Command. This can then be used to do things like
|
||||
* get file paths associated with the Activity.
|
||||
*
|
||||
* @param cordova The context of the main Activity.
|
||||
* @param webView The CordovaWebView Cordova is running in.
|
||||
*/
|
||||
public void initialize(CordovaInterface cordova, CordovaWebView webView) {
|
||||
super.initialize(cordova, webView);
|
||||
try {
|
||||
googleApiAvailability = GoogleApiAvailability.getInstance();
|
||||
buildGoogleApiClient();
|
||||
}catch(Exception e ) {
|
||||
handleError(e.getMessage(), ERROR_EXCEPTION);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Executes the request and returns PluginResult.
|
||||
*
|
||||
* @param action The action to execute.
|
||||
* @param args JSONArry of arguments for the plugin.
|
||||
* @param callbackContext The callback id used when calling back into JavaScript.
|
||||
* @return True if the action was valid, false if not.
|
||||
*/
|
||||
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
|
||||
boolean result;
|
||||
context = callbackContext;
|
||||
try {
|
||||
if(action.equals("request")) {
|
||||
result = request(args.getInt(0));
|
||||
}else if(action.equals("canRequest")) {
|
||||
result = canRequest();
|
||||
}else {
|
||||
handleError("Invalid action", ERROR_INVALID_ACTION);
|
||||
result = false;
|
||||
}
|
||||
}catch(Exception e ) {
|
||||
handleError(e.getMessage(), ERROR_EXCEPTION);
|
||||
result = false;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public boolean request(int requestedAccuracy) throws Exception{
|
||||
if(permanentError != null){
|
||||
this.onConnectionFailed(permanentError);
|
||||
return true;
|
||||
}
|
||||
|
||||
if(mGoogleApiClient == null){
|
||||
handleError("Google Play Services Client failed to initialize", ERROR_GOOGLE_API_CONNECTION_FAILED);
|
||||
return true;
|
||||
}
|
||||
|
||||
int priority;
|
||||
switch(requestedAccuracy){
|
||||
case REQUEST_PRIORITY_NO_POWER:
|
||||
priority = LocationRequest.PRIORITY_NO_POWER;
|
||||
break;
|
||||
case REQUEST_PRIORITY_LOW_POWER:
|
||||
priority = LocationRequest.PRIORITY_LOW_POWER;
|
||||
break;
|
||||
case REQUEST_PRIORITY_BALANCED_POWER_ACCURACY:
|
||||
priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY;
|
||||
break;
|
||||
case REQUEST_PRIORITY_HIGH_ACCURACY:
|
||||
priority = LocationRequest.PRIORITY_HIGH_ACCURACY;
|
||||
break;
|
||||
default:
|
||||
handleError("'"+requestedAccuracy+"' is not a valid accuracy constant", ERROR_INVALID_ACCURACY);
|
||||
return false;
|
||||
}
|
||||
|
||||
createLocationRequest(priority);
|
||||
buildLocationSettingsRequest();
|
||||
checkLocationSettings();
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean canRequest() throws Exception{
|
||||
boolean _canRequest = isLocationAuthorized();
|
||||
context.success(_canRequest ? 1 : 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean isLocationAuthorized() throws Exception {
|
||||
boolean authorized = hasPermission(Manifest.permission.ACCESS_FINE_LOCATION) || hasPermission(Manifest.permission.ACCESS_COARSE_LOCATION);
|
||||
Log.v(TAG, "Location permission is " + (authorized ? "authorized" : "unauthorized"));
|
||||
return authorized;
|
||||
}
|
||||
|
||||
private boolean hasPermission(String permission) throws Exception{
|
||||
boolean hasPermission = true;
|
||||
Method method = null;
|
||||
try {
|
||||
method = cordova.getClass().getMethod("hasPermission", permission.getClass());
|
||||
Boolean bool = (Boolean) method.invoke(cordova, permission);
|
||||
hasPermission = bool.booleanValue();
|
||||
} catch (NoSuchMethodException e) {
|
||||
Log.w(TAG, "Cordova v" + CordovaWebView.CORDOVA_VERSION + " does not support runtime permissions so defaulting to GRANTED for " + permission);
|
||||
}
|
||||
return hasPermission;
|
||||
}
|
||||
|
||||
protected void handleError(String errorMsg, int errorCode){
|
||||
try {
|
||||
Log.e(TAG, errorMsg);
|
||||
if(context != null){
|
||||
JSONObject error = new JSONObject();
|
||||
error.put("message", errorMsg);
|
||||
error.put("code", errorCode);
|
||||
context.error(error);
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
Log.e(TAG, e.toString());
|
||||
}
|
||||
}
|
||||
|
||||
protected void handleSuccess(String msg, int code){
|
||||
try {
|
||||
Log.i(TAG, msg);
|
||||
if(context != null){
|
||||
JSONObject success = new JSONObject();
|
||||
success.put("message", msg);
|
||||
success.put("code", code);
|
||||
context.success(success);
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
handleError(e.getMessage(), ERROR_EXCEPTION);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds a GoogleApiClient. Uses the {@code #addApi} method to request the
|
||||
* LocationServices API.
|
||||
*/
|
||||
protected synchronized void buildGoogleApiClient() {
|
||||
Log.i(TAG, "Building GoogleApiClient");
|
||||
mGoogleApiClient = new GoogleApiClient.Builder(this.cordova.getActivity())
|
||||
.addConnectionCallbacks(this)
|
||||
.addOnConnectionFailedListener(this)
|
||||
.addApi(LocationServices.API)
|
||||
.build();
|
||||
|
||||
Log.i(TAG, "Connect Google API client");
|
||||
mGoogleApiClient.connect();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets up the location request. Android has two location request settings:
|
||||
* {@code ACCESS_COARSE_LOCATION} and {@code ACCESS_FINE_LOCATION}. These settings control
|
||||
* the accuracy of the current location. This sample uses ACCESS_FINE_LOCATION, as defined in
|
||||
* the AndroidManifest.xml.
|
||||
* <p/>
|
||||
* When the ACCESS_FINE_LOCATION setting is specified, combined with a fast update
|
||||
* interval (5 seconds), the Fused Location Provider API returns location updates that are
|
||||
* accurate to within a few feet.
|
||||
* <p/>
|
||||
* These settings are appropriate for mapping applications that show real-time location
|
||||
* updates.
|
||||
*/
|
||||
protected void createLocationRequest(int priority) {
|
||||
Log.i(TAG, "Create location request");
|
||||
mLocationRequest = new LocationRequest();
|
||||
mLocationRequest.setPriority(priority);
|
||||
}
|
||||
|
||||
/**
|
||||
* Uses a {@link com.google.android.gms.location.LocationSettingsRequest.Builder} to build
|
||||
* a {@link com.google.android.gms.location.LocationSettingsRequest} that is used for checking
|
||||
* if a device has the needed location settings.
|
||||
*/
|
||||
protected void buildLocationSettingsRequest() {
|
||||
Log.i(TAG, "Build location settings request");
|
||||
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
|
||||
builder.addLocationRequest(mLocationRequest);
|
||||
builder.setAlwaysShow(true);
|
||||
mLocationSettingsRequest = builder.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the device's location settings are adequate for the app's needs using the
|
||||
* {@link com.google.android.gms.location.SettingsApi#checkLocationSettings(GoogleApiClient,
|
||||
* LocationSettingsRequest)} method, with the results provided through a {@code PendingResult}.
|
||||
*/
|
||||
protected void checkLocationSettings() {
|
||||
Log.i(TAG, "Check location settings");
|
||||
PendingResult<LocationSettingsResult> result =
|
||||
LocationServices.SettingsApi.checkLocationSettings(
|
||||
mGoogleApiClient,
|
||||
mLocationSettingsRequest
|
||||
);
|
||||
result.setResultCallback(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* The callback invoked when
|
||||
* {@link com.google.android.gms.location.SettingsApi#checkLocationSettings(GoogleApiClient,
|
||||
* LocationSettingsRequest)} is called. Examines the
|
||||
* {@link com.google.android.gms.location.LocationSettingsResult} object and determines if
|
||||
* location settings are adequate. If they are not, begins the process of presenting a location
|
||||
* settings dialog to the user.
|
||||
*/
|
||||
@Override
|
||||
public void onResult(LocationSettingsResult locationSettingsResult) {
|
||||
Log.i(TAG, "onResult()");
|
||||
final Status status = locationSettingsResult.getStatus();
|
||||
switch (status.getStatusCode()) {
|
||||
case LocationSettingsStatusCodes.SUCCESS:
|
||||
String msg = "All location settings are satisfied.";
|
||||
Log.i(TAG, msg);
|
||||
handleSuccess(msg, SUCCESS_SETTINGS_SATISFIED);
|
||||
break;
|
||||
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
|
||||
Log.i(TAG, "Location settings are not satisfied. Show the user a dialog to upgrade location settings ");
|
||||
try {
|
||||
// Show the dialog by calling startResolutionForResult(), and check the result
|
||||
// in onActivityResult().
|
||||
this.cordova.setActivityResultCallback(this);
|
||||
status.startResolutionForResult(this.cordova.getActivity(), REQUEST_CHECK_SETTINGS);
|
||||
} catch (IntentSender.SendIntentException e) {
|
||||
handleError("PendingIntent unable to execute request: ".concat(e.getMessage()), ERROR_CANNOT_CHANGE_ACCURACY);
|
||||
}
|
||||
break;
|
||||
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
|
||||
handleError("Location settings are inadequate, and cannot be fixed here. Dialog not created.", ERROR_CANNOT_CHANGE_ACCURACY);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
Log.i(TAG, "onActivityResult()");
|
||||
switch (requestCode) {
|
||||
// Check for the integer request code originally supplied to startResolutionForResult().
|
||||
case REQUEST_CHECK_SETTINGS:
|
||||
switch (resultCode) {
|
||||
case Activity.RESULT_OK:
|
||||
String msg = "User agreed to make required location settings changes.";
|
||||
Log.i(TAG, msg);
|
||||
handleSuccess(msg, SUCCESS_USER_AGREED);
|
||||
break;
|
||||
case Activity.RESULT_CANCELED:
|
||||
handleError("User chose not to make required location settings changes.", ERROR_USER_DISAGREED);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs when a GoogleApiClient object successfully connects.
|
||||
*/
|
||||
@Override
|
||||
public void onConnected(Bundle connectionHint) {
|
||||
Log.i(TAG, "Connected to GoogleApiClient");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConnectionSuspended(int cause) {
|
||||
Log.i(TAG, "Connection suspended");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
Log.i(TAG, "On start");
|
||||
super.onStart();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
Log.i(TAG, "On onDestroy");
|
||||
if(mGoogleApiClient != null){
|
||||
super.onStop();
|
||||
Log.i(TAG, "Disconnect Google API client");
|
||||
try {
|
||||
mGoogleApiClient.disconnect();
|
||||
}catch(Exception e ) {
|
||||
handleError(e.getMessage(), ERROR_EXCEPTION);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConnectionFailed(ConnectionResult result) {
|
||||
// https://developers.google.com/android/reference/com/google/android/gms/common/ConnectionResult
|
||||
permanentError = result;
|
||||
String reason;
|
||||
switch (result.getErrorCode()){
|
||||
case ConnectionResult.API_UNAVAILABLE:
|
||||
reason = "One of the API components you attempted to connect to is not available.";
|
||||
break;
|
||||
case ConnectionResult.CANCELED:
|
||||
reason = "The connection was canceled.";
|
||||
break;
|
||||
case ConnectionResult.DEVELOPER_ERROR:
|
||||
reason = "The application is misconfigured.";
|
||||
break;
|
||||
case ConnectionResult.INTERNAL_ERROR:
|
||||
reason = "An internal error occurred.";
|
||||
break;
|
||||
case ConnectionResult.INTERRUPTED:
|
||||
reason = "An interrupt occurred while waiting for the connection complete.";
|
||||
break;
|
||||
case ConnectionResult.INVALID_ACCOUNT:
|
||||
reason = "he client attempted to connect to the service with an invalid account name specified.";
|
||||
break;
|
||||
case ConnectionResult.LICENSE_CHECK_FAILED:
|
||||
reason = "The application is not licensed to the user.";
|
||||
break;
|
||||
case ConnectionResult.NETWORK_ERROR:
|
||||
reason = "A network error occurred.";
|
||||
break;
|
||||
case ConnectionResult.RESOLUTION_REQUIRED:
|
||||
reason = "Completing the connection requires some form of resolution.";
|
||||
break;
|
||||
case ConnectionResult.SERVICE_DISABLED:
|
||||
reason = "The installed version of Google Play services has been disabled on this device.";
|
||||
break;
|
||||
case ConnectionResult.SERVICE_INVALID:
|
||||
reason = "The version of the Google Play services installed on this device is not authentic.";
|
||||
break;
|
||||
case ConnectionResult.SERVICE_MISSING:
|
||||
reason = "Google Play services is missing on this device.";
|
||||
break;
|
||||
case ConnectionResult.SERVICE_MISSING_PERMISSION:
|
||||
reason = "Google Play service doesn't have one or more required permissions.";
|
||||
break;
|
||||
case ConnectionResult.SERVICE_UPDATING:
|
||||
reason = "Google Play service is currently being updated on this device.";
|
||||
break;
|
||||
case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED:
|
||||
reason = "The installed version of Google Play services is out of date.";
|
||||
break;
|
||||
case ConnectionResult.SIGN_IN_FAILED:
|
||||
reason = "The client attempted to connect to the service but the user is not signed in.";
|
||||
break;
|
||||
case ConnectionResult.SIGN_IN_REQUIRED:
|
||||
reason = "The client attempted to connect to the service but the user is not signed in.";
|
||||
break;
|
||||
case ConnectionResult.TIMEOUT:
|
||||
reason = "The timeout was exceeded while waiting for the connection to complete.";
|
||||
break;
|
||||
default:
|
||||
reason = "Unknown reason";
|
||||
}
|
||||
handleError("Failed to connect to Google Play Services: ".concat(reason), ERROR_GOOGLE_API_CONNECTION_FAILED);
|
||||
|
||||
int status = googleApiAvailability.isGooglePlayServicesAvailable(cordova.getActivity().getApplicationContext());
|
||||
if (googleApiAvailability.isUserResolvableError (status)) {
|
||||
Dialog dialog = googleApiAvailability.getErrorDialog(cordova.getActivity(),status, 0);
|
||||
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
|
||||
@Override
|
||||
public void onCancel(DialogInterface dialogInterface) {
|
||||
cordova.getActivity().finish();
|
||||
}
|
||||
});
|
||||
dialog.show();
|
||||
permanentError = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,15 @@
|
||||
#import <Cordova/CDVPlugin.h>
|
||||
#import <CoreLocation/CoreLocation.h>
|
||||
|
||||
|
||||
@interface RequestLocationAccuracy : CDVPlugin <CLLocationManagerDelegate>{
|
||||
@private BOOL __locationStarted;
|
||||
}
|
||||
|
||||
@property (nonatomic, strong) CLLocationManager* locationManager;
|
||||
|
||||
- (void) request:(CDVInvokedUrlCommand*)command;
|
||||
- (void) isRequesting:(CDVInvokedUrlCommand*)command;
|
||||
- (void) canRequest:(CDVInvokedUrlCommand*)command;
|
||||
|
||||
@end
|
||||
@ -0,0 +1,119 @@
|
||||
#import "RequestLocationAccuracy.h"
|
||||
|
||||
@implementation RequestLocationAccuracy
|
||||
|
||||
// Initialization
|
||||
@synthesize locationManager;
|
||||
|
||||
- (void)pluginInitialize
|
||||
{
|
||||
self.locationManager = [[CLLocationManager alloc] init];
|
||||
self.locationManager.delegate = self;
|
||||
__locationStarted = NO;
|
||||
}
|
||||
|
||||
// Plugin API
|
||||
- (void) request:(CDVInvokedUrlCommand*)command;{
|
||||
CDVPluginResult* pluginResult;
|
||||
@try {
|
||||
if (__locationStarted) {
|
||||
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"Location is already being requested"];
|
||||
}else if(![self canRequest]){
|
||||
// Location services is already enabled
|
||||
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
|
||||
}else{
|
||||
[self.locationManager startUpdatingLocation];
|
||||
__locationStarted = YES;
|
||||
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
|
||||
}
|
||||
}@catch (NSException *exception) {
|
||||
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:exception.reason];
|
||||
}
|
||||
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
|
||||
}
|
||||
|
||||
- (void) isRequesting:(CDVInvokedUrlCommand*)command;{
|
||||
int result;
|
||||
if(__locationStarted){
|
||||
result = 1;
|
||||
}else{
|
||||
result = 0;
|
||||
}
|
||||
[self.commandDelegate sendPluginResult:[CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:result] callbackId:command.callbackId];
|
||||
}
|
||||
|
||||
- (void) canRequest:(CDVInvokedUrlCommand*)command;{
|
||||
int result;
|
||||
if([self canRequest]){
|
||||
result = 1;
|
||||
}else{
|
||||
result = 0;
|
||||
}
|
||||
[self.commandDelegate sendPluginResult:[CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:result] callbackId:command.callbackId];
|
||||
}
|
||||
|
||||
// Internals
|
||||
|
||||
- (BOOL) canRequest
|
||||
{
|
||||
return ![self isLocationServicesEnabled] && !__locationStarted;
|
||||
}
|
||||
|
||||
|
||||
- (void)stopRequestingLocation
|
||||
{
|
||||
if (__locationStarted) {
|
||||
[self.locationManager stopUpdatingLocation];
|
||||
__locationStarted = NO;
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)isAuthorized
|
||||
{
|
||||
BOOL authorizationStatusClassPropertyAvailable = [CLLocationManager respondsToSelector:@selector(authorizationStatus)]; // iOS 4.2+
|
||||
|
||||
if (authorizationStatusClassPropertyAvailable) {
|
||||
NSUInteger authStatus = [CLLocationManager authorizationStatus];
|
||||
#ifdef __IPHONE_8_0
|
||||
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) { //iOS 8.0+
|
||||
return (authStatus == kCLAuthorizationStatusAuthorizedWhenInUse) || (authStatus == kCLAuthorizationStatusAuthorizedAlways) || (authStatus == kCLAuthorizationStatusNotDetermined);
|
||||
}
|
||||
#endif
|
||||
return (authStatus == kCLAuthorizationStatusAuthorized) || (authStatus == kCLAuthorizationStatusNotDetermined);
|
||||
}
|
||||
|
||||
// by default, assume YES (for iOS < 4.2)
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (BOOL)isLocationServicesEnabled
|
||||
{
|
||||
BOOL locationServicesEnabledInstancePropertyAvailable = [self.locationManager respondsToSelector:@selector(locationServicesEnabled)]; // iOS 3.x
|
||||
BOOL locationServicesEnabledClassPropertyAvailable = [CLLocationManager respondsToSelector:@selector(locationServicesEnabled)]; // iOS 4.x
|
||||
|
||||
if (locationServicesEnabledClassPropertyAvailable) { // iOS 4.x
|
||||
return [CLLocationManager locationServicesEnabled];
|
||||
} else if (locationServicesEnabledInstancePropertyAvailable) { // iOS 2.x, iOS 3.x
|
||||
return [(id)self.locationManager locationServicesEnabled];
|
||||
} else {
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - locationManager delegate
|
||||
|
||||
- (void)locationManager:(CLLocationManager*)manager
|
||||
didUpdateToLocation:(CLLocation*)newLocation
|
||||
fromLocation:(CLLocation*)oldLocation
|
||||
{
|
||||
[self stopRequestingLocation];
|
||||
|
||||
}
|
||||
|
||||
- (void)locationManager:(CLLocationManager*)manager didFailWithError:(NSError*)error
|
||||
{
|
||||
NSLog(@"locationManager::didFailWithError %@", [error localizedFailureReason]);
|
||||
[self stopRequestingLocation];
|
||||
}
|
||||
|
||||
@end
|
||||
151
plugins/cordova-plugin-request-location-accuracy/www/android/RequestLocationAccuracy.js
vendored
Normal file
151
plugins/cordova-plugin-request-location-accuracy/www/android/RequestLocationAccuracy.js
vendored
Normal file
@ -0,0 +1,151 @@
|
||||
/**
|
||||
* Request Location Accuracy plugin
|
||||
*
|
||||
* Copyright (c) 2016 Dave Alden (Working Edge Ltd.)
|
||||
**/
|
||||
var RequestLocationAccuracy = function(){
|
||||
this.requesting = false;
|
||||
};
|
||||
|
||||
/**
|
||||
* Request location mode priority "no power": the best accuracy possible with zero additional power consumption.
|
||||
* https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#PRIORITY_NO_POWER
|
||||
* @type {number}
|
||||
*/
|
||||
RequestLocationAccuracy.prototype.REQUEST_PRIORITY_NO_POWER = 0;
|
||||
|
||||
/**
|
||||
* Request location mode priority "low power": "city" level accuracy (about 10km accuracy)
|
||||
* https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#PRIORITY_LOW_POWER
|
||||
* @type {number}
|
||||
*/
|
||||
RequestLocationAccuracy.prototype.REQUEST_PRIORITY_LOW_POWER = 1;
|
||||
|
||||
/**
|
||||
* Request location mode priority "balanced power": "block" level accuracy (about 100 meter accuracy)
|
||||
* https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#PRIORITY_BALANCED_POWER_ACCURACY
|
||||
* @type {number}
|
||||
*/
|
||||
RequestLocationAccuracy.prototype.REQUEST_PRIORITY_BALANCED_POWER_ACCURACY = 2;
|
||||
|
||||
/**
|
||||
* Request location mode priority "high accuracy": the most accurate locations available. This will use GPS hardware to retrieve positions.
|
||||
* https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#PRIORITY_HIGH_ACCURACY
|
||||
* @type {number}
|
||||
*/
|
||||
RequestLocationAccuracy.prototype.REQUEST_PRIORITY_HIGH_ACCURACY = 3;
|
||||
|
||||
|
||||
/**
|
||||
* Success due to current location settings already satisfying requested accuracy
|
||||
* @type {number}
|
||||
*/
|
||||
RequestLocationAccuracy.prototype.SUCCESS_SETTINGS_SATISFIED = 0;
|
||||
|
||||
/**
|
||||
* Success due to user agreeing to requested accuracy change
|
||||
* @type {number}
|
||||
*/
|
||||
RequestLocationAccuracy.prototype.SUCCESS_USER_AGREED = 1;
|
||||
|
||||
/**
|
||||
* Error due an unresolved request already being in progress.
|
||||
* @type {number}
|
||||
*/
|
||||
RequestLocationAccuracy.prototype.ERROR_ALREADY_REQUESTING = -1;
|
||||
|
||||
/**
|
||||
* Error due invalid action requested
|
||||
* @type {number}
|
||||
*/
|
||||
RequestLocationAccuracy.prototype.ERROR_INVALID_ACTION = 0;
|
||||
|
||||
/**
|
||||
* Error due invalid accuracy requested
|
||||
* @type {number}
|
||||
*/
|
||||
RequestLocationAccuracy.prototype.ERROR_INVALID_ACCURACY = 1;
|
||||
|
||||
/**
|
||||
* Error due to exception in the native code
|
||||
* @type {number}
|
||||
*/
|
||||
RequestLocationAccuracy.prototype.ERROR_EXCEPTION = 2;
|
||||
|
||||
/**
|
||||
* Error due to not being able to change location accuracy to requested state
|
||||
* @type {number}
|
||||
*/
|
||||
RequestLocationAccuracy.prototype.ERROR_CANNOT_CHANGE_ACCURACY = 3;
|
||||
|
||||
/**
|
||||
* Error due to user rejecting requested accuracy change
|
||||
* @type {number}
|
||||
*/
|
||||
RequestLocationAccuracy.prototype.ERROR_USER_DISAGREED = 4;
|
||||
|
||||
/**
|
||||
* Error due to failure to connect to Google Play Services API
|
||||
* @type {number}
|
||||
*/
|
||||
RequestLocationAccuracy.prototype.ERROR_GOOGLE_API_CONNECTION_FAILED = 5;
|
||||
|
||||
/**
|
||||
* Requests a specific accuracy for Location Services.
|
||||
*
|
||||
* @param [Function} successCallback - callback to be invoked on successful resolution of the requested accuracy.
|
||||
* A single object argument will be passed which has two keys: "code" in an integer corresponding to a SUCCESS constant and indicates the reason for success;
|
||||
* "message" is a string containing a description of the success.
|
||||
* @param {Function} errorCallback - callback to be invoked on failure to resolve the requested accuracy.
|
||||
* A single object argument will be passed which has two keys: "code" in an integer corresponding to an ERROR constant and indicates the reason for failure;
|
||||
* "message" is a string containing a description of the error.
|
||||
* @param {Integer} accuracy - The location accuracy to request defined by an integer corresponding to a REQUEST constant.
|
||||
*/
|
||||
RequestLocationAccuracy.prototype.request = function(successCallback, errorCallback, accuracy) {
|
||||
var _this = this;
|
||||
|
||||
if(this.requesting){
|
||||
return errorCallback({
|
||||
code: _this.ERROR_ALREADY_REQUESTING,
|
||||
message: "A request is already in progress"
|
||||
});
|
||||
}
|
||||
|
||||
this.requesting = true;
|
||||
|
||||
return cordova.exec(function(data){
|
||||
_this.requesting = false;
|
||||
successCallback(data)
|
||||
},
|
||||
function(err) {
|
||||
_this.requesting = false;
|
||||
errorCallback(err);
|
||||
},
|
||||
'RequestLocationAccuracy',
|
||||
'request',
|
||||
[accuracy]);
|
||||
};
|
||||
|
||||
/**
|
||||
* Indicates if a request is currently in progress.
|
||||
*
|
||||
* @param [Function} successCallback - callback to pass result to.
|
||||
* This is passed a boolean argument indicating if a request is currently in progress;
|
||||
*/
|
||||
RequestLocationAccuracy.prototype.isRequesting = function(successCallback) {
|
||||
successCallback(!!this.requesting);
|
||||
};
|
||||
|
||||
/**
|
||||
* Indicates if it is possible to request a specific location accuracy.
|
||||
* This will return true if the app is authorized to use location.
|
||||
*
|
||||
* @param [Function} successCallback - callback to pass result to.
|
||||
* This is passed a boolean argument indicating if a request can be made.
|
||||
*/
|
||||
RequestLocationAccuracy.prototype.canRequest = function(successCallback) {
|
||||
return cordova.exec(successCallback, null, 'RequestLocationAccuracy', 'canRequest', []);
|
||||
};
|
||||
|
||||
module.exports = new RequestLocationAccuracy();
|
||||
|
||||
42
plugins/cordova-plugin-request-location-accuracy/www/ios/RequestLocationAccuracy.js
vendored
Normal file
42
plugins/cordova-plugin-request-location-accuracy/www/ios/RequestLocationAccuracy.js
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
/**
|
||||
* Request Location Accuracy plugin
|
||||
*
|
||||
* Copyright (c) 2016 Dave Alden (Working Edge Ltd.)
|
||||
**/
|
||||
var RequestLocationAccuracy = function(){
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Requests a position to invoke to native dialog to turn on Location Services.
|
||||
*
|
||||
* @param [Function} successCallback - callback to be invoked on successful position request.
|
||||
* @param {Function} errorCallback - callback to be invoked on failure to request position.
|
||||
*/
|
||||
RequestLocationAccuracy.prototype.request = function(successCallback, errorCallback) {
|
||||
return cordova.exec(successCallback, errorCallback, 'RequestLocationAccuracy', 'request', []);
|
||||
};
|
||||
|
||||
/**
|
||||
* Indicates if a request is possible to invoke to native dialog to turn on Location Services.
|
||||
* This will return true if Location Services is currently OFF and request is not currently in progress.
|
||||
*
|
||||
* @param [Function} successCallback - callback to pass result to.
|
||||
* This is passed a boolean argument indicating if a request can be made.
|
||||
*/
|
||||
RequestLocationAccuracy.prototype.canRequest = function(successCallback) {
|
||||
return cordova.exec(successCallback, null, 'RequestLocationAccuracy', 'canRequest', []);
|
||||
};
|
||||
|
||||
/**
|
||||
* Indicates if a request is currently in progress.
|
||||
*
|
||||
* @param [Function} successCallback - callback to pass result to.
|
||||
* This is passed a boolean argument indicating if a request is currently in progress;
|
||||
*/
|
||||
RequestLocationAccuracy.prototype.isRequesting = function(successCallback) {
|
||||
return cordova.exec(successCallback, null, 'RequestLocationAccuracy', 'isRequesting', []);
|
||||
};
|
||||
|
||||
module.exports = new RequestLocationAccuracy();
|
||||
|
||||
30
plugins/cordova-sqlite-storage/AUTHORS.md
Normal file
30
plugins/cordova-sqlite-storage/AUTHORS.md
Normal file
@ -0,0 +1,30 @@
|
||||
# Authors
|
||||
|
||||
## Common Javascript
|
||||
|
||||
- Extracted from DroidGap by @brodybits (Christopher J. Brody aka Chris Brody)
|
||||
- Fail-safe nested transaction support by @ef4 (Edward Faulkner)
|
||||
- Translated to Coffee-Script using js2coffee tool by @brodybits (Chris Brody)
|
||||
- API changes by @brodybits (Chris Brody)
|
||||
- Transaction timing fixes to support PouchDB by @nolanlawson
|
||||
|
||||
## Android version
|
||||
|
||||
- Extracted from DroidGap by @brodybits (Chris Brody)
|
||||
- Transaction batch processing of Android version by @marcucio
|
||||
- Maintained by @brodybits (Chris Brody)
|
||||
- Fixes to support old Android versions by @nolanlawson
|
||||
- Thanks to Mark Oppenheim <mark.oppenheim@mnetics.co.uk> for fixes to open/close callbacks and repeated open/close/delete operations
|
||||
|
||||
## iOS/macOS version
|
||||
|
||||
- Original authors: @davibe (Davide Bertola <dade@dadeb.it>) and @joenoon (Joe Noon <joenoon@gmail.com>)
|
||||
- Cordova 2.7+ port with background processing by @j3k0 (Jean-Christophe Hoelt <hoelt@fovea.cc>)
|
||||
- Maintained by @brodybits (Chris Brody)
|
||||
|
||||
## Windows version
|
||||
|
||||
- SQLiteProxy.js by @vldmrrr (Vladimir Avdonin) and @brodybits (Chris Brody)
|
||||
- Using SQLite3-WinRT C++ classes and SQLite3JS (Javascript part) by @doo (doo GmbH)
|
||||
- Visual C++ build files for Windows 8.1, Windows Phone 8.1, and Windows 10 UWP by @brodybits (with some help from Visual Studio Express 2013)
|
||||
- Thanks to @AllJoyn-Cordova for idea how to integrate Windows 8.1/Windows Phone 8.1 Visual C++ projects in plugin.xml
|
||||
464
plugins/cordova-sqlite-storage/CHANGES.md
Normal file
464
plugins/cordova-sqlite-storage/CHANGES.md
Normal file
@ -0,0 +1,464 @@
|
||||
# Changes
|
||||
|
||||
#### cordova-sqlite-storage 3.4.0
|
||||
|
||||
- quick workaround for `SYNTAX_ERR` redefinition
|
||||
|
||||
#### cordova-sqlite-storage 3.3.0
|
||||
|
||||
- new default page & cache sizes with cordova-sqlite-storage-dependencies@2.1.0
|
||||
|
||||
##### cordova-sqlite-storage-commoncore 1.0.0
|
||||
|
||||
- additional EU string manipulation test cases
|
||||
|
||||
#### cordova-sqlite-storage 3.2.1
|
||||
|
||||
- cordova-sqlite-storage-dependencies@2.0.1 with SQLite 3.28.0 update for all supported platforms Android/iOS/macOS/Windows
|
||||
|
||||
#### cordova-sqlite-storage 3.2.0
|
||||
|
||||
- sqlite3_threadsafe() error handling on iOS/macOS
|
||||
|
||||
#### cordova-sqlite-storage 3.1.0
|
||||
|
||||
- no SQLITE_DEFAULT_CACHE_SIZE compile-time setting on iOS/macOS/Windows
|
||||
|
||||
#### cordova-sqlite-storage 3.0.0
|
||||
|
||||
- Use cordova-sqlite-storage-dependencies 2.0.0 with SQLITE_DBCONFIG_DEFENSIVE setting used by sqlite-native-driver.jar on Android
|
||||
|
||||
###### cordova-sqlite-ext-common-core 0.2.0
|
||||
|
||||
- Move SQLite3.UWP.vcxproj out of extra SQLite3.UWP subdirectory
|
||||
- Completely remove old Windows 8.1 & Windows Phone 8.1 vcxproj files
|
||||
|
||||
###### cordova-sqlite-extcore 0.1.0
|
||||
|
||||
- move the embedded `SQLite3-WinRT` component to `src/windows/SQLite3-WinRT-sync` and update `plugin.xml`
|
||||
|
||||
##### cordova-sqlite-ext-common-core 0.1.0
|
||||
|
||||
###### cordova-sqlite-ext-core-common 0.1.0
|
||||
|
||||
- beforePluginInstall.js updates
|
||||
- use standard Promise
|
||||
- get the plugin package name from package.json
|
||||
- use const instead of var (this should be considered a POSSIBLY BREAKING CHANGE since const may not work on some really old Node.js versions)
|
||||
- remove hasbang line that is not needed
|
||||
|
||||
###### cordova-sqlite-storage-ext-core-common 2.0.0
|
||||
|
||||
- SQLITE_DBCONFIG_DEFENSIVE flag - iOS/macOS/Windows (POTENTIALLY BREAKING CHANGE)
|
||||
- remove internal qid usage from JavaScript (not needed)
|
||||
- non-static Android database runner map (POTENTIALLY BREAKING CHANGE)
|
||||
- Completely remove old Android SuppressLint (android.annotation.SuppressLint) - POSSIBLY BREAKING CHANGE
|
||||
- drop workaround for pre-Honeycomb Android API (BREAKING CHANGE)
|
||||
- no extra @synchronized block per batch (iOS/macOS) - should be considered a POSSIBLY BREAKING change
|
||||
- remove backgroundExecuteSql method not needed (iOS/macOS)
|
||||
- Completely remove iOS/macOS MRC (Manual Reference Counting) support - should be considered a POSSIBLY BREAKING change
|
||||
|
||||
### cordova-sqlite-storage 2.6.0
|
||||
|
||||
- Use cordova-sqlite-storage-dependencies 1.2.1 with SQLite 3.26.0, with a security update and support for window functions
|
||||
|
||||
### cordova-sqlite-storage 2.5.2
|
||||
|
||||
- Ignore Android end transaction error when closing for androidDatabaseProvider: 'system' setting, to avoid possible crash during app shutdown (<https://github.com/litehelpers/Cordova-sqlite-storage/issues/833>)
|
||||
|
||||
### cordova-sqlite-storage 2.5.1
|
||||
|
||||
- fix internal plugin cleanup error log on Android
|
||||
|
||||
### cordova-sqlite-storage 2.5.0
|
||||
|
||||
- androidDatabaseProvider: 'system' setting, to replace androidDatabaseImplementation setting which is now deprecated
|
||||
|
||||
### cordova-sqlite-storage 2.4.0
|
||||
|
||||
- Report internal plugin error in case of attempt to open database with no database name on iOS or macOS
|
||||
- Cover use of standard (WebKit) Web SQL API in spec test suite
|
||||
- Test and document insertId in UPDATE result set on plugin vs (WebKit) Web SQL
|
||||
- other test updates
|
||||
|
||||
### cordova-sqlite-storage 2.3.3
|
||||
|
||||
- Quick fix for some iOS/macOS internal plugin error log messagess
|
||||
- test updates
|
||||
- quick doc updates
|
||||
|
||||
### cordova-sqlite-storage 2.3.2
|
||||
|
||||
- Mark some Android errors as internal plugin errors (quick fix)
|
||||
- remove trailing whitespace from Android implementation
|
||||
- test coverage updates
|
||||
- quick doc updates
|
||||
|
||||
### cordova-sqlite-storage 2.3.1
|
||||
|
||||
- Mark some iOS/macOS plugin error messages as internal plugin errors (quick fix)
|
||||
- Quick documentation updates
|
||||
|
||||
### cordova-sqlite-storage 2.3.0
|
||||
|
||||
- Use SQLite 3.22.0 with SQLITE_DEFAULT_SYNCHRONOUS=3 (EXTRA DURABLE) compile-time setting on all platforms (Android/iOS/macOS/Windows) ref: litehelpers/Cordova-sqlite-storage#736
|
||||
|
||||
### cordova-sqlite-storage 2.2.1
|
||||
|
||||
- SQLITE_THREADSAFE=1 compile-time setting for iOS/macOS
|
||||
- Fix Android/iOS src copyright, perpetually
|
||||
|
||||
## cordova-sqlite-storage 2.2.0
|
||||
|
||||
- Android-sqlite-native-driver NDK objects in JAR to resolve issue on cordova-android@7
|
||||
- Fix SQLiteAndroidDatabase implementation for Turkish and other foreign locales
|
||||
|
||||
## cordova-sqlite-storage 2.1.5
|
||||
|
||||
##### cordova-sqlite-legacy-core 1.0.7
|
||||
|
||||
- Add error info text in case of close error on Windows
|
||||
- Signal INTERNAL ERROR in case of attempt to reuse db on Windows (should never happen due to workaround solution to BUG 666)
|
||||
- SQLITE_DEFAULT_CACHE_SIZE build flag fix for macOS ("osx") and Windows
|
||||
|
||||
###### cordova-sqlite-legacy-express-core 1.0.5
|
||||
|
||||
- iOS/macOS @synchronized guard for sqlite3_open operation
|
||||
- Signal INTERNAL ERROR in case of attempt to reuse db (Android/iOS) (should never happen due to workaround solution to BUG 666)
|
||||
|
||||
## cordova-sqlite-storage 2.1.4
|
||||
|
||||
##### cordova-sqlite-legacy-core 1.0.6
|
||||
|
||||
###### cordova-sqlite-legacy-express-core 1.0.4
|
||||
|
||||
- Cleaned up workaround solution to BUG 666: close db before opening (ignore close error)
|
||||
- android.database end transaction if active before closing (needed for new BUG 666 workaround solution to pass selfTest in case of builtin android.database implementation)
|
||||
|
||||
## cordova-sqlite-storage 2.1.3
|
||||
|
||||
##### cordova-sqlite-legacy-core 1.0.5
|
||||
|
||||
###### cordova-sqlite-legacy-express-core 1.0.3
|
||||
|
||||
- Resolve Java 6/7/8 concurrent map compatibility issue reported in litehelpers/Cordova-sqlite-storage#726, THANKS to pointer by @NeoLSN (Jason Yang/楊朝傑) in litehelpers/Cordova-sqlite-storage#727.
|
||||
- selfTest database cleanup do not ignore close or delete error on any platforms
|
||||
|
||||
## cordova-sqlite-storage 2.1.2
|
||||
|
||||
##### cordova-sqlite-legacy-core 1.0.4
|
||||
|
||||
- New workaround solution to BUG 666: close db before opening (ignore close error)
|
||||
|
||||
## cordova-sqlite-storage 2.1.1
|
||||
|
||||
##### cordova-sqlite-legacy-core 1.0.3
|
||||
|
||||
- Suppress warnings when building sqlite3.c & PSPDFThreadSafeMutableDictionary.m on iOS/macOS
|
||||
|
||||
##### cordova-sqlite-legacy-core 1.0.2
|
||||
|
||||
- Fix log in case of transaction waiting for open to finish; doc fixes
|
||||
- SQLite 3.15.2 build with SQLITE_THREADSAFE=2 on iOS/macOS (SQLITE_THREADSAFE=1 on Android/Windows) and other flag fixes in this version branch to avoid possible malformed database due to multithreaded access ref: litehelpers/Cordova-sqlite-storage#703
|
||||
- Windows 10 (UWP) build with /SAFESEH flag on Win32 (x86) target
|
||||
|
||||
###### cordova-sqlite-legacy-express-core 1.0.2
|
||||
|
||||
- Use PSPDFThreadSafeMutableDictionary for iOS/macOS to avoid threading issue ref: litehelpers/Cordova-sqlite-storage#716
|
||||
|
||||
###### cordova-sqlite-legacy-express-core 1.0.1
|
||||
|
||||
- Fix bug 666 workaround to trigger ROLLBACK in the next event tick (needed to support version with pre-populated database on Windows)
|
||||
|
||||
## cordova-sqlite-storage 2.1.0
|
||||
|
||||
- Visual Studio 2017 updates for Windows UWP build
|
||||
|
||||
## cordova-sqlite-storage 2.0.4
|
||||
|
||||
###### cordova-sqlite-legacy-express-core 1.0.0
|
||||
|
||||
- Workaround solution to BUG litehelpers/Cordova-sqlite-storage#666 (hanging transaction in case of location reload/change)
|
||||
- selfTest simulate scenario & test solution to BUG litehelpers/Cordova-sqlite-storage#666 (also includes string test and test of effects of location reload/change in this version branch, along with another internal check)
|
||||
|
||||
## cordova-sqlite-storage 2.0.3
|
||||
|
||||
- Drop engines rule from package.json
|
||||
- Doc fixes
|
||||
|
||||
### cordova-sqlite-storage 1.5.4
|
||||
|
||||
- Fix iOS/macOS version to report undefined insertId in case INSERT OR IGNORE is ignored
|
||||
- Fix FIRST_WORD check for android.sqlite.database implementation
|
||||
- SQLite 3.15.2 build fixes
|
||||
- Doc updates
|
||||
|
||||
## cordova-sqlite-storage 2.0.2
|
||||
|
||||
- Fix Windows target platform version
|
||||
|
||||
### cordova-sqlite-storage 1.5.3
|
||||
|
||||
- Fix merges to prevent possible conflicts with other plugins (Windows)
|
||||
- Fix handling of undefined SQL argument values (Windows)
|
||||
- Signal error in case of a failure opening the database file (iOS/macOS)
|
||||
- Doc fixes and updates
|
||||
|
||||
## cordova-sqlite-storage 2.0.1
|
||||
|
||||
### cordova-sqlite-storage 1.5.2
|
||||
|
||||
- Build with sqlite 3.15.2 with the following settings in this version branch:
|
||||
- SQLITE_TEMP_STORE=2
|
||||
- SQLITE_THREADSAFE=1
|
||||
- SQLITE_ENABLE_FTS3
|
||||
- SQLITE_ENABLE_FTS3_PARENTHESIS
|
||||
- SQLITE_ENABLE_FTS4
|
||||
- SQLITE_ENABLE_RTREE
|
||||
- SQLITE_OMIT_BUILTIN_TEST
|
||||
- SQLITE_OMIT_LOAD_EXTENSION
|
||||
- SQLITE_DEFAULT_PAGE_SIZE=1024 and SQLITE_DEFAULT_CACHE_SIZE=2000 to avoid "potentially distruptive change(s)" from SQLite 3.12.0 ref: <http://sqlite.org/pgszchng2016.html>
|
||||
- SQLITE_OS_WINRT for Windows only
|
||||
- Check transaction callback functions to avoid crash on Windows
|
||||
- Fix echoTest callback handling
|
||||
- Fix openDatabase/deleteDatabase exception messages
|
||||
- Move Lawnchair adapter to a separate project
|
||||
- Doc updates
|
||||
|
||||
### cordova-sqlite-storage 2.0.0
|
||||
|
||||
- Reference Windows platform toolset v141 to support Visual Studio 2017 (RC)
|
||||
|
||||
### cordova-sqlite-storage 1.5.1
|
||||
|
||||
- Add engines rule to package.json to specify plugin version >= 2.0.0 in case of cordova-windows 4.4.2 or newer for Visual Studio 2017 (Preview)
|
||||
|
||||
### cordova-sqlite-storage 1.5.0
|
||||
|
||||
- Build with sqlite 3.15.1, with the following settings:
|
||||
- SQLITE_TEMP_STORE=2
|
||||
- SQLITE_THREADSAFE=2
|
||||
- FTS3, FTS4, and R-Tree enabled
|
||||
- SQLITE_DEFAULT_PAGE_SIZE=1024 and SQLITE_DEFAULT_CACHE_SIZE=2000 to avoid "potentially distruptive change(s)" from SQLite 3.12.0 ref: <http://sqlite.org/pgszchng2016.html>
|
||||
- Drop support for Windows 8.1 & Windows Phone 8.1
|
||||
|
||||
### cordova-sqlite-storage 1.4.9
|
||||
|
||||
- Minor JavaScript fix (generated by CoffeeScript 1.11.1)
|
||||
- Update test due to issue with u2028/u2029 on cordova-android 6.0.0
|
||||
- doc fixes
|
||||
- Cleanup plugin.xml: remove old engine constraint that was already commented out
|
||||
- Fix LICENSE.md
|
||||
|
||||
### cordova-sqlite-storage 1.4.8
|
||||
|
||||
- selfTest function add string test and test of effects of location reload/change
|
||||
- Support macOS ("osx" platform)
|
||||
- Signal an error in case of SQL with too many parameter argument values on iOS (in addition to Android & Windows)
|
||||
- Include proper SQL error code on Android (in certain cases)
|
||||
- Fix reporting of SQL statement execution errors in Windows version
|
||||
- Fix Windows version to report errors with a valid error code (0)
|
||||
- Some doc fixes
|
||||
|
||||
### cordova-sqlite-storage 1.4.7
|
||||
|
||||
- Minor JavaScript fixes to pass @brodybits/Cordova-sql-test-app
|
||||
|
||||
### cordova-sqlite-storage 1.4.6
|
||||
|
||||
- Stop remaining transaction callback in case of an error with no error handler returning false
|
||||
- Expand selfTest function to cover CRUD with unique record keys
|
||||
- Fix readTransaction to reject ALTER, REINDEX, and REPLACE operations
|
||||
- Fix Windows 10 ARM Release Build of SQLite3 by disabling SDL check (ARM Release only)
|
||||
- Fix Windows 8.1/Windows Phone 8.1 Release Build of SQLite3 by disabling SDL check
|
||||
- Some documentation fixes
|
||||
|
||||
### cordova-sqlite-storage 1.4.5
|
||||
|
||||
- Log/error message fixes; remove extra qid from internal JSON interface
|
||||
|
||||
### cordova-sqlite-storage 1.4.4
|
||||
|
||||
- Fix readTransaction to reject modification statements with extra semicolon(s) in the beginning
|
||||
- Announce new Cordova-sqlite-evcore-extbuild-free version
|
||||
- Additional tests
|
||||
- Other doc fixes
|
||||
|
||||
### cordova-sqlite-storage 1.4.3
|
||||
|
||||
- Handle executeSql with object sql value (solves another possible crash on iOS)
|
||||
|
||||
### cordova-sqlite-storage 1.4.2
|
||||
|
||||
- Fix sqlitePlugin.openDatabase and sqlitePlugin.deleteDatabase to check location/iosDatabaseLocation values
|
||||
- Fix sqlitePlugin.deleteDatabase to check that db name is really a string (prevents possible crash on iOS)
|
||||
- Fix iOS version to use DLog macro to remove extra logging from release build
|
||||
- Fix Lawnchair adapter to use new mandatory "location" parameter
|
||||
- Remove special handling of Blob parameters, use toString for all non-value parameter objects
|
||||
- Minor cleanup of Android version code
|
||||
|
||||
### cordova-sqlite-storage 1.4.1
|
||||
|
||||
- Minimum Cordova version no longer enforced in this version
|
||||
|
||||
### cordova-sqlite-storage 1.4.0
|
||||
|
||||
- Now using cordova-sqlite-storage-dependencies for SQLite 3.8.10.2 Android/iOS/Windows
|
||||
- Android-sqlite-connector implementation supported by this version again
|
||||
- Enforce minimum cordova-windows version (should be OK in Cordova 6.x)
|
||||
- Support Windows 10 along with Windows 8.1/Windows Phone 8.1
|
||||
|
||||
### cordova-sqlite-storage 1.2.2
|
||||
|
||||
- Self-test function to verify ability to open/populate/read/delete a test database
|
||||
- Read BLOB as Base-64 DISABLED in Android version (was already disabled for iOS)
|
||||
|
||||
### cordova-sqlite-storage 1.2.1
|
||||
|
||||
- Close Android SQLiteStatement after INSERT/UPDATE/DELETE
|
||||
- Specify minimum Cordova version 6.0.0
|
||||
- Lawnchair adapter fix: Changed remove method to work with key array
|
||||
|
||||
### cordova-sqlite-storage 1.2.0
|
||||
|
||||
- Rename Lawnchair adapter to prevent clash with standard webkit-sqlite adapter
|
||||
- Support location: 'default' setting in openDatabase & deleteDatabase
|
||||
|
||||
### cordova-sqlite-storage 0.8.5
|
||||
|
||||
- More explicit iosDatabaseLocation option
|
||||
- iOS database location is now mandatory
|
||||
- Split-up of some more spec test scripts
|
||||
|
||||
### cordova-sqlite-storage 0.8.2
|
||||
|
||||
- Workaround fix for empty readTransaction issue (litehelpers/Cordova-sqlite-storage#409)
|
||||
- Split spec/www/spec/legacy.js into db-open-close-delete-test.js & tx-extended.js
|
||||
|
||||
### cordova-sqlite-storage 0.8.0
|
||||
|
||||
- Simple sql batch transaction function
|
||||
- Echo test function
|
||||
- All iOS operations are now using background processing (reported to resolve intermittent problems with cordova-ios@4.0.1)
|
||||
- Java source of Android version now using io.sqlc package
|
||||
- Drop Android-sqlite-connector support
|
||||
- Drop WP(8) and Windows support
|
||||
|
||||
### 0.7.14
|
||||
|
||||
- REGEXP support completely removed from this version branch
|
||||
- Remove src/android/libs/.gitignore (inadvertently added in 0.7.13)
|
||||
|
||||
### 0.7.13
|
||||
|
||||
- REGEXP support partially removed from this version branch
|
||||
- Rename Windows C++ Database close function to closedb to resolve conflict for Windows Store certification
|
||||
- Android version with sqlite `3.8.10.2` embedded (with error messages fixed)
|
||||
- Pre-populated database support removed from this version branch
|
||||
- Amazon Fire-OS support removed
|
||||
- Fix conversion warnings in iOS version
|
||||
|
||||
### 0.7.12
|
||||
|
||||
- Fix to Windows "Universal" version to support big integers
|
||||
- Implement database close and delete operations for Windows "Universal"
|
||||
- Fix readTransaction to skip BEGIN/COMMIT/ROLLBACK
|
||||
|
||||
### 0.7.11
|
||||
|
||||
- Fix plugin ID in plugin.xml to match npm package ID
|
||||
- Unpacked sqlite-native-driver.so libraries from jar
|
||||
- Fix conversion of INTEGER type (iOS version)
|
||||
- Disable code to read BLOB as Base-64 (iOS version) due to https://issues.apache.org/jira/browse/CB-9638
|
||||
|
||||
### 0.7.10
|
||||
|
||||
- Use Android-sqlite-connector instead of sqlite4java
|
||||
|
||||
### 0.7.9
|
||||
|
||||
- Build iOS and Windows versions with sqlite 3.8.10.2 embedded
|
||||
- Fix plugin id to match npm package id
|
||||
|
||||
### 0.7.8
|
||||
|
||||
- Support FTS3/FTS4 and R-Tree in iOS and Windows "Universal" (8.1) versions
|
||||
- Build ARM target with Function Level Linking ref: http://www.monkey-x.com/Community/posts.php?topic=7739
|
||||
- SQLite3.Windows.vcxproj and SQLite3.WindowsPhone.vcxproj in their own directories to avoid problems due to temporary files
|
||||
|
||||
### 0.7.7
|
||||
|
||||
- include build of sqlite4java for Android x86_64 and arm-64
|
||||
- clean publish to plugins.cordova.io
|
||||
|
||||
### 0.7.6
|
||||
|
||||
- Small fix to plugin id
|
||||
- Disable use of gethostuuid() in sqlite3.c (only used in iOS version)
|
||||
- published to plugins.cordova.io - [BUG] published extra junk in workarea, causing problems with Windows (Universal) version
|
||||
|
||||
### 0.7.5
|
||||
|
||||
- Windows (Universal) version now supports both Windows 8.1 and Windows Phone 8.1
|
||||
- iOS and Windows versions are now built with sqlite 3.8.9 embedded
|
||||
- Improved locking style and other optimizations applied for iOS version
|
||||
|
||||
### 0.7.4
|
||||
|
||||
- iOS and Windows (8.1) versions built to keep non-essential temporary sqlite files in memory
|
||||
- Option to use legacy Android database library, with Android locking/closing issue (BUG #193) workaround included again
|
||||
|
||||
### 0.7.3
|
||||
|
||||
- insertId & rowsAffected implemented for Windows (8.1)
|
||||
- plugin id changed
|
||||
|
||||
### 0.7.2
|
||||
|
||||
- Android version with sqlite4java (sqlite 3.8.7 embedded), which solves BUG #193: Android closing/locking issue (ICU-UNICODE integration is now missing)
|
||||
- iOS version fixed to override the correct pluginInitialize method and built with sqlite 3.8.8.3 embedded
|
||||
|
||||
### 0.7.1
|
||||
|
||||
- Project renamed
|
||||
- Initial version for Windows (8.1) [with sqlite 3.8.8.3 embedded]
|
||||
- Abort initially pending transactions for db handle (due to incorrect password key, for example) [from Cordova-sqlcipher-storage]
|
||||
- WP7 build enabled (NOT TESTED)
|
||||
|
||||
### 1.0.6
|
||||
|
||||
- Proper handling of transactions that may be requested before the database open operation is completed
|
||||
- Report an error upon attempt to close a database handle object multiple times.
|
||||
|
||||
### 1.0.5
|
||||
|
||||
- Workaround for Android db locking/closing issue
|
||||
- Fix double-precision REAL values in result (iOS version)
|
||||
- Fix query result truncation in case of NULL character (\0 or \u0000) (iOS version)
|
||||
- Convert array SQL parameters to string, according to match Web SQL spec
|
||||
- Fix closing of Android database
|
||||
- Some fixes for SQL API error handling to be consistent with Web SQL
|
||||
|
||||
### 1.0.4
|
||||
|
||||
- Pre-populated database option (Android/iOS)
|
||||
- Option to select database location to disable iCloud backup (iOS ONLY)
|
||||
- Safeguard against closing of database while transaction is pending
|
||||
- Fix to prevent double marshaling of data
|
||||
|
||||
### 1.0.3
|
||||
|
||||
- Fixed issue with multi-page apps on Android (due to problem when closing & re-opening app)
|
||||
|
||||
### 1.0.2
|
||||
|
||||
- Workaround for issue with multiple UPDATE statements WP(8) (#128)
|
||||
|
||||
### 1.0.1
|
||||
|
||||
- Support Cordova 3.3.0/3.4.0 to support Amazon-FireOS
|
||||
- Fixes for WP(8):
|
||||
- use one thread per db to solve open/close/delete issues
|
||||
- fix integer data binding
|
||||
- Fix open/close callbacks Android & WP(8)
|
||||
- Resolve issue with INSERT OR IGNORE (Android)
|
||||
33
plugins/cordova-sqlite-storage/CONTRIBUTING.md
Normal file
33
plugins/cordova-sqlite-storage/CONTRIBUTING.md
Normal file
@ -0,0 +1,33 @@
|
||||
# General
|
||||
|
||||
**IMPORTANT:** Please raise general questions in [litehelpers / Cordova-sqlite-help / issues](https://github.com/litehelpers/Cordova-sqlite-help/issues).
|
||||
|
||||
## Reproducible bugs
|
||||
|
||||
- Verify the results of calling the echoTest and selfTest functions as described in README.md
|
||||
- Check the pitfalls and other troubleshooting steps in README.md and [brodybits / Avoiding-some-Cordova-pitfalls](https://github.com/brodybits/Avoiding-some-Cordova-pitfalls)
|
||||
- Reproduce the issue in a fresh, clean project, preferably based on [brodybits / Cordova-sqlite-bootstrap-test](https://github.com/brodybits/Cordova-sqlite-bootstrap-test) or [brodybits / cordova-sqlite-test-app](https://github.com/brodybits/cordova-sqlite-test-app).
|
||||
|
||||
Please see README.md for more details.
|
||||
|
||||
## Feature requests
|
||||
|
||||
Feature requests are welcome for community discussion and future consideration. Preference will be given to paid customers. Please contact <sales@litehelpers.net> for more information.
|
||||
|
||||
## Other questions
|
||||
|
||||
**NOTE:** As stated above please other questions in [litehelpers / Cordova-sqlite-help / issues](https://github.com/litehelpers/Cordova-sqlite-help/issues).
|
||||
|
||||
## Contributing patches
|
||||
|
||||
- Patches with bug fixes are helpful, especially when submitted with test code.
|
||||
- Other enhancements are welcome for consideration, when submitted with test code and are working for all supported platforms. Increase of complexity should be avoided.
|
||||
- All contributions may be reused by [@brodybits](https://github.com/brodybits) under another license in the future. Efforts will be taken to give credit for major contributions but it will not be guaranteed.
|
||||
- Project restructuring, i.e. moving files and/or directories around, should be avoided if possible.
|
||||
|
||||
Please see README.md for more details.
|
||||
|
||||
## Other
|
||||
|
||||
- Testimonials of apps that are using this plugin would be especially helpful.
|
||||
- Reporting issues can help improve the quality of this plugin.
|
||||
143
plugins/cordova-sqlite-storage/HISTORY.md
Normal file
143
plugins/cordova-sqlite-storage/HISTORY.md
Normal file
@ -0,0 +1,143 @@
|
||||
# History
|
||||
|
||||
## Overall
|
||||
|
||||
@brodybits (Christopher J. Brody aka Chris Brody) assembled the project in April 2012
|
||||
from the following parts:
|
||||
- DroidGap SQLite Storage Java and Javascript parts
|
||||
- Phonegap-SQLitePlugin for iOS by @davibe (Davide Bertola <dade@dadeb.it>) and
|
||||
@joenoon (Joe Noon <joenoon@gmail.com>)
|
||||
|
||||
@brodybits has been maintaining this project with a number of bug fixes and other improvements.
|
||||
|
||||
A number of contributions have been integrated. The most important contributors are explicitly
|
||||
mentioned in AUTHORS.md.
|
||||
|
||||
## 2009-2010
|
||||
|
||||
DroidGap Storage Java and Javascript parts were initially added in December 2009.
|
||||
|
||||
## 2011
|
||||
|
||||
Phonegap-SQLitePlugin for iOS was started by @davibe in June 2011.
|
||||
|
||||
In September 2011 @joenoon rewrote the Javascript (using CoffeeScript) and added a
|
||||
Lawnchair adapter.
|
||||
|
||||
## 2012
|
||||
|
||||
The original Phonegap-SQLitePlugin for iOS had a major deviation from the Web SQL API draft.
|
||||
While the Web SQL API draft keeps the sql and the parameters array as separate parameters,
|
||||
the original Phonegap-SQLitePlugin combined the sql and parameters in a single array.
|
||||
This project as assembled by @brodybits keeps the sql and parameters array as separate
|
||||
parameters to follow the Web SQL API draft more closely.
|
||||
|
||||
@marcucio (Mike Arcucio) contributed a major rework of the Android version to support
|
||||
efficient batch processing.
|
||||
|
||||
For the first year the Javascript part was completely different for the iOS and
|
||||
Android versions. @brodybits introduced a QUnit test suite, with some help from
|
||||
the Lawnchair QUnit test suite as well as the usage sample by @joenoon and @davibe.
|
||||
|
||||
In October 2012 @ef4 (Edward Faulkner) reworked the Javascript for the iOS version
|
||||
to implement the Web SQL failure-safe transaction semantics, along with some tests.
|
||||
|
||||
In December 2012 @brodybits split the project into separate Android and iOS parts
|
||||
(merged back together in September 2013).
|
||||
|
||||
In December 2012 @marcucio (Mike Arcucio) made a WP8 version using CSharp-SQLite.
|
||||
|
||||
## 2013
|
||||
|
||||
In May 2013 @j3k0 (Jean-Christophe Hoelt <hoelt@fovea.cc>) contributed major changes
|
||||
to the iOS version to work in Cordova 2.7 and support background processing.
|
||||
|
||||
In July 2013 @brodybits updated the Android version to use one background thread
|
||||
per database and ported the failure-safe transaction semantics to work in the
|
||||
Android version (with the help of CoffeeScript).
|
||||
|
||||
In August 2013 @brodybits fixed the iOS version to work with the Javascript from
|
||||
the Android version.
|
||||
|
||||
In September 2013 @brodybits merged the Android version and iOS version to use the
|
||||
same Javascript interface.
|
||||
|
||||
In September 2013 @brodybits published a fork of the WP8 version with a version
|
||||
of the CSharp-SQLite source embedded.
|
||||
|
||||
Merge notes: The merged version from September 2013 has some of the early commits
|
||||
repeated in history. This is because @brodybits removed the iOS sources from the
|
||||
old Android version using the git filter-branch command.
|
||||
|
||||
## 2014
|
||||
|
||||
In July 2014 @Gillardo (Darren Gillard <darren.gillard81@gmail.com>) contributed an integration
|
||||
of the WP8 version with background processing and improved transaction support.
|
||||
|
||||
Also in July 2014 @nolanlawson contributed a number of fixes and got this project
|
||||
working with PouchDB. For example: introduction of nextTick to schedule actions to be taken
|
||||
once the current HTML(5) event handler is finished.
|
||||
|
||||
In August 2014 Mark Oppenheim (<mark.oppenheim@mnetics.co.uk>) contributed the following:
|
||||
- working open/close callbacks and repeated open/close/delete fixes for Android and WP8 versions
|
||||
(@brodybits fixed these for the iOS version);
|
||||
- fixed WP8 version to use one thread per database.
|
||||
|
||||
NOTE: The WP8 version is currently supported in the Cordova-sqlite-legacy version.
|
||||
|
||||
## 2015
|
||||
|
||||
In January 2015 @aarononeal (Aaron Oneal <aaron.oneal@spicypixel.com>) raised PR #170 with a
|
||||
number of fixes, including:
|
||||
- Fix to prevent double marshaling of data.
|
||||
- Fix test runner to use correct plugin id (subsequently broken by @brodybits).
|
||||
- Fix database close conditions and unit test (reject attempt to close database
|
||||
the middle of a transaction).
|
||||
- Propagate statement failures to transaction failures (in the case when a
|
||||
statement error handler does not return false).
|
||||
- Fix transaction and statement errors to conform to SQLError.
|
||||
- Fix warning regarding test runner viewport format.
|
||||
- Fix executeSql to throw on finalized transactions.
|
||||
- Reproduce & fix truncation in iOS query result string encoding
|
||||
(in case of UNICODE \u0000 character in the middle).
|
||||
|
||||
In addition, PR #170 includes a two-way SQL blob marshalling mechanism that is still under
|
||||
consideration.
|
||||
|
||||
Other major changes by @brodybits in 2015:
|
||||
- Porting of the existing test suite to work within the Jasmine framework.
|
||||
- Introduction of workaround for Android locking bug.
|
||||
- Introduction of Windows target version (Windows 8.0/Windows 8.1/Windows Phone 8.1),
|
||||
which is now available in cordova-sqlite-ext and Cordova-sqlite-legacy version projects.
|
||||
- Introduction of lightweight Android-sqlite-connector database library, which is
|
||||
now available in cordova-sqlite-ext and Cordova-sqlite-legacy version projects.
|
||||
- Use of Circle CI (Android version) and Travis CI (iOS version).
|
||||
- Introduction of other version projects:
|
||||
- Cordova-sqlcipher-adapter
|
||||
- cordova-sqlite-ext with REGEXP and pre-populated database support
|
||||
- Enterprise version with memory fix and other enhancements,
|
||||
available under GPL or commercial licensing options
|
||||
- react-native-sqlite-storage version for Android and iOS developed and maintained
|
||||
by @andpor (Andrzej Porebski <fkuciapa@yahoo.com>), based on this project
|
||||
|
||||
## Major changes 2016
|
||||
|
||||
New features:
|
||||
- Echo self-test function
|
||||
- Simple sql batch query interface
|
||||
|
||||
Installation changes
|
||||
- Use of `before_plugin_install` hook to install external dependencies
|
||||
|
||||
New versions introduced
|
||||
- Cordova-sqlite-evcore-extbuild-free with major performance and memory fixes for Android,
|
||||
available under GPL or commercial licensing options with support for PhoneGap Build
|
||||
- Cordova-sqlite-evplus (legacy) versions with GPL or premium commercial licensing options
|
||||
|
||||
## Major changes 2017
|
||||
|
||||
Windows platform toolset dependency updated for Visual Studio 2017
|
||||
|
||||
## Recent changes
|
||||
|
||||
See CHANGES.md
|
||||
31
plugins/cordova-sqlite-storage/LICENSE.md
Normal file
31
plugins/cordova-sqlite-storage/LICENSE.md
Normal file
@ -0,0 +1,31 @@
|
||||
# Licenses
|
||||
|
||||
## Common Javascript
|
||||
|
||||
MIT or Apache 2.0
|
||||
|
||||
## Android version
|
||||
|
||||
MIT or Apache 2.0
|
||||
|
||||
## iOS/macOS version
|
||||
|
||||
MIT only
|
||||
|
||||
based on Phonegap-SQLitePlugin by @davibe (Davide Bertola <dade@dadeb.it>) and @joenoon (Joe Noon <joenoon@gmail.com>)
|
||||
|
||||
includes and uses PSPDFThreadSafeMutableDictionary (PSPDFThreadSafeMutableDictionary.m <https://gist.github.com/steipete/5928916>) MIT license by @steipete (<https://gist.github.com/steipete>)
|
||||
|
||||
## Windows version
|
||||
|
||||
MIT or Apache 2.0
|
||||
|
||||
### SQLite3-WinRT
|
||||
|
||||
by @doo (doo GmbH)
|
||||
|
||||
MIT License
|
||||
|
||||
## SQLite3
|
||||
|
||||
Public domain
|
||||
1798
plugins/cordova-sqlite-storage/README.md
Normal file
1798
plugins/cordova-sqlite-storage/README.md
Normal file
File diff suppressed because it is too large
Load Diff
1034
plugins/cordova-sqlite-storage/SQLitePlugin.coffee.md
Normal file
1034
plugins/cordova-sqlite-storage/SQLitePlugin.coffee.md
Normal file
File diff suppressed because it is too large
Load Diff
67
plugins/cordova-sqlite-storage/bin/test.ps1
Normal file
67
plugins/cordova-sqlite-storage/bin/test.ps1
Normal file
@ -0,0 +1,67 @@
|
||||
# Automated cordova tests. Installs the correct cordova platform,
|
||||
# installs the plugin, installs the test app, and then runs it on
|
||||
# a device or emulator.
|
||||
#
|
||||
# usage: .\bin\test.ps1 [android|ios|windows|wp8]
|
||||
#
|
||||
# N.B. if you functionally change this script you _must_ change .\bin\test.sh too.
|
||||
#
|
||||
# STATUS: UNSUPPORTED
|
||||
#
|
||||
# A known issue is that this script needs old coffeescript@1 or coffee-script@1
|
||||
# to be installed globally while the package script is using locally installed
|
||||
# version of coffeescript@1.
|
||||
#
|
||||
# It is recommended to use the package scripts with npm or yarn tool instead
|
||||
# of this script.
|
||||
#
|
||||
|
||||
param([string]$platform)
|
||||
|
||||
if (! $platform) {
|
||||
echo "usage: .\bin\test.sh [android|ios|windows|wp8]"
|
||||
exit 1
|
||||
}
|
||||
|
||||
if (! (get-command coffee) ) {
|
||||
echo "you need coffeescript. please install with:"
|
||||
echo "npm install -g coffee-script"
|
||||
exit 1
|
||||
}
|
||||
|
||||
if (! (get-command cordova) ) {
|
||||
echo "you need cordova. please install with:"
|
||||
echo "npm install -g cordova"
|
||||
exit 1
|
||||
}
|
||||
|
||||
|
||||
pushd spec
|
||||
if (!$?) { # run from the bin/ directory
|
||||
echo "re-pushing"
|
||||
pushd ../spec
|
||||
}
|
||||
try {
|
||||
# compile coffeescript
|
||||
coffee --no-header -cl -o ../www ../SQLitePlugin.coffee.md
|
||||
if (!$?) {
|
||||
echo "coffeescript compilation failed"
|
||||
exit 1
|
||||
}
|
||||
echo "compiled coffeescript to javascript"
|
||||
|
||||
# move everything to a temp folder to avoid infinite recursion errors
|
||||
if (test-path ../.plugin) {
|
||||
rm -force -recurse ../.plugin -ErrorAction ignore
|
||||
}
|
||||
mkdir -ErrorAction ignore ../.plugin | out-null
|
||||
cp -recurse ../scripts, ../src, ../package.json, ../plugin.xml, ../www ../.plugin
|
||||
|
||||
# update the plugin, run the test app
|
||||
cordova platform add $platform
|
||||
cordova plugin rm com.phonegap.plugins.sqlite
|
||||
cordova plugin add ../.plugin
|
||||
cordova run $platform
|
||||
} finally {
|
||||
popd
|
||||
}
|
||||
66
plugins/cordova-sqlite-storage/bin/test.sh
Executable file
66
plugins/cordova-sqlite-storage/bin/test.sh
Executable file
@ -0,0 +1,66 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Automated cordova tests. Installs the correct cordova platform,
|
||||
# installs the plugin, installs the test app, and then runs it on
|
||||
# a device or emulator.
|
||||
#
|
||||
# usage: ./bin/test.sh [android|ios]
|
||||
#
|
||||
# N.B. if you functionally change this script you _must_ change .\bin\test.sh too.
|
||||
#
|
||||
# STATUS: UNSUPPORTED
|
||||
#
|
||||
# A known issue is that this script needs old coffeescript@1 or coffee-script@1
|
||||
# to be installed globally while the package script is using locally installed
|
||||
# version of coffeescript@1.
|
||||
#
|
||||
# It is recommended to use the package scripts with npm or yarn tool instead
|
||||
# of this script.
|
||||
#
|
||||
|
||||
platform=$1
|
||||
|
||||
if [[ -z $platform ]]; then
|
||||
echo "usage: ./bin/test.sh [android|ios]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -x $(which coffee) ]]; then
|
||||
echo "you need coffeescript. please install with:"
|
||||
echo "npm install -g coffee-script"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -x $(which cordova) ]]; then
|
||||
echo "you need cordova. please install with:"
|
||||
echo "npm install -g cordova"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd spec
|
||||
if [[ $? != 0 ]]; then # run from the bin/ directory
|
||||
cd ../spec
|
||||
fi
|
||||
|
||||
# compile coffeescript
|
||||
coffee --no-header -cl -o ../www ../SQLitePlugin.coffee.md
|
||||
|
||||
if [[ $? != 0 ]]; then
|
||||
echo "coffeescript compilation failed"
|
||||
exit 1
|
||||
fi
|
||||
echo "compiled coffeescript to javascript"
|
||||
|
||||
# move everything to a temp folder to avoid infinite recursion errors
|
||||
rm -fr myplugin
|
||||
mkdir -p myplugin
|
||||
cp -r ../scripts ../src ../plugin.xml ../package.json ../www myplugin
|
||||
|
||||
# cleanup old test
|
||||
rm -fr plugins platforms
|
||||
|
||||
# update the plugin, run the test app
|
||||
cordova platform add $platform
|
||||
#cordova plugin rm com.brodysoft.sqlitePlugin
|
||||
cordova plugin add myplugin
|
||||
cordova run $platform
|
||||
28
plugins/cordova-sqlite-storage/circle.yml
Normal file
28
plugins/cordova-sqlite-storage/circle.yml
Normal file
@ -0,0 +1,28 @@
|
||||
machine:
|
||||
environment:
|
||||
ANDROID_NDK_HOME: $ANDROID_NDK
|
||||
SPEC_ROOT: spec/www
|
||||
TESTS_PATH: tests/tests.js
|
||||
CORDOVA_PARAMEDIC_CMD: cordova-paramedic --platform android --plugin . --timeout 3600000
|
||||
|
||||
dependencies:
|
||||
pre:
|
||||
- npm install -g cordova-paramedic
|
||||
- npm install -g cordova
|
||||
|
||||
test:
|
||||
|
||||
pre:
|
||||
- emulator -avd circleci-android21 -no-audio -no-window:
|
||||
background: true
|
||||
parallel: true
|
||||
- circle-android wait-for-boot
|
||||
|
||||
override:
|
||||
- cordova-paramedic --platform android --plugin . || echo error-ignored
|
||||
- cp $SPEC_ROOT/spec/self-test.js $TESTS_PATH && $CORDOVA_PARAMEDIC_CMD
|
||||
- cp $SPEC_ROOT/spec/db-tx-string-test.js $TESTS_PATH && $CORDOVA_PARAMEDIC_CMD
|
||||
- cp $SPEC_ROOT/spec/db-tx-sql-select-value-test.js $TESTS_PATH && $CORDOVA_PARAMEDIC_CMD
|
||||
- cp $SPEC_ROOT/spec/basic-db-tx-sql-storage-results.js $TESTS_PATH && $CORDOVA_PARAMEDIC_CMD
|
||||
- cp $SPEC_ROOT/spec/db-sql-operations-test.js $TESTS_PATH && $CORDOVA_PARAMEDIC_CMD
|
||||
- cp $SPEC_ROOT/spec/sql-batch-test.js $TESTS_PATH && $CORDOVA_PARAMEDIC_CMD
|
||||
1
plugins/cordova-sqlite-storage/node_modules/.bin/cake
generated
vendored
Symbolic link
1
plugins/cordova-sqlite-storage/node_modules/.bin/cake
generated
vendored
Symbolic link
@ -0,0 +1 @@
|
||||
../coffeescript/bin/cake
|
||||
1
plugins/cordova-sqlite-storage/node_modules/.bin/coffee
generated
vendored
Symbolic link
1
plugins/cordova-sqlite-storage/node_modules/.bin/coffee
generated
vendored
Symbolic link
@ -0,0 +1 @@
|
||||
../coffeescript/bin/coffee
|
||||
1
plugins/cordova-sqlite-storage/node_modules/.bin/semver
generated
vendored
Symbolic link
1
plugins/cordova-sqlite-storage/node_modules/.bin/semver
generated
vendored
Symbolic link
@ -0,0 +1 @@
|
||||
../semver/bin/semver
|
||||
1
plugins/cordova-sqlite-storage/node_modules/.bin/which
generated
vendored
Symbolic link
1
plugins/cordova-sqlite-storage/node_modules/.bin/which
generated
vendored
Symbolic link
@ -0,0 +1 @@
|
||||
../which/bin/which
|
||||
22
plugins/cordova-sqlite-storage/node_modules/coffeescript/LICENSE
generated
vendored
Normal file
22
plugins/cordova-sqlite-storage/node_modules/coffeescript/LICENSE
generated
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
Copyright (c) 2009-2017 Jeremy Ashkenas
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
files (the "Software"), to deal in the Software without
|
||||
restriction, including without limitation the rights to use,
|
||||
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
57
plugins/cordova-sqlite-storage/node_modules/coffeescript/README.md
generated
vendored
Normal file
57
plugins/cordova-sqlite-storage/node_modules/coffeescript/README.md
generated
vendored
Normal file
@ -0,0 +1,57 @@
|
||||
{
|
||||
} } {
|
||||
{ { } }
|
||||
} }{ {
|
||||
{ }{ } } _____ __ __
|
||||
{ }{ }{ { } / ____| / _|/ _|
|
||||
.- { { } { }} -. | | ___ | |_| |_ ___ ___
|
||||
( { } { } { } } ) | | / _ \| _| _/ _ \/ _ \
|
||||
|`-..________ ..-'| | |___| (_) | | | || __/ __/
|
||||
| | \_____\___/|_| |_| \___|\___|
|
||||
| ;--.
|
||||
| (__ \ _____ _ _
|
||||
| | ) ) / ____| (_) | |
|
||||
| |/ / | (___ ___ _ __ _ _ __ | |_
|
||||
| ( / \___ \ / __| '__| | '_ \| __|
|
||||
| |/ ____) | (__| | | | |_) | |_
|
||||
| | |_____/ \___|_| |_| .__/ \__|
|
||||
`-.._________..-' | |
|
||||
|_|
|
||||
|
||||
CoffeeScript is a little language that compiles into JavaScript.
|
||||
|
||||
## Installation
|
||||
|
||||
Once you have Node.js installed:
|
||||
|
||||
```shell
|
||||
npm install --global coffeescript
|
||||
```
|
||||
|
||||
Leave off the `--global` if you don’t wish to install globally.
|
||||
|
||||
## Getting Started
|
||||
|
||||
Execute a script:
|
||||
|
||||
```shell
|
||||
coffee /path/to/script.coffee
|
||||
```
|
||||
|
||||
Compile a script:
|
||||
|
||||
```shell
|
||||
coffee -c /path/to/script.coffee
|
||||
```
|
||||
|
||||
For documentation, usage, and examples, see: http://coffeescript.org/
|
||||
|
||||
To suggest a feature or report a bug: https://github.com/jashkenas/coffeescript/issues
|
||||
|
||||
If you’d like to chat, drop by #coffeescript on Freenode IRC.
|
||||
|
||||
The source repository: https://github.com/jashkenas/coffeescript.git
|
||||
|
||||
Changelog: http://coffeescript.org/#changelog
|
||||
|
||||
Our lovely and talented contributors are listed here: https://github.com/jashkenas/coffeescript/contributors
|
||||
18
plugins/cordova-sqlite-storage/node_modules/coffeescript/bin/cake
generated
vendored
Executable file
18
plugins/cordova-sqlite-storage/node_modules/coffeescript/bin/cake
generated
vendored
Executable file
@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
var path = require('path');
|
||||
var fs = require('fs');
|
||||
|
||||
var potentialPaths = [
|
||||
path.join(process.cwd(), 'node_modules/coffeescript/lib/coffeescript'),
|
||||
path.join(process.cwd(), 'node_modules/coffeescript/lib/coffee-script'),
|
||||
path.join(process.cwd(), 'node_modules/coffee-script/lib/coffee-script'),
|
||||
path.join(__dirname, '../lib/coffee-script')
|
||||
];
|
||||
|
||||
for (var i = 0, len = potentialPaths.length; i < len; i++) {
|
||||
if (fs.existsSync(potentialPaths[i])) {
|
||||
require(potentialPaths[i] + '/cake').run();
|
||||
break;
|
||||
}
|
||||
}
|
||||
18
plugins/cordova-sqlite-storage/node_modules/coffeescript/bin/coffee
generated
vendored
Executable file
18
plugins/cordova-sqlite-storage/node_modules/coffeescript/bin/coffee
generated
vendored
Executable file
@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
var path = require('path');
|
||||
var fs = require('fs');
|
||||
|
||||
var potentialPaths = [
|
||||
path.join(process.cwd(), 'node_modules/coffeescript/lib/coffeescript'),
|
||||
path.join(process.cwd(), 'node_modules/coffeescript/lib/coffee-script'),
|
||||
path.join(process.cwd(), 'node_modules/coffee-script/lib/coffee-script'),
|
||||
path.join(__dirname, '../lib/coffee-script')
|
||||
];
|
||||
|
||||
for (var i = 0, len = potentialPaths.length; i < len; i++) {
|
||||
if (fs.existsSync(potentialPaths[i])) {
|
||||
require(potentialPaths[i] + '/command').run();
|
||||
break;
|
||||
}
|
||||
}
|
||||
132
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/browser.js
generated
vendored
Normal file
132
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/browser.js
generated
vendored
Normal file
@ -0,0 +1,132 @@
|
||||
// Generated by CoffeeScript 1.12.7
|
||||
(function() {
|
||||
var CoffeeScript, compile, runScripts,
|
||||
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
||||
|
||||
CoffeeScript = require('./coffee-script');
|
||||
|
||||
CoffeeScript.require = require;
|
||||
|
||||
compile = CoffeeScript.compile;
|
||||
|
||||
CoffeeScript["eval"] = function(code, options) {
|
||||
if (options == null) {
|
||||
options = {};
|
||||
}
|
||||
if (options.bare == null) {
|
||||
options.bare = true;
|
||||
}
|
||||
return eval(compile(code, options));
|
||||
};
|
||||
|
||||
CoffeeScript.run = function(code, options) {
|
||||
if (options == null) {
|
||||
options = {};
|
||||
}
|
||||
options.bare = true;
|
||||
options.shiftLine = true;
|
||||
return Function(compile(code, options))();
|
||||
};
|
||||
|
||||
if (typeof window === "undefined" || window === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ((typeof btoa !== "undefined" && btoa !== null) && (typeof JSON !== "undefined" && JSON !== null)) {
|
||||
compile = function(code, options) {
|
||||
if (options == null) {
|
||||
options = {};
|
||||
}
|
||||
options.inlineMap = true;
|
||||
return CoffeeScript.compile(code, options);
|
||||
};
|
||||
}
|
||||
|
||||
CoffeeScript.load = function(url, callback, options, hold) {
|
||||
var xhr;
|
||||
if (options == null) {
|
||||
options = {};
|
||||
}
|
||||
if (hold == null) {
|
||||
hold = false;
|
||||
}
|
||||
options.sourceFiles = [url];
|
||||
xhr = window.ActiveXObject ? new window.ActiveXObject('Microsoft.XMLHTTP') : new window.XMLHttpRequest();
|
||||
xhr.open('GET', url, true);
|
||||
if ('overrideMimeType' in xhr) {
|
||||
xhr.overrideMimeType('text/plain');
|
||||
}
|
||||
xhr.onreadystatechange = function() {
|
||||
var param, ref;
|
||||
if (xhr.readyState === 4) {
|
||||
if ((ref = xhr.status) === 0 || ref === 200) {
|
||||
param = [xhr.responseText, options];
|
||||
if (!hold) {
|
||||
CoffeeScript.run.apply(CoffeeScript, param);
|
||||
}
|
||||
} else {
|
||||
throw new Error("Could not load " + url);
|
||||
}
|
||||
if (callback) {
|
||||
return callback(param);
|
||||
}
|
||||
}
|
||||
};
|
||||
return xhr.send(null);
|
||||
};
|
||||
|
||||
runScripts = function() {
|
||||
var coffees, coffeetypes, execute, fn, i, index, j, len, s, script, scripts;
|
||||
scripts = window.document.getElementsByTagName('script');
|
||||
coffeetypes = ['text/coffeescript', 'text/literate-coffeescript'];
|
||||
coffees = (function() {
|
||||
var j, len, ref, results;
|
||||
results = [];
|
||||
for (j = 0, len = scripts.length; j < len; j++) {
|
||||
s = scripts[j];
|
||||
if (ref = s.type, indexOf.call(coffeetypes, ref) >= 0) {
|
||||
results.push(s);
|
||||
}
|
||||
}
|
||||
return results;
|
||||
})();
|
||||
index = 0;
|
||||
execute = function() {
|
||||
var param;
|
||||
param = coffees[index];
|
||||
if (param instanceof Array) {
|
||||
CoffeeScript.run.apply(CoffeeScript, param);
|
||||
index++;
|
||||
return execute();
|
||||
}
|
||||
};
|
||||
fn = function(script, i) {
|
||||
var options, source;
|
||||
options = {
|
||||
literate: script.type === coffeetypes[1]
|
||||
};
|
||||
source = script.src || script.getAttribute('data-src');
|
||||
if (source) {
|
||||
return CoffeeScript.load(source, function(param) {
|
||||
coffees[i] = param;
|
||||
return execute();
|
||||
}, options, true);
|
||||
} else {
|
||||
options.sourceFiles = ['embedded'];
|
||||
return coffees[i] = [script.innerHTML, options];
|
||||
}
|
||||
};
|
||||
for (i = j = 0, len = coffees.length; j < len; i = ++j) {
|
||||
script = coffees[i];
|
||||
fn(script, i);
|
||||
}
|
||||
return execute();
|
||||
};
|
||||
|
||||
if (window.addEventListener) {
|
||||
window.addEventListener('DOMContentLoaded', runScripts, false);
|
||||
} else {
|
||||
window.attachEvent('onload', runScripts);
|
||||
}
|
||||
|
||||
}).call(this);
|
||||
114
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/cake.js
generated
vendored
Normal file
114
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/cake.js
generated
vendored
Normal file
@ -0,0 +1,114 @@
|
||||
// Generated by CoffeeScript 1.12.7
|
||||
(function() {
|
||||
var CoffeeScript, cakefileDirectory, fatalError, fs, helpers, missingTask, oparse, options, optparse, path, printTasks, switches, tasks;
|
||||
|
||||
fs = require('fs');
|
||||
|
||||
path = require('path');
|
||||
|
||||
helpers = require('./helpers');
|
||||
|
||||
optparse = require('./optparse');
|
||||
|
||||
CoffeeScript = require('./coffee-script');
|
||||
|
||||
CoffeeScript.register();
|
||||
|
||||
tasks = {};
|
||||
|
||||
options = {};
|
||||
|
||||
switches = [];
|
||||
|
||||
oparse = null;
|
||||
|
||||
helpers.extend(global, {
|
||||
task: function(name, description, action) {
|
||||
var ref;
|
||||
if (!action) {
|
||||
ref = [description, action], action = ref[0], description = ref[1];
|
||||
}
|
||||
return tasks[name] = {
|
||||
name: name,
|
||||
description: description,
|
||||
action: action
|
||||
};
|
||||
},
|
||||
option: function(letter, flag, description) {
|
||||
return switches.push([letter, flag, description]);
|
||||
},
|
||||
invoke: function(name) {
|
||||
if (!tasks[name]) {
|
||||
missingTask(name);
|
||||
}
|
||||
return tasks[name].action(options);
|
||||
}
|
||||
});
|
||||
|
||||
exports.run = function() {
|
||||
var arg, args, e, i, len, ref, results;
|
||||
global.__originalDirname = fs.realpathSync('.');
|
||||
process.chdir(cakefileDirectory(__originalDirname));
|
||||
args = process.argv.slice(2);
|
||||
CoffeeScript.run(fs.readFileSync('Cakefile').toString(), {
|
||||
filename: 'Cakefile'
|
||||
});
|
||||
oparse = new optparse.OptionParser(switches);
|
||||
if (!args.length) {
|
||||
return printTasks();
|
||||
}
|
||||
try {
|
||||
options = oparse.parse(args);
|
||||
} catch (error) {
|
||||
e = error;
|
||||
return fatalError("" + e);
|
||||
}
|
||||
ref = options["arguments"];
|
||||
results = [];
|
||||
for (i = 0, len = ref.length; i < len; i++) {
|
||||
arg = ref[i];
|
||||
results.push(invoke(arg));
|
||||
}
|
||||
return results;
|
||||
};
|
||||
|
||||
printTasks = function() {
|
||||
var cakefilePath, desc, name, relative, spaces, task;
|
||||
relative = path.relative || path.resolve;
|
||||
cakefilePath = path.join(relative(__originalDirname, process.cwd()), 'Cakefile');
|
||||
console.log(cakefilePath + " defines the following tasks:\n");
|
||||
for (name in tasks) {
|
||||
task = tasks[name];
|
||||
spaces = 20 - name.length;
|
||||
spaces = spaces > 0 ? Array(spaces + 1).join(' ') : '';
|
||||
desc = task.description ? "# " + task.description : '';
|
||||
console.log("cake " + name + spaces + " " + desc);
|
||||
}
|
||||
if (switches.length) {
|
||||
return console.log(oparse.help());
|
||||
}
|
||||
};
|
||||
|
||||
fatalError = function(message) {
|
||||
console.error(message + '\n');
|
||||
console.log('To see a list of all tasks/options, run "cake"');
|
||||
return process.exit(1);
|
||||
};
|
||||
|
||||
missingTask = function(task) {
|
||||
return fatalError("No such task: " + task);
|
||||
};
|
||||
|
||||
cakefileDirectory = function(dir) {
|
||||
var parent;
|
||||
if (fs.existsSync(path.join(dir, 'Cakefile'))) {
|
||||
return dir;
|
||||
}
|
||||
parent = path.normalize(path.join(dir, '..'));
|
||||
if (parent !== dir) {
|
||||
return cakefileDirectory(parent);
|
||||
}
|
||||
throw new Error("Cakefile not found in " + (process.cwd()));
|
||||
};
|
||||
|
||||
}).call(this);
|
||||
426
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/coffee-script.js
generated
vendored
Normal file
426
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/coffee-script.js
generated
vendored
Normal file
@ -0,0 +1,426 @@
|
||||
// Generated by CoffeeScript 1.12.7
|
||||
(function() {
|
||||
var Lexer, SourceMap, base64encode, compile, ext, fn1, formatSourcePosition, fs, getSourceMap, helpers, i, len, lexer, packageJson, parser, path, ref, sourceMaps, sources, vm, withPrettyErrors,
|
||||
hasProp = {}.hasOwnProperty;
|
||||
|
||||
fs = require('fs');
|
||||
|
||||
vm = require('vm');
|
||||
|
||||
path = require('path');
|
||||
|
||||
Lexer = require('./lexer').Lexer;
|
||||
|
||||
parser = require('./parser').parser;
|
||||
|
||||
helpers = require('./helpers');
|
||||
|
||||
SourceMap = require('./sourcemap');
|
||||
|
||||
packageJson = require('../../package.json');
|
||||
|
||||
exports.VERSION = packageJson.version;
|
||||
|
||||
exports.FILE_EXTENSIONS = ['.coffee', '.litcoffee', '.coffee.md'];
|
||||
|
||||
exports.helpers = helpers;
|
||||
|
||||
base64encode = function(src) {
|
||||
switch (false) {
|
||||
case typeof Buffer !== 'function':
|
||||
return new Buffer(src).toString('base64');
|
||||
case typeof btoa !== 'function':
|
||||
return btoa(encodeURIComponent(src).replace(/%([0-9A-F]{2})/g, function(match, p1) {
|
||||
return String.fromCharCode('0x' + p1);
|
||||
}));
|
||||
default:
|
||||
throw new Error('Unable to base64 encode inline sourcemap.');
|
||||
}
|
||||
};
|
||||
|
||||
withPrettyErrors = function(fn) {
|
||||
return function(code, options) {
|
||||
var err;
|
||||
if (options == null) {
|
||||
options = {};
|
||||
}
|
||||
try {
|
||||
return fn.call(this, code, options);
|
||||
} catch (error) {
|
||||
err = error;
|
||||
if (typeof code !== 'string') {
|
||||
throw err;
|
||||
}
|
||||
throw helpers.updateSyntaxError(err, code, options.filename);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
sources = {};
|
||||
|
||||
sourceMaps = {};
|
||||
|
||||
exports.compile = compile = withPrettyErrors(function(code, options) {
|
||||
var currentColumn, currentLine, encoded, extend, filename, fragment, fragments, generateSourceMap, header, i, j, js, len, len1, map, merge, newLines, ref, ref1, sourceMapDataURI, sourceURL, token, tokens, v3SourceMap;
|
||||
merge = helpers.merge, extend = helpers.extend;
|
||||
options = extend({}, options);
|
||||
generateSourceMap = options.sourceMap || options.inlineMap || (options.filename == null);
|
||||
filename = options.filename || '<anonymous>';
|
||||
sources[filename] = code;
|
||||
if (generateSourceMap) {
|
||||
map = new SourceMap;
|
||||
}
|
||||
tokens = lexer.tokenize(code, options);
|
||||
options.referencedVars = (function() {
|
||||
var i, len, results;
|
||||
results = [];
|
||||
for (i = 0, len = tokens.length; i < len; i++) {
|
||||
token = tokens[i];
|
||||
if (token[0] === 'IDENTIFIER') {
|
||||
results.push(token[1]);
|
||||
}
|
||||
}
|
||||
return results;
|
||||
})();
|
||||
if (!((options.bare != null) && options.bare === true)) {
|
||||
for (i = 0, len = tokens.length; i < len; i++) {
|
||||
token = tokens[i];
|
||||
if ((ref = token[0]) === 'IMPORT' || ref === 'EXPORT') {
|
||||
options.bare = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
fragments = parser.parse(tokens).compileToFragments(options);
|
||||
currentLine = 0;
|
||||
if (options.header) {
|
||||
currentLine += 1;
|
||||
}
|
||||
if (options.shiftLine) {
|
||||
currentLine += 1;
|
||||
}
|
||||
currentColumn = 0;
|
||||
js = "";
|
||||
for (j = 0, len1 = fragments.length; j < len1; j++) {
|
||||
fragment = fragments[j];
|
||||
if (generateSourceMap) {
|
||||
if (fragment.locationData && !/^[;\s]*$/.test(fragment.code)) {
|
||||
map.add([fragment.locationData.first_line, fragment.locationData.first_column], [currentLine, currentColumn], {
|
||||
noReplace: true
|
||||
});
|
||||
}
|
||||
newLines = helpers.count(fragment.code, "\n");
|
||||
currentLine += newLines;
|
||||
if (newLines) {
|
||||
currentColumn = fragment.code.length - (fragment.code.lastIndexOf("\n") + 1);
|
||||
} else {
|
||||
currentColumn += fragment.code.length;
|
||||
}
|
||||
}
|
||||
js += fragment.code;
|
||||
}
|
||||
if (options.header) {
|
||||
header = "Generated by CoffeeScript " + this.VERSION;
|
||||
js = "// " + header + "\n" + js;
|
||||
}
|
||||
if (generateSourceMap) {
|
||||
v3SourceMap = map.generate(options, code);
|
||||
sourceMaps[filename] = map;
|
||||
}
|
||||
if (options.inlineMap) {
|
||||
encoded = base64encode(JSON.stringify(v3SourceMap));
|
||||
sourceMapDataURI = "//# sourceMappingURL=data:application/json;base64," + encoded;
|
||||
sourceURL = "//# sourceURL=" + ((ref1 = options.filename) != null ? ref1 : 'coffeescript');
|
||||
js = js + "\n" + sourceMapDataURI + "\n" + sourceURL;
|
||||
}
|
||||
if (options.sourceMap) {
|
||||
return {
|
||||
js: js,
|
||||
sourceMap: map,
|
||||
v3SourceMap: JSON.stringify(v3SourceMap, null, 2)
|
||||
};
|
||||
} else {
|
||||
return js;
|
||||
}
|
||||
});
|
||||
|
||||
exports.tokens = withPrettyErrors(function(code, options) {
|
||||
return lexer.tokenize(code, options);
|
||||
});
|
||||
|
||||
exports.nodes = withPrettyErrors(function(source, options) {
|
||||
if (typeof source === 'string') {
|
||||
return parser.parse(lexer.tokenize(source, options));
|
||||
} else {
|
||||
return parser.parse(source);
|
||||
}
|
||||
});
|
||||
|
||||
exports.run = function(code, options) {
|
||||
var answer, dir, mainModule, ref;
|
||||
if (options == null) {
|
||||
options = {};
|
||||
}
|
||||
mainModule = require.main;
|
||||
mainModule.filename = process.argv[1] = options.filename ? fs.realpathSync(options.filename) : '<anonymous>';
|
||||
mainModule.moduleCache && (mainModule.moduleCache = {});
|
||||
dir = options.filename != null ? path.dirname(fs.realpathSync(options.filename)) : fs.realpathSync('.');
|
||||
mainModule.paths = require('module')._nodeModulePaths(dir);
|
||||
if (!helpers.isCoffee(mainModule.filename) || require.extensions) {
|
||||
answer = compile(code, options);
|
||||
code = (ref = answer.js) != null ? ref : answer;
|
||||
}
|
||||
return mainModule._compile(code, mainModule.filename);
|
||||
};
|
||||
|
||||
exports["eval"] = function(code, options) {
|
||||
var Module, _module, _require, createContext, i, isContext, js, k, len, o, r, ref, ref1, ref2, ref3, sandbox, v;
|
||||
if (options == null) {
|
||||
options = {};
|
||||
}
|
||||
if (!(code = code.trim())) {
|
||||
return;
|
||||
}
|
||||
createContext = (ref = vm.Script.createContext) != null ? ref : vm.createContext;
|
||||
isContext = (ref1 = vm.isContext) != null ? ref1 : function(ctx) {
|
||||
return options.sandbox instanceof createContext().constructor;
|
||||
};
|
||||
if (createContext) {
|
||||
if (options.sandbox != null) {
|
||||
if (isContext(options.sandbox)) {
|
||||
sandbox = options.sandbox;
|
||||
} else {
|
||||
sandbox = createContext();
|
||||
ref2 = options.sandbox;
|
||||
for (k in ref2) {
|
||||
if (!hasProp.call(ref2, k)) continue;
|
||||
v = ref2[k];
|
||||
sandbox[k] = v;
|
||||
}
|
||||
}
|
||||
sandbox.global = sandbox.root = sandbox.GLOBAL = sandbox;
|
||||
} else {
|
||||
sandbox = global;
|
||||
}
|
||||
sandbox.__filename = options.filename || 'eval';
|
||||
sandbox.__dirname = path.dirname(sandbox.__filename);
|
||||
if (!(sandbox !== global || sandbox.module || sandbox.require)) {
|
||||
Module = require('module');
|
||||
sandbox.module = _module = new Module(options.modulename || 'eval');
|
||||
sandbox.require = _require = function(path) {
|
||||
return Module._load(path, _module, true);
|
||||
};
|
||||
_module.filename = sandbox.__filename;
|
||||
ref3 = Object.getOwnPropertyNames(require);
|
||||
for (i = 0, len = ref3.length; i < len; i++) {
|
||||
r = ref3[i];
|
||||
if (r !== 'paths' && r !== 'arguments' && r !== 'caller') {
|
||||
_require[r] = require[r];
|
||||
}
|
||||
}
|
||||
_require.paths = _module.paths = Module._nodeModulePaths(process.cwd());
|
||||
_require.resolve = function(request) {
|
||||
return Module._resolveFilename(request, _module);
|
||||
};
|
||||
}
|
||||
}
|
||||
o = {};
|
||||
for (k in options) {
|
||||
if (!hasProp.call(options, k)) continue;
|
||||
v = options[k];
|
||||
o[k] = v;
|
||||
}
|
||||
o.bare = true;
|
||||
js = compile(code, o);
|
||||
if (sandbox === global) {
|
||||
return vm.runInThisContext(js);
|
||||
} else {
|
||||
return vm.runInContext(js, sandbox);
|
||||
}
|
||||
};
|
||||
|
||||
exports.register = function() {
|
||||
return require('./register');
|
||||
};
|
||||
|
||||
if (require.extensions) {
|
||||
ref = this.FILE_EXTENSIONS;
|
||||
fn1 = function(ext) {
|
||||
var base;
|
||||
return (base = require.extensions)[ext] != null ? base[ext] : base[ext] = function() {
|
||||
throw new Error("Use CoffeeScript.register() or require the coffee-script/register module to require " + ext + " files.");
|
||||
};
|
||||
};
|
||||
for (i = 0, len = ref.length; i < len; i++) {
|
||||
ext = ref[i];
|
||||
fn1(ext);
|
||||
}
|
||||
}
|
||||
|
||||
exports._compileFile = function(filename, sourceMap, inlineMap) {
|
||||
var answer, err, raw, stripped;
|
||||
if (sourceMap == null) {
|
||||
sourceMap = false;
|
||||
}
|
||||
if (inlineMap == null) {
|
||||
inlineMap = false;
|
||||
}
|
||||
raw = fs.readFileSync(filename, 'utf8');
|
||||
stripped = raw.charCodeAt(0) === 0xFEFF ? raw.substring(1) : raw;
|
||||
try {
|
||||
answer = compile(stripped, {
|
||||
filename: filename,
|
||||
sourceMap: sourceMap,
|
||||
inlineMap: inlineMap,
|
||||
sourceFiles: [filename],
|
||||
literate: helpers.isLiterate(filename)
|
||||
});
|
||||
} catch (error) {
|
||||
err = error;
|
||||
throw helpers.updateSyntaxError(err, stripped, filename);
|
||||
}
|
||||
return answer;
|
||||
};
|
||||
|
||||
lexer = new Lexer;
|
||||
|
||||
parser.lexer = {
|
||||
lex: function() {
|
||||
var tag, token;
|
||||
token = parser.tokens[this.pos++];
|
||||
if (token) {
|
||||
tag = token[0], this.yytext = token[1], this.yylloc = token[2];
|
||||
parser.errorToken = token.origin || token;
|
||||
this.yylineno = this.yylloc.first_line;
|
||||
} else {
|
||||
tag = '';
|
||||
}
|
||||
return tag;
|
||||
},
|
||||
setInput: function(tokens) {
|
||||
parser.tokens = tokens;
|
||||
return this.pos = 0;
|
||||
},
|
||||
upcomingInput: function() {
|
||||
return "";
|
||||
}
|
||||
};
|
||||
|
||||
parser.yy = require('./nodes');
|
||||
|
||||
parser.yy.parseError = function(message, arg) {
|
||||
var errorLoc, errorTag, errorText, errorToken, token, tokens;
|
||||
token = arg.token;
|
||||
errorToken = parser.errorToken, tokens = parser.tokens;
|
||||
errorTag = errorToken[0], errorText = errorToken[1], errorLoc = errorToken[2];
|
||||
errorText = (function() {
|
||||
switch (false) {
|
||||
case errorToken !== tokens[tokens.length - 1]:
|
||||
return 'end of input';
|
||||
case errorTag !== 'INDENT' && errorTag !== 'OUTDENT':
|
||||
return 'indentation';
|
||||
case errorTag !== 'IDENTIFIER' && errorTag !== 'NUMBER' && errorTag !== 'INFINITY' && errorTag !== 'STRING' && errorTag !== 'STRING_START' && errorTag !== 'REGEX' && errorTag !== 'REGEX_START':
|
||||
return errorTag.replace(/_START$/, '').toLowerCase();
|
||||
default:
|
||||
return helpers.nameWhitespaceCharacter(errorText);
|
||||
}
|
||||
})();
|
||||
return helpers.throwSyntaxError("unexpected " + errorText, errorLoc);
|
||||
};
|
||||
|
||||
formatSourcePosition = function(frame, getSourceMapping) {
|
||||
var as, column, fileLocation, filename, functionName, isConstructor, isMethodCall, line, methodName, source, tp, typeName;
|
||||
filename = void 0;
|
||||
fileLocation = '';
|
||||
if (frame.isNative()) {
|
||||
fileLocation = "native";
|
||||
} else {
|
||||
if (frame.isEval()) {
|
||||
filename = frame.getScriptNameOrSourceURL();
|
||||
if (!filename) {
|
||||
fileLocation = (frame.getEvalOrigin()) + ", ";
|
||||
}
|
||||
} else {
|
||||
filename = frame.getFileName();
|
||||
}
|
||||
filename || (filename = "<anonymous>");
|
||||
line = frame.getLineNumber();
|
||||
column = frame.getColumnNumber();
|
||||
source = getSourceMapping(filename, line, column);
|
||||
fileLocation = source ? filename + ":" + source[0] + ":" + source[1] : filename + ":" + line + ":" + column;
|
||||
}
|
||||
functionName = frame.getFunctionName();
|
||||
isConstructor = frame.isConstructor();
|
||||
isMethodCall = !(frame.isToplevel() || isConstructor);
|
||||
if (isMethodCall) {
|
||||
methodName = frame.getMethodName();
|
||||
typeName = frame.getTypeName();
|
||||
if (functionName) {
|
||||
tp = as = '';
|
||||
if (typeName && functionName.indexOf(typeName)) {
|
||||
tp = typeName + ".";
|
||||
}
|
||||
if (methodName && functionName.indexOf("." + methodName) !== functionName.length - methodName.length - 1) {
|
||||
as = " [as " + methodName + "]";
|
||||
}
|
||||
return "" + tp + functionName + as + " (" + fileLocation + ")";
|
||||
} else {
|
||||
return typeName + "." + (methodName || '<anonymous>') + " (" + fileLocation + ")";
|
||||
}
|
||||
} else if (isConstructor) {
|
||||
return "new " + (functionName || '<anonymous>') + " (" + fileLocation + ")";
|
||||
} else if (functionName) {
|
||||
return functionName + " (" + fileLocation + ")";
|
||||
} else {
|
||||
return fileLocation;
|
||||
}
|
||||
};
|
||||
|
||||
getSourceMap = function(filename) {
|
||||
var answer;
|
||||
if (sourceMaps[filename] != null) {
|
||||
return sourceMaps[filename];
|
||||
} else if (sourceMaps['<anonymous>'] != null) {
|
||||
return sourceMaps['<anonymous>'];
|
||||
} else if (sources[filename] != null) {
|
||||
answer = compile(sources[filename], {
|
||||
filename: filename,
|
||||
sourceMap: true,
|
||||
literate: helpers.isLiterate(filename)
|
||||
});
|
||||
return answer.sourceMap;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
Error.prepareStackTrace = function(err, stack) {
|
||||
var frame, frames, getSourceMapping;
|
||||
getSourceMapping = function(filename, line, column) {
|
||||
var answer, sourceMap;
|
||||
sourceMap = getSourceMap(filename);
|
||||
if (sourceMap != null) {
|
||||
answer = sourceMap.sourceLocation([line - 1, column - 1]);
|
||||
}
|
||||
if (answer != null) {
|
||||
return [answer[0] + 1, answer[1] + 1];
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
frames = (function() {
|
||||
var j, len1, results;
|
||||
results = [];
|
||||
for (j = 0, len1 = stack.length; j < len1; j++) {
|
||||
frame = stack[j];
|
||||
if (frame.getFunction() === exports.run) {
|
||||
break;
|
||||
}
|
||||
results.push(" at " + (formatSourcePosition(frame, getSourceMapping)));
|
||||
}
|
||||
return results;
|
||||
})();
|
||||
return (err.toString()) + "\n" + (frames.join('\n')) + "\n";
|
||||
};
|
||||
|
||||
}).call(this);
|
||||
610
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/command.js
generated
vendored
Normal file
610
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/command.js
generated
vendored
Normal file
@ -0,0 +1,610 @@
|
||||
// Generated by CoffeeScript 1.12.7
|
||||
(function() {
|
||||
var BANNER, CoffeeScript, EventEmitter, SWITCHES, compileJoin, compileOptions, compilePath, compileScript, compileStdio, exec, findDirectoryIndex, forkNode, fs, helpers, hidden, joinTimeout, makePrelude, mkdirp, notSources, optionParser, optparse, opts, outputPath, parseOptions, path, printLine, printTokens, printWarn, ref, removeSource, removeSourceDir, silentUnlink, sourceCode, sources, spawn, timeLog, usage, useWinPathSep, version, wait, watch, watchDir, watchedDirs, writeJs,
|
||||
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
||||
|
||||
fs = require('fs');
|
||||
|
||||
path = require('path');
|
||||
|
||||
helpers = require('./helpers');
|
||||
|
||||
optparse = require('./optparse');
|
||||
|
||||
CoffeeScript = require('./coffee-script');
|
||||
|
||||
ref = require('child_process'), spawn = ref.spawn, exec = ref.exec;
|
||||
|
||||
EventEmitter = require('events').EventEmitter;
|
||||
|
||||
useWinPathSep = path.sep === '\\';
|
||||
|
||||
helpers.extend(CoffeeScript, new EventEmitter);
|
||||
|
||||
printLine = function(line) {
|
||||
return process.stdout.write(line + '\n');
|
||||
};
|
||||
|
||||
printWarn = function(line) {
|
||||
return process.stderr.write(line + '\n');
|
||||
};
|
||||
|
||||
hidden = function(file) {
|
||||
return /^\.|~$/.test(file);
|
||||
};
|
||||
|
||||
BANNER = 'Usage: coffee [options] path/to/script.coffee -- [args]\n\nIf called without options, `coffee` will run your script.';
|
||||
|
||||
SWITCHES = [['-b', '--bare', 'compile without a top-level function wrapper'], ['-c', '--compile', 'compile to JavaScript and save as .js files'], ['-e', '--eval', 'pass a string from the command line as input'], ['-h', '--help', 'display this help message'], ['-i', '--interactive', 'run an interactive CoffeeScript REPL'], ['-j', '--join [FILE]', 'concatenate the source CoffeeScript before compiling'], ['-m', '--map', 'generate source map and save as .js.map files'], ['-M', '--inline-map', 'generate source map and include it directly in output'], ['-n', '--nodes', 'print out the parse tree that the parser produces'], ['--nodejs [ARGS]', 'pass options directly to the "node" binary'], ['--no-header', 'suppress the "Generated by" header'], ['-o', '--output [DIR]', 'set the output directory for compiled JavaScript'], ['-p', '--print', 'print out the compiled JavaScript'], ['-r', '--require [MODULE*]', 'require the given module before eval or REPL'], ['-s', '--stdio', 'listen for and compile scripts over stdio'], ['-l', '--literate', 'treat stdio as literate style coffee-script'], ['-t', '--tokens', 'print out the tokens that the lexer/rewriter produce'], ['-v', '--version', 'display the version number'], ['-w', '--watch', 'watch scripts for changes and rerun commands']];
|
||||
|
||||
opts = {};
|
||||
|
||||
sources = [];
|
||||
|
||||
sourceCode = [];
|
||||
|
||||
notSources = {};
|
||||
|
||||
watchedDirs = {};
|
||||
|
||||
optionParser = null;
|
||||
|
||||
exports.run = function() {
|
||||
var i, len, literals, ref1, replCliOpts, results, source;
|
||||
parseOptions();
|
||||
replCliOpts = {
|
||||
useGlobal: true
|
||||
};
|
||||
if (opts.require) {
|
||||
opts.prelude = makePrelude(opts.require);
|
||||
}
|
||||
replCliOpts.prelude = opts.prelude;
|
||||
if (opts.nodejs) {
|
||||
return forkNode();
|
||||
}
|
||||
if (opts.help) {
|
||||
return usage();
|
||||
}
|
||||
if (opts.version) {
|
||||
return version();
|
||||
}
|
||||
if (opts.interactive) {
|
||||
return require('./repl').start(replCliOpts);
|
||||
}
|
||||
if (opts.stdio) {
|
||||
return compileStdio();
|
||||
}
|
||||
if (opts["eval"]) {
|
||||
return compileScript(null, opts["arguments"][0]);
|
||||
}
|
||||
if (!opts["arguments"].length) {
|
||||
return require('./repl').start(replCliOpts);
|
||||
}
|
||||
literals = opts.run ? opts["arguments"].splice(1) : [];
|
||||
process.argv = process.argv.slice(0, 2).concat(literals);
|
||||
process.argv[0] = 'coffee';
|
||||
if (opts.output) {
|
||||
opts.output = path.resolve(opts.output);
|
||||
}
|
||||
if (opts.join) {
|
||||
opts.join = path.resolve(opts.join);
|
||||
console.error('\nThe --join option is deprecated and will be removed in a future version.\n\nIf for some reason it\'s necessary to share local variables between files,\nreplace...\n\n $ coffee --compile --join bundle.js -- a.coffee b.coffee c.coffee\n\nwith...\n\n $ cat a.coffee b.coffee c.coffee | coffee --compile --stdio > bundle.js\n');
|
||||
}
|
||||
ref1 = opts["arguments"];
|
||||
results = [];
|
||||
for (i = 0, len = ref1.length; i < len; i++) {
|
||||
source = ref1[i];
|
||||
source = path.resolve(source);
|
||||
results.push(compilePath(source, true, source));
|
||||
}
|
||||
return results;
|
||||
};
|
||||
|
||||
makePrelude = function(requires) {
|
||||
return requires.map(function(module) {
|
||||
var _, match, name;
|
||||
if (match = module.match(/^(.*)=(.*)$/)) {
|
||||
_ = match[0], name = match[1], module = match[2];
|
||||
}
|
||||
name || (name = helpers.baseFileName(module, true, useWinPathSep));
|
||||
return name + " = require('" + module + "')";
|
||||
}).join(';');
|
||||
};
|
||||
|
||||
compilePath = function(source, topLevel, base) {
|
||||
var code, err, file, files, i, len, results, stats;
|
||||
if (indexOf.call(sources, source) >= 0 || watchedDirs[source] || !topLevel && (notSources[source] || hidden(source))) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
stats = fs.statSync(source);
|
||||
} catch (error) {
|
||||
err = error;
|
||||
if (err.code === 'ENOENT') {
|
||||
console.error("File not found: " + source);
|
||||
process.exit(1);
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
if (stats.isDirectory()) {
|
||||
if (path.basename(source) === 'node_modules') {
|
||||
notSources[source] = true;
|
||||
return;
|
||||
}
|
||||
if (opts.run) {
|
||||
compilePath(findDirectoryIndex(source), topLevel, base);
|
||||
return;
|
||||
}
|
||||
if (opts.watch) {
|
||||
watchDir(source, base);
|
||||
}
|
||||
try {
|
||||
files = fs.readdirSync(source);
|
||||
} catch (error) {
|
||||
err = error;
|
||||
if (err.code === 'ENOENT') {
|
||||
return;
|
||||
} else {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
results = [];
|
||||
for (i = 0, len = files.length; i < len; i++) {
|
||||
file = files[i];
|
||||
results.push(compilePath(path.join(source, file), false, base));
|
||||
}
|
||||
return results;
|
||||
} else if (topLevel || helpers.isCoffee(source)) {
|
||||
sources.push(source);
|
||||
sourceCode.push(null);
|
||||
delete notSources[source];
|
||||
if (opts.watch) {
|
||||
watch(source, base);
|
||||
}
|
||||
try {
|
||||
code = fs.readFileSync(source);
|
||||
} catch (error) {
|
||||
err = error;
|
||||
if (err.code === 'ENOENT') {
|
||||
return;
|
||||
} else {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
return compileScript(source, code.toString(), base);
|
||||
} else {
|
||||
return notSources[source] = true;
|
||||
}
|
||||
};
|
||||
|
||||
findDirectoryIndex = function(source) {
|
||||
var err, ext, i, index, len, ref1;
|
||||
ref1 = CoffeeScript.FILE_EXTENSIONS;
|
||||
for (i = 0, len = ref1.length; i < len; i++) {
|
||||
ext = ref1[i];
|
||||
index = path.join(source, "index" + ext);
|
||||
try {
|
||||
if ((fs.statSync(index)).isFile()) {
|
||||
return index;
|
||||
}
|
||||
} catch (error) {
|
||||
err = error;
|
||||
if (err.code !== 'ENOENT') {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
}
|
||||
console.error("Missing index.coffee or index.litcoffee in " + source);
|
||||
return process.exit(1);
|
||||
};
|
||||
|
||||
compileScript = function(file, input, base) {
|
||||
var compiled, err, message, o, options, t, task;
|
||||
if (base == null) {
|
||||
base = null;
|
||||
}
|
||||
o = opts;
|
||||
options = compileOptions(file, base);
|
||||
try {
|
||||
t = task = {
|
||||
file: file,
|
||||
input: input,
|
||||
options: options
|
||||
};
|
||||
CoffeeScript.emit('compile', task);
|
||||
if (o.tokens) {
|
||||
return printTokens(CoffeeScript.tokens(t.input, t.options));
|
||||
} else if (o.nodes) {
|
||||
return printLine(CoffeeScript.nodes(t.input, t.options).toString().trim());
|
||||
} else if (o.run) {
|
||||
CoffeeScript.register();
|
||||
if (opts.prelude) {
|
||||
CoffeeScript["eval"](opts.prelude, t.options);
|
||||
}
|
||||
return CoffeeScript.run(t.input, t.options);
|
||||
} else if (o.join && t.file !== o.join) {
|
||||
if (helpers.isLiterate(file)) {
|
||||
t.input = helpers.invertLiterate(t.input);
|
||||
}
|
||||
sourceCode[sources.indexOf(t.file)] = t.input;
|
||||
return compileJoin();
|
||||
} else {
|
||||
compiled = CoffeeScript.compile(t.input, t.options);
|
||||
t.output = compiled;
|
||||
if (o.map) {
|
||||
t.output = compiled.js;
|
||||
t.sourceMap = compiled.v3SourceMap;
|
||||
}
|
||||
CoffeeScript.emit('success', task);
|
||||
if (o.print) {
|
||||
return printLine(t.output.trim());
|
||||
} else if (o.compile || o.map) {
|
||||
return writeJs(base, t.file, t.output, options.jsPath, t.sourceMap);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
err = error;
|
||||
CoffeeScript.emit('failure', err, task);
|
||||
if (CoffeeScript.listeners('failure').length) {
|
||||
return;
|
||||
}
|
||||
message = (err != null ? err.stack : void 0) || ("" + err);
|
||||
if (o.watch) {
|
||||
return printLine(message + '\x07');
|
||||
} else {
|
||||
printWarn(message);
|
||||
return process.exit(1);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
compileStdio = function() {
|
||||
var buffers, stdin;
|
||||
buffers = [];
|
||||
stdin = process.openStdin();
|
||||
stdin.on('data', function(buffer) {
|
||||
if (buffer) {
|
||||
return buffers.push(buffer);
|
||||
}
|
||||
});
|
||||
return stdin.on('end', function() {
|
||||
return compileScript(null, Buffer.concat(buffers).toString());
|
||||
});
|
||||
};
|
||||
|
||||
joinTimeout = null;
|
||||
|
||||
compileJoin = function() {
|
||||
if (!opts.join) {
|
||||
return;
|
||||
}
|
||||
if (!sourceCode.some(function(code) {
|
||||
return code === null;
|
||||
})) {
|
||||
clearTimeout(joinTimeout);
|
||||
return joinTimeout = wait(100, function() {
|
||||
return compileScript(opts.join, sourceCode.join('\n'), opts.join);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
watch = function(source, base) {
|
||||
var compile, compileTimeout, err, prevStats, rewatch, startWatcher, watchErr, watcher;
|
||||
watcher = null;
|
||||
prevStats = null;
|
||||
compileTimeout = null;
|
||||
watchErr = function(err) {
|
||||
if (err.code !== 'ENOENT') {
|
||||
throw err;
|
||||
}
|
||||
if (indexOf.call(sources, source) < 0) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
rewatch();
|
||||
return compile();
|
||||
} catch (error) {
|
||||
removeSource(source, base);
|
||||
return compileJoin();
|
||||
}
|
||||
};
|
||||
compile = function() {
|
||||
clearTimeout(compileTimeout);
|
||||
return compileTimeout = wait(25, function() {
|
||||
return fs.stat(source, function(err, stats) {
|
||||
if (err) {
|
||||
return watchErr(err);
|
||||
}
|
||||
if (prevStats && stats.size === prevStats.size && stats.mtime.getTime() === prevStats.mtime.getTime()) {
|
||||
return rewatch();
|
||||
}
|
||||
prevStats = stats;
|
||||
return fs.readFile(source, function(err, code) {
|
||||
if (err) {
|
||||
return watchErr(err);
|
||||
}
|
||||
compileScript(source, code.toString(), base);
|
||||
return rewatch();
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
startWatcher = function() {
|
||||
return watcher = fs.watch(source).on('change', compile).on('error', function(err) {
|
||||
if (err.code !== 'EPERM') {
|
||||
throw err;
|
||||
}
|
||||
return removeSource(source, base);
|
||||
});
|
||||
};
|
||||
rewatch = function() {
|
||||
if (watcher != null) {
|
||||
watcher.close();
|
||||
}
|
||||
return startWatcher();
|
||||
};
|
||||
try {
|
||||
return startWatcher();
|
||||
} catch (error) {
|
||||
err = error;
|
||||
return watchErr(err);
|
||||
}
|
||||
};
|
||||
|
||||
watchDir = function(source, base) {
|
||||
var err, readdirTimeout, startWatcher, stopWatcher, watcher;
|
||||
watcher = null;
|
||||
readdirTimeout = null;
|
||||
startWatcher = function() {
|
||||
return watcher = fs.watch(source).on('error', function(err) {
|
||||
if (err.code !== 'EPERM') {
|
||||
throw err;
|
||||
}
|
||||
return stopWatcher();
|
||||
}).on('change', function() {
|
||||
clearTimeout(readdirTimeout);
|
||||
return readdirTimeout = wait(25, function() {
|
||||
var err, file, files, i, len, results;
|
||||
try {
|
||||
files = fs.readdirSync(source);
|
||||
} catch (error) {
|
||||
err = error;
|
||||
if (err.code !== 'ENOENT') {
|
||||
throw err;
|
||||
}
|
||||
return stopWatcher();
|
||||
}
|
||||
results = [];
|
||||
for (i = 0, len = files.length; i < len; i++) {
|
||||
file = files[i];
|
||||
results.push(compilePath(path.join(source, file), false, base));
|
||||
}
|
||||
return results;
|
||||
});
|
||||
});
|
||||
};
|
||||
stopWatcher = function() {
|
||||
watcher.close();
|
||||
return removeSourceDir(source, base);
|
||||
};
|
||||
watchedDirs[source] = true;
|
||||
try {
|
||||
return startWatcher();
|
||||
} catch (error) {
|
||||
err = error;
|
||||
if (err.code !== 'ENOENT') {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
removeSourceDir = function(source, base) {
|
||||
var file, i, len, sourcesChanged;
|
||||
delete watchedDirs[source];
|
||||
sourcesChanged = false;
|
||||
for (i = 0, len = sources.length; i < len; i++) {
|
||||
file = sources[i];
|
||||
if (!(source === path.dirname(file))) {
|
||||
continue;
|
||||
}
|
||||
removeSource(file, base);
|
||||
sourcesChanged = true;
|
||||
}
|
||||
if (sourcesChanged) {
|
||||
return compileJoin();
|
||||
}
|
||||
};
|
||||
|
||||
removeSource = function(source, base) {
|
||||
var index;
|
||||
index = sources.indexOf(source);
|
||||
sources.splice(index, 1);
|
||||
sourceCode.splice(index, 1);
|
||||
if (!opts.join) {
|
||||
silentUnlink(outputPath(source, base));
|
||||
silentUnlink(outputPath(source, base, '.js.map'));
|
||||
return timeLog("removed " + source);
|
||||
}
|
||||
};
|
||||
|
||||
silentUnlink = function(path) {
|
||||
var err, ref1;
|
||||
try {
|
||||
return fs.unlinkSync(path);
|
||||
} catch (error) {
|
||||
err = error;
|
||||
if ((ref1 = err.code) !== 'ENOENT' && ref1 !== 'EPERM') {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
outputPath = function(source, base, extension) {
|
||||
var basename, dir, srcDir;
|
||||
if (extension == null) {
|
||||
extension = ".js";
|
||||
}
|
||||
basename = helpers.baseFileName(source, true, useWinPathSep);
|
||||
srcDir = path.dirname(source);
|
||||
if (!opts.output) {
|
||||
dir = srcDir;
|
||||
} else if (source === base) {
|
||||
dir = opts.output;
|
||||
} else {
|
||||
dir = path.join(opts.output, path.relative(base, srcDir));
|
||||
}
|
||||
return path.join(dir, basename + extension);
|
||||
};
|
||||
|
||||
mkdirp = function(dir, fn) {
|
||||
var mkdirs, mode;
|
||||
mode = 0x1ff & ~process.umask();
|
||||
return (mkdirs = function(p, fn) {
|
||||
return fs.exists(p, function(exists) {
|
||||
if (exists) {
|
||||
return fn();
|
||||
} else {
|
||||
return mkdirs(path.dirname(p), function() {
|
||||
return fs.mkdir(p, mode, function(err) {
|
||||
if (err) {
|
||||
return fn(err);
|
||||
}
|
||||
return fn();
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
})(dir, fn);
|
||||
};
|
||||
|
||||
writeJs = function(base, sourcePath, js, jsPath, generatedSourceMap) {
|
||||
var compile, jsDir, sourceMapPath;
|
||||
if (generatedSourceMap == null) {
|
||||
generatedSourceMap = null;
|
||||
}
|
||||
sourceMapPath = outputPath(sourcePath, base, ".js.map");
|
||||
jsDir = path.dirname(jsPath);
|
||||
compile = function() {
|
||||
if (opts.compile) {
|
||||
if (js.length <= 0) {
|
||||
js = ' ';
|
||||
}
|
||||
if (generatedSourceMap) {
|
||||
js = js + "\n//# sourceMappingURL=" + (helpers.baseFileName(sourceMapPath, false, useWinPathSep)) + "\n";
|
||||
}
|
||||
fs.writeFile(jsPath, js, function(err) {
|
||||
if (err) {
|
||||
printLine(err.message);
|
||||
return process.exit(1);
|
||||
} else if (opts.compile && opts.watch) {
|
||||
return timeLog("compiled " + sourcePath);
|
||||
}
|
||||
});
|
||||
}
|
||||
if (generatedSourceMap) {
|
||||
return fs.writeFile(sourceMapPath, generatedSourceMap, function(err) {
|
||||
if (err) {
|
||||
printLine("Could not write source map: " + err.message);
|
||||
return process.exit(1);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
return fs.exists(jsDir, function(itExists) {
|
||||
if (itExists) {
|
||||
return compile();
|
||||
} else {
|
||||
return mkdirp(jsDir, compile);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
wait = function(milliseconds, func) {
|
||||
return setTimeout(func, milliseconds);
|
||||
};
|
||||
|
||||
timeLog = function(message) {
|
||||
return console.log(((new Date).toLocaleTimeString()) + " - " + message);
|
||||
};
|
||||
|
||||
printTokens = function(tokens) {
|
||||
var strings, tag, token, value;
|
||||
strings = (function() {
|
||||
var i, len, results;
|
||||
results = [];
|
||||
for (i = 0, len = tokens.length; i < len; i++) {
|
||||
token = tokens[i];
|
||||
tag = token[0];
|
||||
value = token[1].toString().replace(/\n/, '\\n');
|
||||
results.push("[" + tag + " " + value + "]");
|
||||
}
|
||||
return results;
|
||||
})();
|
||||
return printLine(strings.join(' '));
|
||||
};
|
||||
|
||||
parseOptions = function() {
|
||||
var o;
|
||||
optionParser = new optparse.OptionParser(SWITCHES, BANNER);
|
||||
o = opts = optionParser.parse(process.argv.slice(2));
|
||||
o.compile || (o.compile = !!o.output);
|
||||
o.run = !(o.compile || o.print || o.map);
|
||||
return o.print = !!(o.print || (o["eval"] || o.stdio && o.compile));
|
||||
};
|
||||
|
||||
compileOptions = function(filename, base) {
|
||||
var answer, cwd, jsDir, jsPath;
|
||||
answer = {
|
||||
filename: filename,
|
||||
literate: opts.literate || helpers.isLiterate(filename),
|
||||
bare: opts.bare,
|
||||
header: opts.compile && !opts['no-header'],
|
||||
sourceMap: opts.map,
|
||||
inlineMap: opts['inline-map']
|
||||
};
|
||||
if (filename) {
|
||||
if (base) {
|
||||
cwd = process.cwd();
|
||||
jsPath = outputPath(filename, base);
|
||||
jsDir = path.dirname(jsPath);
|
||||
answer = helpers.merge(answer, {
|
||||
jsPath: jsPath,
|
||||
sourceRoot: path.relative(jsDir, cwd),
|
||||
sourceFiles: [path.relative(cwd, filename)],
|
||||
generatedFile: helpers.baseFileName(jsPath, false, useWinPathSep)
|
||||
});
|
||||
} else {
|
||||
answer = helpers.merge(answer, {
|
||||
sourceRoot: "",
|
||||
sourceFiles: [helpers.baseFileName(filename, false, useWinPathSep)],
|
||||
generatedFile: helpers.baseFileName(filename, true, useWinPathSep) + ".js"
|
||||
});
|
||||
}
|
||||
}
|
||||
return answer;
|
||||
};
|
||||
|
||||
forkNode = function() {
|
||||
var args, nodeArgs, p;
|
||||
nodeArgs = opts.nodejs.split(/\s+/);
|
||||
args = process.argv.slice(1);
|
||||
args.splice(args.indexOf('--nodejs'), 2);
|
||||
p = spawn(process.execPath, nodeArgs.concat(args), {
|
||||
cwd: process.cwd(),
|
||||
env: process.env,
|
||||
stdio: [0, 1, 2]
|
||||
});
|
||||
return p.on('exit', function(code) {
|
||||
return process.exit(code);
|
||||
});
|
||||
};
|
||||
|
||||
usage = function() {
|
||||
return printLine((new optparse.OptionParser(SWITCHES, BANNER)).help());
|
||||
};
|
||||
|
||||
version = function() {
|
||||
return printLine("CoffeeScript version " + CoffeeScript.VERSION);
|
||||
};
|
||||
|
||||
}).call(this);
|
||||
816
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/grammar.js
generated
vendored
Normal file
816
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/grammar.js
generated
vendored
Normal file
@ -0,0 +1,816 @@
|
||||
// Generated by CoffeeScript 1.12.7
|
||||
(function() {
|
||||
var Parser, alt, alternatives, grammar, name, o, operators, token, tokens, unwrap;
|
||||
|
||||
Parser = require('jison').Parser;
|
||||
|
||||
unwrap = /^function\s*\(\)\s*\{\s*return\s*([\s\S]*);\s*\}/;
|
||||
|
||||
o = function(patternString, action, options) {
|
||||
var addLocationDataFn, match, patternCount;
|
||||
patternString = patternString.replace(/\s{2,}/g, ' ');
|
||||
patternCount = patternString.split(' ').length;
|
||||
if (!action) {
|
||||
return [patternString, '$$ = $1;', options];
|
||||
}
|
||||
action = (match = unwrap.exec(action)) ? match[1] : "(" + action + "())";
|
||||
action = action.replace(/\bnew /g, '$&yy.');
|
||||
action = action.replace(/\b(?:Block\.wrap|extend)\b/g, 'yy.$&');
|
||||
addLocationDataFn = function(first, last) {
|
||||
if (!last) {
|
||||
return "yy.addLocationDataFn(@" + first + ")";
|
||||
} else {
|
||||
return "yy.addLocationDataFn(@" + first + ", @" + last + ")";
|
||||
}
|
||||
};
|
||||
action = action.replace(/LOC\(([0-9]*)\)/g, addLocationDataFn('$1'));
|
||||
action = action.replace(/LOC\(([0-9]*),\s*([0-9]*)\)/g, addLocationDataFn('$1', '$2'));
|
||||
return [patternString, "$$ = " + (addLocationDataFn(1, patternCount)) + "(" + action + ");", options];
|
||||
};
|
||||
|
||||
grammar = {
|
||||
Root: [
|
||||
o('', function() {
|
||||
return new Block;
|
||||
}), o('Body')
|
||||
],
|
||||
Body: [
|
||||
o('Line', function() {
|
||||
return Block.wrap([$1]);
|
||||
}), o('Body TERMINATOR Line', function() {
|
||||
return $1.push($3);
|
||||
}), o('Body TERMINATOR')
|
||||
],
|
||||
Line: [o('Expression'), o('Statement'), o('YieldReturn')],
|
||||
Statement: [
|
||||
o('Return'), o('Comment'), o('STATEMENT', function() {
|
||||
return new StatementLiteral($1);
|
||||
}), o('Import'), o('Export')
|
||||
],
|
||||
Expression: [o('Value'), o('Invocation'), o('Code'), o('Operation'), o('Assign'), o('If'), o('Try'), o('While'), o('For'), o('Switch'), o('Class'), o('Throw'), o('Yield')],
|
||||
Yield: [
|
||||
o('YIELD', function() {
|
||||
return new Op($1, new Value(new Literal('')));
|
||||
}), o('YIELD Expression', function() {
|
||||
return new Op($1, $2);
|
||||
}), o('YIELD FROM Expression', function() {
|
||||
return new Op($1.concat($2), $3);
|
||||
})
|
||||
],
|
||||
Block: [
|
||||
o('INDENT OUTDENT', function() {
|
||||
return new Block;
|
||||
}), o('INDENT Body OUTDENT', function() {
|
||||
return $2;
|
||||
})
|
||||
],
|
||||
Identifier: [
|
||||
o('IDENTIFIER', function() {
|
||||
return new IdentifierLiteral($1);
|
||||
})
|
||||
],
|
||||
Property: [
|
||||
o('PROPERTY', function() {
|
||||
return new PropertyName($1);
|
||||
})
|
||||
],
|
||||
AlphaNumeric: [
|
||||
o('NUMBER', function() {
|
||||
return new NumberLiteral($1);
|
||||
}), o('String')
|
||||
],
|
||||
String: [
|
||||
o('STRING', function() {
|
||||
return new StringLiteral($1);
|
||||
}), o('STRING_START Body STRING_END', function() {
|
||||
return new StringWithInterpolations($2);
|
||||
})
|
||||
],
|
||||
Regex: [
|
||||
o('REGEX', function() {
|
||||
return new RegexLiteral($1);
|
||||
}), o('REGEX_START Invocation REGEX_END', function() {
|
||||
return new RegexWithInterpolations($2.args);
|
||||
})
|
||||
],
|
||||
Literal: [
|
||||
o('AlphaNumeric'), o('JS', function() {
|
||||
return new PassthroughLiteral($1);
|
||||
}), o('Regex'), o('UNDEFINED', function() {
|
||||
return new UndefinedLiteral;
|
||||
}), o('NULL', function() {
|
||||
return new NullLiteral;
|
||||
}), o('BOOL', function() {
|
||||
return new BooleanLiteral($1);
|
||||
}), o('INFINITY', function() {
|
||||
return new InfinityLiteral($1);
|
||||
}), o('NAN', function() {
|
||||
return new NaNLiteral;
|
||||
})
|
||||
],
|
||||
Assign: [
|
||||
o('Assignable = Expression', function() {
|
||||
return new Assign($1, $3);
|
||||
}), o('Assignable = TERMINATOR Expression', function() {
|
||||
return new Assign($1, $4);
|
||||
}), o('Assignable = INDENT Expression OUTDENT', function() {
|
||||
return new Assign($1, $4);
|
||||
})
|
||||
],
|
||||
AssignObj: [
|
||||
o('ObjAssignable', function() {
|
||||
return new Value($1);
|
||||
}), o('ObjAssignable : Expression', function() {
|
||||
return new Assign(LOC(1)(new Value($1)), $3, 'object', {
|
||||
operatorToken: LOC(2)(new Literal($2))
|
||||
});
|
||||
}), o('ObjAssignable : INDENT Expression OUTDENT', function() {
|
||||
return new Assign(LOC(1)(new Value($1)), $4, 'object', {
|
||||
operatorToken: LOC(2)(new Literal($2))
|
||||
});
|
||||
}), o('SimpleObjAssignable = Expression', function() {
|
||||
return new Assign(LOC(1)(new Value($1)), $3, null, {
|
||||
operatorToken: LOC(2)(new Literal($2))
|
||||
});
|
||||
}), o('SimpleObjAssignable = INDENT Expression OUTDENT', function() {
|
||||
return new Assign(LOC(1)(new Value($1)), $4, null, {
|
||||
operatorToken: LOC(2)(new Literal($2))
|
||||
});
|
||||
}), o('Comment')
|
||||
],
|
||||
SimpleObjAssignable: [o('Identifier'), o('Property'), o('ThisProperty')],
|
||||
ObjAssignable: [o('SimpleObjAssignable'), o('AlphaNumeric')],
|
||||
Return: [
|
||||
o('RETURN Expression', function() {
|
||||
return new Return($2);
|
||||
}), o('RETURN INDENT Object OUTDENT', function() {
|
||||
return new Return(new Value($3));
|
||||
}), o('RETURN', function() {
|
||||
return new Return;
|
||||
})
|
||||
],
|
||||
YieldReturn: [
|
||||
o('YIELD RETURN Expression', function() {
|
||||
return new YieldReturn($3);
|
||||
}), o('YIELD RETURN', function() {
|
||||
return new YieldReturn;
|
||||
})
|
||||
],
|
||||
Comment: [
|
||||
o('HERECOMMENT', function() {
|
||||
return new Comment($1);
|
||||
})
|
||||
],
|
||||
Code: [
|
||||
o('PARAM_START ParamList PARAM_END FuncGlyph Block', function() {
|
||||
return new Code($2, $5, $4);
|
||||
}), o('FuncGlyph Block', function() {
|
||||
return new Code([], $2, $1);
|
||||
})
|
||||
],
|
||||
FuncGlyph: [
|
||||
o('->', function() {
|
||||
return 'func';
|
||||
}), o('=>', function() {
|
||||
return 'boundfunc';
|
||||
})
|
||||
],
|
||||
OptComma: [o(''), o(',')],
|
||||
ParamList: [
|
||||
o('', function() {
|
||||
return [];
|
||||
}), o('Param', function() {
|
||||
return [$1];
|
||||
}), o('ParamList , Param', function() {
|
||||
return $1.concat($3);
|
||||
}), o('ParamList OptComma TERMINATOR Param', function() {
|
||||
return $1.concat($4);
|
||||
}), o('ParamList OptComma INDENT ParamList OptComma OUTDENT', function() {
|
||||
return $1.concat($4);
|
||||
})
|
||||
],
|
||||
Param: [
|
||||
o('ParamVar', function() {
|
||||
return new Param($1);
|
||||
}), o('ParamVar ...', function() {
|
||||
return new Param($1, null, true);
|
||||
}), o('ParamVar = Expression', function() {
|
||||
return new Param($1, $3);
|
||||
}), o('...', function() {
|
||||
return new Expansion;
|
||||
})
|
||||
],
|
||||
ParamVar: [o('Identifier'), o('ThisProperty'), o('Array'), o('Object')],
|
||||
Splat: [
|
||||
o('Expression ...', function() {
|
||||
return new Splat($1);
|
||||
})
|
||||
],
|
||||
SimpleAssignable: [
|
||||
o('Identifier', function() {
|
||||
return new Value($1);
|
||||
}), o('Value Accessor', function() {
|
||||
return $1.add($2);
|
||||
}), o('Invocation Accessor', function() {
|
||||
return new Value($1, [].concat($2));
|
||||
}), o('ThisProperty')
|
||||
],
|
||||
Assignable: [
|
||||
o('SimpleAssignable'), o('Array', function() {
|
||||
return new Value($1);
|
||||
}), o('Object', function() {
|
||||
return new Value($1);
|
||||
})
|
||||
],
|
||||
Value: [
|
||||
o('Assignable'), o('Literal', function() {
|
||||
return new Value($1);
|
||||
}), o('Parenthetical', function() {
|
||||
return new Value($1);
|
||||
}), o('Range', function() {
|
||||
return new Value($1);
|
||||
}), o('This')
|
||||
],
|
||||
Accessor: [
|
||||
o('. Property', function() {
|
||||
return new Access($2);
|
||||
}), o('?. Property', function() {
|
||||
return new Access($2, 'soak');
|
||||
}), o(':: Property', function() {
|
||||
return [LOC(1)(new Access(new PropertyName('prototype'))), LOC(2)(new Access($2))];
|
||||
}), o('?:: Property', function() {
|
||||
return [LOC(1)(new Access(new PropertyName('prototype'), 'soak')), LOC(2)(new Access($2))];
|
||||
}), o('::', function() {
|
||||
return new Access(new PropertyName('prototype'));
|
||||
}), o('Index')
|
||||
],
|
||||
Index: [
|
||||
o('INDEX_START IndexValue INDEX_END', function() {
|
||||
return $2;
|
||||
}), o('INDEX_SOAK Index', function() {
|
||||
return extend($2, {
|
||||
soak: true
|
||||
});
|
||||
})
|
||||
],
|
||||
IndexValue: [
|
||||
o('Expression', function() {
|
||||
return new Index($1);
|
||||
}), o('Slice', function() {
|
||||
return new Slice($1);
|
||||
})
|
||||
],
|
||||
Object: [
|
||||
o('{ AssignList OptComma }', function() {
|
||||
return new Obj($2, $1.generated);
|
||||
})
|
||||
],
|
||||
AssignList: [
|
||||
o('', function() {
|
||||
return [];
|
||||
}), o('AssignObj', function() {
|
||||
return [$1];
|
||||
}), o('AssignList , AssignObj', function() {
|
||||
return $1.concat($3);
|
||||
}), o('AssignList OptComma TERMINATOR AssignObj', function() {
|
||||
return $1.concat($4);
|
||||
}), o('AssignList OptComma INDENT AssignList OptComma OUTDENT', function() {
|
||||
return $1.concat($4);
|
||||
})
|
||||
],
|
||||
Class: [
|
||||
o('CLASS', function() {
|
||||
return new Class;
|
||||
}), o('CLASS Block', function() {
|
||||
return new Class(null, null, $2);
|
||||
}), o('CLASS EXTENDS Expression', function() {
|
||||
return new Class(null, $3);
|
||||
}), o('CLASS EXTENDS Expression Block', function() {
|
||||
return new Class(null, $3, $4);
|
||||
}), o('CLASS SimpleAssignable', function() {
|
||||
return new Class($2);
|
||||
}), o('CLASS SimpleAssignable Block', function() {
|
||||
return new Class($2, null, $3);
|
||||
}), o('CLASS SimpleAssignable EXTENDS Expression', function() {
|
||||
return new Class($2, $4);
|
||||
}), o('CLASS SimpleAssignable EXTENDS Expression Block', function() {
|
||||
return new Class($2, $4, $5);
|
||||
})
|
||||
],
|
||||
Import: [
|
||||
o('IMPORT String', function() {
|
||||
return new ImportDeclaration(null, $2);
|
||||
}), o('IMPORT ImportDefaultSpecifier FROM String', function() {
|
||||
return new ImportDeclaration(new ImportClause($2, null), $4);
|
||||
}), o('IMPORT ImportNamespaceSpecifier FROM String', function() {
|
||||
return new ImportDeclaration(new ImportClause(null, $2), $4);
|
||||
}), o('IMPORT { } FROM String', function() {
|
||||
return new ImportDeclaration(new ImportClause(null, new ImportSpecifierList([])), $5);
|
||||
}), o('IMPORT { ImportSpecifierList OptComma } FROM String', function() {
|
||||
return new ImportDeclaration(new ImportClause(null, new ImportSpecifierList($3)), $7);
|
||||
}), o('IMPORT ImportDefaultSpecifier , ImportNamespaceSpecifier FROM String', function() {
|
||||
return new ImportDeclaration(new ImportClause($2, $4), $6);
|
||||
}), o('IMPORT ImportDefaultSpecifier , { ImportSpecifierList OptComma } FROM String', function() {
|
||||
return new ImportDeclaration(new ImportClause($2, new ImportSpecifierList($5)), $9);
|
||||
})
|
||||
],
|
||||
ImportSpecifierList: [
|
||||
o('ImportSpecifier', function() {
|
||||
return [$1];
|
||||
}), o('ImportSpecifierList , ImportSpecifier', function() {
|
||||
return $1.concat($3);
|
||||
}), o('ImportSpecifierList OptComma TERMINATOR ImportSpecifier', function() {
|
||||
return $1.concat($4);
|
||||
}), o('INDENT ImportSpecifierList OptComma OUTDENT', function() {
|
||||
return $2;
|
||||
}), o('ImportSpecifierList OptComma INDENT ImportSpecifierList OptComma OUTDENT', function() {
|
||||
return $1.concat($4);
|
||||
})
|
||||
],
|
||||
ImportSpecifier: [
|
||||
o('Identifier', function() {
|
||||
return new ImportSpecifier($1);
|
||||
}), o('Identifier AS Identifier', function() {
|
||||
return new ImportSpecifier($1, $3);
|
||||
}), o('DEFAULT', function() {
|
||||
return new ImportSpecifier(new Literal($1));
|
||||
}), o('DEFAULT AS Identifier', function() {
|
||||
return new ImportSpecifier(new Literal($1), $3);
|
||||
})
|
||||
],
|
||||
ImportDefaultSpecifier: [
|
||||
o('Identifier', function() {
|
||||
return new ImportDefaultSpecifier($1);
|
||||
})
|
||||
],
|
||||
ImportNamespaceSpecifier: [
|
||||
o('IMPORT_ALL AS Identifier', function() {
|
||||
return new ImportNamespaceSpecifier(new Literal($1), $3);
|
||||
})
|
||||
],
|
||||
Export: [
|
||||
o('EXPORT { }', function() {
|
||||
return new ExportNamedDeclaration(new ExportSpecifierList([]));
|
||||
}), o('EXPORT { ExportSpecifierList OptComma }', function() {
|
||||
return new ExportNamedDeclaration(new ExportSpecifierList($3));
|
||||
}), o('EXPORT Class', function() {
|
||||
return new ExportNamedDeclaration($2);
|
||||
}), o('EXPORT Identifier = Expression', function() {
|
||||
return new ExportNamedDeclaration(new Assign($2, $4, null, {
|
||||
moduleDeclaration: 'export'
|
||||
}));
|
||||
}), o('EXPORT Identifier = TERMINATOR Expression', function() {
|
||||
return new ExportNamedDeclaration(new Assign($2, $5, null, {
|
||||
moduleDeclaration: 'export'
|
||||
}));
|
||||
}), o('EXPORT Identifier = INDENT Expression OUTDENT', function() {
|
||||
return new ExportNamedDeclaration(new Assign($2, $5, null, {
|
||||
moduleDeclaration: 'export'
|
||||
}));
|
||||
}), o('EXPORT DEFAULT Expression', function() {
|
||||
return new ExportDefaultDeclaration($3);
|
||||
}), o('EXPORT EXPORT_ALL FROM String', function() {
|
||||
return new ExportAllDeclaration(new Literal($2), $4);
|
||||
}), o('EXPORT { ExportSpecifierList OptComma } FROM String', function() {
|
||||
return new ExportNamedDeclaration(new ExportSpecifierList($3), $7);
|
||||
})
|
||||
],
|
||||
ExportSpecifierList: [
|
||||
o('ExportSpecifier', function() {
|
||||
return [$1];
|
||||
}), o('ExportSpecifierList , ExportSpecifier', function() {
|
||||
return $1.concat($3);
|
||||
}), o('ExportSpecifierList OptComma TERMINATOR ExportSpecifier', function() {
|
||||
return $1.concat($4);
|
||||
}), o('INDENT ExportSpecifierList OptComma OUTDENT', function() {
|
||||
return $2;
|
||||
}), o('ExportSpecifierList OptComma INDENT ExportSpecifierList OptComma OUTDENT', function() {
|
||||
return $1.concat($4);
|
||||
})
|
||||
],
|
||||
ExportSpecifier: [
|
||||
o('Identifier', function() {
|
||||
return new ExportSpecifier($1);
|
||||
}), o('Identifier AS Identifier', function() {
|
||||
return new ExportSpecifier($1, $3);
|
||||
}), o('Identifier AS DEFAULT', function() {
|
||||
return new ExportSpecifier($1, new Literal($3));
|
||||
}), o('DEFAULT', function() {
|
||||
return new ExportSpecifier(new Literal($1));
|
||||
}), o('DEFAULT AS Identifier', function() {
|
||||
return new ExportSpecifier(new Literal($1), $3);
|
||||
})
|
||||
],
|
||||
Invocation: [
|
||||
o('Value OptFuncExist String', function() {
|
||||
return new TaggedTemplateCall($1, $3, $2);
|
||||
}), o('Value OptFuncExist Arguments', function() {
|
||||
return new Call($1, $3, $2);
|
||||
}), o('Invocation OptFuncExist Arguments', function() {
|
||||
return new Call($1, $3, $2);
|
||||
}), o('Super')
|
||||
],
|
||||
Super: [
|
||||
o('SUPER', function() {
|
||||
return new SuperCall;
|
||||
}), o('SUPER Arguments', function() {
|
||||
return new SuperCall($2);
|
||||
})
|
||||
],
|
||||
OptFuncExist: [
|
||||
o('', function() {
|
||||
return false;
|
||||
}), o('FUNC_EXIST', function() {
|
||||
return true;
|
||||
})
|
||||
],
|
||||
Arguments: [
|
||||
o('CALL_START CALL_END', function() {
|
||||
return [];
|
||||
}), o('CALL_START ArgList OptComma CALL_END', function() {
|
||||
return $2;
|
||||
})
|
||||
],
|
||||
This: [
|
||||
o('THIS', function() {
|
||||
return new Value(new ThisLiteral);
|
||||
}), o('@', function() {
|
||||
return new Value(new ThisLiteral);
|
||||
})
|
||||
],
|
||||
ThisProperty: [
|
||||
o('@ Property', function() {
|
||||
return new Value(LOC(1)(new ThisLiteral), [LOC(2)(new Access($2))], 'this');
|
||||
})
|
||||
],
|
||||
Array: [
|
||||
o('[ ]', function() {
|
||||
return new Arr([]);
|
||||
}), o('[ ArgList OptComma ]', function() {
|
||||
return new Arr($2);
|
||||
})
|
||||
],
|
||||
RangeDots: [
|
||||
o('..', function() {
|
||||
return 'inclusive';
|
||||
}), o('...', function() {
|
||||
return 'exclusive';
|
||||
})
|
||||
],
|
||||
Range: [
|
||||
o('[ Expression RangeDots Expression ]', function() {
|
||||
return new Range($2, $4, $3);
|
||||
})
|
||||
],
|
||||
Slice: [
|
||||
o('Expression RangeDots Expression', function() {
|
||||
return new Range($1, $3, $2);
|
||||
}), o('Expression RangeDots', function() {
|
||||
return new Range($1, null, $2);
|
||||
}), o('RangeDots Expression', function() {
|
||||
return new Range(null, $2, $1);
|
||||
}), o('RangeDots', function() {
|
||||
return new Range(null, null, $1);
|
||||
})
|
||||
],
|
||||
ArgList: [
|
||||
o('Arg', function() {
|
||||
return [$1];
|
||||
}), o('ArgList , Arg', function() {
|
||||
return $1.concat($3);
|
||||
}), o('ArgList OptComma TERMINATOR Arg', function() {
|
||||
return $1.concat($4);
|
||||
}), o('INDENT ArgList OptComma OUTDENT', function() {
|
||||
return $2;
|
||||
}), o('ArgList OptComma INDENT ArgList OptComma OUTDENT', function() {
|
||||
return $1.concat($4);
|
||||
})
|
||||
],
|
||||
Arg: [
|
||||
o('Expression'), o('Splat'), o('...', function() {
|
||||
return new Expansion;
|
||||
})
|
||||
],
|
||||
SimpleArgs: [
|
||||
o('Expression'), o('SimpleArgs , Expression', function() {
|
||||
return [].concat($1, $3);
|
||||
})
|
||||
],
|
||||
Try: [
|
||||
o('TRY Block', function() {
|
||||
return new Try($2);
|
||||
}), o('TRY Block Catch', function() {
|
||||
return new Try($2, $3[0], $3[1]);
|
||||
}), o('TRY Block FINALLY Block', function() {
|
||||
return new Try($2, null, null, $4);
|
||||
}), o('TRY Block Catch FINALLY Block', function() {
|
||||
return new Try($2, $3[0], $3[1], $5);
|
||||
})
|
||||
],
|
||||
Catch: [
|
||||
o('CATCH Identifier Block', function() {
|
||||
return [$2, $3];
|
||||
}), o('CATCH Object Block', function() {
|
||||
return [LOC(2)(new Value($2)), $3];
|
||||
}), o('CATCH Block', function() {
|
||||
return [null, $2];
|
||||
})
|
||||
],
|
||||
Throw: [
|
||||
o('THROW Expression', function() {
|
||||
return new Throw($2);
|
||||
})
|
||||
],
|
||||
Parenthetical: [
|
||||
o('( Body )', function() {
|
||||
return new Parens($2);
|
||||
}), o('( INDENT Body OUTDENT )', function() {
|
||||
return new Parens($3);
|
||||
})
|
||||
],
|
||||
WhileSource: [
|
||||
o('WHILE Expression', function() {
|
||||
return new While($2);
|
||||
}), o('WHILE Expression WHEN Expression', function() {
|
||||
return new While($2, {
|
||||
guard: $4
|
||||
});
|
||||
}), o('UNTIL Expression', function() {
|
||||
return new While($2, {
|
||||
invert: true
|
||||
});
|
||||
}), o('UNTIL Expression WHEN Expression', function() {
|
||||
return new While($2, {
|
||||
invert: true,
|
||||
guard: $4
|
||||
});
|
||||
})
|
||||
],
|
||||
While: [
|
||||
o('WhileSource Block', function() {
|
||||
return $1.addBody($2);
|
||||
}), o('Statement WhileSource', function() {
|
||||
return $2.addBody(LOC(1)(Block.wrap([$1])));
|
||||
}), o('Expression WhileSource', function() {
|
||||
return $2.addBody(LOC(1)(Block.wrap([$1])));
|
||||
}), o('Loop', function() {
|
||||
return $1;
|
||||
})
|
||||
],
|
||||
Loop: [
|
||||
o('LOOP Block', function() {
|
||||
return new While(LOC(1)(new BooleanLiteral('true'))).addBody($2);
|
||||
}), o('LOOP Expression', function() {
|
||||
return new While(LOC(1)(new BooleanLiteral('true'))).addBody(LOC(2)(Block.wrap([$2])));
|
||||
})
|
||||
],
|
||||
For: [
|
||||
o('Statement ForBody', function() {
|
||||
return new For($1, $2);
|
||||
}), o('Expression ForBody', function() {
|
||||
return new For($1, $2);
|
||||
}), o('ForBody Block', function() {
|
||||
return new For($2, $1);
|
||||
})
|
||||
],
|
||||
ForBody: [
|
||||
o('FOR Range', function() {
|
||||
return {
|
||||
source: LOC(2)(new Value($2))
|
||||
};
|
||||
}), o('FOR Range BY Expression', function() {
|
||||
return {
|
||||
source: LOC(2)(new Value($2)),
|
||||
step: $4
|
||||
};
|
||||
}), o('ForStart ForSource', function() {
|
||||
$2.own = $1.own;
|
||||
$2.ownTag = $1.ownTag;
|
||||
$2.name = $1[0];
|
||||
$2.index = $1[1];
|
||||
return $2;
|
||||
})
|
||||
],
|
||||
ForStart: [
|
||||
o('FOR ForVariables', function() {
|
||||
return $2;
|
||||
}), o('FOR OWN ForVariables', function() {
|
||||
$3.own = true;
|
||||
$3.ownTag = LOC(2)(new Literal($2));
|
||||
return $3;
|
||||
})
|
||||
],
|
||||
ForValue: [
|
||||
o('Identifier'), o('ThisProperty'), o('Array', function() {
|
||||
return new Value($1);
|
||||
}), o('Object', function() {
|
||||
return new Value($1);
|
||||
})
|
||||
],
|
||||
ForVariables: [
|
||||
o('ForValue', function() {
|
||||
return [$1];
|
||||
}), o('ForValue , ForValue', function() {
|
||||
return [$1, $3];
|
||||
})
|
||||
],
|
||||
ForSource: [
|
||||
o('FORIN Expression', function() {
|
||||
return {
|
||||
source: $2
|
||||
};
|
||||
}), o('FOROF Expression', function() {
|
||||
return {
|
||||
source: $2,
|
||||
object: true
|
||||
};
|
||||
}), o('FORIN Expression WHEN Expression', function() {
|
||||
return {
|
||||
source: $2,
|
||||
guard: $4
|
||||
};
|
||||
}), o('FOROF Expression WHEN Expression', function() {
|
||||
return {
|
||||
source: $2,
|
||||
guard: $4,
|
||||
object: true
|
||||
};
|
||||
}), o('FORIN Expression BY Expression', function() {
|
||||
return {
|
||||
source: $2,
|
||||
step: $4
|
||||
};
|
||||
}), o('FORIN Expression WHEN Expression BY Expression', function() {
|
||||
return {
|
||||
source: $2,
|
||||
guard: $4,
|
||||
step: $6
|
||||
};
|
||||
}), o('FORIN Expression BY Expression WHEN Expression', function() {
|
||||
return {
|
||||
source: $2,
|
||||
step: $4,
|
||||
guard: $6
|
||||
};
|
||||
}), o('FORFROM Expression', function() {
|
||||
return {
|
||||
source: $2,
|
||||
from: true
|
||||
};
|
||||
}), o('FORFROM Expression WHEN Expression', function() {
|
||||
return {
|
||||
source: $2,
|
||||
guard: $4,
|
||||
from: true
|
||||
};
|
||||
})
|
||||
],
|
||||
Switch: [
|
||||
o('SWITCH Expression INDENT Whens OUTDENT', function() {
|
||||
return new Switch($2, $4);
|
||||
}), o('SWITCH Expression INDENT Whens ELSE Block OUTDENT', function() {
|
||||
return new Switch($2, $4, $6);
|
||||
}), o('SWITCH INDENT Whens OUTDENT', function() {
|
||||
return new Switch(null, $3);
|
||||
}), o('SWITCH INDENT Whens ELSE Block OUTDENT', function() {
|
||||
return new Switch(null, $3, $5);
|
||||
})
|
||||
],
|
||||
Whens: [
|
||||
o('When'), o('Whens When', function() {
|
||||
return $1.concat($2);
|
||||
})
|
||||
],
|
||||
When: [
|
||||
o('LEADING_WHEN SimpleArgs Block', function() {
|
||||
return [[$2, $3]];
|
||||
}), o('LEADING_WHEN SimpleArgs Block TERMINATOR', function() {
|
||||
return [[$2, $3]];
|
||||
})
|
||||
],
|
||||
IfBlock: [
|
||||
o('IF Expression Block', function() {
|
||||
return new If($2, $3, {
|
||||
type: $1
|
||||
});
|
||||
}), o('IfBlock ELSE IF Expression Block', function() {
|
||||
return $1.addElse(LOC(3, 5)(new If($4, $5, {
|
||||
type: $3
|
||||
})));
|
||||
})
|
||||
],
|
||||
If: [
|
||||
o('IfBlock'), o('IfBlock ELSE Block', function() {
|
||||
return $1.addElse($3);
|
||||
}), o('Statement POST_IF Expression', function() {
|
||||
return new If($3, LOC(1)(Block.wrap([$1])), {
|
||||
type: $2,
|
||||
statement: true
|
||||
});
|
||||
}), o('Expression POST_IF Expression', function() {
|
||||
return new If($3, LOC(1)(Block.wrap([$1])), {
|
||||
type: $2,
|
||||
statement: true
|
||||
});
|
||||
})
|
||||
],
|
||||
Operation: [
|
||||
o('UNARY Expression', function() {
|
||||
return new Op($1, $2);
|
||||
}), o('UNARY_MATH Expression', function() {
|
||||
return new Op($1, $2);
|
||||
}), o('- Expression', (function() {
|
||||
return new Op('-', $2);
|
||||
}), {
|
||||
prec: 'UNARY_MATH'
|
||||
}), o('+ Expression', (function() {
|
||||
return new Op('+', $2);
|
||||
}), {
|
||||
prec: 'UNARY_MATH'
|
||||
}), o('-- SimpleAssignable', function() {
|
||||
return new Op('--', $2);
|
||||
}), o('++ SimpleAssignable', function() {
|
||||
return new Op('++', $2);
|
||||
}), o('SimpleAssignable --', function() {
|
||||
return new Op('--', $1, null, true);
|
||||
}), o('SimpleAssignable ++', function() {
|
||||
return new Op('++', $1, null, true);
|
||||
}), o('Expression ?', function() {
|
||||
return new Existence($1);
|
||||
}), o('Expression + Expression', function() {
|
||||
return new Op('+', $1, $3);
|
||||
}), o('Expression - Expression', function() {
|
||||
return new Op('-', $1, $3);
|
||||
}), o('Expression MATH Expression', function() {
|
||||
return new Op($2, $1, $3);
|
||||
}), o('Expression ** Expression', function() {
|
||||
return new Op($2, $1, $3);
|
||||
}), o('Expression SHIFT Expression', function() {
|
||||
return new Op($2, $1, $3);
|
||||
}), o('Expression COMPARE Expression', function() {
|
||||
return new Op($2, $1, $3);
|
||||
}), o('Expression & Expression', function() {
|
||||
return new Op($2, $1, $3);
|
||||
}), o('Expression ^ Expression', function() {
|
||||
return new Op($2, $1, $3);
|
||||
}), o('Expression | Expression', function() {
|
||||
return new Op($2, $1, $3);
|
||||
}), o('Expression && Expression', function() {
|
||||
return new Op($2, $1, $3);
|
||||
}), o('Expression || Expression', function() {
|
||||
return new Op($2, $1, $3);
|
||||
}), o('Expression BIN? Expression', function() {
|
||||
return new Op($2, $1, $3);
|
||||
}), o('Expression RELATION Expression', function() {
|
||||
if ($2.charAt(0) === '!') {
|
||||
return new Op($2.slice(1), $1, $3).invert();
|
||||
} else {
|
||||
return new Op($2, $1, $3);
|
||||
}
|
||||
}), o('SimpleAssignable COMPOUND_ASSIGN Expression', function() {
|
||||
return new Assign($1, $3, $2);
|
||||
}), o('SimpleAssignable COMPOUND_ASSIGN INDENT Expression OUTDENT', function() {
|
||||
return new Assign($1, $4, $2);
|
||||
}), o('SimpleAssignable COMPOUND_ASSIGN TERMINATOR Expression', function() {
|
||||
return new Assign($1, $4, $2);
|
||||
}), o('SimpleAssignable EXTENDS Expression', function() {
|
||||
return new Extends($1, $3);
|
||||
})
|
||||
]
|
||||
};
|
||||
|
||||
operators = [['left', '.', '?.', '::', '?::'], ['left', 'CALL_START', 'CALL_END'], ['nonassoc', '++', '--'], ['left', '?'], ['right', 'UNARY'], ['right', '**'], ['right', 'UNARY_MATH'], ['left', 'MATH'], ['left', '+', '-'], ['left', 'SHIFT'], ['left', 'RELATION'], ['left', 'COMPARE'], ['left', '&'], ['left', '^'], ['left', '|'], ['left', '&&'], ['left', '||'], ['left', 'BIN?'], ['nonassoc', 'INDENT', 'OUTDENT'], ['right', 'YIELD'], ['right', '=', ':', 'COMPOUND_ASSIGN', 'RETURN', 'THROW', 'EXTENDS'], ['right', 'FORIN', 'FOROF', 'FORFROM', 'BY', 'WHEN'], ['right', 'IF', 'ELSE', 'FOR', 'WHILE', 'UNTIL', 'LOOP', 'SUPER', 'CLASS', 'IMPORT', 'EXPORT'], ['left', 'POST_IF']];
|
||||
|
||||
tokens = [];
|
||||
|
||||
for (name in grammar) {
|
||||
alternatives = grammar[name];
|
||||
grammar[name] = (function() {
|
||||
var i, j, len, len1, ref, results;
|
||||
results = [];
|
||||
for (i = 0, len = alternatives.length; i < len; i++) {
|
||||
alt = alternatives[i];
|
||||
ref = alt[0].split(' ');
|
||||
for (j = 0, len1 = ref.length; j < len1; j++) {
|
||||
token = ref[j];
|
||||
if (!grammar[token]) {
|
||||
tokens.push(token);
|
||||
}
|
||||
}
|
||||
if (name === 'Root') {
|
||||
alt[1] = "return " + alt[1];
|
||||
}
|
||||
results.push(alt);
|
||||
}
|
||||
return results;
|
||||
})();
|
||||
}
|
||||
|
||||
exports.parser = new Parser({
|
||||
tokens: tokens.join(' '),
|
||||
bnf: grammar,
|
||||
operators: operators.reverse(),
|
||||
startSymbol: 'Root'
|
||||
});
|
||||
|
||||
}).call(this);
|
||||
249
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/helpers.js
generated
vendored
Normal file
249
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/helpers.js
generated
vendored
Normal file
@ -0,0 +1,249 @@
|
||||
// Generated by CoffeeScript 1.12.7
|
||||
(function() {
|
||||
var buildLocationData, extend, flatten, ref, repeat, syntaxErrorToString;
|
||||
|
||||
exports.starts = function(string, literal, start) {
|
||||
return literal === string.substr(start, literal.length);
|
||||
};
|
||||
|
||||
exports.ends = function(string, literal, back) {
|
||||
var len;
|
||||
len = literal.length;
|
||||
return literal === string.substr(string.length - len - (back || 0), len);
|
||||
};
|
||||
|
||||
exports.repeat = repeat = function(str, n) {
|
||||
var res;
|
||||
res = '';
|
||||
while (n > 0) {
|
||||
if (n & 1) {
|
||||
res += str;
|
||||
}
|
||||
n >>>= 1;
|
||||
str += str;
|
||||
}
|
||||
return res;
|
||||
};
|
||||
|
||||
exports.compact = function(array) {
|
||||
var i, item, len1, results;
|
||||
results = [];
|
||||
for (i = 0, len1 = array.length; i < len1; i++) {
|
||||
item = array[i];
|
||||
if (item) {
|
||||
results.push(item);
|
||||
}
|
||||
}
|
||||
return results;
|
||||
};
|
||||
|
||||
exports.count = function(string, substr) {
|
||||
var num, pos;
|
||||
num = pos = 0;
|
||||
if (!substr.length) {
|
||||
return 1 / 0;
|
||||
}
|
||||
while (pos = 1 + string.indexOf(substr, pos)) {
|
||||
num++;
|
||||
}
|
||||
return num;
|
||||
};
|
||||
|
||||
exports.merge = function(options, overrides) {
|
||||
return extend(extend({}, options), overrides);
|
||||
};
|
||||
|
||||
extend = exports.extend = function(object, properties) {
|
||||
var key, val;
|
||||
for (key in properties) {
|
||||
val = properties[key];
|
||||
object[key] = val;
|
||||
}
|
||||
return object;
|
||||
};
|
||||
|
||||
exports.flatten = flatten = function(array) {
|
||||
var element, flattened, i, len1;
|
||||
flattened = [];
|
||||
for (i = 0, len1 = array.length; i < len1; i++) {
|
||||
element = array[i];
|
||||
if ('[object Array]' === Object.prototype.toString.call(element)) {
|
||||
flattened = flattened.concat(flatten(element));
|
||||
} else {
|
||||
flattened.push(element);
|
||||
}
|
||||
}
|
||||
return flattened;
|
||||
};
|
||||
|
||||
exports.del = function(obj, key) {
|
||||
var val;
|
||||
val = obj[key];
|
||||
delete obj[key];
|
||||
return val;
|
||||
};
|
||||
|
||||
exports.some = (ref = Array.prototype.some) != null ? ref : function(fn) {
|
||||
var e, i, len1, ref1;
|
||||
ref1 = this;
|
||||
for (i = 0, len1 = ref1.length; i < len1; i++) {
|
||||
e = ref1[i];
|
||||
if (fn(e)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
exports.invertLiterate = function(code) {
|
||||
var line, lines, maybe_code;
|
||||
maybe_code = true;
|
||||
lines = (function() {
|
||||
var i, len1, ref1, results;
|
||||
ref1 = code.split('\n');
|
||||
results = [];
|
||||
for (i = 0, len1 = ref1.length; i < len1; i++) {
|
||||
line = ref1[i];
|
||||
if (maybe_code && /^([ ]{4}|[ ]{0,3}\t)/.test(line)) {
|
||||
results.push(line);
|
||||
} else if (maybe_code = /^\s*$/.test(line)) {
|
||||
results.push(line);
|
||||
} else {
|
||||
results.push('# ' + line);
|
||||
}
|
||||
}
|
||||
return results;
|
||||
})();
|
||||
return lines.join('\n');
|
||||
};
|
||||
|
||||
buildLocationData = function(first, last) {
|
||||
if (!last) {
|
||||
return first;
|
||||
} else {
|
||||
return {
|
||||
first_line: first.first_line,
|
||||
first_column: first.first_column,
|
||||
last_line: last.last_line,
|
||||
last_column: last.last_column
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
exports.addLocationDataFn = function(first, last) {
|
||||
return function(obj) {
|
||||
if (((typeof obj) === 'object') && (!!obj['updateLocationDataIfMissing'])) {
|
||||
obj.updateLocationDataIfMissing(buildLocationData(first, last));
|
||||
}
|
||||
return obj;
|
||||
};
|
||||
};
|
||||
|
||||
exports.locationDataToString = function(obj) {
|
||||
var locationData;
|
||||
if (("2" in obj) && ("first_line" in obj[2])) {
|
||||
locationData = obj[2];
|
||||
} else if ("first_line" in obj) {
|
||||
locationData = obj;
|
||||
}
|
||||
if (locationData) {
|
||||
return ((locationData.first_line + 1) + ":" + (locationData.first_column + 1) + "-") + ((locationData.last_line + 1) + ":" + (locationData.last_column + 1));
|
||||
} else {
|
||||
return "No location data";
|
||||
}
|
||||
};
|
||||
|
||||
exports.baseFileName = function(file, stripExt, useWinPathSep) {
|
||||
var parts, pathSep;
|
||||
if (stripExt == null) {
|
||||
stripExt = false;
|
||||
}
|
||||
if (useWinPathSep == null) {
|
||||
useWinPathSep = false;
|
||||
}
|
||||
pathSep = useWinPathSep ? /\\|\// : /\//;
|
||||
parts = file.split(pathSep);
|
||||
file = parts[parts.length - 1];
|
||||
if (!(stripExt && file.indexOf('.') >= 0)) {
|
||||
return file;
|
||||
}
|
||||
parts = file.split('.');
|
||||
parts.pop();
|
||||
if (parts[parts.length - 1] === 'coffee' && parts.length > 1) {
|
||||
parts.pop();
|
||||
}
|
||||
return parts.join('.');
|
||||
};
|
||||
|
||||
exports.isCoffee = function(file) {
|
||||
return /\.((lit)?coffee|coffee\.md)$/.test(file);
|
||||
};
|
||||
|
||||
exports.isLiterate = function(file) {
|
||||
return /\.(litcoffee|coffee\.md)$/.test(file);
|
||||
};
|
||||
|
||||
exports.throwSyntaxError = function(message, location) {
|
||||
var error;
|
||||
error = new SyntaxError(message);
|
||||
error.location = location;
|
||||
error.toString = syntaxErrorToString;
|
||||
error.stack = error.toString();
|
||||
throw error;
|
||||
};
|
||||
|
||||
exports.updateSyntaxError = function(error, code, filename) {
|
||||
if (error.toString === syntaxErrorToString) {
|
||||
error.code || (error.code = code);
|
||||
error.filename || (error.filename = filename);
|
||||
error.stack = error.toString();
|
||||
}
|
||||
return error;
|
||||
};
|
||||
|
||||
syntaxErrorToString = function() {
|
||||
var codeLine, colorize, colorsEnabled, end, filename, first_column, first_line, last_column, last_line, marker, ref1, ref2, ref3, ref4, start;
|
||||
if (!(this.code && this.location)) {
|
||||
return Error.prototype.toString.call(this);
|
||||
}
|
||||
ref1 = this.location, first_line = ref1.first_line, first_column = ref1.first_column, last_line = ref1.last_line, last_column = ref1.last_column;
|
||||
if (last_line == null) {
|
||||
last_line = first_line;
|
||||
}
|
||||
if (last_column == null) {
|
||||
last_column = first_column;
|
||||
}
|
||||
filename = this.filename || '[stdin]';
|
||||
codeLine = this.code.split('\n')[first_line];
|
||||
start = first_column;
|
||||
end = first_line === last_line ? last_column + 1 : codeLine.length;
|
||||
marker = codeLine.slice(0, start).replace(/[^\s]/g, ' ') + repeat('^', end - start);
|
||||
if (typeof process !== "undefined" && process !== null) {
|
||||
colorsEnabled = ((ref2 = process.stdout) != null ? ref2.isTTY : void 0) && !((ref3 = process.env) != null ? ref3.NODE_DISABLE_COLORS : void 0);
|
||||
}
|
||||
if ((ref4 = this.colorful) != null ? ref4 : colorsEnabled) {
|
||||
colorize = function(str) {
|
||||
return "\x1B[1;31m" + str + "\x1B[0m";
|
||||
};
|
||||
codeLine = codeLine.slice(0, start) + colorize(codeLine.slice(start, end)) + codeLine.slice(end);
|
||||
marker = colorize(marker);
|
||||
}
|
||||
return filename + ":" + (first_line + 1) + ":" + (first_column + 1) + ": error: " + this.message + "\n" + codeLine + "\n" + marker;
|
||||
};
|
||||
|
||||
exports.nameWhitespaceCharacter = function(string) {
|
||||
switch (string) {
|
||||
case ' ':
|
||||
return 'space';
|
||||
case '\n':
|
||||
return 'newline';
|
||||
case '\r':
|
||||
return 'carriage return';
|
||||
case '\t':
|
||||
return 'tab';
|
||||
default:
|
||||
return string;
|
||||
}
|
||||
};
|
||||
|
||||
}).call(this);
|
||||
11
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/index.js
generated
vendored
Normal file
11
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/index.js
generated
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
// Generated by CoffeeScript 1.12.7
|
||||
(function() {
|
||||
var key, ref, val;
|
||||
|
||||
ref = require('./coffee-script');
|
||||
for (key in ref) {
|
||||
val = ref[key];
|
||||
exports[key] = val;
|
||||
}
|
||||
|
||||
}).call(this);
|
||||
1166
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/lexer.js
generated
vendored
Normal file
1166
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/lexer.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3899
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/nodes.js
generated
vendored
Normal file
3899
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/nodes.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
139
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/optparse.js
generated
vendored
Normal file
139
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/optparse.js
generated
vendored
Normal file
@ -0,0 +1,139 @@
|
||||
// Generated by CoffeeScript 1.12.7
|
||||
(function() {
|
||||
var LONG_FLAG, MULTI_FLAG, OPTIONAL, OptionParser, SHORT_FLAG, buildRule, buildRules, normalizeArguments, repeat;
|
||||
|
||||
repeat = require('./helpers').repeat;
|
||||
|
||||
exports.OptionParser = OptionParser = (function() {
|
||||
function OptionParser(rules, banner) {
|
||||
this.banner = banner;
|
||||
this.rules = buildRules(rules);
|
||||
}
|
||||
|
||||
OptionParser.prototype.parse = function(args) {
|
||||
var arg, i, isOption, j, k, len, len1, matchedRule, options, originalArgs, pos, ref, rule, seenNonOptionArg, skippingArgument, value;
|
||||
options = {
|
||||
"arguments": []
|
||||
};
|
||||
skippingArgument = false;
|
||||
originalArgs = args;
|
||||
args = normalizeArguments(args);
|
||||
for (i = j = 0, len = args.length; j < len; i = ++j) {
|
||||
arg = args[i];
|
||||
if (skippingArgument) {
|
||||
skippingArgument = false;
|
||||
continue;
|
||||
}
|
||||
if (arg === '--') {
|
||||
pos = originalArgs.indexOf('--');
|
||||
options["arguments"] = options["arguments"].concat(originalArgs.slice(pos + 1));
|
||||
break;
|
||||
}
|
||||
isOption = !!(arg.match(LONG_FLAG) || arg.match(SHORT_FLAG));
|
||||
seenNonOptionArg = options["arguments"].length > 0;
|
||||
if (!seenNonOptionArg) {
|
||||
matchedRule = false;
|
||||
ref = this.rules;
|
||||
for (k = 0, len1 = ref.length; k < len1; k++) {
|
||||
rule = ref[k];
|
||||
if (rule.shortFlag === arg || rule.longFlag === arg) {
|
||||
value = true;
|
||||
if (rule.hasArgument) {
|
||||
skippingArgument = true;
|
||||
value = args[i + 1];
|
||||
}
|
||||
options[rule.name] = rule.isList ? (options[rule.name] || []).concat(value) : value;
|
||||
matchedRule = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (isOption && !matchedRule) {
|
||||
throw new Error("unrecognized option: " + arg);
|
||||
}
|
||||
}
|
||||
if (seenNonOptionArg || !isOption) {
|
||||
options["arguments"].push(arg);
|
||||
}
|
||||
}
|
||||
return options;
|
||||
};
|
||||
|
||||
OptionParser.prototype.help = function() {
|
||||
var j, len, letPart, lines, ref, rule, spaces;
|
||||
lines = [];
|
||||
if (this.banner) {
|
||||
lines.unshift(this.banner + "\n");
|
||||
}
|
||||
ref = this.rules;
|
||||
for (j = 0, len = ref.length; j < len; j++) {
|
||||
rule = ref[j];
|
||||
spaces = 15 - rule.longFlag.length;
|
||||
spaces = spaces > 0 ? repeat(' ', spaces) : '';
|
||||
letPart = rule.shortFlag ? rule.shortFlag + ', ' : ' ';
|
||||
lines.push(' ' + letPart + rule.longFlag + spaces + rule.description);
|
||||
}
|
||||
return "\n" + (lines.join('\n')) + "\n";
|
||||
};
|
||||
|
||||
return OptionParser;
|
||||
|
||||
})();
|
||||
|
||||
LONG_FLAG = /^(--\w[\w\-]*)/;
|
||||
|
||||
SHORT_FLAG = /^(-\w)$/;
|
||||
|
||||
MULTI_FLAG = /^-(\w{2,})/;
|
||||
|
||||
OPTIONAL = /\[(\w+(\*?))\]/;
|
||||
|
||||
buildRules = function(rules) {
|
||||
var j, len, results, tuple;
|
||||
results = [];
|
||||
for (j = 0, len = rules.length; j < len; j++) {
|
||||
tuple = rules[j];
|
||||
if (tuple.length < 3) {
|
||||
tuple.unshift(null);
|
||||
}
|
||||
results.push(buildRule.apply(null, tuple));
|
||||
}
|
||||
return results;
|
||||
};
|
||||
|
||||
buildRule = function(shortFlag, longFlag, description, options) {
|
||||
var match;
|
||||
if (options == null) {
|
||||
options = {};
|
||||
}
|
||||
match = longFlag.match(OPTIONAL);
|
||||
longFlag = longFlag.match(LONG_FLAG)[1];
|
||||
return {
|
||||
name: longFlag.substr(2),
|
||||
shortFlag: shortFlag,
|
||||
longFlag: longFlag,
|
||||
description: description,
|
||||
hasArgument: !!(match && match[1]),
|
||||
isList: !!(match && match[2])
|
||||
};
|
||||
};
|
||||
|
||||
normalizeArguments = function(args) {
|
||||
var arg, j, k, l, len, len1, match, ref, result;
|
||||
args = args.slice(0);
|
||||
result = [];
|
||||
for (j = 0, len = args.length; j < len; j++) {
|
||||
arg = args[j];
|
||||
if (match = arg.match(MULTI_FLAG)) {
|
||||
ref = match[1].split('');
|
||||
for (k = 0, len1 = ref.length; k < len1; k++) {
|
||||
l = ref[k];
|
||||
result.push('-' + l);
|
||||
}
|
||||
} else {
|
||||
result.push(arg);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
}).call(this);
|
||||
891
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/parser.js
generated
vendored
Executable file
891
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/parser.js
generated
vendored
Executable file
File diff suppressed because one or more lines are too long
66
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/register.js
generated
vendored
Normal file
66
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/register.js
generated
vendored
Normal file
@ -0,0 +1,66 @@
|
||||
// Generated by CoffeeScript 1.12.7
|
||||
(function() {
|
||||
var CoffeeScript, Module, binary, child_process, ext, findExtension, fork, helpers, i, len, loadFile, path, ref;
|
||||
|
||||
CoffeeScript = require('./coffee-script');
|
||||
|
||||
child_process = require('child_process');
|
||||
|
||||
helpers = require('./helpers');
|
||||
|
||||
path = require('path');
|
||||
|
||||
loadFile = function(module, filename) {
|
||||
var answer;
|
||||
answer = CoffeeScript._compileFile(filename, false, true);
|
||||
return module._compile(answer, filename);
|
||||
};
|
||||
|
||||
if (require.extensions) {
|
||||
ref = CoffeeScript.FILE_EXTENSIONS;
|
||||
for (i = 0, len = ref.length; i < len; i++) {
|
||||
ext = ref[i];
|
||||
require.extensions[ext] = loadFile;
|
||||
}
|
||||
Module = require('module');
|
||||
findExtension = function(filename) {
|
||||
var curExtension, extensions;
|
||||
extensions = path.basename(filename).split('.');
|
||||
if (extensions[0] === '') {
|
||||
extensions.shift();
|
||||
}
|
||||
while (extensions.shift()) {
|
||||
curExtension = '.' + extensions.join('.');
|
||||
if (Module._extensions[curExtension]) {
|
||||
return curExtension;
|
||||
}
|
||||
}
|
||||
return '.js';
|
||||
};
|
||||
Module.prototype.load = function(filename) {
|
||||
var extension;
|
||||
this.filename = filename;
|
||||
this.paths = Module._nodeModulePaths(path.dirname(filename));
|
||||
extension = findExtension(filename);
|
||||
Module._extensions[extension](this, filename);
|
||||
return this.loaded = true;
|
||||
};
|
||||
}
|
||||
|
||||
if (child_process) {
|
||||
fork = child_process.fork;
|
||||
binary = require.resolve('../../bin/coffee');
|
||||
child_process.fork = function(path, args, options) {
|
||||
if (helpers.isCoffee(path)) {
|
||||
if (!Array.isArray(args)) {
|
||||
options = args || {};
|
||||
args = [];
|
||||
}
|
||||
args = [path].concat(args);
|
||||
path = binary;
|
||||
}
|
||||
return fork(path, args, options);
|
||||
};
|
||||
}
|
||||
|
||||
}).call(this);
|
||||
203
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/repl.js
generated
vendored
Normal file
203
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/repl.js
generated
vendored
Normal file
@ -0,0 +1,203 @@
|
||||
// Generated by CoffeeScript 1.12.7
|
||||
(function() {
|
||||
var CoffeeScript, addHistory, addMultilineHandler, fs, getCommandId, merge, nodeREPL, path, ref, replDefaults, runInContext, updateSyntaxError, vm;
|
||||
|
||||
fs = require('fs');
|
||||
|
||||
path = require('path');
|
||||
|
||||
vm = require('vm');
|
||||
|
||||
nodeREPL = require('repl');
|
||||
|
||||
CoffeeScript = require('./coffee-script');
|
||||
|
||||
ref = require('./helpers'), merge = ref.merge, updateSyntaxError = ref.updateSyntaxError;
|
||||
|
||||
replDefaults = {
|
||||
prompt: 'coffee> ',
|
||||
historyFile: process.env.HOME ? path.join(process.env.HOME, '.coffee_history') : void 0,
|
||||
historyMaxInputSize: 10240,
|
||||
"eval": function(input, context, filename, cb) {
|
||||
var Assign, Block, Literal, Value, ast, err, js, ref1, referencedVars, token, tokens;
|
||||
input = input.replace(/\uFF00/g, '\n');
|
||||
input = input.replace(/^\(([\s\S]*)\n\)$/m, '$1');
|
||||
input = input.replace(/^\s*try\s*{([\s\S]*)}\s*catch.*$/m, '$1');
|
||||
ref1 = require('./nodes'), Block = ref1.Block, Assign = ref1.Assign, Value = ref1.Value, Literal = ref1.Literal;
|
||||
try {
|
||||
tokens = CoffeeScript.tokens(input);
|
||||
referencedVars = (function() {
|
||||
var i, len, results;
|
||||
results = [];
|
||||
for (i = 0, len = tokens.length; i < len; i++) {
|
||||
token = tokens[i];
|
||||
if (token[0] === 'IDENTIFIER') {
|
||||
results.push(token[1]);
|
||||
}
|
||||
}
|
||||
return results;
|
||||
})();
|
||||
ast = CoffeeScript.nodes(tokens);
|
||||
ast = new Block([new Assign(new Value(new Literal('__')), ast, '=')]);
|
||||
js = ast.compile({
|
||||
bare: true,
|
||||
locals: Object.keys(context),
|
||||
referencedVars: referencedVars
|
||||
});
|
||||
return cb(null, runInContext(js, context, filename));
|
||||
} catch (error) {
|
||||
err = error;
|
||||
updateSyntaxError(err, input);
|
||||
return cb(err);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
runInContext = function(js, context, filename) {
|
||||
if (context === global) {
|
||||
return vm.runInThisContext(js, filename);
|
||||
} else {
|
||||
return vm.runInContext(js, context, filename);
|
||||
}
|
||||
};
|
||||
|
||||
addMultilineHandler = function(repl) {
|
||||
var inputStream, multiline, nodeLineListener, origPrompt, outputStream, ref1, rli;
|
||||
rli = repl.rli, inputStream = repl.inputStream, outputStream = repl.outputStream;
|
||||
origPrompt = (ref1 = repl._prompt) != null ? ref1 : repl.prompt;
|
||||
multiline = {
|
||||
enabled: false,
|
||||
initialPrompt: origPrompt.replace(/^[^> ]*/, function(x) {
|
||||
return x.replace(/./g, '-');
|
||||
}),
|
||||
prompt: origPrompt.replace(/^[^> ]*>?/, function(x) {
|
||||
return x.replace(/./g, '.');
|
||||
}),
|
||||
buffer: ''
|
||||
};
|
||||
nodeLineListener = rli.listeners('line')[0];
|
||||
rli.removeListener('line', nodeLineListener);
|
||||
rli.on('line', function(cmd) {
|
||||
if (multiline.enabled) {
|
||||
multiline.buffer += cmd + "\n";
|
||||
rli.setPrompt(multiline.prompt);
|
||||
rli.prompt(true);
|
||||
} else {
|
||||
rli.setPrompt(origPrompt);
|
||||
nodeLineListener(cmd);
|
||||
}
|
||||
});
|
||||
return inputStream.on('keypress', function(char, key) {
|
||||
if (!(key && key.ctrl && !key.meta && !key.shift && key.name === 'v')) {
|
||||
return;
|
||||
}
|
||||
if (multiline.enabled) {
|
||||
if (!multiline.buffer.match(/\n/)) {
|
||||
multiline.enabled = !multiline.enabled;
|
||||
rli.setPrompt(origPrompt);
|
||||
rli.prompt(true);
|
||||
return;
|
||||
}
|
||||
if ((rli.line != null) && !rli.line.match(/^\s*$/)) {
|
||||
return;
|
||||
}
|
||||
multiline.enabled = !multiline.enabled;
|
||||
rli.line = '';
|
||||
rli.cursor = 0;
|
||||
rli.output.cursorTo(0);
|
||||
rli.output.clearLine(1);
|
||||
multiline.buffer = multiline.buffer.replace(/\n/g, '\uFF00');
|
||||
rli.emit('line', multiline.buffer);
|
||||
multiline.buffer = '';
|
||||
} else {
|
||||
multiline.enabled = !multiline.enabled;
|
||||
rli.setPrompt(multiline.initialPrompt);
|
||||
rli.prompt(true);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
addHistory = function(repl, filename, maxSize) {
|
||||
var buffer, fd, lastLine, readFd, size, stat;
|
||||
lastLine = null;
|
||||
try {
|
||||
stat = fs.statSync(filename);
|
||||
size = Math.min(maxSize, stat.size);
|
||||
readFd = fs.openSync(filename, 'r');
|
||||
buffer = new Buffer(size);
|
||||
fs.readSync(readFd, buffer, 0, size, stat.size - size);
|
||||
fs.closeSync(readFd);
|
||||
repl.rli.history = buffer.toString().split('\n').reverse();
|
||||
if (stat.size > maxSize) {
|
||||
repl.rli.history.pop();
|
||||
}
|
||||
if (repl.rli.history[0] === '') {
|
||||
repl.rli.history.shift();
|
||||
}
|
||||
repl.rli.historyIndex = -1;
|
||||
lastLine = repl.rli.history[0];
|
||||
} catch (error) {}
|
||||
fd = fs.openSync(filename, 'a');
|
||||
repl.rli.addListener('line', function(code) {
|
||||
if (code && code.length && code !== '.history' && code !== '.exit' && lastLine !== code) {
|
||||
fs.writeSync(fd, code + "\n");
|
||||
return lastLine = code;
|
||||
}
|
||||
});
|
||||
repl.on('exit', function() {
|
||||
return fs.closeSync(fd);
|
||||
});
|
||||
return repl.commands[getCommandId(repl, 'history')] = {
|
||||
help: 'Show command history',
|
||||
action: function() {
|
||||
repl.outputStream.write((repl.rli.history.slice(0).reverse().join('\n')) + "\n");
|
||||
return repl.displayPrompt();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
getCommandId = function(repl, commandName) {
|
||||
var commandsHaveLeadingDot;
|
||||
commandsHaveLeadingDot = repl.commands['.help'] != null;
|
||||
if (commandsHaveLeadingDot) {
|
||||
return "." + commandName;
|
||||
} else {
|
||||
return commandName;
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
start: function(opts) {
|
||||
var build, major, minor, ref1, repl;
|
||||
if (opts == null) {
|
||||
opts = {};
|
||||
}
|
||||
ref1 = process.versions.node.split('.').map(function(n) {
|
||||
return parseInt(n, 10);
|
||||
}), major = ref1[0], minor = ref1[1], build = ref1[2];
|
||||
if (major === 0 && minor < 8) {
|
||||
console.warn("Node 0.8.0+ required for CoffeeScript REPL");
|
||||
process.exit(1);
|
||||
}
|
||||
CoffeeScript.register();
|
||||
process.argv = ['coffee'].concat(process.argv.slice(2));
|
||||
opts = merge(replDefaults, opts);
|
||||
repl = nodeREPL.start(opts);
|
||||
if (opts.prelude) {
|
||||
runInContext(opts.prelude, repl.context, 'prelude');
|
||||
}
|
||||
repl.on('exit', function() {
|
||||
if (!repl.rli.closed) {
|
||||
return repl.outputStream.write('\n');
|
||||
}
|
||||
});
|
||||
addMultilineHandler(repl);
|
||||
if (opts.historyFile) {
|
||||
addHistory(repl, opts.historyFile, opts.historyMaxInputSize);
|
||||
}
|
||||
repl.commands[getCommandId(repl, 'load')].help = 'Load code from a file into this REPL session';
|
||||
return repl;
|
||||
}
|
||||
};
|
||||
|
||||
}).call(this);
|
||||
537
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/rewriter.js
generated
vendored
Normal file
537
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/rewriter.js
generated
vendored
Normal file
@ -0,0 +1,537 @@
|
||||
// Generated by CoffeeScript 1.12.7
|
||||
(function() {
|
||||
var BALANCED_PAIRS, CALL_CLOSERS, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, IMPLICIT_UNSPACED_CALL, INVERSES, LINEBREAKS, Rewriter, SINGLE_CLOSERS, SINGLE_LINERS, generate, k, left, len, ref, rite,
|
||||
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },
|
||||
slice = [].slice;
|
||||
|
||||
generate = function(tag, value, origin) {
|
||||
var tok;
|
||||
tok = [tag, value];
|
||||
tok.generated = true;
|
||||
if (origin) {
|
||||
tok.origin = origin;
|
||||
}
|
||||
return tok;
|
||||
};
|
||||
|
||||
exports.Rewriter = Rewriter = (function() {
|
||||
function Rewriter() {}
|
||||
|
||||
Rewriter.prototype.rewrite = function(tokens1) {
|
||||
this.tokens = tokens1;
|
||||
this.removeLeadingNewlines();
|
||||
this.closeOpenCalls();
|
||||
this.closeOpenIndexes();
|
||||
this.normalizeLines();
|
||||
this.tagPostfixConditionals();
|
||||
this.addImplicitBracesAndParens();
|
||||
this.addLocationDataToGeneratedTokens();
|
||||
this.fixOutdentLocationData();
|
||||
return this.tokens;
|
||||
};
|
||||
|
||||
Rewriter.prototype.scanTokens = function(block) {
|
||||
var i, token, tokens;
|
||||
tokens = this.tokens;
|
||||
i = 0;
|
||||
while (token = tokens[i]) {
|
||||
i += block.call(this, token, i, tokens);
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
Rewriter.prototype.detectEnd = function(i, condition, action) {
|
||||
var levels, ref, ref1, token, tokens;
|
||||
tokens = this.tokens;
|
||||
levels = 0;
|
||||
while (token = tokens[i]) {
|
||||
if (levels === 0 && condition.call(this, token, i)) {
|
||||
return action.call(this, token, i);
|
||||
}
|
||||
if (!token || levels < 0) {
|
||||
return action.call(this, token, i - 1);
|
||||
}
|
||||
if (ref = token[0], indexOf.call(EXPRESSION_START, ref) >= 0) {
|
||||
levels += 1;
|
||||
} else if (ref1 = token[0], indexOf.call(EXPRESSION_END, ref1) >= 0) {
|
||||
levels -= 1;
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
return i - 1;
|
||||
};
|
||||
|
||||
Rewriter.prototype.removeLeadingNewlines = function() {
|
||||
var i, k, len, ref, tag;
|
||||
ref = this.tokens;
|
||||
for (i = k = 0, len = ref.length; k < len; i = ++k) {
|
||||
tag = ref[i][0];
|
||||
if (tag !== 'TERMINATOR') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i) {
|
||||
return this.tokens.splice(0, i);
|
||||
}
|
||||
};
|
||||
|
||||
Rewriter.prototype.closeOpenCalls = function() {
|
||||
var action, condition;
|
||||
condition = function(token, i) {
|
||||
var ref;
|
||||
return ((ref = token[0]) === ')' || ref === 'CALL_END') || token[0] === 'OUTDENT' && this.tag(i - 1) === ')';
|
||||
};
|
||||
action = function(token, i) {
|
||||
return this.tokens[token[0] === 'OUTDENT' ? i - 1 : i][0] = 'CALL_END';
|
||||
};
|
||||
return this.scanTokens(function(token, i) {
|
||||
if (token[0] === 'CALL_START') {
|
||||
this.detectEnd(i + 1, condition, action);
|
||||
}
|
||||
return 1;
|
||||
});
|
||||
};
|
||||
|
||||
Rewriter.prototype.closeOpenIndexes = function() {
|
||||
var action, condition;
|
||||
condition = function(token, i) {
|
||||
var ref;
|
||||
return (ref = token[0]) === ']' || ref === 'INDEX_END';
|
||||
};
|
||||
action = function(token, i) {
|
||||
return token[0] = 'INDEX_END';
|
||||
};
|
||||
return this.scanTokens(function(token, i) {
|
||||
if (token[0] === 'INDEX_START') {
|
||||
this.detectEnd(i + 1, condition, action);
|
||||
}
|
||||
return 1;
|
||||
});
|
||||
};
|
||||
|
||||
Rewriter.prototype.indexOfTag = function() {
|
||||
var fuzz, i, j, k, pattern, ref, ref1;
|
||||
i = arguments[0], pattern = 2 <= arguments.length ? slice.call(arguments, 1) : [];
|
||||
fuzz = 0;
|
||||
for (j = k = 0, ref = pattern.length; 0 <= ref ? k < ref : k > ref; j = 0 <= ref ? ++k : --k) {
|
||||
while (this.tag(i + j + fuzz) === 'HERECOMMENT') {
|
||||
fuzz += 2;
|
||||
}
|
||||
if (pattern[j] == null) {
|
||||
continue;
|
||||
}
|
||||
if (typeof pattern[j] === 'string') {
|
||||
pattern[j] = [pattern[j]];
|
||||
}
|
||||
if (ref1 = this.tag(i + j + fuzz), indexOf.call(pattern[j], ref1) < 0) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return i + j + fuzz - 1;
|
||||
};
|
||||
|
||||
Rewriter.prototype.looksObjectish = function(j) {
|
||||
var end, index;
|
||||
if (this.indexOfTag(j, '@', null, ':') > -1 || this.indexOfTag(j, null, ':') > -1) {
|
||||
return true;
|
||||
}
|
||||
index = this.indexOfTag(j, EXPRESSION_START);
|
||||
if (index > -1) {
|
||||
end = null;
|
||||
this.detectEnd(index + 1, (function(token) {
|
||||
var ref;
|
||||
return ref = token[0], indexOf.call(EXPRESSION_END, ref) >= 0;
|
||||
}), (function(token, i) {
|
||||
return end = i;
|
||||
}));
|
||||
if (this.tag(end + 1) === ':') {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
Rewriter.prototype.findTagsBackwards = function(i, tags) {
|
||||
var backStack, ref, ref1, ref2, ref3, ref4, ref5;
|
||||
backStack = [];
|
||||
while (i >= 0 && (backStack.length || (ref2 = this.tag(i), indexOf.call(tags, ref2) < 0) && ((ref3 = this.tag(i), indexOf.call(EXPRESSION_START, ref3) < 0) || this.tokens[i].generated) && (ref4 = this.tag(i), indexOf.call(LINEBREAKS, ref4) < 0))) {
|
||||
if (ref = this.tag(i), indexOf.call(EXPRESSION_END, ref) >= 0) {
|
||||
backStack.push(this.tag(i));
|
||||
}
|
||||
if ((ref1 = this.tag(i), indexOf.call(EXPRESSION_START, ref1) >= 0) && backStack.length) {
|
||||
backStack.pop();
|
||||
}
|
||||
i -= 1;
|
||||
}
|
||||
return ref5 = this.tag(i), indexOf.call(tags, ref5) >= 0;
|
||||
};
|
||||
|
||||
Rewriter.prototype.addImplicitBracesAndParens = function() {
|
||||
var stack, start;
|
||||
stack = [];
|
||||
start = null;
|
||||
return this.scanTokens(function(token, i, tokens) {
|
||||
var endImplicitCall, endImplicitObject, forward, inImplicit, inImplicitCall, inImplicitControl, inImplicitObject, isImplicit, isImplicitCall, isImplicitObject, k, newLine, nextTag, offset, prevTag, prevToken, ref, ref1, ref2, ref3, ref4, ref5, s, sameLine, stackIdx, stackItem, stackTag, stackTop, startIdx, startImplicitCall, startImplicitObject, startsLine, tag;
|
||||
tag = token[0];
|
||||
prevTag = (prevToken = i > 0 ? tokens[i - 1] : [])[0];
|
||||
nextTag = (i < tokens.length - 1 ? tokens[i + 1] : [])[0];
|
||||
stackTop = function() {
|
||||
return stack[stack.length - 1];
|
||||
};
|
||||
startIdx = i;
|
||||
forward = function(n) {
|
||||
return i - startIdx + n;
|
||||
};
|
||||
isImplicit = function(stackItem) {
|
||||
var ref;
|
||||
return stackItem != null ? (ref = stackItem[2]) != null ? ref.ours : void 0 : void 0;
|
||||
};
|
||||
isImplicitObject = function(stackItem) {
|
||||
return isImplicit(stackItem) && (stackItem != null ? stackItem[0] : void 0) === '{';
|
||||
};
|
||||
isImplicitCall = function(stackItem) {
|
||||
return isImplicit(stackItem) && (stackItem != null ? stackItem[0] : void 0) === '(';
|
||||
};
|
||||
inImplicit = function() {
|
||||
return isImplicit(stackTop());
|
||||
};
|
||||
inImplicitCall = function() {
|
||||
return isImplicitCall(stackTop());
|
||||
};
|
||||
inImplicitObject = function() {
|
||||
return isImplicitObject(stackTop());
|
||||
};
|
||||
inImplicitControl = function() {
|
||||
var ref;
|
||||
return inImplicit && ((ref = stackTop()) != null ? ref[0] : void 0) === 'CONTROL';
|
||||
};
|
||||
startImplicitCall = function(j) {
|
||||
var idx;
|
||||
idx = j != null ? j : i;
|
||||
stack.push([
|
||||
'(', idx, {
|
||||
ours: true
|
||||
}
|
||||
]);
|
||||
tokens.splice(idx, 0, generate('CALL_START', '(', ['', 'implicit function call', token[2]]));
|
||||
if (j == null) {
|
||||
return i += 1;
|
||||
}
|
||||
};
|
||||
endImplicitCall = function() {
|
||||
stack.pop();
|
||||
tokens.splice(i, 0, generate('CALL_END', ')', ['', 'end of input', token[2]]));
|
||||
return i += 1;
|
||||
};
|
||||
startImplicitObject = function(j, startsLine) {
|
||||
var idx, val;
|
||||
if (startsLine == null) {
|
||||
startsLine = true;
|
||||
}
|
||||
idx = j != null ? j : i;
|
||||
stack.push([
|
||||
'{', idx, {
|
||||
sameLine: true,
|
||||
startsLine: startsLine,
|
||||
ours: true
|
||||
}
|
||||
]);
|
||||
val = new String('{');
|
||||
val.generated = true;
|
||||
tokens.splice(idx, 0, generate('{', val, token));
|
||||
if (j == null) {
|
||||
return i += 1;
|
||||
}
|
||||
};
|
||||
endImplicitObject = function(j) {
|
||||
j = j != null ? j : i;
|
||||
stack.pop();
|
||||
tokens.splice(j, 0, generate('}', '}', token));
|
||||
return i += 1;
|
||||
};
|
||||
if (inImplicitCall() && (tag === 'IF' || tag === 'TRY' || tag === 'FINALLY' || tag === 'CATCH' || tag === 'CLASS' || tag === 'SWITCH')) {
|
||||
stack.push([
|
||||
'CONTROL', i, {
|
||||
ours: true
|
||||
}
|
||||
]);
|
||||
return forward(1);
|
||||
}
|
||||
if (tag === 'INDENT' && inImplicit()) {
|
||||
if (prevTag !== '=>' && prevTag !== '->' && prevTag !== '[' && prevTag !== '(' && prevTag !== ',' && prevTag !== '{' && prevTag !== 'TRY' && prevTag !== 'ELSE' && prevTag !== '=') {
|
||||
while (inImplicitCall()) {
|
||||
endImplicitCall();
|
||||
}
|
||||
}
|
||||
if (inImplicitControl()) {
|
||||
stack.pop();
|
||||
}
|
||||
stack.push([tag, i]);
|
||||
return forward(1);
|
||||
}
|
||||
if (indexOf.call(EXPRESSION_START, tag) >= 0) {
|
||||
stack.push([tag, i]);
|
||||
return forward(1);
|
||||
}
|
||||
if (indexOf.call(EXPRESSION_END, tag) >= 0) {
|
||||
while (inImplicit()) {
|
||||
if (inImplicitCall()) {
|
||||
endImplicitCall();
|
||||
} else if (inImplicitObject()) {
|
||||
endImplicitObject();
|
||||
} else {
|
||||
stack.pop();
|
||||
}
|
||||
}
|
||||
start = stack.pop();
|
||||
}
|
||||
if ((indexOf.call(IMPLICIT_FUNC, tag) >= 0 && token.spaced || tag === '?' && i > 0 && !tokens[i - 1].spaced) && (indexOf.call(IMPLICIT_CALL, nextTag) >= 0 || indexOf.call(IMPLICIT_UNSPACED_CALL, nextTag) >= 0 && !((ref = tokens[i + 1]) != null ? ref.spaced : void 0) && !((ref1 = tokens[i + 1]) != null ? ref1.newLine : void 0))) {
|
||||
if (tag === '?') {
|
||||
tag = token[0] = 'FUNC_EXIST';
|
||||
}
|
||||
startImplicitCall(i + 1);
|
||||
return forward(2);
|
||||
}
|
||||
if (indexOf.call(IMPLICIT_FUNC, tag) >= 0 && this.indexOfTag(i + 1, 'INDENT') > -1 && this.looksObjectish(i + 2) && !this.findTagsBackwards(i, ['CLASS', 'EXTENDS', 'IF', 'CATCH', 'SWITCH', 'LEADING_WHEN', 'FOR', 'WHILE', 'UNTIL'])) {
|
||||
startImplicitCall(i + 1);
|
||||
stack.push(['INDENT', i + 2]);
|
||||
return forward(3);
|
||||
}
|
||||
if (tag === ':') {
|
||||
s = (function() {
|
||||
var ref2;
|
||||
switch (false) {
|
||||
case ref2 = this.tag(i - 1), indexOf.call(EXPRESSION_END, ref2) < 0:
|
||||
return start[1];
|
||||
case this.tag(i - 2) !== '@':
|
||||
return i - 2;
|
||||
default:
|
||||
return i - 1;
|
||||
}
|
||||
}).call(this);
|
||||
while (this.tag(s - 2) === 'HERECOMMENT') {
|
||||
s -= 2;
|
||||
}
|
||||
this.insideForDeclaration = nextTag === 'FOR';
|
||||
startsLine = s === 0 || (ref2 = this.tag(s - 1), indexOf.call(LINEBREAKS, ref2) >= 0) || tokens[s - 1].newLine;
|
||||
if (stackTop()) {
|
||||
ref3 = stackTop(), stackTag = ref3[0], stackIdx = ref3[1];
|
||||
if ((stackTag === '{' || stackTag === 'INDENT' && this.tag(stackIdx - 1) === '{') && (startsLine || this.tag(s - 1) === ',' || this.tag(s - 1) === '{')) {
|
||||
return forward(1);
|
||||
}
|
||||
}
|
||||
startImplicitObject(s, !!startsLine);
|
||||
return forward(2);
|
||||
}
|
||||
if (indexOf.call(LINEBREAKS, tag) >= 0) {
|
||||
for (k = stack.length - 1; k >= 0; k += -1) {
|
||||
stackItem = stack[k];
|
||||
if (!isImplicit(stackItem)) {
|
||||
break;
|
||||
}
|
||||
if (isImplicitObject(stackItem)) {
|
||||
stackItem[2].sameLine = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
newLine = prevTag === 'OUTDENT' || prevToken.newLine;
|
||||
if (indexOf.call(IMPLICIT_END, tag) >= 0 || indexOf.call(CALL_CLOSERS, tag) >= 0 && newLine) {
|
||||
while (inImplicit()) {
|
||||
ref4 = stackTop(), stackTag = ref4[0], stackIdx = ref4[1], (ref5 = ref4[2], sameLine = ref5.sameLine, startsLine = ref5.startsLine);
|
||||
if (inImplicitCall() && prevTag !== ',') {
|
||||
endImplicitCall();
|
||||
} else if (inImplicitObject() && !this.insideForDeclaration && sameLine && tag !== 'TERMINATOR' && prevTag !== ':') {
|
||||
endImplicitObject();
|
||||
} else if (inImplicitObject() && tag === 'TERMINATOR' && prevTag !== ',' && !(startsLine && this.looksObjectish(i + 1))) {
|
||||
if (nextTag === 'HERECOMMENT') {
|
||||
return forward(1);
|
||||
}
|
||||
endImplicitObject();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (tag === ',' && !this.looksObjectish(i + 1) && inImplicitObject() && !this.insideForDeclaration && (nextTag !== 'TERMINATOR' || !this.looksObjectish(i + 2))) {
|
||||
offset = nextTag === 'OUTDENT' ? 1 : 0;
|
||||
while (inImplicitObject()) {
|
||||
endImplicitObject(i + offset);
|
||||
}
|
||||
}
|
||||
return forward(1);
|
||||
});
|
||||
};
|
||||
|
||||
Rewriter.prototype.addLocationDataToGeneratedTokens = function() {
|
||||
return this.scanTokens(function(token, i, tokens) {
|
||||
var column, line, nextLocation, prevLocation, ref, ref1;
|
||||
if (token[2]) {
|
||||
return 1;
|
||||
}
|
||||
if (!(token.generated || token.explicit)) {
|
||||
return 1;
|
||||
}
|
||||
if (token[0] === '{' && (nextLocation = (ref = tokens[i + 1]) != null ? ref[2] : void 0)) {
|
||||
line = nextLocation.first_line, column = nextLocation.first_column;
|
||||
} else if (prevLocation = (ref1 = tokens[i - 1]) != null ? ref1[2] : void 0) {
|
||||
line = prevLocation.last_line, column = prevLocation.last_column;
|
||||
} else {
|
||||
line = column = 0;
|
||||
}
|
||||
token[2] = {
|
||||
first_line: line,
|
||||
first_column: column,
|
||||
last_line: line,
|
||||
last_column: column
|
||||
};
|
||||
return 1;
|
||||
});
|
||||
};
|
||||
|
||||
Rewriter.prototype.fixOutdentLocationData = function() {
|
||||
return this.scanTokens(function(token, i, tokens) {
|
||||
var prevLocationData;
|
||||
if (!(token[0] === 'OUTDENT' || (token.generated && token[0] === 'CALL_END') || (token.generated && token[0] === '}'))) {
|
||||
return 1;
|
||||
}
|
||||
prevLocationData = tokens[i - 1][2];
|
||||
token[2] = {
|
||||
first_line: prevLocationData.last_line,
|
||||
first_column: prevLocationData.last_column,
|
||||
last_line: prevLocationData.last_line,
|
||||
last_column: prevLocationData.last_column
|
||||
};
|
||||
return 1;
|
||||
});
|
||||
};
|
||||
|
||||
Rewriter.prototype.normalizeLines = function() {
|
||||
var action, condition, indent, outdent, starter;
|
||||
starter = indent = outdent = null;
|
||||
condition = function(token, i) {
|
||||
var ref, ref1, ref2, ref3;
|
||||
return token[1] !== ';' && (ref = token[0], indexOf.call(SINGLE_CLOSERS, ref) >= 0) && !(token[0] === 'TERMINATOR' && (ref1 = this.tag(i + 1), indexOf.call(EXPRESSION_CLOSE, ref1) >= 0)) && !(token[0] === 'ELSE' && starter !== 'THEN') && !(((ref2 = token[0]) === 'CATCH' || ref2 === 'FINALLY') && (starter === '->' || starter === '=>')) || (ref3 = token[0], indexOf.call(CALL_CLOSERS, ref3) >= 0) && (this.tokens[i - 1].newLine || this.tokens[i - 1][0] === 'OUTDENT');
|
||||
};
|
||||
action = function(token, i) {
|
||||
return this.tokens.splice((this.tag(i - 1) === ',' ? i - 1 : i), 0, outdent);
|
||||
};
|
||||
return this.scanTokens(function(token, i, tokens) {
|
||||
var j, k, ref, ref1, ref2, tag;
|
||||
tag = token[0];
|
||||
if (tag === 'TERMINATOR') {
|
||||
if (this.tag(i + 1) === 'ELSE' && this.tag(i - 1) !== 'OUTDENT') {
|
||||
tokens.splice.apply(tokens, [i, 1].concat(slice.call(this.indentation())));
|
||||
return 1;
|
||||
}
|
||||
if (ref = this.tag(i + 1), indexOf.call(EXPRESSION_CLOSE, ref) >= 0) {
|
||||
tokens.splice(i, 1);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if (tag === 'CATCH') {
|
||||
for (j = k = 1; k <= 2; j = ++k) {
|
||||
if (!((ref1 = this.tag(i + j)) === 'OUTDENT' || ref1 === 'TERMINATOR' || ref1 === 'FINALLY')) {
|
||||
continue;
|
||||
}
|
||||
tokens.splice.apply(tokens, [i + j, 0].concat(slice.call(this.indentation())));
|
||||
return 2 + j;
|
||||
}
|
||||
}
|
||||
if (indexOf.call(SINGLE_LINERS, tag) >= 0 && this.tag(i + 1) !== 'INDENT' && !(tag === 'ELSE' && this.tag(i + 1) === 'IF')) {
|
||||
starter = tag;
|
||||
ref2 = this.indentation(tokens[i]), indent = ref2[0], outdent = ref2[1];
|
||||
if (starter === 'THEN') {
|
||||
indent.fromThen = true;
|
||||
}
|
||||
tokens.splice(i + 1, 0, indent);
|
||||
this.detectEnd(i + 2, condition, action);
|
||||
if (tag === 'THEN') {
|
||||
tokens.splice(i, 1);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
return 1;
|
||||
});
|
||||
};
|
||||
|
||||
Rewriter.prototype.tagPostfixConditionals = function() {
|
||||
var action, condition, original;
|
||||
original = null;
|
||||
condition = function(token, i) {
|
||||
var prevTag, tag;
|
||||
tag = token[0];
|
||||
prevTag = this.tokens[i - 1][0];
|
||||
return tag === 'TERMINATOR' || (tag === 'INDENT' && indexOf.call(SINGLE_LINERS, prevTag) < 0);
|
||||
};
|
||||
action = function(token, i) {
|
||||
if (token[0] !== 'INDENT' || (token.generated && !token.fromThen)) {
|
||||
return original[0] = 'POST_' + original[0];
|
||||
}
|
||||
};
|
||||
return this.scanTokens(function(token, i) {
|
||||
if (token[0] !== 'IF') {
|
||||
return 1;
|
||||
}
|
||||
original = token;
|
||||
this.detectEnd(i + 1, condition, action);
|
||||
return 1;
|
||||
});
|
||||
};
|
||||
|
||||
Rewriter.prototype.indentation = function(origin) {
|
||||
var indent, outdent;
|
||||
indent = ['INDENT', 2];
|
||||
outdent = ['OUTDENT', 2];
|
||||
if (origin) {
|
||||
indent.generated = outdent.generated = true;
|
||||
indent.origin = outdent.origin = origin;
|
||||
} else {
|
||||
indent.explicit = outdent.explicit = true;
|
||||
}
|
||||
return [indent, outdent];
|
||||
};
|
||||
|
||||
Rewriter.prototype.generate = generate;
|
||||
|
||||
Rewriter.prototype.tag = function(i) {
|
||||
var ref;
|
||||
return (ref = this.tokens[i]) != null ? ref[0] : void 0;
|
||||
};
|
||||
|
||||
return Rewriter;
|
||||
|
||||
})();
|
||||
|
||||
BALANCED_PAIRS = [['(', ')'], ['[', ']'], ['{', '}'], ['INDENT', 'OUTDENT'], ['CALL_START', 'CALL_END'], ['PARAM_START', 'PARAM_END'], ['INDEX_START', 'INDEX_END'], ['STRING_START', 'STRING_END'], ['REGEX_START', 'REGEX_END']];
|
||||
|
||||
exports.INVERSES = INVERSES = {};
|
||||
|
||||
EXPRESSION_START = [];
|
||||
|
||||
EXPRESSION_END = [];
|
||||
|
||||
for (k = 0, len = BALANCED_PAIRS.length; k < len; k++) {
|
||||
ref = BALANCED_PAIRS[k], left = ref[0], rite = ref[1];
|
||||
EXPRESSION_START.push(INVERSES[rite] = left);
|
||||
EXPRESSION_END.push(INVERSES[left] = rite);
|
||||
}
|
||||
|
||||
EXPRESSION_CLOSE = ['CATCH', 'THEN', 'ELSE', 'FINALLY'].concat(EXPRESSION_END);
|
||||
|
||||
IMPLICIT_FUNC = ['IDENTIFIER', 'PROPERTY', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END', '@', 'THIS'];
|
||||
|
||||
IMPLICIT_CALL = ['IDENTIFIER', 'PROPERTY', 'NUMBER', 'INFINITY', 'NAN', 'STRING', 'STRING_START', 'REGEX', 'REGEX_START', 'JS', 'NEW', 'PARAM_START', 'CLASS', 'IF', 'TRY', 'SWITCH', 'THIS', 'UNDEFINED', 'NULL', 'BOOL', 'UNARY', 'YIELD', 'UNARY_MATH', 'SUPER', 'THROW', '@', '->', '=>', '[', '(', '{', '--', '++'];
|
||||
|
||||
IMPLICIT_UNSPACED_CALL = ['+', '-'];
|
||||
|
||||
IMPLICIT_END = ['POST_IF', 'FOR', 'WHILE', 'UNTIL', 'WHEN', 'BY', 'LOOP', 'TERMINATOR'];
|
||||
|
||||
SINGLE_LINERS = ['ELSE', '->', '=>', 'TRY', 'FINALLY', 'THEN'];
|
||||
|
||||
SINGLE_CLOSERS = ['TERMINATOR', 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN'];
|
||||
|
||||
LINEBREAKS = ['TERMINATOR', 'INDENT', 'OUTDENT'];
|
||||
|
||||
CALL_CLOSERS = ['.', '?.', '::', '?::'];
|
||||
|
||||
}).call(this);
|
||||
165
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/scope.js
generated
vendored
Normal file
165
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/scope.js
generated
vendored
Normal file
@ -0,0 +1,165 @@
|
||||
// Generated by CoffeeScript 1.12.7
|
||||
(function() {
|
||||
var Scope,
|
||||
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
||||
|
||||
exports.Scope = Scope = (function() {
|
||||
function Scope(parent, expressions, method, referencedVars) {
|
||||
var ref, ref1;
|
||||
this.parent = parent;
|
||||
this.expressions = expressions;
|
||||
this.method = method;
|
||||
this.referencedVars = referencedVars;
|
||||
this.variables = [
|
||||
{
|
||||
name: 'arguments',
|
||||
type: 'arguments'
|
||||
}
|
||||
];
|
||||
this.positions = {};
|
||||
if (!this.parent) {
|
||||
this.utilities = {};
|
||||
}
|
||||
this.root = (ref = (ref1 = this.parent) != null ? ref1.root : void 0) != null ? ref : this;
|
||||
}
|
||||
|
||||
Scope.prototype.add = function(name, type, immediate) {
|
||||
if (this.shared && !immediate) {
|
||||
return this.parent.add(name, type, immediate);
|
||||
}
|
||||
if (Object.prototype.hasOwnProperty.call(this.positions, name)) {
|
||||
return this.variables[this.positions[name]].type = type;
|
||||
} else {
|
||||
return this.positions[name] = this.variables.push({
|
||||
name: name,
|
||||
type: type
|
||||
}) - 1;
|
||||
}
|
||||
};
|
||||
|
||||
Scope.prototype.namedMethod = function() {
|
||||
var ref;
|
||||
if (((ref = this.method) != null ? ref.name : void 0) || !this.parent) {
|
||||
return this.method;
|
||||
}
|
||||
return this.parent.namedMethod();
|
||||
};
|
||||
|
||||
Scope.prototype.find = function(name, type) {
|
||||
if (type == null) {
|
||||
type = 'var';
|
||||
}
|
||||
if (this.check(name)) {
|
||||
return true;
|
||||
}
|
||||
this.add(name, type);
|
||||
return false;
|
||||
};
|
||||
|
||||
Scope.prototype.parameter = function(name) {
|
||||
if (this.shared && this.parent.check(name, true)) {
|
||||
return;
|
||||
}
|
||||
return this.add(name, 'param');
|
||||
};
|
||||
|
||||
Scope.prototype.check = function(name) {
|
||||
var ref;
|
||||
return !!(this.type(name) || ((ref = this.parent) != null ? ref.check(name) : void 0));
|
||||
};
|
||||
|
||||
Scope.prototype.temporary = function(name, index, single) {
|
||||
var diff, endCode, letter, newCode, num, startCode;
|
||||
if (single == null) {
|
||||
single = false;
|
||||
}
|
||||
if (single) {
|
||||
startCode = name.charCodeAt(0);
|
||||
endCode = 'z'.charCodeAt(0);
|
||||
diff = endCode - startCode;
|
||||
newCode = startCode + index % (diff + 1);
|
||||
letter = String.fromCharCode(newCode);
|
||||
num = Math.floor(index / (diff + 1));
|
||||
return "" + letter + (num || '');
|
||||
} else {
|
||||
return "" + name + (index || '');
|
||||
}
|
||||
};
|
||||
|
||||
Scope.prototype.type = function(name) {
|
||||
var i, len, ref, v;
|
||||
ref = this.variables;
|
||||
for (i = 0, len = ref.length; i < len; i++) {
|
||||
v = ref[i];
|
||||
if (v.name === name) {
|
||||
return v.type;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
Scope.prototype.freeVariable = function(name, options) {
|
||||
var index, ref, temp;
|
||||
if (options == null) {
|
||||
options = {};
|
||||
}
|
||||
index = 0;
|
||||
while (true) {
|
||||
temp = this.temporary(name, index, options.single);
|
||||
if (!(this.check(temp) || indexOf.call(this.root.referencedVars, temp) >= 0)) {
|
||||
break;
|
||||
}
|
||||
index++;
|
||||
}
|
||||
if ((ref = options.reserve) != null ? ref : true) {
|
||||
this.add(temp, 'var', true);
|
||||
}
|
||||
return temp;
|
||||
};
|
||||
|
||||
Scope.prototype.assign = function(name, value) {
|
||||
this.add(name, {
|
||||
value: value,
|
||||
assigned: true
|
||||
}, true);
|
||||
return this.hasAssignments = true;
|
||||
};
|
||||
|
||||
Scope.prototype.hasDeclarations = function() {
|
||||
return !!this.declaredVariables().length;
|
||||
};
|
||||
|
||||
Scope.prototype.declaredVariables = function() {
|
||||
var v;
|
||||
return ((function() {
|
||||
var i, len, ref, results;
|
||||
ref = this.variables;
|
||||
results = [];
|
||||
for (i = 0, len = ref.length; i < len; i++) {
|
||||
v = ref[i];
|
||||
if (v.type === 'var') {
|
||||
results.push(v.name);
|
||||
}
|
||||
}
|
||||
return results;
|
||||
}).call(this)).sort();
|
||||
};
|
||||
|
||||
Scope.prototype.assignedVariables = function() {
|
||||
var i, len, ref, results, v;
|
||||
ref = this.variables;
|
||||
results = [];
|
||||
for (i = 0, len = ref.length; i < len; i++) {
|
||||
v = ref[i];
|
||||
if (v.type.assigned) {
|
||||
results.push(v.name + " = " + v.type.value);
|
||||
}
|
||||
}
|
||||
return results;
|
||||
};
|
||||
|
||||
return Scope;
|
||||
|
||||
})();
|
||||
|
||||
}).call(this);
|
||||
161
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/sourcemap.js
generated
vendored
Normal file
161
plugins/cordova-sqlite-storage/node_modules/coffeescript/lib/coffee-script/sourcemap.js
generated
vendored
Normal file
@ -0,0 +1,161 @@
|
||||
// Generated by CoffeeScript 1.12.7
|
||||
(function() {
|
||||
var LineMap, SourceMap;
|
||||
|
||||
LineMap = (function() {
|
||||
function LineMap(line1) {
|
||||
this.line = line1;
|
||||
this.columns = [];
|
||||
}
|
||||
|
||||
LineMap.prototype.add = function(column, arg, options) {
|
||||
var sourceColumn, sourceLine;
|
||||
sourceLine = arg[0], sourceColumn = arg[1];
|
||||
if (options == null) {
|
||||
options = {};
|
||||
}
|
||||
if (this.columns[column] && options.noReplace) {
|
||||
return;
|
||||
}
|
||||
return this.columns[column] = {
|
||||
line: this.line,
|
||||
column: column,
|
||||
sourceLine: sourceLine,
|
||||
sourceColumn: sourceColumn
|
||||
};
|
||||
};
|
||||
|
||||
LineMap.prototype.sourceLocation = function(column) {
|
||||
var mapping;
|
||||
while (!((mapping = this.columns[column]) || (column <= 0))) {
|
||||
column--;
|
||||
}
|
||||
return mapping && [mapping.sourceLine, mapping.sourceColumn];
|
||||
};
|
||||
|
||||
return LineMap;
|
||||
|
||||
})();
|
||||
|
||||
SourceMap = (function() {
|
||||
var BASE64_CHARS, VLQ_CONTINUATION_BIT, VLQ_SHIFT, VLQ_VALUE_MASK;
|
||||
|
||||
function SourceMap() {
|
||||
this.lines = [];
|
||||
}
|
||||
|
||||
SourceMap.prototype.add = function(sourceLocation, generatedLocation, options) {
|
||||
var base, column, line, lineMap;
|
||||
if (options == null) {
|
||||
options = {};
|
||||
}
|
||||
line = generatedLocation[0], column = generatedLocation[1];
|
||||
lineMap = ((base = this.lines)[line] || (base[line] = new LineMap(line)));
|
||||
return lineMap.add(column, sourceLocation, options);
|
||||
};
|
||||
|
||||
SourceMap.prototype.sourceLocation = function(arg) {
|
||||
var column, line, lineMap;
|
||||
line = arg[0], column = arg[1];
|
||||
while (!((lineMap = this.lines[line]) || (line <= 0))) {
|
||||
line--;
|
||||
}
|
||||
return lineMap && lineMap.sourceLocation(column);
|
||||
};
|
||||
|
||||
SourceMap.prototype.generate = function(options, code) {
|
||||
var buffer, i, j, lastColumn, lastSourceColumn, lastSourceLine, len, len1, lineMap, lineNumber, mapping, needComma, ref, ref1, v3, writingline;
|
||||
if (options == null) {
|
||||
options = {};
|
||||
}
|
||||
if (code == null) {
|
||||
code = null;
|
||||
}
|
||||
writingline = 0;
|
||||
lastColumn = 0;
|
||||
lastSourceLine = 0;
|
||||
lastSourceColumn = 0;
|
||||
needComma = false;
|
||||
buffer = "";
|
||||
ref = this.lines;
|
||||
for (lineNumber = i = 0, len = ref.length; i < len; lineNumber = ++i) {
|
||||
lineMap = ref[lineNumber];
|
||||
if (lineMap) {
|
||||
ref1 = lineMap.columns;
|
||||
for (j = 0, len1 = ref1.length; j < len1; j++) {
|
||||
mapping = ref1[j];
|
||||
if (!(mapping)) {
|
||||
continue;
|
||||
}
|
||||
while (writingline < mapping.line) {
|
||||
lastColumn = 0;
|
||||
needComma = false;
|
||||
buffer += ";";
|
||||
writingline++;
|
||||
}
|
||||
if (needComma) {
|
||||
buffer += ",";
|
||||
needComma = false;
|
||||
}
|
||||
buffer += this.encodeVlq(mapping.column - lastColumn);
|
||||
lastColumn = mapping.column;
|
||||
buffer += this.encodeVlq(0);
|
||||
buffer += this.encodeVlq(mapping.sourceLine - lastSourceLine);
|
||||
lastSourceLine = mapping.sourceLine;
|
||||
buffer += this.encodeVlq(mapping.sourceColumn - lastSourceColumn);
|
||||
lastSourceColumn = mapping.sourceColumn;
|
||||
needComma = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
v3 = {
|
||||
version: 3,
|
||||
file: options.generatedFile || '',
|
||||
sourceRoot: options.sourceRoot || '',
|
||||
sources: options.sourceFiles || [''],
|
||||
names: [],
|
||||
mappings: buffer
|
||||
};
|
||||
if (options.inlineMap) {
|
||||
v3.sourcesContent = [code];
|
||||
}
|
||||
return v3;
|
||||
};
|
||||
|
||||
VLQ_SHIFT = 5;
|
||||
|
||||
VLQ_CONTINUATION_BIT = 1 << VLQ_SHIFT;
|
||||
|
||||
VLQ_VALUE_MASK = VLQ_CONTINUATION_BIT - 1;
|
||||
|
||||
SourceMap.prototype.encodeVlq = function(value) {
|
||||
var answer, nextChunk, signBit, valueToEncode;
|
||||
answer = '';
|
||||
signBit = value < 0 ? 1 : 0;
|
||||
valueToEncode = (Math.abs(value) << 1) + signBit;
|
||||
while (valueToEncode || !answer) {
|
||||
nextChunk = valueToEncode & VLQ_VALUE_MASK;
|
||||
valueToEncode = valueToEncode >> VLQ_SHIFT;
|
||||
if (valueToEncode) {
|
||||
nextChunk |= VLQ_CONTINUATION_BIT;
|
||||
}
|
||||
answer += this.encodeBase64(nextChunk);
|
||||
}
|
||||
return answer;
|
||||
};
|
||||
|
||||
BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
||||
|
||||
SourceMap.prototype.encodeBase64 = function(value) {
|
||||
return BASE64_CHARS[value] || (function() {
|
||||
throw new Error("Cannot Base64 encode value: " + value);
|
||||
})();
|
||||
};
|
||||
|
||||
return SourceMap;
|
||||
|
||||
})();
|
||||
|
||||
module.exports = SourceMap;
|
||||
|
||||
}).call(this);
|
||||
77
plugins/cordova-sqlite-storage/node_modules/coffeescript/package.json
generated
vendored
Normal file
77
plugins/cordova-sqlite-storage/node_modules/coffeescript/package.json
generated
vendored
Normal file
@ -0,0 +1,77 @@
|
||||
{
|
||||
"_from": "coffeescript@1",
|
||||
"_id": "coffeescript@1.12.7",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==",
|
||||
"_location": "/coffeescript",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "range",
|
||||
"registry": true,
|
||||
"raw": "coffeescript@1",
|
||||
"name": "coffeescript",
|
||||
"escapedName": "coffeescript",
|
||||
"rawSpec": "1",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "1"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"#DEV:/"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz",
|
||||
"_shasum": "e57ee4c4867cf7f606bfc4a0f2d550c0981ddd27",
|
||||
"_spec": "coffeescript@1",
|
||||
"_where": "/home/rajasekar/project/SineEdge/sineedgelenderapp/plugins/cordova-sqlite-storage",
|
||||
"author": {
|
||||
"name": "Jeremy Ashkenas"
|
||||
},
|
||||
"bin": {
|
||||
"coffee": "./bin/coffee",
|
||||
"cake": "./bin/cake"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/jashkenas/coffeescript/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"deprecated": false,
|
||||
"description": "Unfancy JavaScript",
|
||||
"devDependencies": {
|
||||
"docco": "~0.7.0",
|
||||
"google-closure-compiler-js": "^20170626.0.0",
|
||||
"highlight.js": "~9.12.0",
|
||||
"jison": ">=0.4.17",
|
||||
"markdown-it": "^8.3.1",
|
||||
"underscore": "~1.8.3"
|
||||
},
|
||||
"directories": {
|
||||
"lib": "./lib/coffee-script"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.8.0"
|
||||
},
|
||||
"files": [
|
||||
"bin",
|
||||
"lib",
|
||||
"register.js",
|
||||
"repl.js"
|
||||
],
|
||||
"homepage": "http://coffeescript.org",
|
||||
"keywords": [
|
||||
"javascript",
|
||||
"language",
|
||||
"coffeescript",
|
||||
"compiler"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "./lib/coffee-script/coffee-script",
|
||||
"name": "coffeescript",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/jashkenas/coffeescript.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "node ./bin/cake test",
|
||||
"test-harmony": "node --harmony ./bin/cake test"
|
||||
},
|
||||
"version": "1.12.7"
|
||||
}
|
||||
1
plugins/cordova-sqlite-storage/node_modules/coffeescript/register.js
generated
vendored
Normal file
1
plugins/cordova-sqlite-storage/node_modules/coffeescript/register.js
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
require('./lib/coffee-script/register');
|
||||
1
plugins/cordova-sqlite-storage/node_modules/coffeescript/repl.js
generated
vendored
Normal file
1
plugins/cordova-sqlite-storage/node_modules/coffeescript/repl.js
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
module.exports = require('./lib/coffee-script/repl');
|
||||
29
plugins/cordova-sqlite-storage/node_modules/cordova-sqlite-storage-dependencies/README.md
generated
vendored
Normal file
29
plugins/cordova-sqlite-storage/node_modules/cordova-sqlite-storage-dependencies/README.md
generated
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
# Cordova sqlite storage dependencies
|
||||
|
||||
**AUTHOR:** Christopher J. Brody
|
||||
|
||||
**LICENSE:** [Unlicense (unlicense.org)](http://unlicense.org/) (public domain)
|
||||
|
||||
Contains source and object code built from:
|
||||
- SQLite3 from [sqlite.org](http://sqlite.org/) (public domain)
|
||||
- [liteglue / Android-sqlite-native-driver](https://github.com/liteglue/Android-sqlite-native-driver) (Unlicense, public domain)
|
||||
- [brodybits / Android-sqlite-ext-native-driver (sqlite-storage-native-driver branch)](https://github.com/brodybits/Android-sqlite-ext-native-driver/tree/sqlite-storage-native-driver) (Unlicense, public domain)
|
||||
|
||||
This project provides the following dependencies needed to build [litehelpers / Cordova-sqlite-storage](https://github.com/litehelpers/Cordova-sqlite-storage):
|
||||
- `sqlite3.h`, `sqlite3.c` - SQLite `3.28.0` amalgamation needed to build iOS/macOS and Windows versions
|
||||
- `libs` - [liteglue / Android-sqlite-connector](https://github.com/liteglue/Android-sqlite-connector) and [brodybits / Android-sqlite-ext-native-driver (sqlite-storage-native-driver branch)](https://github.com/brodybits/Android-sqlite-ext-native-driver/tree/sqlite-storage-native-driver) JAR libraries built with SQLite `3.28.0` amalgamation, with the following flags:
|
||||
- `-DSQLITE_THREADSAFE=1`
|
||||
- `-DSQLITE_DEFAULT_SYNCHRONOUS=3`
|
||||
- `-DSQLITE_DEFAULT_MEMSTATUS=0`
|
||||
- `-DSQLITE_OMIT_DECLTYPE`
|
||||
- `-DSQLITE_OMIT_DEPRECATED`
|
||||
- `-DSQLITE_OMIT_PROGRESS_CALLBACK`
|
||||
- `-DSQLITE_OMIT_SHARED_CACHE`
|
||||
- `-DSQLITE_TEMP_STORE=2`
|
||||
- `-DSQLITE_OMIT_LOAD_EXTENSION`
|
||||
- `-DSQLITE_ENABLE_FTS3`
|
||||
- `-DSQLITE_ENABLE_FTS3_PARENTHESIS`
|
||||
- `-DSQLITE_ENABLE_FTS4`
|
||||
- `-DSQLITE_ENABLE_RTREE`
|
||||
- `-DSQLITE_DEFAULT_PAGE_SIZE=4096`
|
||||
- `-DSQLITE_DEFAULT_CACHE_SIZE=-2000`
|
||||
BIN
plugins/cordova-sqlite-storage/node_modules/cordova-sqlite-storage-dependencies/libs/sqlite-connector.jar
generated
vendored
Normal file
BIN
plugins/cordova-sqlite-storage/node_modules/cordova-sqlite-storage-dependencies/libs/sqlite-connector.jar
generated
vendored
Normal file
Binary file not shown.
BIN
plugins/cordova-sqlite-storage/node_modules/cordova-sqlite-storage-dependencies/libs/sqlite-native-driver.jar
generated
vendored
Normal file
BIN
plugins/cordova-sqlite-storage/node_modules/cordova-sqlite-storage-dependencies/libs/sqlite-native-driver.jar
generated
vendored
Normal file
Binary file not shown.
51
plugins/cordova-sqlite-storage/node_modules/cordova-sqlite-storage-dependencies/package.json
generated
vendored
Normal file
51
plugins/cordova-sqlite-storage/node_modules/cordova-sqlite-storage-dependencies/package.json
generated
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"_from": "cordova-sqlite-storage-dependencies@2.1.0",
|
||||
"_id": "cordova-sqlite-storage-dependencies@2.1.0",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-m0cPOWPzckAqS0/e7v+xtcM+FrHrw63qgh5T91JdkXMKCK8sN9bDoqVNJHZ5E9y7sRO7liMUIDm6Dz439RYqGA==",
|
||||
"_location": "/cordova-sqlite-storage-dependencies",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "version",
|
||||
"registry": true,
|
||||
"raw": "cordova-sqlite-storage-dependencies@2.1.0",
|
||||
"name": "cordova-sqlite-storage-dependencies",
|
||||
"escapedName": "cordova-sqlite-storage-dependencies",
|
||||
"rawSpec": "2.1.0",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "2.1.0"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/cordova-sqlite-storage-dependencies/-/cordova-sqlite-storage-dependencies-2.1.0.tgz",
|
||||
"_shasum": "374e13ca6d5dd5229b51167875e45e53a3ed2a76",
|
||||
"_spec": "cordova-sqlite-storage-dependencies@2.1.0",
|
||||
"_where": "/home/rajasekar/project/SineEdge/sineedgelenderapp/plugins/cordova-sqlite-storage",
|
||||
"author": {
|
||||
"name": "Christopher J. Brody"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/litehelpers/Cordova-sqlite-storage-dependencies/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"deprecated": false,
|
||||
"description": "Cordova sqlite storage dependencies",
|
||||
"homepage": "https://github.com/litehelpers/Cordova-sqlite-storage-dependencies#readme",
|
||||
"keywords": [
|
||||
"cordova",
|
||||
"sqlite",
|
||||
"amalgamation"
|
||||
],
|
||||
"license": "Unlicense",
|
||||
"main": "404.js",
|
||||
"name": "cordova-sqlite-storage-dependencies",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/litehelpers/Cordova-sqlite-storage-dependencies.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"version": "2.1.0"
|
||||
}
|
||||
222876
plugins/cordova-sqlite-storage/node_modules/cordova-sqlite-storage-dependencies/sqlite3.c
generated
vendored
Normal file
222876
plugins/cordova-sqlite-storage/node_modules/cordova-sqlite-storage-dependencies/sqlite3.c
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
11753
plugins/cordova-sqlite-storage/node_modules/cordova-sqlite-storage-dependencies/sqlite3.h
generated
vendored
Normal file
11753
plugins/cordova-sqlite-storage/node_modules/cordova-sqlite-storage-dependencies/sqlite3.h
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
100
plugins/cordova-sqlite-storage/node_modules/cross-spawn/CHANGELOG.md
generated
vendored
Normal file
100
plugins/cordova-sqlite-storage/node_modules/cross-spawn/CHANGELOG.md
generated
vendored
Normal file
@ -0,0 +1,100 @@
|
||||
# Change Log
|
||||
|
||||
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
||||
|
||||
<a name="6.0.5"></a>
|
||||
## [6.0.5](https://github.com/moxystudio/node-cross-spawn/compare/v6.0.4...v6.0.5) (2018-03-02)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* avoid using deprecated Buffer constructor ([#94](https://github.com/moxystudio/node-cross-spawn/issues/94)) ([d5770df](https://github.com/moxystudio/node-cross-spawn/commit/d5770df)), closes [/nodejs.org/api/deprecations.html#deprecations_dep0005](https://github.com//nodejs.org/api/deprecations.html/issues/deprecations_dep0005)
|
||||
|
||||
|
||||
|
||||
<a name="6.0.4"></a>
|
||||
## [6.0.4](https://github.com/moxystudio/node-cross-spawn/compare/v6.0.3...v6.0.4) (2018-01-31)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* fix paths being incorrectly normalized on unix ([06ee3c6](https://github.com/moxystudio/node-cross-spawn/commit/06ee3c6)), closes [#90](https://github.com/moxystudio/node-cross-spawn/issues/90)
|
||||
|
||||
|
||||
|
||||
<a name="6.0.3"></a>
|
||||
## [6.0.3](https://github.com/moxystudio/node-cross-spawn/compare/v6.0.2...v6.0.3) (2018-01-23)
|
||||
|
||||
|
||||
|
||||
<a name="6.0.2"></a>
|
||||
## [6.0.2](https://github.com/moxystudio/node-cross-spawn/compare/v6.0.1...v6.0.2) (2018-01-23)
|
||||
|
||||
|
||||
|
||||
<a name="6.0.1"></a>
|
||||
## [6.0.1](https://github.com/moxystudio/node-cross-spawn/compare/v6.0.0...v6.0.1) (2018-01-23)
|
||||
|
||||
|
||||
|
||||
<a name="6.0.0"></a>
|
||||
# [6.0.0](https://github.com/moxystudio/node-cross-spawn/compare/5.1.0...6.0.0) (2018-01-23)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* fix certain arguments not being correctly escaped or causing batch syntax error ([900cf10](https://github.com/moxystudio/node-cross-spawn/commit/900cf10)), closes [#82](https://github.com/moxystudio/node-cross-spawn/issues/82) [#51](https://github.com/moxystudio/node-cross-spawn/issues/51)
|
||||
* fix commands as posix relatixe paths not working correctly, e.g.: `./my-command` ([900cf10](https://github.com/moxystudio/node-cross-spawn/commit/900cf10))
|
||||
* fix `options` argument being mutated ([900cf10](https://github.com/moxystudio/node-cross-spawn/commit/900cf10))
|
||||
* fix commands resolution when PATH was actually Path ([900cf10](https://github.com/moxystudio/node-cross-spawn/commit/900cf10))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* improve compliance with node's ENOENT errors ([900cf10](https://github.com/moxystudio/node-cross-spawn/commit/900cf10))
|
||||
* improve detection of node's shell option support ([900cf10](https://github.com/moxystudio/node-cross-spawn/commit/900cf10))
|
||||
|
||||
|
||||
### Chores
|
||||
|
||||
* upgrade tooling
|
||||
* upgrate project to es6 (node v4)
|
||||
|
||||
|
||||
### BREAKING CHANGES
|
||||
|
||||
* remove support for older nodejs versions, only `node >= 4` is supported
|
||||
|
||||
|
||||
<a name="5.1.0"></a>
|
||||
## [5.1.0](https://github.com/moxystudio/node-cross-spawn/compare/5.0.1...5.1.0) (2017-02-26)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* fix `options.shell` support for NodeJS [v4.8](https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V4.md#4.8.0)
|
||||
|
||||
|
||||
<a name="5.0.1"></a>
|
||||
## [5.0.1](https://github.com/moxystudio/node-cross-spawn/compare/5.0.0...5.0.1) (2016-11-04)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* fix `options.shell` support for NodeJS v7
|
||||
|
||||
|
||||
<a name="5.0.0"></a>
|
||||
# [5.0.0](https://github.com/moxystudio/node-cross-spawn/compare/4.0.2...5.0.0) (2016-10-30)
|
||||
|
||||
|
||||
## Features
|
||||
|
||||
* add support for `options.shell`
|
||||
* improve parsing of shebangs by using [`shebang-command`](https://github.com/kevva/shebang-command) module
|
||||
|
||||
|
||||
## Chores
|
||||
|
||||
* refactor some code to make it more clear
|
||||
* update README caveats
|
||||
21
plugins/cordova-sqlite-storage/node_modules/cross-spawn/LICENSE
generated
vendored
Normal file
21
plugins/cordova-sqlite-storage/node_modules/cross-spawn/LICENSE
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2018 Made With MOXY Lda <hello@moxy.studio>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
94
plugins/cordova-sqlite-storage/node_modules/cross-spawn/README.md
generated
vendored
Normal file
94
plugins/cordova-sqlite-storage/node_modules/cross-spawn/README.md
generated
vendored
Normal file
@ -0,0 +1,94 @@
|
||||
# cross-spawn
|
||||
|
||||
[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Build status][appveyor-image]][appveyor-url] [![Coverage Status][codecov-image]][codecov-url] [![Dependency status][david-dm-image]][david-dm-url] [![Dev Dependency status][david-dm-dev-image]][david-dm-dev-url] [![Greenkeeper badge][greenkeeper-image]][greenkeeper-url]
|
||||
|
||||
[npm-url]:https://npmjs.org/package/cross-spawn
|
||||
[downloads-image]:http://img.shields.io/npm/dm/cross-spawn.svg
|
||||
[npm-image]:http://img.shields.io/npm/v/cross-spawn.svg
|
||||
[travis-url]:https://travis-ci.org/moxystudio/node-cross-spawn
|
||||
[travis-image]:http://img.shields.io/travis/moxystudio/node-cross-spawn/master.svg
|
||||
[appveyor-url]:https://ci.appveyor.com/project/satazor/node-cross-spawn
|
||||
[appveyor-image]:https://img.shields.io/appveyor/ci/satazor/node-cross-spawn/master.svg
|
||||
[codecov-url]:https://codecov.io/gh/moxystudio/node-cross-spawn
|
||||
[codecov-image]:https://img.shields.io/codecov/c/github/moxystudio/node-cross-spawn/master.svg
|
||||
[david-dm-url]:https://david-dm.org/moxystudio/node-cross-spawn
|
||||
[david-dm-image]:https://img.shields.io/david/moxystudio/node-cross-spawn.svg
|
||||
[david-dm-dev-url]:https://david-dm.org/moxystudio/node-cross-spawn?type=dev
|
||||
[david-dm-dev-image]:https://img.shields.io/david/dev/moxystudio/node-cross-spawn.svg
|
||||
[greenkeeper-image]:https://badges.greenkeeper.io/moxystudio/node-cross-spawn.svg
|
||||
[greenkeeper-url]:https://greenkeeper.io/
|
||||
|
||||
A cross platform solution to node's spawn and spawnSync.
|
||||
|
||||
|
||||
## Installation
|
||||
|
||||
`$ npm install cross-spawn`
|
||||
|
||||
|
||||
## Why
|
||||
|
||||
Node has issues when using spawn on Windows:
|
||||
|
||||
- It ignores [PATHEXT](https://github.com/joyent/node/issues/2318)
|
||||
- It does not support [shebangs](https://en.wikipedia.org/wiki/Shebang_(Unix))
|
||||
- Has problems running commands with [spaces](https://github.com/nodejs/node/issues/7367)
|
||||
- Has problems running commands with posix relative paths (e.g.: `./my-folder/my-executable`)
|
||||
- Has an [issue](https://github.com/moxystudio/node-cross-spawn/issues/82) with command shims (files in `node_modules/.bin/`), where arguments with quotes and parenthesis would result in [invalid syntax error](https://github.com/moxystudio/node-cross-spawn/blob/e77b8f22a416db46b6196767bcd35601d7e11d54/test/index.test.js#L149)
|
||||
- No `options.shell` support on node `<v4.8`
|
||||
|
||||
All these issues are handled correctly by `cross-spawn`.
|
||||
There are some known modules, such as [win-spawn](https://github.com/ForbesLindesay/win-spawn), that try to solve this but they are either broken or provide faulty escaping of shell arguments.
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
Exactly the same way as node's [`spawn`](https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options) or [`spawnSync`](https://nodejs.org/api/child_process.html#child_process_child_process_spawnsync_command_args_options), so it's a drop in replacement.
|
||||
|
||||
|
||||
```js
|
||||
const spawn = require('cross-spawn');
|
||||
|
||||
// Spawn NPM asynchronously
|
||||
const child = spawn('npm', ['list', '-g', '-depth', '0'], { stdio: 'inherit' });
|
||||
|
||||
// Spawn NPM synchronously
|
||||
const result = spawn.sync('npm', ['list', '-g', '-depth', '0'], { stdio: 'inherit' });
|
||||
```
|
||||
|
||||
|
||||
## Caveats
|
||||
|
||||
### Using `options.shell` as an alternative to `cross-spawn`
|
||||
|
||||
Starting from node `v4.8`, `spawn` has a `shell` option that allows you run commands from within a shell. This new option solves
|
||||
the [PATHEXT](https://github.com/joyent/node/issues/2318) issue but:
|
||||
|
||||
- It's not supported in node `<v4.8`
|
||||
- You must manually escape the command and arguments which is very error prone, specially when passing user input
|
||||
- There are a lot of other unresolved issues from the [Why](#why) section that you must take into account
|
||||
|
||||
If you are using the `shell` option to spawn a command in a cross platform way, consider using `cross-spawn` instead. You have been warned.
|
||||
|
||||
### `options.shell` support
|
||||
|
||||
While `cross-spawn` adds support for `options.shell` in node `<v4.8`, all of its enhancements are disabled.
|
||||
|
||||
This mimics the Node.js behavior. More specifically, the command and its arguments will not be automatically escaped nor shebang support will be offered. This is by design because if you are using `options.shell` you are probably targeting a specific platform anyway and you don't want things to get into your way.
|
||||
|
||||
### Shebangs support
|
||||
|
||||
While `cross-spawn` handles shebangs on Windows, its support is limited. More specifically, it just supports `#!/usr/bin/env <program>` where `<program>` must not contain any arguments.
|
||||
If you would like to have the shebang support improved, feel free to contribute via a pull-request.
|
||||
|
||||
Remember to always test your code on Windows!
|
||||
|
||||
|
||||
## Tests
|
||||
|
||||
`$ npm test`
|
||||
`$ npm test -- --watch` during development
|
||||
|
||||
## License
|
||||
|
||||
Released under the [MIT License](http://www.opensource.org/licenses/mit-license.php).
|
||||
39
plugins/cordova-sqlite-storage/node_modules/cross-spawn/index.js
generated
vendored
Normal file
39
plugins/cordova-sqlite-storage/node_modules/cross-spawn/index.js
generated
vendored
Normal file
@ -0,0 +1,39 @@
|
||||
'use strict';
|
||||
|
||||
const cp = require('child_process');
|
||||
const parse = require('./lib/parse');
|
||||
const enoent = require('./lib/enoent');
|
||||
|
||||
function spawn(command, args, options) {
|
||||
// Parse the arguments
|
||||
const parsed = parse(command, args, options);
|
||||
|
||||
// Spawn the child process
|
||||
const spawned = cp.spawn(parsed.command, parsed.args, parsed.options);
|
||||
|
||||
// Hook into child process "exit" event to emit an error if the command
|
||||
// does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16
|
||||
enoent.hookChildProcess(spawned, parsed);
|
||||
|
||||
return spawned;
|
||||
}
|
||||
|
||||
function spawnSync(command, args, options) {
|
||||
// Parse the arguments
|
||||
const parsed = parse(command, args, options);
|
||||
|
||||
// Spawn the child process
|
||||
const result = cp.spawnSync(parsed.command, parsed.args, parsed.options);
|
||||
|
||||
// Analyze if the command does not exist, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16
|
||||
result.error = result.error || enoent.verifyENOENTSync(result.status, parsed);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
module.exports = spawn;
|
||||
module.exports.spawn = spawn;
|
||||
module.exports.sync = spawnSync;
|
||||
|
||||
module.exports._parse = parse;
|
||||
module.exports._enoent = enoent;
|
||||
59
plugins/cordova-sqlite-storage/node_modules/cross-spawn/lib/enoent.js
generated
vendored
Normal file
59
plugins/cordova-sqlite-storage/node_modules/cross-spawn/lib/enoent.js
generated
vendored
Normal file
@ -0,0 +1,59 @@
|
||||
'use strict';
|
||||
|
||||
const isWin = process.platform === 'win32';
|
||||
|
||||
function notFoundError(original, syscall) {
|
||||
return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), {
|
||||
code: 'ENOENT',
|
||||
errno: 'ENOENT',
|
||||
syscall: `${syscall} ${original.command}`,
|
||||
path: original.command,
|
||||
spawnargs: original.args,
|
||||
});
|
||||
}
|
||||
|
||||
function hookChildProcess(cp, parsed) {
|
||||
if (!isWin) {
|
||||
return;
|
||||
}
|
||||
|
||||
const originalEmit = cp.emit;
|
||||
|
||||
cp.emit = function (name, arg1) {
|
||||
// If emitting "exit" event and exit code is 1, we need to check if
|
||||
// the command exists and emit an "error" instead
|
||||
// See https://github.com/IndigoUnited/node-cross-spawn/issues/16
|
||||
if (name === 'exit') {
|
||||
const err = verifyENOENT(arg1, parsed, 'spawn');
|
||||
|
||||
if (err) {
|
||||
return originalEmit.call(cp, 'error', err);
|
||||
}
|
||||
}
|
||||
|
||||
return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params
|
||||
};
|
||||
}
|
||||
|
||||
function verifyENOENT(status, parsed) {
|
||||
if (isWin && status === 1 && !parsed.file) {
|
||||
return notFoundError(parsed.original, 'spawn');
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function verifyENOENTSync(status, parsed) {
|
||||
if (isWin && status === 1 && !parsed.file) {
|
||||
return notFoundError(parsed.original, 'spawnSync');
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
hookChildProcess,
|
||||
verifyENOENT,
|
||||
verifyENOENTSync,
|
||||
notFoundError,
|
||||
};
|
||||
125
plugins/cordova-sqlite-storage/node_modules/cross-spawn/lib/parse.js
generated
vendored
Normal file
125
plugins/cordova-sqlite-storage/node_modules/cross-spawn/lib/parse.js
generated
vendored
Normal file
@ -0,0 +1,125 @@
|
||||
'use strict';
|
||||
|
||||
const path = require('path');
|
||||
const niceTry = require('nice-try');
|
||||
const resolveCommand = require('./util/resolveCommand');
|
||||
const escape = require('./util/escape');
|
||||
const readShebang = require('./util/readShebang');
|
||||
const semver = require('semver');
|
||||
|
||||
const isWin = process.platform === 'win32';
|
||||
const isExecutableRegExp = /\.(?:com|exe)$/i;
|
||||
const isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;
|
||||
|
||||
// `options.shell` is supported in Node ^4.8.0, ^5.7.0 and >= 6.0.0
|
||||
const supportsShellOption = niceTry(() => semver.satisfies(process.version, '^4.8.0 || ^5.7.0 || >= 6.0.0', true)) || false;
|
||||
|
||||
function detectShebang(parsed) {
|
||||
parsed.file = resolveCommand(parsed);
|
||||
|
||||
const shebang = parsed.file && readShebang(parsed.file);
|
||||
|
||||
if (shebang) {
|
||||
parsed.args.unshift(parsed.file);
|
||||
parsed.command = shebang;
|
||||
|
||||
return resolveCommand(parsed);
|
||||
}
|
||||
|
||||
return parsed.file;
|
||||
}
|
||||
|
||||
function parseNonShell(parsed) {
|
||||
if (!isWin) {
|
||||
return parsed;
|
||||
}
|
||||
|
||||
// Detect & add support for shebangs
|
||||
const commandFile = detectShebang(parsed);
|
||||
|
||||
// We don't need a shell if the command filename is an executable
|
||||
const needsShell = !isExecutableRegExp.test(commandFile);
|
||||
|
||||
// If a shell is required, use cmd.exe and take care of escaping everything correctly
|
||||
// Note that `forceShell` is an hidden option used only in tests
|
||||
if (parsed.options.forceShell || needsShell) {
|
||||
// Need to double escape meta chars if the command is a cmd-shim located in `node_modules/.bin/`
|
||||
// The cmd-shim simply calls execute the package bin file with NodeJS, proxying any argument
|
||||
// Because the escape of metachars with ^ gets interpreted when the cmd.exe is first called,
|
||||
// we need to double escape them
|
||||
const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile);
|
||||
|
||||
// Normalize posix paths into OS compatible paths (e.g.: foo/bar -> foo\bar)
|
||||
// This is necessary otherwise it will always fail with ENOENT in those cases
|
||||
parsed.command = path.normalize(parsed.command);
|
||||
|
||||
// Escape command & arguments
|
||||
parsed.command = escape.command(parsed.command);
|
||||
parsed.args = parsed.args.map((arg) => escape.argument(arg, needsDoubleEscapeMetaChars));
|
||||
|
||||
const shellCommand = [parsed.command].concat(parsed.args).join(' ');
|
||||
|
||||
parsed.args = ['/d', '/s', '/c', `"${shellCommand}"`];
|
||||
parsed.command = process.env.comspec || 'cmd.exe';
|
||||
parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped
|
||||
}
|
||||
|
||||
return parsed;
|
||||
}
|
||||
|
||||
function parseShell(parsed) {
|
||||
// If node supports the shell option, there's no need to mimic its behavior
|
||||
if (supportsShellOption) {
|
||||
return parsed;
|
||||
}
|
||||
|
||||
// Mimic node shell option
|
||||
// See https://github.com/nodejs/node/blob/b9f6a2dc059a1062776133f3d4fd848c4da7d150/lib/child_process.js#L335
|
||||
const shellCommand = [parsed.command].concat(parsed.args).join(' ');
|
||||
|
||||
if (isWin) {
|
||||
parsed.command = typeof parsed.options.shell === 'string' ? parsed.options.shell : process.env.comspec || 'cmd.exe';
|
||||
parsed.args = ['/d', '/s', '/c', `"${shellCommand}"`];
|
||||
parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped
|
||||
} else {
|
||||
if (typeof parsed.options.shell === 'string') {
|
||||
parsed.command = parsed.options.shell;
|
||||
} else if (process.platform === 'android') {
|
||||
parsed.command = '/system/bin/sh';
|
||||
} else {
|
||||
parsed.command = '/bin/sh';
|
||||
}
|
||||
|
||||
parsed.args = ['-c', shellCommand];
|
||||
}
|
||||
|
||||
return parsed;
|
||||
}
|
||||
|
||||
function parse(command, args, options) {
|
||||
// Normalize arguments, similar to nodejs
|
||||
if (args && !Array.isArray(args)) {
|
||||
options = args;
|
||||
args = null;
|
||||
}
|
||||
|
||||
args = args ? args.slice(0) : []; // Clone array to avoid changing the original
|
||||
options = Object.assign({}, options); // Clone object to avoid changing the original
|
||||
|
||||
// Build our parsed object
|
||||
const parsed = {
|
||||
command,
|
||||
args,
|
||||
options,
|
||||
file: undefined,
|
||||
original: {
|
||||
command,
|
||||
args,
|
||||
},
|
||||
};
|
||||
|
||||
// Delegate further parsing to shell or non-shell
|
||||
return options.shell ? parseShell(parsed) : parseNonShell(parsed);
|
||||
}
|
||||
|
||||
module.exports = parse;
|
||||
45
plugins/cordova-sqlite-storage/node_modules/cross-spawn/lib/util/escape.js
generated
vendored
Normal file
45
plugins/cordova-sqlite-storage/node_modules/cross-spawn/lib/util/escape.js
generated
vendored
Normal file
@ -0,0 +1,45 @@
|
||||
'use strict';
|
||||
|
||||
// See http://www.robvanderwoude.com/escapechars.php
|
||||
const metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g;
|
||||
|
||||
function escapeCommand(arg) {
|
||||
// Escape meta chars
|
||||
arg = arg.replace(metaCharsRegExp, '^$1');
|
||||
|
||||
return arg;
|
||||
}
|
||||
|
||||
function escapeArgument(arg, doubleEscapeMetaChars) {
|
||||
// Convert to string
|
||||
arg = `${arg}`;
|
||||
|
||||
// Algorithm below is based on https://qntm.org/cmd
|
||||
|
||||
// Sequence of backslashes followed by a double quote:
|
||||
// double up all the backslashes and escape the double quote
|
||||
arg = arg.replace(/(\\*)"/g, '$1$1\\"');
|
||||
|
||||
// Sequence of backslashes followed by the end of the string
|
||||
// (which will become a double quote later):
|
||||
// double up all the backslashes
|
||||
arg = arg.replace(/(\\*)$/, '$1$1');
|
||||
|
||||
// All other backslashes occur literally
|
||||
|
||||
// Quote the whole thing:
|
||||
arg = `"${arg}"`;
|
||||
|
||||
// Escape meta chars
|
||||
arg = arg.replace(metaCharsRegExp, '^$1');
|
||||
|
||||
// Double escape meta chars if necessary
|
||||
if (doubleEscapeMetaChars) {
|
||||
arg = arg.replace(metaCharsRegExp, '^$1');
|
||||
}
|
||||
|
||||
return arg;
|
||||
}
|
||||
|
||||
module.exports.command = escapeCommand;
|
||||
module.exports.argument = escapeArgument;
|
||||
32
plugins/cordova-sqlite-storage/node_modules/cross-spawn/lib/util/readShebang.js
generated
vendored
Normal file
32
plugins/cordova-sqlite-storage/node_modules/cross-spawn/lib/util/readShebang.js
generated
vendored
Normal file
@ -0,0 +1,32 @@
|
||||
'use strict';
|
||||
|
||||
const fs = require('fs');
|
||||
const shebangCommand = require('shebang-command');
|
||||
|
||||
function readShebang(command) {
|
||||
// Read the first 150 bytes from the file
|
||||
const size = 150;
|
||||
let buffer;
|
||||
|
||||
if (Buffer.alloc) {
|
||||
// Node.js v4.5+ / v5.10+
|
||||
buffer = Buffer.alloc(size);
|
||||
} else {
|
||||
// Old Node.js API
|
||||
buffer = new Buffer(size);
|
||||
buffer.fill(0); // zero-fill
|
||||
}
|
||||
|
||||
let fd;
|
||||
|
||||
try {
|
||||
fd = fs.openSync(command, 'r');
|
||||
fs.readSync(fd, buffer, 0, size, 0);
|
||||
fs.closeSync(fd);
|
||||
} catch (e) { /* Empty */ }
|
||||
|
||||
// Attempt to extract shebang (null is returned if not a shebang)
|
||||
return shebangCommand(buffer.toString());
|
||||
}
|
||||
|
||||
module.exports = readShebang;
|
||||
47
plugins/cordova-sqlite-storage/node_modules/cross-spawn/lib/util/resolveCommand.js
generated
vendored
Normal file
47
plugins/cordova-sqlite-storage/node_modules/cross-spawn/lib/util/resolveCommand.js
generated
vendored
Normal file
@ -0,0 +1,47 @@
|
||||
'use strict';
|
||||
|
||||
const path = require('path');
|
||||
const which = require('which');
|
||||
const pathKey = require('path-key')();
|
||||
|
||||
function resolveCommandAttempt(parsed, withoutPathExt) {
|
||||
const cwd = process.cwd();
|
||||
const hasCustomCwd = parsed.options.cwd != null;
|
||||
|
||||
// If a custom `cwd` was specified, we need to change the process cwd
|
||||
// because `which` will do stat calls but does not support a custom cwd
|
||||
if (hasCustomCwd) {
|
||||
try {
|
||||
process.chdir(parsed.options.cwd);
|
||||
} catch (err) {
|
||||
/* Empty */
|
||||
}
|
||||
}
|
||||
|
||||
let resolved;
|
||||
|
||||
try {
|
||||
resolved = which.sync(parsed.command, {
|
||||
path: (parsed.options.env || process.env)[pathKey],
|
||||
pathExt: withoutPathExt ? path.delimiter : undefined,
|
||||
});
|
||||
} catch (e) {
|
||||
/* Empty */
|
||||
} finally {
|
||||
process.chdir(cwd);
|
||||
}
|
||||
|
||||
// If we successfully resolved, ensure that an absolute path is returned
|
||||
// Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it
|
||||
if (resolved) {
|
||||
resolved = path.resolve(hasCustomCwd ? parsed.options.cwd : '', resolved);
|
||||
}
|
||||
|
||||
return resolved;
|
||||
}
|
||||
|
||||
function resolveCommand(parsed) {
|
||||
return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true);
|
||||
}
|
||||
|
||||
module.exports = resolveCommand;
|
||||
107
plugins/cordova-sqlite-storage/node_modules/cross-spawn/package.json
generated
vendored
Normal file
107
plugins/cordova-sqlite-storage/node_modules/cross-spawn/package.json
generated
vendored
Normal file
@ -0,0 +1,107 @@
|
||||
{
|
||||
"_from": "cross-spawn@^6.0.5",
|
||||
"_id": "cross-spawn@6.0.5",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
|
||||
"_location": "/cross-spawn",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "range",
|
||||
"registry": true,
|
||||
"raw": "cross-spawn@^6.0.5",
|
||||
"name": "cross-spawn",
|
||||
"escapedName": "cross-spawn",
|
||||
"rawSpec": "^6.0.5",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "^6.0.5"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"#DEV:/"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
|
||||
"_shasum": "4a5ec7c64dfae22c3a14124dbacdee846d80cbc4",
|
||||
"_spec": "cross-spawn@^6.0.5",
|
||||
"_where": "/home/rajasekar/project/SineEdge/sineedgelenderapp/plugins/cordova-sqlite-storage",
|
||||
"author": {
|
||||
"name": "André Cruz",
|
||||
"email": "andre@moxy.studio"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/moxystudio/node-cross-spawn/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"commitlint": {
|
||||
"extends": [
|
||||
"@commitlint/config-conventional"
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"nice-try": "^1.0.4",
|
||||
"path-key": "^2.0.1",
|
||||
"semver": "^5.5.0",
|
||||
"shebang-command": "^1.2.0",
|
||||
"which": "^1.2.9"
|
||||
},
|
||||
"deprecated": false,
|
||||
"description": "Cross platform child_process#spawn and child_process#spawnSync",
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^6.0.0",
|
||||
"@commitlint/config-conventional": "^6.0.2",
|
||||
"babel-core": "^6.26.0",
|
||||
"babel-jest": "^22.1.0",
|
||||
"babel-preset-moxy": "^2.2.1",
|
||||
"eslint": "^4.3.0",
|
||||
"eslint-config-moxy": "^5.0.0",
|
||||
"husky": "^0.14.3",
|
||||
"jest": "^22.0.0",
|
||||
"lint-staged": "^7.0.0",
|
||||
"mkdirp": "^0.5.1",
|
||||
"regenerator-runtime": "^0.11.1",
|
||||
"rimraf": "^2.6.2",
|
||||
"standard-version": "^4.2.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4.8"
|
||||
},
|
||||
"files": [
|
||||
"lib"
|
||||
],
|
||||
"homepage": "https://github.com/moxystudio/node-cross-spawn",
|
||||
"keywords": [
|
||||
"spawn",
|
||||
"spawnSync",
|
||||
"windows",
|
||||
"cross-platform",
|
||||
"path-ext",
|
||||
"shebang",
|
||||
"cmd",
|
||||
"execute"
|
||||
],
|
||||
"license": "MIT",
|
||||
"lint-staged": {
|
||||
"*.js": [
|
||||
"eslint --fix",
|
||||
"git add"
|
||||
]
|
||||
},
|
||||
"main": "index.js",
|
||||
"name": "cross-spawn",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+ssh://git@github.com/moxystudio/node-cross-spawn.git"
|
||||
},
|
||||
"scripts": {
|
||||
"commitmsg": "commitlint -e $GIT_PARAMS",
|
||||
"lint": "eslint .",
|
||||
"precommit": "lint-staged",
|
||||
"prerelease": "npm t && npm run lint",
|
||||
"release": "standard-version",
|
||||
"test": "jest --env node --coverage"
|
||||
},
|
||||
"standard-version": {
|
||||
"scripts": {
|
||||
"posttag": "git push --follow-tags origin master && npm publish"
|
||||
}
|
||||
},
|
||||
"version": "6.0.5"
|
||||
}
|
||||
864
plugins/cordova-sqlite-storage/node_modules/fs-extra/CHANGELOG.md
generated
vendored
Normal file
864
plugins/cordova-sqlite-storage/node_modules/fs-extra/CHANGELOG.md
generated
vendored
Normal file
@ -0,0 +1,864 @@
|
||||
8.1.0 / 2019-06-28
|
||||
------------------
|
||||
|
||||
- Add support for promisified `fs.realpath.native` in Node v9.2+ ([#650](https://github.com/jprichardson/node-fs-extra/issues/650), [#682](https://github.com/jprichardson/node-fs-extra/pull/682))
|
||||
- Update `graceful-fs` dependency ([#700](https://github.com/jprichardson/node-fs-extra/pull/700))
|
||||
- Use `graceful-fs` everywhere ([#700](https://github.com/jprichardson/node-fs-extra/pull/700))
|
||||
|
||||
8.0.1 / 2019-05-13
|
||||
------------------
|
||||
|
||||
- Fix bug `Maximum call stack size exceeded` error in `util/stat` ([#679](https://github.com/jprichardson/node-fs-extra/pull/679))
|
||||
|
||||
8.0.0 / 2019-05-11
|
||||
------------------
|
||||
|
||||
**NOTE:** Node.js v6 support is deprecated, and will be dropped in the next major release.
|
||||
|
||||
- Use `renameSync()` under the hood in `moveSync()`
|
||||
- Fix bug with bind-mounted directories in `copy*()` ([#613](https://github.com/jprichardson/node-fs-extra/issues/613), [#618](https://github.com/jprichardson/node-fs-extra/pull/618))
|
||||
- Fix bug in `move()` with case-insensitive file systems
|
||||
- Use `fs.stat()`'s `bigint` option in `copy*()` & `move*()` where possible ([#657](https://github.com/jprichardson/node-fs-extra/issues/657))
|
||||
|
||||
7.0.1 / 2018-11-07
|
||||
------------------
|
||||
|
||||
- Fix `removeSync()` on Windows, in some cases, it would error out with `ENOTEMPTY` ([#646](https://github.com/jprichardson/node-fs-extra/pull/646))
|
||||
- Document `mode` option for `ensureDir*()` ([#587](https://github.com/jprichardson/node-fs-extra/pull/587))
|
||||
- Don't include documentation files in npm package tarball ([#642](https://github.com/jprichardson/node-fs-extra/issues/642), [#643](https://github.com/jprichardson/node-fs-extra/pull/643))
|
||||
|
||||
7.0.0 / 2018-07-16
|
||||
------------------
|
||||
|
||||
- **BREAKING:** Refine `copy*()` handling of symlinks to properly detect symlinks that point to the same file. ([#582](https://github.com/jprichardson/node-fs-extra/pull/582))
|
||||
- Fix bug with copying write-protected directories ([#600](https://github.com/jprichardson/node-fs-extra/pull/600))
|
||||
- Universalify `fs.lchmod()` ([#596](https://github.com/jprichardson/node-fs-extra/pull/596))
|
||||
- Add `engines` field to `package.json` ([#580](https://github.com/jprichardson/node-fs-extra/pull/580))
|
||||
|
||||
6.0.1 / 2018-05-09
|
||||
------------------
|
||||
|
||||
- Fix `fs.promises` `ExperimentalWarning` on Node v10.1.0 ([#578](https://github.com/jprichardson/node-fs-extra/pull/578))
|
||||
|
||||
6.0.0 / 2018-05-01
|
||||
------------------
|
||||
|
||||
- Drop support for Node.js versions 4, 5, & 7 ([#564](https://github.com/jprichardson/node-fs-extra/pull/564))
|
||||
- Rewrite `move` to use `fs.rename` where possible ([#549](https://github.com/jprichardson/node-fs-extra/pull/549))
|
||||
- Don't convert relative paths to absolute paths for `filter` ([#554](https://github.com/jprichardson/node-fs-extra/pull/554))
|
||||
- `copy*`'s behavior when `preserveTimestamps` is `false` has been OS-dependent since 5.0.0, but that's now explicitly noted in the docs ([#563](https://github.com/jprichardson/node-fs-extra/pull/563))
|
||||
- Fix subdirectory detection for `copy*` & `move*` ([#541](https://github.com/jprichardson/node-fs-extra/pull/541))
|
||||
- Handle case-insensitive paths correctly in `copy*` ([#568](https://github.com/jprichardson/node-fs-extra/pull/568))
|
||||
|
||||
5.0.0 / 2017-12-11
|
||||
------------------
|
||||
|
||||
Significant refactor of `copy()` & `copySync()`, including breaking changes. No changes to other functions in this release.
|
||||
|
||||
Huge thanks to **[@manidlou](https://github.com/manidlou)** for doing most of the work on this release.
|
||||
|
||||
- The `filter` option can no longer be a RegExp (must be a function). This was deprecated since fs-extra v1.0.0. [#512](https://github.com/jprichardson/node-fs-extra/pull/512)
|
||||
- `copy()`'s `filter` option can now be a function that returns a Promise. [#518](https://github.com/jprichardson/node-fs-extra/pull/518)
|
||||
- `copy()` & `copySync()` now use `fs.copyFile()`/`fs.copyFileSync()` in environments that support it (currently Node 8.5.0+). Older Node versions still get the old implementation. [#505](https://github.com/jprichardson/node-fs-extra/pull/505)
|
||||
- Don't allow copying a directory into itself. [#83](https://github.com/jprichardson/node-fs-extra/issues/83)
|
||||
- Handle copying between identical files. [#198](https://github.com/jprichardson/node-fs-extra/issues/198)
|
||||
- Error out when copying an empty folder to a path that already exists. [#464](https://github.com/jprichardson/node-fs-extra/issues/464)
|
||||
- Don't create `dest`'s parent if the `filter` function aborts the `copy()` operation. [#517](https://github.com/jprichardson/node-fs-extra/pull/517)
|
||||
- Fix `writeStream` not being closed if there was an error in `copy()`. [#516](https://github.com/jprichardson/node-fs-extra/pull/516)
|
||||
|
||||
4.0.3 / 2017-12-05
|
||||
------------------
|
||||
|
||||
- Fix wrong `chmod` values in `fs.remove()` [#501](https://github.com/jprichardson/node-fs-extra/pull/501)
|
||||
- Fix `TypeError` on systems that don't have some `fs` operations like `lchown` [#520](https://github.com/jprichardson/node-fs-extra/pull/520)
|
||||
|
||||
4.0.2 / 2017-09-12
|
||||
------------------
|
||||
|
||||
- Added `EOL` option to `writeJson*` & `outputJson*` (via upgrade to jsonfile v4)
|
||||
- Added promise support to [`fs.copyFile()`](https://nodejs.org/api/fs.html#fs_fs_copyfile_src_dest_flags_callback) in Node 8.5+
|
||||
- Added `.js` extension to `main` field in `package.json` for better tooling compatibility. [#485](https://github.com/jprichardson/node-fs-extra/pull/485)
|
||||
|
||||
4.0.1 / 2017-07-31
|
||||
------------------
|
||||
|
||||
### Fixed
|
||||
|
||||
- Previously, `ensureFile()` & `ensureFileSync()` would do nothing if the path was a directory. Now, they error out for consistency with `ensureDir()`. [#465](https://github.com/jprichardson/node-fs-extra/issues/465), [#466](https://github.com/jprichardson/node-fs-extra/pull/466), [#470](https://github.com/jprichardson/node-fs-extra/issues/470)
|
||||
|
||||
4.0.0 / 2017-07-14
|
||||
------------------
|
||||
|
||||
### Changed
|
||||
|
||||
- **BREAKING:** The promisified versions of `fs.read()` & `fs.write()` now return objects. See [the docs](docs/fs-read-write.md) for details. [#436](https://github.com/jprichardson/node-fs-extra/issues/436), [#449](https://github.com/jprichardson/node-fs-extra/pull/449)
|
||||
- `fs.move()` now errors out when destination is a subdirectory of source. [#458](https://github.com/jprichardson/node-fs-extra/pull/458)
|
||||
- Applied upstream fixes from `rimraf` to `fs.remove()` & `fs.removeSync()`. [#459](https://github.com/jprichardson/node-fs-extra/pull/459)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Got `fs.outputJSONSync()` working again; it was broken due to refactoring. [#428](https://github.com/jprichardson/node-fs-extra/pull/428)
|
||||
|
||||
Also clarified the docs in a few places.
|
||||
|
||||
3.0.1 / 2017-05-04
|
||||
------------------
|
||||
|
||||
- Fix bug in `move()` & `moveSync()` when source and destination are the same, and source does not exist. [#415](https://github.com/jprichardson/node-fs-extra/pull/415)
|
||||
|
||||
3.0.0 / 2017-04-27
|
||||
------------------
|
||||
|
||||
### Added
|
||||
|
||||
- **BREAKING:** Added Promise support. All asynchronous native fs methods and fs-extra methods now return a promise if the callback is not passed. [#403](https://github.com/jprichardson/node-fs-extra/pull/403)
|
||||
- `pathExists()`, a replacement for the deprecated `fs.exists`. `pathExists` has a normal error-first callback signature. Also added `pathExistsSync`, an alias to `fs.existsSync`, for completeness. [#406](https://github.com/jprichardson/node-fs-extra/pull/406)
|
||||
|
||||
### Removed
|
||||
|
||||
- **BREAKING:** Removed support for setting the default spaces for `writeJson()`, `writeJsonSync()`, `outputJson()`, & `outputJsonSync()`. This was undocumented. [#402](https://github.com/jprichardson/node-fs-extra/pull/402)
|
||||
|
||||
### Changed
|
||||
|
||||
- Upgraded jsonfile dependency to v3.0.0:
|
||||
- **BREAKING:** Changed behavior of `throws` option for `readJsonSync()`; now does not throw filesystem errors when `throws` is `false`.
|
||||
- **BREAKING:** `writeJson()`, `writeJsonSync()`, `outputJson()`, & `outputJsonSync()` now output minified JSON by default for consistency with `JSON.stringify()`; set the `spaces` option to `2` to override this new behavior. [#402](https://github.com/jprichardson/node-fs-extra/pull/402)
|
||||
- Use `Buffer.allocUnsafe()` instead of `new Buffer()` in environments that support it. [#394](https://github.com/jprichardson/node-fs-extra/pull/394)
|
||||
|
||||
### Fixed
|
||||
|
||||
- `removeSync()` silently failed on Windows in some cases. Now throws an `EBUSY` error. [#408](https://github.com/jprichardson/node-fs-extra/pull/408)
|
||||
|
||||
2.1.2 / 2017-03-16
|
||||
------------------
|
||||
|
||||
### Fixed
|
||||
|
||||
- Weird windows bug that resulted in `ensureDir()`'s callback being called twice in some cases. This bug may have also affected `remove()`. See [#392](https://github.com/jprichardson/node-fs-extra/issues/392), [#393](https://github.com/jprichardson/node-fs-extra/pull/393)
|
||||
|
||||
2.1.1 / 2017-03-15
|
||||
------------------
|
||||
|
||||
### Fixed
|
||||
|
||||
- Reverted [`5597bd`](https://github.com/jprichardson/node-fs-extra/commit/5597bd5b67f7d060f5f5bf26e9635be48330f5d7), this broke compatibility with Node.js versions v4+ but less than `v4.5.0`.
|
||||
- Remove `Buffer.alloc()` usage in `moveSync()`.
|
||||
|
||||
2.1.0 / 2017-03-15
|
||||
------------------
|
||||
|
||||
Thanks to [Mani Maghsoudlou (@manidlou)](https://github.com/manidlou) & [Jan Peer Stöcklmair (@JPeer264)](https://github.com/JPeer264) for their extraordinary help with this release!
|
||||
|
||||
### Added
|
||||
- `moveSync()` See [#309], [#381](https://github.com/jprichardson/node-fs-extra/pull/381). ([@manidlou](https://github.com/manidlou))
|
||||
- `copy()` and `copySync()`'s `filter` option now gets the destination path passed as the second parameter. [#366](https://github.com/jprichardson/node-fs-extra/pull/366) ([@manidlou](https://github.com/manidlou))
|
||||
|
||||
### Changed
|
||||
- Use `Buffer.alloc()` instead of deprecated `new Buffer()` in `copySync()`. [#380](https://github.com/jprichardson/node-fs-extra/pull/380) ([@manidlou](https://github.com/manidlou))
|
||||
- Refactored entire codebase to use ES6 features supported by Node.js v4+ [#355](https://github.com/jprichardson/node-fs-extra/issues/355). [(@JPeer264)](https://github.com/JPeer264)
|
||||
- Refactored docs. ([@manidlou](https://github.com/manidlou))
|
||||
|
||||
### Fixed
|
||||
|
||||
- `move()` shouldn't error out when source and dest are the same. [#377](https://github.com/jprichardson/node-fs-extra/issues/377), [#378](https://github.com/jprichardson/node-fs-extra/pull/378) ([@jdalton](https://github.com/jdalton))
|
||||
|
||||
2.0.0 / 2017-01-16
|
||||
------------------
|
||||
|
||||
### Removed
|
||||
- **BREAKING:** Removed support for Node `v0.12`. The Node foundation stopped officially supporting it
|
||||
on Jan 1st, 2017.
|
||||
- **BREAKING:** Remove `walk()` and `walkSync()`. `walkSync()` was only part of `fs-extra` for a little
|
||||
over two months. Use [klaw](https://github.com/jprichardson/node-klaw) instead of `walk()`, in fact, `walk()` was just
|
||||
an alias to klaw. For `walkSync()` use [klaw-sync](https://github.com/mawni/node-klaw-sync). See: [#338], [#339]
|
||||
|
||||
### Changed
|
||||
- **BREAKING:** Renamed `clobber` to `overwrite`. This affects `copy()`, `copySync()`, and `move()`. [#330], [#333]
|
||||
- Moved docs, to `docs/`. [#340]
|
||||
|
||||
### Fixed
|
||||
- Apply filters to directories in `copySync()` like in `copy()`. [#324]
|
||||
- A specific condition when disk is under heavy use, `copy()` can fail. [#326]
|
||||
|
||||
|
||||
1.0.0 / 2016-11-01
|
||||
------------------
|
||||
|
||||
After five years of development, we finally have reach the 1.0.0 milestone! Big thanks goes
|
||||
to [Ryan Zim](https://github.com/RyanZim) for leading the charge on this release!
|
||||
|
||||
### Added
|
||||
- `walkSync()`
|
||||
|
||||
### Changed
|
||||
- **BREAKING**: dropped Node v0.10 support.
|
||||
- disabled `rimaf` globbing, wasn't used. [#280]
|
||||
- deprecate `copy()/copySync()` option `filter` if it's a `RegExp`. `filter` should now be a function.
|
||||
- inline `rimraf`. This is temporary and was done because `rimraf` depended upon the beefy `glob` which `fs-extra` does not use. [#300]
|
||||
|
||||
### Fixed
|
||||
- bug fix proper closing of file handle on `utimesMillis()` [#271]
|
||||
- proper escaping of files with dollar signs [#291]
|
||||
- `copySync()` failed if user didn't own file. [#199], [#301]
|
||||
|
||||
|
||||
0.30.0 / 2016-04-28
|
||||
-------------------
|
||||
- Brought back Node v0.10 support. I didn't realize there was still demand. Official support will end **2016-10-01**.
|
||||
|
||||
0.29.0 / 2016-04-27
|
||||
-------------------
|
||||
- **BREAKING**: removed support for Node v0.10. If you still want to use Node v0.10, everything should work except for `ensureLink()/ensureSymlink()`. Node v0.12 is still supported but will be dropped in the near future as well.
|
||||
|
||||
0.28.0 / 2016-04-17
|
||||
-------------------
|
||||
- **BREAKING**: removed `createOutputStream()`. Use https://www.npmjs.com/package/create-output-stream. See: [#192][#192]
|
||||
- `mkdirs()/mkdirsSync()` check for invalid win32 path chars. See: [#209][#209], [#237][#237]
|
||||
- `mkdirs()/mkdirsSync()` if drive not mounted, error. See: [#93][#93]
|
||||
|
||||
0.27.0 / 2016-04-15
|
||||
-------------------
|
||||
- add `dereference` option to `copySync()`. [#235][#235]
|
||||
|
||||
0.26.7 / 2016-03-16
|
||||
-------------------
|
||||
- fixed `copy()` if source and dest are the same. [#230][#230]
|
||||
|
||||
0.26.6 / 2016-03-15
|
||||
-------------------
|
||||
- fixed if `emptyDir()` does not have a callback: [#229][#229]
|
||||
|
||||
0.26.5 / 2016-01-27
|
||||
-------------------
|
||||
- `copy()` with two arguments (w/o callback) was broken. See: [#215][#215]
|
||||
|
||||
0.26.4 / 2016-01-05
|
||||
-------------------
|
||||
- `copySync()` made `preserveTimestamps` default consistent with `copy()` which is `false`. See: [#208][#208]
|
||||
|
||||
0.26.3 / 2015-12-17
|
||||
-------------------
|
||||
- fixed `copy()` hangup in copying blockDevice / characterDevice / `/dev/null`. See: [#193][#193]
|
||||
|
||||
0.26.2 / 2015-11-02
|
||||
-------------------
|
||||
- fixed `outputJson{Sync}()` spacing adherence to `fs.spaces`
|
||||
|
||||
0.26.1 / 2015-11-02
|
||||
-------------------
|
||||
- fixed `copySync()` when `clogger=true` and the destination is read only. See: [#190][#190]
|
||||
|
||||
0.26.0 / 2015-10-25
|
||||
-------------------
|
||||
- extracted the `walk()` function into its own module [`klaw`](https://github.com/jprichardson/node-klaw).
|
||||
|
||||
0.25.0 / 2015-10-24
|
||||
-------------------
|
||||
- now has a file walker `walk()`
|
||||
|
||||
0.24.0 / 2015-08-28
|
||||
-------------------
|
||||
- removed alias `delete()` and `deleteSync()`. See: [#171][#171]
|
||||
|
||||
0.23.1 / 2015-08-07
|
||||
-------------------
|
||||
- Better handling of errors for `move()` when moving across devices. [#170][#170]
|
||||
- `ensureSymlink()` and `ensureLink()` should not throw errors if link exists. [#169][#169]
|
||||
|
||||
0.23.0 / 2015-08-06
|
||||
-------------------
|
||||
- added `ensureLink{Sync}()` and `ensureSymlink{Sync}()`. See: [#165][#165]
|
||||
|
||||
0.22.1 / 2015-07-09
|
||||
-------------------
|
||||
- Prevent calling `hasMillisResSync()` on module load. See: [#149][#149].
|
||||
Fixes regression that was introduced in `0.21.0`.
|
||||
|
||||
0.22.0 / 2015-07-09
|
||||
-------------------
|
||||
- preserve permissions / ownership in `copy()`. See: [#54][#54]
|
||||
|
||||
0.21.0 / 2015-07-04
|
||||
-------------------
|
||||
- add option to preserve timestamps in `copy()` and `copySync()`. See: [#141][#141]
|
||||
- updated `graceful-fs@3.x` to `4.x`. This brings in features from `amazing-graceful-fs` (much cleaner code / less hacks)
|
||||
|
||||
0.20.1 / 2015-06-23
|
||||
-------------------
|
||||
- fixed regression caused by latest jsonfile update: See: https://github.com/jprichardson/node-jsonfile/issues/26
|
||||
|
||||
0.20.0 / 2015-06-19
|
||||
-------------------
|
||||
- removed `jsonfile` aliases with `File` in the name, they weren't documented and probably weren't in use e.g.
|
||||
this package had both `fs.readJsonFile` and `fs.readJson` that were aliases to each other, now use `fs.readJson`.
|
||||
- preliminary walker created. Intentionally not documented. If you use it, it will almost certainly change and break your code.
|
||||
- started moving tests inline
|
||||
- upgraded to `jsonfile@2.1.0`, can now pass JSON revivers/replacers to `readJson()`, `writeJson()`, `outputJson()`
|
||||
|
||||
0.19.0 / 2015-06-08
|
||||
-------------------
|
||||
- `fs.copy()` had support for Node v0.8, dropped support
|
||||
|
||||
0.18.4 / 2015-05-22
|
||||
-------------------
|
||||
- fixed license field according to this: [#136][#136] and https://github.com/npm/npm/releases/tag/v2.10.0
|
||||
|
||||
0.18.3 / 2015-05-08
|
||||
-------------------
|
||||
- bugfix: handle `EEXIST` when clobbering on some Linux systems. [#134][#134]
|
||||
|
||||
0.18.2 / 2015-04-17
|
||||
-------------------
|
||||
- bugfix: allow `F_OK` ([#120][#120])
|
||||
|
||||
0.18.1 / 2015-04-15
|
||||
-------------------
|
||||
- improved windows support for `move()` a bit. https://github.com/jprichardson/node-fs-extra/commit/92838980f25dc2ee4ec46b43ee14d3c4a1d30c1b
|
||||
- fixed a lot of tests for Windows (appveyor)
|
||||
|
||||
0.18.0 / 2015-03-31
|
||||
-------------------
|
||||
- added `emptyDir()` and `emptyDirSync()`
|
||||
|
||||
0.17.0 / 2015-03-28
|
||||
-------------------
|
||||
- `copySync` added `clobber` option (before always would clobber, now if `clobber` is `false` it throws an error if the destination exists).
|
||||
**Only works with files at the moment.**
|
||||
- `createOutputStream()` added. See: [#118][#118]
|
||||
|
||||
0.16.5 / 2015-03-08
|
||||
-------------------
|
||||
- fixed `fs.move` when `clobber` is `true` and destination is a directory, it should clobber. [#114][#114]
|
||||
|
||||
0.16.4 / 2015-03-01
|
||||
-------------------
|
||||
- `fs.mkdirs` fix infinite loop on Windows. See: See https://github.com/substack/node-mkdirp/pull/74 and https://github.com/substack/node-mkdirp/issues/66
|
||||
|
||||
0.16.3 / 2015-01-28
|
||||
-------------------
|
||||
- reverted https://github.com/jprichardson/node-fs-extra/commit/1ee77c8a805eba5b99382a2591ff99667847c9c9
|
||||
|
||||
|
||||
0.16.2 / 2015-01-28
|
||||
-------------------
|
||||
- fixed `fs.copy` for Node v0.8 (support is temporary and will be removed in the near future)
|
||||
|
||||
0.16.1 / 2015-01-28
|
||||
-------------------
|
||||
- if `setImmediate` is not available, fall back to `process.nextTick`
|
||||
|
||||
0.16.0 / 2015-01-28
|
||||
-------------------
|
||||
- bugfix `fs.move()` into itself. Closes [#104]
|
||||
- bugfix `fs.move()` moving directory across device. Closes [#108]
|
||||
- added coveralls support
|
||||
- bugfix: nasty multiple callback `fs.copy()` bug. Closes [#98]
|
||||
- misc fs.copy code cleanups
|
||||
|
||||
0.15.0 / 2015-01-21
|
||||
-------------------
|
||||
- dropped `ncp`, imported code in
|
||||
- because of previous, now supports `io.js`
|
||||
- `graceful-fs` is now a dependency
|
||||
|
||||
0.14.0 / 2015-01-05
|
||||
-------------------
|
||||
- changed `copy`/`copySync` from `fs.copy(src, dest, [filters], callback)` to `fs.copy(src, dest, [options], callback)` [#100][#100]
|
||||
- removed mockfs tests for mkdirp (this may be temporary, but was getting in the way of other tests)
|
||||
|
||||
0.13.0 / 2014-12-10
|
||||
-------------------
|
||||
- removed `touch` and `touchSync` methods (they didn't handle permissions like UNIX touch)
|
||||
- updated `"ncp": "^0.6.0"` to `"ncp": "^1.0.1"`
|
||||
- imported `mkdirp` => `minimist` and `mkdirp` are no longer dependences, should now appease people who wanted `mkdirp` to be `--use_strict` safe. See [#59]([#59][#59])
|
||||
|
||||
0.12.0 / 2014-09-22
|
||||
-------------------
|
||||
- copy symlinks in `copySync()` [#85][#85]
|
||||
|
||||
0.11.1 / 2014-09-02
|
||||
-------------------
|
||||
- bugfix `copySync()` preserve file permissions [#80][#80]
|
||||
|
||||
0.11.0 / 2014-08-11
|
||||
-------------------
|
||||
- upgraded `"ncp": "^0.5.1"` to `"ncp": "^0.6.0"`
|
||||
- upgrade `jsonfile": "^1.2.0"` to `jsonfile": "^2.0.0"` => on write, json files now have `\n` at end. Also adds `options.throws` to `readJsonSync()`
|
||||
see https://github.com/jprichardson/node-jsonfile#readfilesyncfilename-options for more details.
|
||||
|
||||
0.10.0 / 2014-06-29
|
||||
------------------
|
||||
* bugfix: upgaded `"jsonfile": "~1.1.0"` to `"jsonfile": "^1.2.0"`, bumped minor because of `jsonfile` dep change
|
||||
from `~` to `^`. [#67]
|
||||
|
||||
0.9.1 / 2014-05-22
|
||||
------------------
|
||||
* removed Node.js `0.8.x` support, `0.9.0` was published moments ago and should have been done there
|
||||
|
||||
0.9.0 / 2014-05-22
|
||||
------------------
|
||||
* upgraded `ncp` from `~0.4.2` to `^0.5.1`, [#58]
|
||||
* upgraded `rimraf` from `~2.2.6` to `^2.2.8`
|
||||
* upgraded `mkdirp` from `0.3.x` to `^0.5.0`
|
||||
* added methods `ensureFile()`, `ensureFileSync()`
|
||||
* added methods `ensureDir()`, `ensureDirSync()` [#31]
|
||||
* added `move()` method. From: https://github.com/andrewrk/node-mv
|
||||
|
||||
|
||||
0.8.1 / 2013-10-24
|
||||
------------------
|
||||
* copy failed to return an error to the callback if a file doesn't exist (ulikoehler [#38], [#39])
|
||||
|
||||
0.8.0 / 2013-10-14
|
||||
------------------
|
||||
* `filter` implemented on `copy()` and `copySync()`. (Srirangan / [#36])
|
||||
|
||||
0.7.1 / 2013-10-12
|
||||
------------------
|
||||
* `copySync()` implemented (Srirangan / [#33])
|
||||
* updated to the latest `jsonfile` version `1.1.0` which gives `options` params for the JSON methods. Closes [#32]
|
||||
|
||||
0.7.0 / 2013-10-07
|
||||
------------------
|
||||
* update readme conventions
|
||||
* `copy()` now works if destination directory does not exist. Closes [#29]
|
||||
|
||||
0.6.4 / 2013-09-05
|
||||
------------------
|
||||
* changed `homepage` field in package.json to remove NPM warning
|
||||
|
||||
0.6.3 / 2013-06-28
|
||||
------------------
|
||||
* changed JSON spacing default from `4` to `2` to follow Node conventions
|
||||
* updated `jsonfile` dep
|
||||
* updated `rimraf` dep
|
||||
|
||||
0.6.2 / 2013-06-28
|
||||
------------------
|
||||
* added .npmignore, [#25]
|
||||
|
||||
0.6.1 / 2013-05-14
|
||||
------------------
|
||||
* modified for `strict` mode, closes [#24]
|
||||
* added `outputJson()/outputJsonSync()`, closes [#23]
|
||||
|
||||
0.6.0 / 2013-03-18
|
||||
------------------
|
||||
* removed node 0.6 support
|
||||
* added node 0.10 support
|
||||
* upgraded to latest `ncp` and `rimraf`.
|
||||
* optional `graceful-fs` support. Closes [#17]
|
||||
|
||||
|
||||
0.5.0 / 2013-02-03
|
||||
------------------
|
||||
* Removed `readTextFile`.
|
||||
* Renamed `readJSONFile` to `readJSON` and `readJson`, same with write.
|
||||
* Restructured documentation a bit. Added roadmap.
|
||||
|
||||
0.4.0 / 2013-01-28
|
||||
------------------
|
||||
* Set default spaces in `jsonfile` from 4 to 2.
|
||||
* Updated `testutil` deps for tests.
|
||||
* Renamed `touch()` to `createFile()`
|
||||
* Added `outputFile()` and `outputFileSync()`
|
||||
* Changed creation of testing diretories so the /tmp dir is not littered.
|
||||
* Added `readTextFile()` and `readTextFileSync()`.
|
||||
|
||||
0.3.2 / 2012-11-01
|
||||
------------------
|
||||
* Added `touch()` and `touchSync()` methods.
|
||||
|
||||
0.3.1 / 2012-10-11
|
||||
------------------
|
||||
* Fixed some stray globals.
|
||||
|
||||
0.3.0 / 2012-10-09
|
||||
------------------
|
||||
* Removed all CoffeeScript from tests.
|
||||
* Renamed `mkdir` to `mkdirs`/`mkdirp`.
|
||||
|
||||
0.2.1 / 2012-09-11
|
||||
------------------
|
||||
* Updated `rimraf` dep.
|
||||
|
||||
0.2.0 / 2012-09-10
|
||||
------------------
|
||||
* Rewrote module into JavaScript. (Must still rewrite tests into JavaScript)
|
||||
* Added all methods of [jsonfile](https://github.com/jprichardson/node-jsonfile)
|
||||
* Added Travis-CI.
|
||||
|
||||
0.1.3 / 2012-08-13
|
||||
------------------
|
||||
* Added method `readJSONFile`.
|
||||
|
||||
0.1.2 / 2012-06-15
|
||||
------------------
|
||||
* Bug fix: `deleteSync()` didn't exist.
|
||||
* Verified Node v0.8 compatibility.
|
||||
|
||||
0.1.1 / 2012-06-15
|
||||
------------------
|
||||
* Fixed bug in `remove()`/`delete()` that wouldn't execute the function if a callback wasn't passed.
|
||||
|
||||
0.1.0 / 2012-05-31
|
||||
------------------
|
||||
* Renamed `copyFile()` to `copy()`. `copy()` can now copy directories (recursively) too.
|
||||
* Renamed `rmrf()` to `remove()`.
|
||||
* `remove()` aliased with `delete()`.
|
||||
* Added `mkdirp` capabilities. Named: `mkdir()`. Hides Node.js native `mkdir()`.
|
||||
* Instead of exporting the native `fs` module with new functions, I now copy over the native methods to a new object and export that instead.
|
||||
|
||||
0.0.4 / 2012-03-14
|
||||
------------------
|
||||
* Removed CoffeeScript dependency
|
||||
|
||||
0.0.3 / 2012-01-11
|
||||
------------------
|
||||
* Added methods rmrf and rmrfSync
|
||||
* Moved tests from Jasmine to Mocha
|
||||
|
||||
|
||||
[#344]: https://github.com/jprichardson/node-fs-extra/issues/344 "Licence Year"
|
||||
[#343]: https://github.com/jprichardson/node-fs-extra/pull/343 "Add klaw-sync link to readme"
|
||||
[#342]: https://github.com/jprichardson/node-fs-extra/pull/342 "allow preserveTimestamps when use move"
|
||||
[#341]: https://github.com/jprichardson/node-fs-extra/issues/341 "mkdirp(path.dirname(dest) in move() logic needs cleaning up [question]"
|
||||
[#340]: https://github.com/jprichardson/node-fs-extra/pull/340 "Move docs to seperate docs folder [documentation]"
|
||||
[#339]: https://github.com/jprichardson/node-fs-extra/pull/339 "Remove walk() & walkSync() [feature-walk]"
|
||||
[#338]: https://github.com/jprichardson/node-fs-extra/issues/338 "Remove walk() and walkSync() [feature-walk]"
|
||||
[#337]: https://github.com/jprichardson/node-fs-extra/issues/337 "copy doesn't return a yieldable value"
|
||||
[#336]: https://github.com/jprichardson/node-fs-extra/pull/336 "Docs enhanced walk sync [documentation, feature-walk]"
|
||||
[#335]: https://github.com/jprichardson/node-fs-extra/pull/335 "Refactor move() tests [feature-move]"
|
||||
[#334]: https://github.com/jprichardson/node-fs-extra/pull/334 "Cleanup lib/move/index.js [feature-move]"
|
||||
[#333]: https://github.com/jprichardson/node-fs-extra/pull/333 "Rename clobber to overwrite [feature-copy, feature-move]"
|
||||
[#332]: https://github.com/jprichardson/node-fs-extra/pull/332 "BREAKING: Drop Node v0.12 & io.js support"
|
||||
[#331]: https://github.com/jprichardson/node-fs-extra/issues/331 "Add support for chmodr [enhancement, future]"
|
||||
[#330]: https://github.com/jprichardson/node-fs-extra/pull/330 "BREAKING: Do not error when copy destination exists & clobber: false [feature-copy]"
|
||||
[#329]: https://github.com/jprichardson/node-fs-extra/issues/329 "Does .walk() scale to large directories? [question]"
|
||||
[#328]: https://github.com/jprichardson/node-fs-extra/issues/328 "Copying files corrupts [feature-copy, needs-confirmed]"
|
||||
[#327]: https://github.com/jprichardson/node-fs-extra/pull/327 "Use writeStream 'finish' event instead of 'close' [bug, feature-copy]"
|
||||
[#326]: https://github.com/jprichardson/node-fs-extra/issues/326 "fs.copy fails with chmod error when disk under heavy use [bug, feature-copy]"
|
||||
[#325]: https://github.com/jprichardson/node-fs-extra/issues/325 "ensureDir is difficult to promisify [enhancement]"
|
||||
[#324]: https://github.com/jprichardson/node-fs-extra/pull/324 "copySync() should apply filter to directories like copy() [bug, feature-copy]"
|
||||
[#323]: https://github.com/jprichardson/node-fs-extra/issues/323 "Support for `dest` being a directory when using `copy*()`?"
|
||||
[#322]: https://github.com/jprichardson/node-fs-extra/pull/322 "Add fs-promise as fs-extra-promise alternative"
|
||||
[#321]: https://github.com/jprichardson/node-fs-extra/issues/321 "fs.copy() with clobber set to false return EEXIST error [feature-copy]"
|
||||
[#320]: https://github.com/jprichardson/node-fs-extra/issues/320 "fs.copySync: Error: EPERM: operation not permitted, unlink "
|
||||
[#319]: https://github.com/jprichardson/node-fs-extra/issues/319 "Create directory if not exists"
|
||||
[#318]: https://github.com/jprichardson/node-fs-extra/issues/318 "Support glob patterns [enhancement, future]"
|
||||
[#317]: https://github.com/jprichardson/node-fs-extra/pull/317 "Adding copy sync test for src file without write perms"
|
||||
[#316]: https://github.com/jprichardson/node-fs-extra/pull/316 "Remove move()'s broken limit option [feature-move]"
|
||||
[#315]: https://github.com/jprichardson/node-fs-extra/pull/315 "Fix move clobber tests to work around graceful-fs bug."
|
||||
[#314]: https://github.com/jprichardson/node-fs-extra/issues/314 "move() limit option [documentation, enhancement, feature-move]"
|
||||
[#313]: https://github.com/jprichardson/node-fs-extra/pull/313 "Test that remove() ignores glob characters."
|
||||
[#312]: https://github.com/jprichardson/node-fs-extra/pull/312 "Enhance walkSync() to return items with path and stats [feature-walk]"
|
||||
[#311]: https://github.com/jprichardson/node-fs-extra/issues/311 "move() not work when dest name not provided [feature-move]"
|
||||
[#310]: https://github.com/jprichardson/node-fs-extra/issues/310 "Edit walkSync to return items like what walk emits [documentation, enhancement, feature-walk]"
|
||||
[#309]: https://github.com/jprichardson/node-fs-extra/issues/309 "moveSync support [enhancement, feature-move]"
|
||||
[#308]: https://github.com/jprichardson/node-fs-extra/pull/308 "Fix incorrect anchor link"
|
||||
[#307]: https://github.com/jprichardson/node-fs-extra/pull/307 "Fix coverage"
|
||||
[#306]: https://github.com/jprichardson/node-fs-extra/pull/306 "Update devDeps, fix lint error"
|
||||
[#305]: https://github.com/jprichardson/node-fs-extra/pull/305 "Re-add Coveralls"
|
||||
[#304]: https://github.com/jprichardson/node-fs-extra/pull/304 "Remove path-is-absolute [enhancement]"
|
||||
[#303]: https://github.com/jprichardson/node-fs-extra/pull/303 "Document copySync filter inconsistency [documentation, feature-copy]"
|
||||
[#302]: https://github.com/jprichardson/node-fs-extra/pull/302 "fix(console): depreciated -> deprecated"
|
||||
[#301]: https://github.com/jprichardson/node-fs-extra/pull/301 "Remove chmod call from copySync [feature-copy]"
|
||||
[#300]: https://github.com/jprichardson/node-fs-extra/pull/300 "Inline Rimraf [enhancement, feature-move, feature-remove]"
|
||||
[#299]: https://github.com/jprichardson/node-fs-extra/pull/299 "Warn when filter is a RegExp [feature-copy]"
|
||||
[#298]: https://github.com/jprichardson/node-fs-extra/issues/298 "API Docs [documentation]"
|
||||
[#297]: https://github.com/jprichardson/node-fs-extra/pull/297 "Warn about using preserveTimestamps on 32-bit node"
|
||||
[#296]: https://github.com/jprichardson/node-fs-extra/pull/296 "Improve EEXIST error message for copySync [enhancement]"
|
||||
[#295]: https://github.com/jprichardson/node-fs-extra/pull/295 "Depreciate using regular expressions for copy's filter option [documentation]"
|
||||
[#294]: https://github.com/jprichardson/node-fs-extra/pull/294 "BREAKING: Refactor lib/copy/ncp.js [feature-copy]"
|
||||
[#293]: https://github.com/jprichardson/node-fs-extra/pull/293 "Update CI configs"
|
||||
[#292]: https://github.com/jprichardson/node-fs-extra/issues/292 "Rewrite lib/copy/ncp.js [enhancement, feature-copy]"
|
||||
[#291]: https://github.com/jprichardson/node-fs-extra/pull/291 "Escape '$' in replacement string for async file copying"
|
||||
[#290]: https://github.com/jprichardson/node-fs-extra/issues/290 "Exclude files pattern while copying using copy.config.js [question]"
|
||||
[#289]: https://github.com/jprichardson/node-fs-extra/pull/289 "(Closes #271) lib/util/utimes: properly close file descriptors in the event of an error"
|
||||
[#288]: https://github.com/jprichardson/node-fs-extra/pull/288 "(Closes #271) lib/util/utimes: properly close file descriptors in the event of an error"
|
||||
[#287]: https://github.com/jprichardson/node-fs-extra/issues/287 "emptyDir() callback arguments are inconsistent [enhancement, feature-remove]"
|
||||
[#286]: https://github.com/jprichardson/node-fs-extra/pull/286 "Added walkSync function"
|
||||
[#285]: https://github.com/jprichardson/node-fs-extra/issues/285 "CITGM test failing on s390"
|
||||
[#284]: https://github.com/jprichardson/node-fs-extra/issues/284 "outputFile method is missing a check to determine if existing item is a folder or not"
|
||||
[#283]: https://github.com/jprichardson/node-fs-extra/pull/283 "Apply filter also on directories and symlinks for copySync()"
|
||||
[#282]: https://github.com/jprichardson/node-fs-extra/pull/282 "Apply filter also on directories and symlinks for copySync()"
|
||||
[#281]: https://github.com/jprichardson/node-fs-extra/issues/281 "remove function executes 'successfully' but doesn't do anything?"
|
||||
[#280]: https://github.com/jprichardson/node-fs-extra/pull/280 "Disable rimraf globbing"
|
||||
[#279]: https://github.com/jprichardson/node-fs-extra/issues/279 "Some code is vendored instead of included [awaiting-reply]"
|
||||
[#278]: https://github.com/jprichardson/node-fs-extra/issues/278 "copy() does not preserve file/directory ownership"
|
||||
[#277]: https://github.com/jprichardson/node-fs-extra/pull/277 "Mention defaults for clobber and dereference options"
|
||||
[#276]: https://github.com/jprichardson/node-fs-extra/issues/276 "Cannot connect to Shared Folder [awaiting-reply]"
|
||||
[#275]: https://github.com/jprichardson/node-fs-extra/issues/275 "EMFILE, too many open files on Mac OS with JSON API"
|
||||
[#274]: https://github.com/jprichardson/node-fs-extra/issues/274 "Use with memory-fs? [enhancement, future]"
|
||||
[#273]: https://github.com/jprichardson/node-fs-extra/pull/273 "tests: rename `remote.test.js` to `remove.test.js`"
|
||||
[#272]: https://github.com/jprichardson/node-fs-extra/issues/272 "Copy clobber flag never err even when true [bug, feature-copy]"
|
||||
[#271]: https://github.com/jprichardson/node-fs-extra/issues/271 "Unclosed file handle on futimes error"
|
||||
[#270]: https://github.com/jprichardson/node-fs-extra/issues/270 "copy not working as desired on Windows [feature-copy, platform-windows]"
|
||||
[#269]: https://github.com/jprichardson/node-fs-extra/issues/269 "Copying with preserveTimeStamps: true is inaccurate using 32bit node [feature-copy]"
|
||||
[#268]: https://github.com/jprichardson/node-fs-extra/pull/268 "port fix for mkdirp issue #111"
|
||||
[#267]: https://github.com/jprichardson/node-fs-extra/issues/267 "WARN deprecated wrench@1.5.9: wrench.js is deprecated!"
|
||||
[#266]: https://github.com/jprichardson/node-fs-extra/issues/266 "fs-extra"
|
||||
[#265]: https://github.com/jprichardson/node-fs-extra/issues/265 "Link the `fs.stat fs.exists` etc. methods for replace the `fs` module forever?"
|
||||
[#264]: https://github.com/jprichardson/node-fs-extra/issues/264 "Renaming a file using move fails when a file inside is open (at least on windows) [wont-fix]"
|
||||
[#263]: https://github.com/jprichardson/node-fs-extra/issues/263 "ENOSYS: function not implemented, link [needs-confirmed]"
|
||||
[#262]: https://github.com/jprichardson/node-fs-extra/issues/262 "Add .exists() and .existsSync()"
|
||||
[#261]: https://github.com/jprichardson/node-fs-extra/issues/261 "Cannot read property 'prototype' of undefined"
|
||||
[#260]: https://github.com/jprichardson/node-fs-extra/pull/260 "use more specific path for method require"
|
||||
[#259]: https://github.com/jprichardson/node-fs-extra/issues/259 "Feature Request: isEmpty"
|
||||
[#258]: https://github.com/jprichardson/node-fs-extra/issues/258 "copy files does not preserve file timestamp"
|
||||
[#257]: https://github.com/jprichardson/node-fs-extra/issues/257 "Copying a file on windows fails"
|
||||
[#256]: https://github.com/jprichardson/node-fs-extra/pull/256 "Updated Readme "
|
||||
[#255]: https://github.com/jprichardson/node-fs-extra/issues/255 "Update rimraf required version"
|
||||
[#254]: https://github.com/jprichardson/node-fs-extra/issues/254 "request for readTree, readTreeSync, walkSync method"
|
||||
[#253]: https://github.com/jprichardson/node-fs-extra/issues/253 "outputFile does not touch mtime when file exists"
|
||||
[#252]: https://github.com/jprichardson/node-fs-extra/pull/252 "Fixing problem when copying file with no write permission"
|
||||
[#251]: https://github.com/jprichardson/node-fs-extra/issues/251 "Just wanted to say thank you"
|
||||
[#250]: https://github.com/jprichardson/node-fs-extra/issues/250 "`fs.remove()` not removing files (works with `rm -rf`)"
|
||||
[#249]: https://github.com/jprichardson/node-fs-extra/issues/249 "Just a Question ... Remove Servers"
|
||||
[#248]: https://github.com/jprichardson/node-fs-extra/issues/248 "Allow option to not preserve permissions for copy"
|
||||
[#247]: https://github.com/jprichardson/node-fs-extra/issues/247 "Add TypeScript typing directly in the fs-extra package"
|
||||
[#246]: https://github.com/jprichardson/node-fs-extra/issues/246 "fse.remove() && fse.removeSync() don't throw error on ENOENT file"
|
||||
[#245]: https://github.com/jprichardson/node-fs-extra/issues/245 "filter for empty dir [enhancement]"
|
||||
[#244]: https://github.com/jprichardson/node-fs-extra/issues/244 "copySync doesn't apply the filter to directories"
|
||||
[#243]: https://github.com/jprichardson/node-fs-extra/issues/243 "Can I request fs.walk() to be synchronous?"
|
||||
[#242]: https://github.com/jprichardson/node-fs-extra/issues/242 "Accidentally truncates file names ending with $$ [bug, feature-copy]"
|
||||
[#241]: https://github.com/jprichardson/node-fs-extra/pull/241 "Remove link to createOutputStream"
|
||||
[#240]: https://github.com/jprichardson/node-fs-extra/issues/240 "walkSync request"
|
||||
[#239]: https://github.com/jprichardson/node-fs-extra/issues/239 "Depreciate regular expressions for copy's filter [documentation, feature-copy]"
|
||||
[#238]: https://github.com/jprichardson/node-fs-extra/issues/238 "Can't write to files while in a worker thread."
|
||||
[#237]: https://github.com/jprichardson/node-fs-extra/issues/237 ".ensureDir(..) fails silently when passed an invalid path..."
|
||||
[#236]: https://github.com/jprichardson/node-fs-extra/issues/236 "[Removed] Filed under wrong repo"
|
||||
[#235]: https://github.com/jprichardson/node-fs-extra/pull/235 "Adds symlink dereference option to `fse.copySync` (#191)"
|
||||
[#234]: https://github.com/jprichardson/node-fs-extra/issues/234 "ensureDirSync fails silent when EACCES: permission denied on travis-ci"
|
||||
[#233]: https://github.com/jprichardson/node-fs-extra/issues/233 "please make sure the first argument in callback is error object [feature-copy]"
|
||||
[#232]: https://github.com/jprichardson/node-fs-extra/issues/232 "Copy a folder content to its child folder. "
|
||||
[#231]: https://github.com/jprichardson/node-fs-extra/issues/231 "Adding read/write/output functions for YAML"
|
||||
[#230]: https://github.com/jprichardson/node-fs-extra/pull/230 "throw error if src and dest are the same to avoid zeroing out + test"
|
||||
[#229]: https://github.com/jprichardson/node-fs-extra/pull/229 "fix 'TypeError: callback is not a function' in emptyDir"
|
||||
[#228]: https://github.com/jprichardson/node-fs-extra/pull/228 "Throw error when target is empty so file is not accidentally zeroed out"
|
||||
[#227]: https://github.com/jprichardson/node-fs-extra/issues/227 "Uncatchable errors when there are invalid arguments [feature-move]"
|
||||
[#226]: https://github.com/jprichardson/node-fs-extra/issues/226 "Moving to the current directory"
|
||||
[#225]: https://github.com/jprichardson/node-fs-extra/issues/225 "EBUSY: resource busy or locked, unlink"
|
||||
[#224]: https://github.com/jprichardson/node-fs-extra/issues/224 "fse.copy ENOENT error"
|
||||
[#223]: https://github.com/jprichardson/node-fs-extra/issues/223 "Suspicious behavior of fs.existsSync"
|
||||
[#222]: https://github.com/jprichardson/node-fs-extra/pull/222 "A clearer description of emtpyDir function"
|
||||
[#221]: https://github.com/jprichardson/node-fs-extra/pull/221 "Update README.md"
|
||||
[#220]: https://github.com/jprichardson/node-fs-extra/pull/220 "Non-breaking feature: add option 'passStats' to copy methods."
|
||||
[#219]: https://github.com/jprichardson/node-fs-extra/pull/219 "Add closing parenthesis in copySync example"
|
||||
[#218]: https://github.com/jprichardson/node-fs-extra/pull/218 "fix #187 #70 options.filter bug"
|
||||
[#217]: https://github.com/jprichardson/node-fs-extra/pull/217 "fix #187 #70 options.filter bug"
|
||||
[#216]: https://github.com/jprichardson/node-fs-extra/pull/216 "fix #187 #70 options.filter bug"
|
||||
[#215]: https://github.com/jprichardson/node-fs-extra/pull/215 "fse.copy throws error when only src and dest provided [bug, documentation, feature-copy]"
|
||||
[#214]: https://github.com/jprichardson/node-fs-extra/pull/214 "Fixing copySync anchor tag"
|
||||
[#213]: https://github.com/jprichardson/node-fs-extra/issues/213 "Merge extfs with this repo"
|
||||
[#212]: https://github.com/jprichardson/node-fs-extra/pull/212 "Update year to 2016 in README.md and LICENSE"
|
||||
[#211]: https://github.com/jprichardson/node-fs-extra/issues/211 "Not copying all files"
|
||||
[#210]: https://github.com/jprichardson/node-fs-extra/issues/210 "copy/copySync behave differently when copying a symbolic file [bug, documentation, feature-copy]"
|
||||
[#209]: https://github.com/jprichardson/node-fs-extra/issues/209 "In Windows invalid directory name causes infinite loop in ensureDir(). [bug]"
|
||||
[#208]: https://github.com/jprichardson/node-fs-extra/pull/208 "fix options.preserveTimestamps to false in copy-sync by default [feature-copy]"
|
||||
[#207]: https://github.com/jprichardson/node-fs-extra/issues/207 "Add `compare` suite of functions"
|
||||
[#206]: https://github.com/jprichardson/node-fs-extra/issues/206 "outputFileSync"
|
||||
[#205]: https://github.com/jprichardson/node-fs-extra/issues/205 "fix documents about copy/copySync [documentation, feature-copy]"
|
||||
[#204]: https://github.com/jprichardson/node-fs-extra/pull/204 "allow copy of block and character device files"
|
||||
[#203]: https://github.com/jprichardson/node-fs-extra/issues/203 "copy method's argument options couldn't be undefined [bug, feature-copy]"
|
||||
[#202]: https://github.com/jprichardson/node-fs-extra/issues/202 "why there is not a walkSync method?"
|
||||
[#201]: https://github.com/jprichardson/node-fs-extra/issues/201 "clobber for directories [feature-copy, future]"
|
||||
[#200]: https://github.com/jprichardson/node-fs-extra/issues/200 "'copySync' doesn't work in sync"
|
||||
[#199]: https://github.com/jprichardson/node-fs-extra/issues/199 "fs.copySync fails if user does not own file [bug, feature-copy]"
|
||||
[#198]: https://github.com/jprichardson/node-fs-extra/issues/198 "handle copying between identical files [feature-copy]"
|
||||
[#197]: https://github.com/jprichardson/node-fs-extra/issues/197 "Missing documentation for `outputFile` `options` 3rd parameter [documentation]"
|
||||
[#196]: https://github.com/jprichardson/node-fs-extra/issues/196 "copy filter: async function and/or function called with `fs.stat` result [future]"
|
||||
[#195]: https://github.com/jprichardson/node-fs-extra/issues/195 "How to override with outputFile?"
|
||||
[#194]: https://github.com/jprichardson/node-fs-extra/pull/194 "allow ensureFile(Sync) to provide data to be written to created file"
|
||||
[#193]: https://github.com/jprichardson/node-fs-extra/issues/193 "`fs.copy` fails silently if source file is /dev/null [bug, feature-copy]"
|
||||
[#192]: https://github.com/jprichardson/node-fs-extra/issues/192 "Remove fs.createOutputStream()"
|
||||
[#191]: https://github.com/jprichardson/node-fs-extra/issues/191 "How to copy symlinks to target as normal folders [feature-copy]"
|
||||
[#190]: https://github.com/jprichardson/node-fs-extra/pull/190 "copySync to overwrite destination file if readonly and clobber true"
|
||||
[#189]: https://github.com/jprichardson/node-fs-extra/pull/189 "move.test fix to support CRLF on Windows"
|
||||
[#188]: https://github.com/jprichardson/node-fs-extra/issues/188 "move.test failing on windows platform"
|
||||
[#187]: https://github.com/jprichardson/node-fs-extra/issues/187 "Not filter each file, stops on first false [feature-copy]"
|
||||
[#186]: https://github.com/jprichardson/node-fs-extra/issues/186 "Do you need a .size() function in this module? [future]"
|
||||
[#185]: https://github.com/jprichardson/node-fs-extra/issues/185 "Doesn't work on NodeJS v4.x"
|
||||
[#184]: https://github.com/jprichardson/node-fs-extra/issues/184 "CLI equivalent for fs-extra"
|
||||
[#183]: https://github.com/jprichardson/node-fs-extra/issues/183 "with clobber true, copy and copySync behave differently if destination file is read only [bug, feature-copy]"
|
||||
[#182]: https://github.com/jprichardson/node-fs-extra/issues/182 "ensureDir(dir, callback) second callback parameter not specified"
|
||||
[#181]: https://github.com/jprichardson/node-fs-extra/issues/181 "Add ability to remove file securely [enhancement, wont-fix]"
|
||||
[#180]: https://github.com/jprichardson/node-fs-extra/issues/180 "Filter option doesn't work the same way in copy and copySync [bug, feature-copy]"
|
||||
[#179]: https://github.com/jprichardson/node-fs-extra/issues/179 "Include opendir"
|
||||
[#178]: https://github.com/jprichardson/node-fs-extra/issues/178 "ENOTEMPTY is thrown on removeSync "
|
||||
[#177]: https://github.com/jprichardson/node-fs-extra/issues/177 "fix `remove()` wildcards (introduced by rimraf) [feature-remove]"
|
||||
[#176]: https://github.com/jprichardson/node-fs-extra/issues/176 "createOutputStream doesn't emit 'end' event"
|
||||
[#175]: https://github.com/jprichardson/node-fs-extra/issues/175 "[Feature Request].moveSync support [feature-move, future]"
|
||||
[#174]: https://github.com/jprichardson/node-fs-extra/pull/174 "Fix copy formatting and document options.filter"
|
||||
[#173]: https://github.com/jprichardson/node-fs-extra/issues/173 "Feature Request: writeJson should mkdirs"
|
||||
[#172]: https://github.com/jprichardson/node-fs-extra/issues/172 "rename `clobber` flags to `overwrite`"
|
||||
[#171]: https://github.com/jprichardson/node-fs-extra/issues/171 "remove unnecessary aliases"
|
||||
[#170]: https://github.com/jprichardson/node-fs-extra/pull/170 "More robust handling of errors moving across virtual drives"
|
||||
[#169]: https://github.com/jprichardson/node-fs-extra/pull/169 "suppress ensureLink & ensureSymlink dest exists error"
|
||||
[#168]: https://github.com/jprichardson/node-fs-extra/pull/168 "suppress ensurelink dest exists error"
|
||||
[#167]: https://github.com/jprichardson/node-fs-extra/pull/167 "Adds basic (string, buffer) support for ensureFile content [future]"
|
||||
[#166]: https://github.com/jprichardson/node-fs-extra/pull/166 "Adds basic (string, buffer) support for ensureFile content"
|
||||
[#165]: https://github.com/jprichardson/node-fs-extra/pull/165 "ensure for link & symlink"
|
||||
[#164]: https://github.com/jprichardson/node-fs-extra/issues/164 "Feature Request: ensureFile to take optional argument for file content"
|
||||
[#163]: https://github.com/jprichardson/node-fs-extra/issues/163 "ouputJson not formatted out of the box [bug]"
|
||||
[#162]: https://github.com/jprichardson/node-fs-extra/pull/162 "ensure symlink & link"
|
||||
[#161]: https://github.com/jprichardson/node-fs-extra/pull/161 "ensure symlink & link"
|
||||
[#160]: https://github.com/jprichardson/node-fs-extra/pull/160 "ensure symlink & link"
|
||||
[#159]: https://github.com/jprichardson/node-fs-extra/pull/159 "ensure symlink & link"
|
||||
[#158]: https://github.com/jprichardson/node-fs-extra/issues/158 "Feature Request: ensureLink and ensureSymlink methods"
|
||||
[#157]: https://github.com/jprichardson/node-fs-extra/issues/157 "writeJson isn't formatted"
|
||||
[#156]: https://github.com/jprichardson/node-fs-extra/issues/156 "Promise.promisifyAll doesn't work for some methods"
|
||||
[#155]: https://github.com/jprichardson/node-fs-extra/issues/155 "Readme"
|
||||
[#154]: https://github.com/jprichardson/node-fs-extra/issues/154 "/tmp/millis-test-sync"
|
||||
[#153]: https://github.com/jprichardson/node-fs-extra/pull/153 "Make preserveTimes also work on read-only files. Closes #152"
|
||||
[#152]: https://github.com/jprichardson/node-fs-extra/issues/152 "fs.copy fails for read-only files with preserveTimestamp=true [feature-copy]"
|
||||
[#151]: https://github.com/jprichardson/node-fs-extra/issues/151 "TOC does not work correctly on npm [documentation]"
|
||||
[#150]: https://github.com/jprichardson/node-fs-extra/issues/150 "Remove test file fixtures, create with code."
|
||||
[#149]: https://github.com/jprichardson/node-fs-extra/issues/149 "/tmp/millis-test-sync"
|
||||
[#148]: https://github.com/jprichardson/node-fs-extra/issues/148 "split out `Sync` methods in documentation"
|
||||
[#147]: https://github.com/jprichardson/node-fs-extra/issues/147 "Adding rmdirIfEmpty"
|
||||
[#146]: https://github.com/jprichardson/node-fs-extra/pull/146 "ensure test.js works"
|
||||
[#145]: https://github.com/jprichardson/node-fs-extra/issues/145 "Add `fs.exists` and `fs.existsSync` if it doesn't exist."
|
||||
[#144]: https://github.com/jprichardson/node-fs-extra/issues/144 "tests failing"
|
||||
[#143]: https://github.com/jprichardson/node-fs-extra/issues/143 "update graceful-fs"
|
||||
[#142]: https://github.com/jprichardson/node-fs-extra/issues/142 "PrependFile Feature"
|
||||
[#141]: https://github.com/jprichardson/node-fs-extra/pull/141 "Add option to preserve timestamps"
|
||||
[#140]: https://github.com/jprichardson/node-fs-extra/issues/140 "Json file reading fails with 'utf8'"
|
||||
[#139]: https://github.com/jprichardson/node-fs-extra/pull/139 "Preserve file timestamp on copy. Closes #138"
|
||||
[#138]: https://github.com/jprichardson/node-fs-extra/issues/138 "Preserve timestamps on copying files"
|
||||
[#137]: https://github.com/jprichardson/node-fs-extra/issues/137 "outputFile/outputJson: Unexpected end of input"
|
||||
[#136]: https://github.com/jprichardson/node-fs-extra/pull/136 "Update license attribute"
|
||||
[#135]: https://github.com/jprichardson/node-fs-extra/issues/135 "emptyDir throws Error if no callback is provided"
|
||||
[#134]: https://github.com/jprichardson/node-fs-extra/pull/134 "Handle EEXIST error when clobbering dir"
|
||||
[#133]: https://github.com/jprichardson/node-fs-extra/pull/133 "Travis runs with `sudo: false`"
|
||||
[#132]: https://github.com/jprichardson/node-fs-extra/pull/132 "isDirectory method"
|
||||
[#131]: https://github.com/jprichardson/node-fs-extra/issues/131 "copySync is not working iojs 1.8.4 on linux [feature-copy]"
|
||||
[#130]: https://github.com/jprichardson/node-fs-extra/pull/130 "Please review additional features."
|
||||
[#129]: https://github.com/jprichardson/node-fs-extra/pull/129 "can you review this feature?"
|
||||
[#128]: https://github.com/jprichardson/node-fs-extra/issues/128 "fsExtra.move(filepath, newPath) broken;"
|
||||
[#127]: https://github.com/jprichardson/node-fs-extra/issues/127 "consider using fs.access to remove deprecated warnings for fs.exists"
|
||||
[#126]: https://github.com/jprichardson/node-fs-extra/issues/126 " TypeError: Object #<Object> has no method 'access'"
|
||||
[#125]: https://github.com/jprichardson/node-fs-extra/issues/125 "Question: What do the *Sync function do different from non-sync"
|
||||
[#124]: https://github.com/jprichardson/node-fs-extra/issues/124 "move with clobber option 'ENOTEMPTY'"
|
||||
[#123]: https://github.com/jprichardson/node-fs-extra/issues/123 "Only copy the content of a directory"
|
||||
[#122]: https://github.com/jprichardson/node-fs-extra/pull/122 "Update section links in README to match current section ids."
|
||||
[#121]: https://github.com/jprichardson/node-fs-extra/issues/121 "emptyDir is undefined"
|
||||
[#120]: https://github.com/jprichardson/node-fs-extra/issues/120 "usage bug caused by shallow cloning methods of 'graceful-fs'"
|
||||
[#119]: https://github.com/jprichardson/node-fs-extra/issues/119 "mkdirs and ensureDir never invoke callback and consume CPU indefinitely if provided a path with invalid characters on Windows"
|
||||
[#118]: https://github.com/jprichardson/node-fs-extra/pull/118 "createOutputStream"
|
||||
[#117]: https://github.com/jprichardson/node-fs-extra/pull/117 "Fixed issue with slash separated paths on windows"
|
||||
[#116]: https://github.com/jprichardson/node-fs-extra/issues/116 "copySync can only copy directories not files [documentation, feature-copy]"
|
||||
[#115]: https://github.com/jprichardson/node-fs-extra/issues/115 ".Copy & .CopySync [feature-copy]"
|
||||
[#114]: https://github.com/jprichardson/node-fs-extra/issues/114 "Fails to move (rename) directory to non-empty directory even with clobber: true"
|
||||
[#113]: https://github.com/jprichardson/node-fs-extra/issues/113 "fs.copy seems to callback early if the destination file already exists"
|
||||
[#112]: https://github.com/jprichardson/node-fs-extra/pull/112 "Copying a file into an existing directory"
|
||||
[#111]: https://github.com/jprichardson/node-fs-extra/pull/111 "Moving a file into an existing directory "
|
||||
[#110]: https://github.com/jprichardson/node-fs-extra/pull/110 "Moving a file into an existing directory"
|
||||
[#109]: https://github.com/jprichardson/node-fs-extra/issues/109 "fs.move across windows drives fails"
|
||||
[#108]: https://github.com/jprichardson/node-fs-extra/issues/108 "fse.move directories across multiple devices doesn't work"
|
||||
[#107]: https://github.com/jprichardson/node-fs-extra/pull/107 "Check if dest path is an existing dir and copy or move source in it"
|
||||
[#106]: https://github.com/jprichardson/node-fs-extra/issues/106 "fse.copySync crashes while copying across devices D: [feature-copy]"
|
||||
[#105]: https://github.com/jprichardson/node-fs-extra/issues/105 "fs.copy hangs on iojs"
|
||||
[#104]: https://github.com/jprichardson/node-fs-extra/issues/104 "fse.move deletes folders [bug]"
|
||||
[#103]: https://github.com/jprichardson/node-fs-extra/issues/103 "Error: EMFILE with copy"
|
||||
[#102]: https://github.com/jprichardson/node-fs-extra/issues/102 "touch / touchSync was removed ?"
|
||||
[#101]: https://github.com/jprichardson/node-fs-extra/issues/101 "fs-extra promisified"
|
||||
[#100]: https://github.com/jprichardson/node-fs-extra/pull/100 "copy: options object or filter to pass to ncp"
|
||||
[#99]: https://github.com/jprichardson/node-fs-extra/issues/99 "ensureDir() modes [future]"
|
||||
[#98]: https://github.com/jprichardson/node-fs-extra/issues/98 "fs.copy() incorrect async behavior [bug]"
|
||||
[#97]: https://github.com/jprichardson/node-fs-extra/pull/97 "use path.join; fix copySync bug"
|
||||
[#96]: https://github.com/jprichardson/node-fs-extra/issues/96 "destFolderExists in copySync is always undefined."
|
||||
[#95]: https://github.com/jprichardson/node-fs-extra/pull/95 "Using graceful-ncp instead of ncp"
|
||||
[#94]: https://github.com/jprichardson/node-fs-extra/issues/94 "Error: EEXIST, file already exists '../mkdirp/bin/cmd.js' on fs.copySync() [enhancement, feature-copy]"
|
||||
[#93]: https://github.com/jprichardson/node-fs-extra/issues/93 "Confusing error if drive not mounted [enhancement]"
|
||||
[#92]: https://github.com/jprichardson/node-fs-extra/issues/92 "Problems with Bluebird"
|
||||
[#91]: https://github.com/jprichardson/node-fs-extra/issues/91 "fs.copySync('/test', '/haha') is different with 'cp -r /test /haha' [enhancement]"
|
||||
[#90]: https://github.com/jprichardson/node-fs-extra/issues/90 "Folder creation and file copy is Happening in 64 bit machine but not in 32 bit machine"
|
||||
[#89]: https://github.com/jprichardson/node-fs-extra/issues/89 "Error: EEXIST using fs-extra's fs.copy to copy a directory on Windows"
|
||||
[#88]: https://github.com/jprichardson/node-fs-extra/issues/88 "Stacking those libraries"
|
||||
[#87]: https://github.com/jprichardson/node-fs-extra/issues/87 "createWriteStream + outputFile = ?"
|
||||
[#86]: https://github.com/jprichardson/node-fs-extra/issues/86 "no moveSync?"
|
||||
[#85]: https://github.com/jprichardson/node-fs-extra/pull/85 "Copy symlinks in copySync"
|
||||
[#84]: https://github.com/jprichardson/node-fs-extra/issues/84 "Push latest version to npm ?"
|
||||
[#83]: https://github.com/jprichardson/node-fs-extra/issues/83 "Prevent copying a directory into itself [feature-copy]"
|
||||
[#82]: https://github.com/jprichardson/node-fs-extra/pull/82 "README updates for move"
|
||||
[#81]: https://github.com/jprichardson/node-fs-extra/issues/81 "fd leak after fs.move"
|
||||
[#80]: https://github.com/jprichardson/node-fs-extra/pull/80 "Preserve file mode in copySync"
|
||||
[#79]: https://github.com/jprichardson/node-fs-extra/issues/79 "fs.copy only .html file empty"
|
||||
[#78]: https://github.com/jprichardson/node-fs-extra/pull/78 "copySync was not applying filters to directories"
|
||||
[#77]: https://github.com/jprichardson/node-fs-extra/issues/77 "Create README reference to bluebird"
|
||||
[#76]: https://github.com/jprichardson/node-fs-extra/issues/76 "Create README reference to typescript"
|
||||
[#75]: https://github.com/jprichardson/node-fs-extra/issues/75 "add glob as a dep? [question]"
|
||||
[#74]: https://github.com/jprichardson/node-fs-extra/pull/74 "including new emptydir module"
|
||||
[#73]: https://github.com/jprichardson/node-fs-extra/pull/73 "add dependency status in readme"
|
||||
[#72]: https://github.com/jprichardson/node-fs-extra/pull/72 "Use svg instead of png to get better image quality"
|
||||
[#71]: https://github.com/jprichardson/node-fs-extra/issues/71 "fse.copy not working on Windows 7 x64 OS, but, copySync does work"
|
||||
[#70]: https://github.com/jprichardson/node-fs-extra/issues/70 "Not filter each file, stops on first false [bug]"
|
||||
[#69]: https://github.com/jprichardson/node-fs-extra/issues/69 "How to check if folder exist and read the folder name"
|
||||
[#68]: https://github.com/jprichardson/node-fs-extra/issues/68 "consider flag to readJsonSync (throw false) [enhancement]"
|
||||
[#67]: https://github.com/jprichardson/node-fs-extra/issues/67 "docs for readJson incorrectly states that is accepts options"
|
||||
[#66]: https://github.com/jprichardson/node-fs-extra/issues/66 "ENAMETOOLONG"
|
||||
[#65]: https://github.com/jprichardson/node-fs-extra/issues/65 "exclude filter in fs.copy"
|
||||
[#64]: https://github.com/jprichardson/node-fs-extra/issues/64 "Announce: mfs - monitor your fs-extra calls"
|
||||
[#63]: https://github.com/jprichardson/node-fs-extra/issues/63 "Walk"
|
||||
[#62]: https://github.com/jprichardson/node-fs-extra/issues/62 "npm install fs-extra doesn't work"
|
||||
[#61]: https://github.com/jprichardson/node-fs-extra/issues/61 "No longer supports node 0.8 due to use of `^` in package.json dependencies"
|
||||
[#60]: https://github.com/jprichardson/node-fs-extra/issues/60 "chmod & chown for mkdirs"
|
||||
[#59]: https://github.com/jprichardson/node-fs-extra/issues/59 "Consider including mkdirp and making fs-extra '--use_strict' safe [question]"
|
||||
[#58]: https://github.com/jprichardson/node-fs-extra/issues/58 "Stack trace not included in fs.copy error"
|
||||
[#57]: https://github.com/jprichardson/node-fs-extra/issues/57 "Possible to include wildcards in delete?"
|
||||
[#56]: https://github.com/jprichardson/node-fs-extra/issues/56 "Crash when have no access to write to destination file in copy "
|
||||
[#55]: https://github.com/jprichardson/node-fs-extra/issues/55 "Is it possible to have any console output similar to Grunt copy module?"
|
||||
[#54]: https://github.com/jprichardson/node-fs-extra/issues/54 "`copy` does not preserve file ownership and permissons"
|
||||
[#53]: https://github.com/jprichardson/node-fs-extra/issues/53 "outputFile() - ability to write data in appending mode"
|
||||
[#52]: https://github.com/jprichardson/node-fs-extra/pull/52 "This fixes (what I think) is a bug in copySync"
|
||||
[#51]: https://github.com/jprichardson/node-fs-extra/pull/51 "Add a Bitdeli Badge to README"
|
||||
[#50]: https://github.com/jprichardson/node-fs-extra/issues/50 "Replace mechanism in createFile"
|
||||
[#49]: https://github.com/jprichardson/node-fs-extra/pull/49 "update rimraf to v2.2.6"
|
||||
[#48]: https://github.com/jprichardson/node-fs-extra/issues/48 "fs.copy issue [bug]"
|
||||
[#47]: https://github.com/jprichardson/node-fs-extra/issues/47 "Bug in copy - callback called on readStream 'close' - Fixed in ncp 0.5.0"
|
||||
[#46]: https://github.com/jprichardson/node-fs-extra/pull/46 "update copyright year"
|
||||
[#45]: https://github.com/jprichardson/node-fs-extra/pull/45 "Added note about fse.outputFile() being the one that overwrites"
|
||||
[#44]: https://github.com/jprichardson/node-fs-extra/pull/44 "Proposal: Stream support"
|
||||
[#43]: https://github.com/jprichardson/node-fs-extra/issues/43 "Better error reporting "
|
||||
[#42]: https://github.com/jprichardson/node-fs-extra/issues/42 "Performance issue?"
|
||||
[#41]: https://github.com/jprichardson/node-fs-extra/pull/41 "There does seem to be a synchronous version now"
|
||||
[#40]: https://github.com/jprichardson/node-fs-extra/issues/40 "fs.copy throw unexplained error ENOENT, utime "
|
||||
[#39]: https://github.com/jprichardson/node-fs-extra/pull/39 "Added regression test for copy() return callback on error"
|
||||
[#38]: https://github.com/jprichardson/node-fs-extra/pull/38 "Return err in copy() fstat cb, because stat could be undefined or null"
|
||||
[#37]: https://github.com/jprichardson/node-fs-extra/issues/37 "Maybe include a line reader? [enhancement, question]"
|
||||
[#36]: https://github.com/jprichardson/node-fs-extra/pull/36 "`filter` parameter `fs.copy` and `fs.copySync`"
|
||||
[#35]: https://github.com/jprichardson/node-fs-extra/pull/35 "`filter` parameter `fs.copy` and `fs.copySync` "
|
||||
[#34]: https://github.com/jprichardson/node-fs-extra/issues/34 "update docs to include options for JSON methods [enhancement]"
|
||||
[#33]: https://github.com/jprichardson/node-fs-extra/pull/33 "fs_extra.copySync"
|
||||
[#32]: https://github.com/jprichardson/node-fs-extra/issues/32 "update to latest jsonfile [enhancement]"
|
||||
[#31]: https://github.com/jprichardson/node-fs-extra/issues/31 "Add ensure methods [enhancement]"
|
||||
[#30]: https://github.com/jprichardson/node-fs-extra/issues/30 "update package.json optional dep `graceful-fs`"
|
||||
[#29]: https://github.com/jprichardson/node-fs-extra/issues/29 "Copy failing if dest directory doesn't exist. Is this intended?"
|
||||
[#28]: https://github.com/jprichardson/node-fs-extra/issues/28 "homepage field must be a string url. Deleted."
|
||||
[#27]: https://github.com/jprichardson/node-fs-extra/issues/27 "Update Readme"
|
||||
[#26]: https://github.com/jprichardson/node-fs-extra/issues/26 "Add readdir recursive method. [enhancement]"
|
||||
[#25]: https://github.com/jprichardson/node-fs-extra/pull/25 "adding an `.npmignore` file"
|
||||
[#24]: https://github.com/jprichardson/node-fs-extra/issues/24 "[bug] cannot run in strict mode [bug]"
|
||||
[#23]: https://github.com/jprichardson/node-fs-extra/issues/23 "`writeJSON()` should create parent directories"
|
||||
[#22]: https://github.com/jprichardson/node-fs-extra/pull/22 "Add a limit option to mkdirs()"
|
||||
[#21]: https://github.com/jprichardson/node-fs-extra/issues/21 "touch() in 0.10.0"
|
||||
[#20]: https://github.com/jprichardson/node-fs-extra/issues/20 "fs.remove yields callback before directory is really deleted"
|
||||
[#19]: https://github.com/jprichardson/node-fs-extra/issues/19 "fs.copy err is empty array"
|
||||
[#18]: https://github.com/jprichardson/node-fs-extra/pull/18 "Exposed copyFile Function"
|
||||
[#17]: https://github.com/jprichardson/node-fs-extra/issues/17 "Use `require('graceful-fs')` if found instead of `require('fs')`"
|
||||
[#16]: https://github.com/jprichardson/node-fs-extra/pull/16 "Update README.md"
|
||||
[#15]: https://github.com/jprichardson/node-fs-extra/issues/15 "Implement cp -r but sync aka copySync. [enhancement]"
|
||||
[#14]: https://github.com/jprichardson/node-fs-extra/issues/14 "fs.mkdirSync is broken in 0.3.1"
|
||||
[#13]: https://github.com/jprichardson/node-fs-extra/issues/13 "Thoughts on including a directory tree / file watcher? [enhancement, question]"
|
||||
[#12]: https://github.com/jprichardson/node-fs-extra/issues/12 "copyFile & copyFileSync are global"
|
||||
[#11]: https://github.com/jprichardson/node-fs-extra/issues/11 "Thoughts on including a file walker? [enhancement, question]"
|
||||
[#10]: https://github.com/jprichardson/node-fs-extra/issues/10 "move / moveFile API [enhancement]"
|
||||
[#9]: https://github.com/jprichardson/node-fs-extra/issues/9 "don't import normal fs stuff into fs-extra"
|
||||
[#8]: https://github.com/jprichardson/node-fs-extra/pull/8 "Update rimraf to latest version"
|
||||
[#6]: https://github.com/jprichardson/node-fs-extra/issues/6 "Remove CoffeeScript development dependency"
|
||||
[#5]: https://github.com/jprichardson/node-fs-extra/issues/5 "comments on naming"
|
||||
[#4]: https://github.com/jprichardson/node-fs-extra/issues/4 "version bump to 0.2"
|
||||
[#3]: https://github.com/jprichardson/node-fs-extra/pull/3 "Hi! I fixed some code for you!"
|
||||
[#2]: https://github.com/jprichardson/node-fs-extra/issues/2 "Merge with fs.extra and mkdirp"
|
||||
[#1]: https://github.com/jprichardson/node-fs-extra/issues/1 "file-extra npm !exist"
|
||||
15
plugins/cordova-sqlite-storage/node_modules/fs-extra/LICENSE
generated
vendored
Normal file
15
plugins/cordova-sqlite-storage/node_modules/fs-extra/LICENSE
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
(The MIT License)
|
||||
|
||||
Copyright (c) 2011-2017 JP Richardson
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
|
||||
(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
|
||||
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
261
plugins/cordova-sqlite-storage/node_modules/fs-extra/README.md
generated
vendored
Normal file
261
plugins/cordova-sqlite-storage/node_modules/fs-extra/README.md
generated
vendored
Normal file
@ -0,0 +1,261 @@
|
||||
Node.js: fs-extra
|
||||
=================
|
||||
|
||||
`fs-extra` adds file system methods that aren't included in the native `fs` module and adds promise support to the `fs` methods. It also uses [`graceful-fs`](https://github.com/isaacs/node-graceful-fs) to prevent `EMFILE` errors. It should be a drop in replacement for `fs`.
|
||||
|
||||
[](https://www.npmjs.org/package/fs-extra)
|
||||
[](https://github.com/jprichardson/node-fs-extra/blob/master/LICENSE)
|
||||
[](http://travis-ci.org/jprichardson/node-fs-extra)
|
||||
[](https://ci.appveyor.com/project/jprichardson/node-fs-extra/branch/master)
|
||||
[](https://www.npmjs.org/package/fs-extra)
|
||||
[](https://coveralls.io/github/jprichardson/node-fs-extra)
|
||||
[](https://standardjs.com)
|
||||
|
||||
Why?
|
||||
----
|
||||
|
||||
I got tired of including `mkdirp`, `rimraf`, and `ncp` in most of my projects.
|
||||
|
||||
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
npm install fs-extra
|
||||
|
||||
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
`fs-extra` is a drop in replacement for native `fs`. All methods in `fs` are attached to `fs-extra`. All `fs` methods return promises if the callback isn't passed.
|
||||
|
||||
You don't ever need to include the original `fs` module again:
|
||||
|
||||
```js
|
||||
const fs = require('fs') // this is no longer necessary
|
||||
```
|
||||
|
||||
you can now do this:
|
||||
|
||||
```js
|
||||
const fs = require('fs-extra')
|
||||
```
|
||||
|
||||
or if you prefer to make it clear that you're using `fs-extra` and not `fs`, you may want
|
||||
to name your `fs` variable `fse` like so:
|
||||
|
||||
```js
|
||||
const fse = require('fs-extra')
|
||||
```
|
||||
|
||||
you can also keep both, but it's redundant:
|
||||
|
||||
```js
|
||||
const fs = require('fs')
|
||||
const fse = require('fs-extra')
|
||||
```
|
||||
|
||||
Sync vs Async vs Async/Await
|
||||
-------------
|
||||
Most methods are async by default. All async methods will return a promise if the callback isn't passed.
|
||||
|
||||
Sync methods on the other hand will throw if an error occurs.
|
||||
|
||||
Also Async/Await will throw an error if one occurs.
|
||||
|
||||
Example:
|
||||
|
||||
```js
|
||||
const fs = require('fs-extra')
|
||||
|
||||
// Async with promises:
|
||||
fs.copy('/tmp/myfile', '/tmp/mynewfile')
|
||||
.then(() => console.log('success!'))
|
||||
.catch(err => console.error(err))
|
||||
|
||||
// Async with callbacks:
|
||||
fs.copy('/tmp/myfile', '/tmp/mynewfile', err => {
|
||||
if (err) return console.error(err)
|
||||
console.log('success!')
|
||||
})
|
||||
|
||||
// Sync:
|
||||
try {
|
||||
fs.copySync('/tmp/myfile', '/tmp/mynewfile')
|
||||
console.log('success!')
|
||||
} catch (err) {
|
||||
console.error(err)
|
||||
}
|
||||
|
||||
// Async/Await:
|
||||
async function copyFiles () {
|
||||
try {
|
||||
await fs.copy('/tmp/myfile', '/tmp/mynewfile')
|
||||
console.log('success!')
|
||||
} catch (err) {
|
||||
console.error(err)
|
||||
}
|
||||
}
|
||||
|
||||
copyFiles()
|
||||
```
|
||||
|
||||
|
||||
Methods
|
||||
-------
|
||||
|
||||
### Async
|
||||
|
||||
- [copy](docs/copy.md)
|
||||
- [emptyDir](docs/emptyDir.md)
|
||||
- [ensureFile](docs/ensureFile.md)
|
||||
- [ensureDir](docs/ensureDir.md)
|
||||
- [ensureLink](docs/ensureLink.md)
|
||||
- [ensureSymlink](docs/ensureSymlink.md)
|
||||
- [mkdirp](docs/ensureDir.md)
|
||||
- [mkdirs](docs/ensureDir.md)
|
||||
- [move](docs/move.md)
|
||||
- [outputFile](docs/outputFile.md)
|
||||
- [outputJson](docs/outputJson.md)
|
||||
- [pathExists](docs/pathExists.md)
|
||||
- [readJson](docs/readJson.md)
|
||||
- [remove](docs/remove.md)
|
||||
- [writeJson](docs/writeJson.md)
|
||||
|
||||
### Sync
|
||||
|
||||
- [copySync](docs/copy-sync.md)
|
||||
- [emptyDirSync](docs/emptyDir-sync.md)
|
||||
- [ensureFileSync](docs/ensureFile-sync.md)
|
||||
- [ensureDirSync](docs/ensureDir-sync.md)
|
||||
- [ensureLinkSync](docs/ensureLink-sync.md)
|
||||
- [ensureSymlinkSync](docs/ensureSymlink-sync.md)
|
||||
- [mkdirpSync](docs/ensureDir-sync.md)
|
||||
- [mkdirsSync](docs/ensureDir-sync.md)
|
||||
- [moveSync](docs/move-sync.md)
|
||||
- [outputFileSync](docs/outputFile-sync.md)
|
||||
- [outputJsonSync](docs/outputJson-sync.md)
|
||||
- [pathExistsSync](docs/pathExists-sync.md)
|
||||
- [readJsonSync](docs/readJson-sync.md)
|
||||
- [removeSync](docs/remove-sync.md)
|
||||
- [writeJsonSync](docs/writeJson-sync.md)
|
||||
|
||||
|
||||
**NOTE:** You can still use the native Node.js methods. They are promisified and copied over to `fs-extra`. See [notes on `fs.read()` & `fs.write()`](docs/fs-read-write.md)
|
||||
|
||||
### What happened to `walk()` and `walkSync()`?
|
||||
|
||||
They were removed from `fs-extra` in v2.0.0. If you need the functionality, `walk` and `walkSync` are available as separate packages, [`klaw`](https://github.com/jprichardson/node-klaw) and [`klaw-sync`](https://github.com/manidlou/node-klaw-sync).
|
||||
|
||||
|
||||
Third Party
|
||||
-----------
|
||||
|
||||
|
||||
### TypeScript
|
||||
|
||||
If you like TypeScript, you can use `fs-extra` with it: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/fs-extra
|
||||
|
||||
|
||||
### File / Directory Watching
|
||||
|
||||
If you want to watch for changes to files or directories, then you should use [chokidar](https://github.com/paulmillr/chokidar).
|
||||
|
||||
### Obtain Filesystem (Devices, Partitions) Information
|
||||
|
||||
[fs-filesystem](https://github.com/arthurintelligence/node-fs-filesystem) allows you to read the state of the filesystem of the host on which it is run. It returns information about both the devices and the partitions (volumes) of the system.
|
||||
|
||||
### Misc.
|
||||
|
||||
- [fs-extra-debug](https://github.com/jdxcode/fs-extra-debug) - Send your fs-extra calls to [debug](https://npmjs.org/package/debug).
|
||||
- [mfs](https://github.com/cadorn/mfs) - Monitor your fs-extra calls.
|
||||
|
||||
|
||||
|
||||
Hacking on fs-extra
|
||||
-------------------
|
||||
|
||||
Wanna hack on `fs-extra`? Great! Your help is needed! [fs-extra is one of the most depended upon Node.js packages](http://nodei.co/npm/fs-extra.png?downloads=true&downloadRank=true&stars=true). This project
|
||||
uses [JavaScript Standard Style](https://github.com/feross/standard) - if the name or style choices bother you,
|
||||
you're gonna have to get over it :) If `standard` is good enough for `npm`, it's good enough for `fs-extra`.
|
||||
|
||||
[](https://github.com/feross/standard)
|
||||
|
||||
What's needed?
|
||||
- First, take a look at existing issues. Those are probably going to be where the priority lies.
|
||||
- More tests for edge cases. Specifically on different platforms. There can never be enough tests.
|
||||
- Improve test coverage. See coveralls output for more info.
|
||||
|
||||
Note: If you make any big changes, **you should definitely file an issue for discussion first.**
|
||||
|
||||
### Running the Test Suite
|
||||
|
||||
fs-extra contains hundreds of tests.
|
||||
|
||||
- `npm run lint`: runs the linter ([standard](http://standardjs.com/))
|
||||
- `npm run unit`: runs the unit tests
|
||||
- `npm test`: runs both the linter and the tests
|
||||
|
||||
|
||||
### Windows
|
||||
|
||||
If you run the tests on the Windows and receive a lot of symbolic link `EPERM` permission errors, it's
|
||||
because on Windows you need elevated privilege to create symbolic links. You can add this to your Windows's
|
||||
account by following the instructions here: http://superuser.com/questions/104845/permission-to-make-symbolic-links-in-windows-7
|
||||
However, I didn't have much luck doing this.
|
||||
|
||||
Since I develop on Mac OS X, I use VMWare Fusion for Windows testing. I create a shared folder that I map to a drive on Windows.
|
||||
I open the `Node.js command prompt` and run as `Administrator`. I then map the network drive running the following command:
|
||||
|
||||
net use z: "\\vmware-host\Shared Folders"
|
||||
|
||||
I can then navigate to my `fs-extra` directory and run the tests.
|
||||
|
||||
|
||||
Naming
|
||||
------
|
||||
|
||||
I put a lot of thought into the naming of these functions. Inspired by @coolaj86's request. So he deserves much of the credit for raising the issue. See discussion(s) here:
|
||||
|
||||
* https://github.com/jprichardson/node-fs-extra/issues/2
|
||||
* https://github.com/flatiron/utile/issues/11
|
||||
* https://github.com/ryanmcgrath/wrench-js/issues/29
|
||||
* https://github.com/substack/node-mkdirp/issues/17
|
||||
|
||||
First, I believe that in as many cases as possible, the [Node.js naming schemes](http://nodejs.org/api/fs.html) should be chosen. However, there are problems with the Node.js own naming schemes.
|
||||
|
||||
For example, `fs.readFile()` and `fs.readdir()`: the **F** is capitalized in *File* and the **d** is not capitalized in *dir*. Perhaps a bit pedantic, but they should still be consistent. Also, Node.js has chosen a lot of POSIX naming schemes, which I believe is great. See: `fs.mkdir()`, `fs.rmdir()`, `fs.chown()`, etc.
|
||||
|
||||
We have a dilemma though. How do you consistently name methods that perform the following POSIX commands: `cp`, `cp -r`, `mkdir -p`, and `rm -rf`?
|
||||
|
||||
My perspective: when in doubt, err on the side of simplicity. A directory is just a hierarchical grouping of directories and files. Consider that for a moment. So when you want to copy it or remove it, in most cases you'll want to copy or remove all of its contents. When you want to create a directory, if the directory that it's suppose to be contained in does not exist, then in most cases you'll want to create that too.
|
||||
|
||||
So, if you want to remove a file or a directory regardless of whether it has contents, just call `fs.remove(path)`. If you want to copy a file or a directory whether it has contents, just call `fs.copy(source, destination)`. If you want to create a directory regardless of whether its parent directories exist, just call `fs.mkdirs(path)` or `fs.mkdirp(path)`.
|
||||
|
||||
|
||||
Credit
|
||||
------
|
||||
|
||||
`fs-extra` wouldn't be possible without using the modules from the following authors:
|
||||
|
||||
- [Isaac Shlueter](https://github.com/isaacs)
|
||||
- [Charlie McConnel](https://github.com/avianflu)
|
||||
- [James Halliday](https://github.com/substack)
|
||||
- [Andrew Kelley](https://github.com/andrewrk)
|
||||
|
||||
|
||||
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
Licensed under MIT
|
||||
|
||||
Copyright (c) 2011-2017 [JP Richardson](https://github.com/jprichardson)
|
||||
|
||||
[1]: http://nodejs.org/docs/latest/api/fs.html
|
||||
|
||||
|
||||
[jsonfile]: https://github.com/jprichardson/node-jsonfile
|
||||
164
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/copy-sync/copy-sync.js
generated
vendored
Normal file
164
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/copy-sync/copy-sync.js
generated
vendored
Normal file
@ -0,0 +1,164 @@
|
||||
'use strict'
|
||||
|
||||
const fs = require('graceful-fs')
|
||||
const path = require('path')
|
||||
const mkdirpSync = require('../mkdirs').mkdirsSync
|
||||
const utimesSync = require('../util/utimes.js').utimesMillisSync
|
||||
const stat = require('../util/stat')
|
||||
|
||||
function copySync (src, dest, opts) {
|
||||
if (typeof opts === 'function') {
|
||||
opts = { filter: opts }
|
||||
}
|
||||
|
||||
opts = opts || {}
|
||||
opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
|
||||
opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber
|
||||
|
||||
// Warn about using preserveTimestamps on 32-bit node
|
||||
if (opts.preserveTimestamps && process.arch === 'ia32') {
|
||||
console.warn(`fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n
|
||||
see https://github.com/jprichardson/node-fs-extra/issues/269`)
|
||||
}
|
||||
|
||||
const { srcStat, destStat } = stat.checkPathsSync(src, dest, 'copy')
|
||||
stat.checkParentPathsSync(src, srcStat, dest, 'copy')
|
||||
return handleFilterAndCopy(destStat, src, dest, opts)
|
||||
}
|
||||
|
||||
function handleFilterAndCopy (destStat, src, dest, opts) {
|
||||
if (opts.filter && !opts.filter(src, dest)) return
|
||||
const destParent = path.dirname(dest)
|
||||
if (!fs.existsSync(destParent)) mkdirpSync(destParent)
|
||||
return startCopy(destStat, src, dest, opts)
|
||||
}
|
||||
|
||||
function startCopy (destStat, src, dest, opts) {
|
||||
if (opts.filter && !opts.filter(src, dest)) return
|
||||
return getStats(destStat, src, dest, opts)
|
||||
}
|
||||
|
||||
function getStats (destStat, src, dest, opts) {
|
||||
const statSync = opts.dereference ? fs.statSync : fs.lstatSync
|
||||
const srcStat = statSync(src)
|
||||
|
||||
if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts)
|
||||
else if (srcStat.isFile() ||
|
||||
srcStat.isCharacterDevice() ||
|
||||
srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts)
|
||||
else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts)
|
||||
}
|
||||
|
||||
function onFile (srcStat, destStat, src, dest, opts) {
|
||||
if (!destStat) return copyFile(srcStat, src, dest, opts)
|
||||
return mayCopyFile(srcStat, src, dest, opts)
|
||||
}
|
||||
|
||||
function mayCopyFile (srcStat, src, dest, opts) {
|
||||
if (opts.overwrite) {
|
||||
fs.unlinkSync(dest)
|
||||
return copyFile(srcStat, src, dest, opts)
|
||||
} else if (opts.errorOnExist) {
|
||||
throw new Error(`'${dest}' already exists`)
|
||||
}
|
||||
}
|
||||
|
||||
function copyFile (srcStat, src, dest, opts) {
|
||||
if (typeof fs.copyFileSync === 'function') {
|
||||
fs.copyFileSync(src, dest)
|
||||
fs.chmodSync(dest, srcStat.mode)
|
||||
if (opts.preserveTimestamps) {
|
||||
return utimesSync(dest, srcStat.atime, srcStat.mtime)
|
||||
}
|
||||
return
|
||||
}
|
||||
return copyFileFallback(srcStat, src, dest, opts)
|
||||
}
|
||||
|
||||
function copyFileFallback (srcStat, src, dest, opts) {
|
||||
const BUF_LENGTH = 64 * 1024
|
||||
const _buff = require('../util/buffer')(BUF_LENGTH)
|
||||
|
||||
const fdr = fs.openSync(src, 'r')
|
||||
const fdw = fs.openSync(dest, 'w', srcStat.mode)
|
||||
let pos = 0
|
||||
|
||||
while (pos < srcStat.size) {
|
||||
const bytesRead = fs.readSync(fdr, _buff, 0, BUF_LENGTH, pos)
|
||||
fs.writeSync(fdw, _buff, 0, bytesRead)
|
||||
pos += bytesRead
|
||||
}
|
||||
|
||||
if (opts.preserveTimestamps) fs.futimesSync(fdw, srcStat.atime, srcStat.mtime)
|
||||
|
||||
fs.closeSync(fdr)
|
||||
fs.closeSync(fdw)
|
||||
}
|
||||
|
||||
function onDir (srcStat, destStat, src, dest, opts) {
|
||||
if (!destStat) return mkDirAndCopy(srcStat, src, dest, opts)
|
||||
if (destStat && !destStat.isDirectory()) {
|
||||
throw new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`)
|
||||
}
|
||||
return copyDir(src, dest, opts)
|
||||
}
|
||||
|
||||
function mkDirAndCopy (srcStat, src, dest, opts) {
|
||||
fs.mkdirSync(dest)
|
||||
copyDir(src, dest, opts)
|
||||
return fs.chmodSync(dest, srcStat.mode)
|
||||
}
|
||||
|
||||
function copyDir (src, dest, opts) {
|
||||
fs.readdirSync(src).forEach(item => copyDirItem(item, src, dest, opts))
|
||||
}
|
||||
|
||||
function copyDirItem (item, src, dest, opts) {
|
||||
const srcItem = path.join(src, item)
|
||||
const destItem = path.join(dest, item)
|
||||
const { destStat } = stat.checkPathsSync(srcItem, destItem, 'copy')
|
||||
return startCopy(destStat, srcItem, destItem, opts)
|
||||
}
|
||||
|
||||
function onLink (destStat, src, dest, opts) {
|
||||
let resolvedSrc = fs.readlinkSync(src)
|
||||
if (opts.dereference) {
|
||||
resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
|
||||
}
|
||||
|
||||
if (!destStat) {
|
||||
return fs.symlinkSync(resolvedSrc, dest)
|
||||
} else {
|
||||
let resolvedDest
|
||||
try {
|
||||
resolvedDest = fs.readlinkSync(dest)
|
||||
} catch (err) {
|
||||
// dest exists and is a regular file or directory,
|
||||
// Windows may throw UNKNOWN error. If dest already exists,
|
||||
// fs throws error anyway, so no need to guard against it here.
|
||||
if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlinkSync(resolvedSrc, dest)
|
||||
throw err
|
||||
}
|
||||
if (opts.dereference) {
|
||||
resolvedDest = path.resolve(process.cwd(), resolvedDest)
|
||||
}
|
||||
if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {
|
||||
throw new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`)
|
||||
}
|
||||
|
||||
// prevent copy if src is a subdir of dest since unlinking
|
||||
// dest in this case would result in removing src contents
|
||||
// and therefore a broken symlink would be created.
|
||||
if (fs.statSync(dest).isDirectory() && stat.isSrcSubdir(resolvedDest, resolvedSrc)) {
|
||||
throw new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`)
|
||||
}
|
||||
return copyLink(resolvedSrc, dest)
|
||||
}
|
||||
}
|
||||
|
||||
function copyLink (resolvedSrc, dest) {
|
||||
fs.unlinkSync(dest)
|
||||
return fs.symlinkSync(resolvedSrc, dest)
|
||||
}
|
||||
|
||||
module.exports = copySync
|
||||
5
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/copy-sync/index.js
generated
vendored
Normal file
5
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/copy-sync/index.js
generated
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
'use strict'
|
||||
|
||||
module.exports = {
|
||||
copySync: require('./copy-sync')
|
||||
}
|
||||
212
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/copy/copy.js
generated
vendored
Normal file
212
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/copy/copy.js
generated
vendored
Normal file
@ -0,0 +1,212 @@
|
||||
'use strict'
|
||||
|
||||
const fs = require('graceful-fs')
|
||||
const path = require('path')
|
||||
const mkdirp = require('../mkdirs').mkdirs
|
||||
const pathExists = require('../path-exists').pathExists
|
||||
const utimes = require('../util/utimes').utimesMillis
|
||||
const stat = require('../util/stat')
|
||||
|
||||
function copy (src, dest, opts, cb) {
|
||||
if (typeof opts === 'function' && !cb) {
|
||||
cb = opts
|
||||
opts = {}
|
||||
} else if (typeof opts === 'function') {
|
||||
opts = { filter: opts }
|
||||
}
|
||||
|
||||
cb = cb || function () {}
|
||||
opts = opts || {}
|
||||
|
||||
opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
|
||||
opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber
|
||||
|
||||
// Warn about using preserveTimestamps on 32-bit node
|
||||
if (opts.preserveTimestamps && process.arch === 'ia32') {
|
||||
console.warn(`fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n
|
||||
see https://github.com/jprichardson/node-fs-extra/issues/269`)
|
||||
}
|
||||
|
||||
stat.checkPaths(src, dest, 'copy', (err, stats) => {
|
||||
if (err) return cb(err)
|
||||
const { srcStat, destStat } = stats
|
||||
stat.checkParentPaths(src, srcStat, dest, 'copy', err => {
|
||||
if (err) return cb(err)
|
||||
if (opts.filter) return handleFilter(checkParentDir, destStat, src, dest, opts, cb)
|
||||
return checkParentDir(destStat, src, dest, opts, cb)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function checkParentDir (destStat, src, dest, opts, cb) {
|
||||
const destParent = path.dirname(dest)
|
||||
pathExists(destParent, (err, dirExists) => {
|
||||
if (err) return cb(err)
|
||||
if (dirExists) return startCopy(destStat, src, dest, opts, cb)
|
||||
mkdirp(destParent, err => {
|
||||
if (err) return cb(err)
|
||||
return startCopy(destStat, src, dest, opts, cb)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function handleFilter (onInclude, destStat, src, dest, opts, cb) {
|
||||
Promise.resolve(opts.filter(src, dest)).then(include => {
|
||||
if (include) return onInclude(destStat, src, dest, opts, cb)
|
||||
return cb()
|
||||
}, error => cb(error))
|
||||
}
|
||||
|
||||
function startCopy (destStat, src, dest, opts, cb) {
|
||||
if (opts.filter) return handleFilter(getStats, destStat, src, dest, opts, cb)
|
||||
return getStats(destStat, src, dest, opts, cb)
|
||||
}
|
||||
|
||||
function getStats (destStat, src, dest, opts, cb) {
|
||||
const stat = opts.dereference ? fs.stat : fs.lstat
|
||||
stat(src, (err, srcStat) => {
|
||||
if (err) return cb(err)
|
||||
|
||||
if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts, cb)
|
||||
else if (srcStat.isFile() ||
|
||||
srcStat.isCharacterDevice() ||
|
||||
srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts, cb)
|
||||
else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts, cb)
|
||||
})
|
||||
}
|
||||
|
||||
function onFile (srcStat, destStat, src, dest, opts, cb) {
|
||||
if (!destStat) return copyFile(srcStat, src, dest, opts, cb)
|
||||
return mayCopyFile(srcStat, src, dest, opts, cb)
|
||||
}
|
||||
|
||||
function mayCopyFile (srcStat, src, dest, opts, cb) {
|
||||
if (opts.overwrite) {
|
||||
fs.unlink(dest, err => {
|
||||
if (err) return cb(err)
|
||||
return copyFile(srcStat, src, dest, opts, cb)
|
||||
})
|
||||
} else if (opts.errorOnExist) {
|
||||
return cb(new Error(`'${dest}' already exists`))
|
||||
} else return cb()
|
||||
}
|
||||
|
||||
function copyFile (srcStat, src, dest, opts, cb) {
|
||||
if (typeof fs.copyFile === 'function') {
|
||||
return fs.copyFile(src, dest, err => {
|
||||
if (err) return cb(err)
|
||||
return setDestModeAndTimestamps(srcStat, dest, opts, cb)
|
||||
})
|
||||
}
|
||||
return copyFileFallback(srcStat, src, dest, opts, cb)
|
||||
}
|
||||
|
||||
function copyFileFallback (srcStat, src, dest, opts, cb) {
|
||||
const rs = fs.createReadStream(src)
|
||||
rs.on('error', err => cb(err)).once('open', () => {
|
||||
const ws = fs.createWriteStream(dest, { mode: srcStat.mode })
|
||||
ws.on('error', err => cb(err))
|
||||
.on('open', () => rs.pipe(ws))
|
||||
.once('close', () => setDestModeAndTimestamps(srcStat, dest, opts, cb))
|
||||
})
|
||||
}
|
||||
|
||||
function setDestModeAndTimestamps (srcStat, dest, opts, cb) {
|
||||
fs.chmod(dest, srcStat.mode, err => {
|
||||
if (err) return cb(err)
|
||||
if (opts.preserveTimestamps) {
|
||||
return utimes(dest, srcStat.atime, srcStat.mtime, cb)
|
||||
}
|
||||
return cb()
|
||||
})
|
||||
}
|
||||
|
||||
function onDir (srcStat, destStat, src, dest, opts, cb) {
|
||||
if (!destStat) return mkDirAndCopy(srcStat, src, dest, opts, cb)
|
||||
if (destStat && !destStat.isDirectory()) {
|
||||
return cb(new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`))
|
||||
}
|
||||
return copyDir(src, dest, opts, cb)
|
||||
}
|
||||
|
||||
function mkDirAndCopy (srcStat, src, dest, opts, cb) {
|
||||
fs.mkdir(dest, err => {
|
||||
if (err) return cb(err)
|
||||
copyDir(src, dest, opts, err => {
|
||||
if (err) return cb(err)
|
||||
return fs.chmod(dest, srcStat.mode, cb)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function copyDir (src, dest, opts, cb) {
|
||||
fs.readdir(src, (err, items) => {
|
||||
if (err) return cb(err)
|
||||
return copyDirItems(items, src, dest, opts, cb)
|
||||
})
|
||||
}
|
||||
|
||||
function copyDirItems (items, src, dest, opts, cb) {
|
||||
const item = items.pop()
|
||||
if (!item) return cb()
|
||||
return copyDirItem(items, item, src, dest, opts, cb)
|
||||
}
|
||||
|
||||
function copyDirItem (items, item, src, dest, opts, cb) {
|
||||
const srcItem = path.join(src, item)
|
||||
const destItem = path.join(dest, item)
|
||||
stat.checkPaths(srcItem, destItem, 'copy', (err, stats) => {
|
||||
if (err) return cb(err)
|
||||
const { destStat } = stats
|
||||
startCopy(destStat, srcItem, destItem, opts, err => {
|
||||
if (err) return cb(err)
|
||||
return copyDirItems(items, src, dest, opts, cb)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function onLink (destStat, src, dest, opts, cb) {
|
||||
fs.readlink(src, (err, resolvedSrc) => {
|
||||
if (err) return cb(err)
|
||||
if (opts.dereference) {
|
||||
resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
|
||||
}
|
||||
|
||||
if (!destStat) {
|
||||
return fs.symlink(resolvedSrc, dest, cb)
|
||||
} else {
|
||||
fs.readlink(dest, (err, resolvedDest) => {
|
||||
if (err) {
|
||||
// dest exists and is a regular file or directory,
|
||||
// Windows may throw UNKNOWN error. If dest already exists,
|
||||
// fs throws error anyway, so no need to guard against it here.
|
||||
if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlink(resolvedSrc, dest, cb)
|
||||
return cb(err)
|
||||
}
|
||||
if (opts.dereference) {
|
||||
resolvedDest = path.resolve(process.cwd(), resolvedDest)
|
||||
}
|
||||
if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {
|
||||
return cb(new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`))
|
||||
}
|
||||
|
||||
// do not copy if src is a subdir of dest since unlinking
|
||||
// dest in this case would result in removing src contents
|
||||
// and therefore a broken symlink would be created.
|
||||
if (destStat.isDirectory() && stat.isSrcSubdir(resolvedDest, resolvedSrc)) {
|
||||
return cb(new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`))
|
||||
}
|
||||
return copyLink(resolvedSrc, dest, cb)
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function copyLink (resolvedSrc, dest, cb) {
|
||||
fs.unlink(dest, err => {
|
||||
if (err) return cb(err)
|
||||
return fs.symlink(resolvedSrc, dest, cb)
|
||||
})
|
||||
}
|
||||
|
||||
module.exports = copy
|
||||
6
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/copy/index.js
generated
vendored
Normal file
6
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/copy/index.js
generated
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
'use strict'
|
||||
|
||||
const u = require('universalify').fromCallback
|
||||
module.exports = {
|
||||
copy: u(require('./copy'))
|
||||
}
|
||||
48
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/empty/index.js
generated
vendored
Normal file
48
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/empty/index.js
generated
vendored
Normal file
@ -0,0 +1,48 @@
|
||||
'use strict'
|
||||
|
||||
const u = require('universalify').fromCallback
|
||||
const fs = require('graceful-fs')
|
||||
const path = require('path')
|
||||
const mkdir = require('../mkdirs')
|
||||
const remove = require('../remove')
|
||||
|
||||
const emptyDir = u(function emptyDir (dir, callback) {
|
||||
callback = callback || function () {}
|
||||
fs.readdir(dir, (err, items) => {
|
||||
if (err) return mkdir.mkdirs(dir, callback)
|
||||
|
||||
items = items.map(item => path.join(dir, item))
|
||||
|
||||
deleteItem()
|
||||
|
||||
function deleteItem () {
|
||||
const item = items.pop()
|
||||
if (!item) return callback()
|
||||
remove.remove(item, err => {
|
||||
if (err) return callback(err)
|
||||
deleteItem()
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
function emptyDirSync (dir) {
|
||||
let items
|
||||
try {
|
||||
items = fs.readdirSync(dir)
|
||||
} catch (err) {
|
||||
return mkdir.mkdirsSync(dir)
|
||||
}
|
||||
|
||||
items.forEach(item => {
|
||||
item = path.join(dir, item)
|
||||
remove.removeSync(item)
|
||||
})
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
emptyDirSync,
|
||||
emptydirSync: emptyDirSync,
|
||||
emptyDir,
|
||||
emptydir: emptyDir
|
||||
}
|
||||
49
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/ensure/file.js
generated
vendored
Normal file
49
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/ensure/file.js
generated
vendored
Normal file
@ -0,0 +1,49 @@
|
||||
'use strict'
|
||||
|
||||
const u = require('universalify').fromCallback
|
||||
const path = require('path')
|
||||
const fs = require('graceful-fs')
|
||||
const mkdir = require('../mkdirs')
|
||||
const pathExists = require('../path-exists').pathExists
|
||||
|
||||
function createFile (file, callback) {
|
||||
function makeFile () {
|
||||
fs.writeFile(file, '', err => {
|
||||
if (err) return callback(err)
|
||||
callback()
|
||||
})
|
||||
}
|
||||
|
||||
fs.stat(file, (err, stats) => { // eslint-disable-line handle-callback-err
|
||||
if (!err && stats.isFile()) return callback()
|
||||
const dir = path.dirname(file)
|
||||
pathExists(dir, (err, dirExists) => {
|
||||
if (err) return callback(err)
|
||||
if (dirExists) return makeFile()
|
||||
mkdir.mkdirs(dir, err => {
|
||||
if (err) return callback(err)
|
||||
makeFile()
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function createFileSync (file) {
|
||||
let stats
|
||||
try {
|
||||
stats = fs.statSync(file)
|
||||
} catch (e) {}
|
||||
if (stats && stats.isFile()) return
|
||||
|
||||
const dir = path.dirname(file)
|
||||
if (!fs.existsSync(dir)) {
|
||||
mkdir.mkdirsSync(dir)
|
||||
}
|
||||
|
||||
fs.writeFileSync(file, '')
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
createFile: u(createFile),
|
||||
createFileSync
|
||||
}
|
||||
23
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/ensure/index.js
generated
vendored
Normal file
23
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/ensure/index.js
generated
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
'use strict'
|
||||
|
||||
const file = require('./file')
|
||||
const link = require('./link')
|
||||
const symlink = require('./symlink')
|
||||
|
||||
module.exports = {
|
||||
// file
|
||||
createFile: file.createFile,
|
||||
createFileSync: file.createFileSync,
|
||||
ensureFile: file.createFile,
|
||||
ensureFileSync: file.createFileSync,
|
||||
// link
|
||||
createLink: link.createLink,
|
||||
createLinkSync: link.createLinkSync,
|
||||
ensureLink: link.createLink,
|
||||
ensureLinkSync: link.createLinkSync,
|
||||
// symlink
|
||||
createSymlink: symlink.createSymlink,
|
||||
createSymlinkSync: symlink.createSymlinkSync,
|
||||
ensureSymlink: symlink.createSymlink,
|
||||
ensureSymlinkSync: symlink.createSymlinkSync
|
||||
}
|
||||
61
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/ensure/link.js
generated
vendored
Normal file
61
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/ensure/link.js
generated
vendored
Normal file
@ -0,0 +1,61 @@
|
||||
'use strict'
|
||||
|
||||
const u = require('universalify').fromCallback
|
||||
const path = require('path')
|
||||
const fs = require('graceful-fs')
|
||||
const mkdir = require('../mkdirs')
|
||||
const pathExists = require('../path-exists').pathExists
|
||||
|
||||
function createLink (srcpath, dstpath, callback) {
|
||||
function makeLink (srcpath, dstpath) {
|
||||
fs.link(srcpath, dstpath, err => {
|
||||
if (err) return callback(err)
|
||||
callback(null)
|
||||
})
|
||||
}
|
||||
|
||||
pathExists(dstpath, (err, destinationExists) => {
|
||||
if (err) return callback(err)
|
||||
if (destinationExists) return callback(null)
|
||||
fs.lstat(srcpath, (err) => {
|
||||
if (err) {
|
||||
err.message = err.message.replace('lstat', 'ensureLink')
|
||||
return callback(err)
|
||||
}
|
||||
|
||||
const dir = path.dirname(dstpath)
|
||||
pathExists(dir, (err, dirExists) => {
|
||||
if (err) return callback(err)
|
||||
if (dirExists) return makeLink(srcpath, dstpath)
|
||||
mkdir.mkdirs(dir, err => {
|
||||
if (err) return callback(err)
|
||||
makeLink(srcpath, dstpath)
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function createLinkSync (srcpath, dstpath) {
|
||||
const destinationExists = fs.existsSync(dstpath)
|
||||
if (destinationExists) return undefined
|
||||
|
||||
try {
|
||||
fs.lstatSync(srcpath)
|
||||
} catch (err) {
|
||||
err.message = err.message.replace('lstat', 'ensureLink')
|
||||
throw err
|
||||
}
|
||||
|
||||
const dir = path.dirname(dstpath)
|
||||
const dirExists = fs.existsSync(dir)
|
||||
if (dirExists) return fs.linkSync(srcpath, dstpath)
|
||||
mkdir.mkdirsSync(dir)
|
||||
|
||||
return fs.linkSync(srcpath, dstpath)
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
createLink: u(createLink),
|
||||
createLinkSync
|
||||
}
|
||||
99
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/ensure/symlink-paths.js
generated
vendored
Normal file
99
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/ensure/symlink-paths.js
generated
vendored
Normal file
@ -0,0 +1,99 @@
|
||||
'use strict'
|
||||
|
||||
const path = require('path')
|
||||
const fs = require('graceful-fs')
|
||||
const pathExists = require('../path-exists').pathExists
|
||||
|
||||
/**
|
||||
* Function that returns two types of paths, one relative to symlink, and one
|
||||
* relative to the current working directory. Checks if path is absolute or
|
||||
* relative. If the path is relative, this function checks if the path is
|
||||
* relative to symlink or relative to current working directory. This is an
|
||||
* initiative to find a smarter `srcpath` to supply when building symlinks.
|
||||
* This allows you to determine which path to use out of one of three possible
|
||||
* types of source paths. The first is an absolute path. This is detected by
|
||||
* `path.isAbsolute()`. When an absolute path is provided, it is checked to
|
||||
* see if it exists. If it does it's used, if not an error is returned
|
||||
* (callback)/ thrown (sync). The other two options for `srcpath` are a
|
||||
* relative url. By default Node's `fs.symlink` works by creating a symlink
|
||||
* using `dstpath` and expects the `srcpath` to be relative to the newly
|
||||
* created symlink. If you provide a `srcpath` that does not exist on the file
|
||||
* system it results in a broken symlink. To minimize this, the function
|
||||
* checks to see if the 'relative to symlink' source file exists, and if it
|
||||
* does it will use it. If it does not, it checks if there's a file that
|
||||
* exists that is relative to the current working directory, if does its used.
|
||||
* This preserves the expectations of the original fs.symlink spec and adds
|
||||
* the ability to pass in `relative to current working direcotry` paths.
|
||||
*/
|
||||
|
||||
function symlinkPaths (srcpath, dstpath, callback) {
|
||||
if (path.isAbsolute(srcpath)) {
|
||||
return fs.lstat(srcpath, (err) => {
|
||||
if (err) {
|
||||
err.message = err.message.replace('lstat', 'ensureSymlink')
|
||||
return callback(err)
|
||||
}
|
||||
return callback(null, {
|
||||
'toCwd': srcpath,
|
||||
'toDst': srcpath
|
||||
})
|
||||
})
|
||||
} else {
|
||||
const dstdir = path.dirname(dstpath)
|
||||
const relativeToDst = path.join(dstdir, srcpath)
|
||||
return pathExists(relativeToDst, (err, exists) => {
|
||||
if (err) return callback(err)
|
||||
if (exists) {
|
||||
return callback(null, {
|
||||
'toCwd': relativeToDst,
|
||||
'toDst': srcpath
|
||||
})
|
||||
} else {
|
||||
return fs.lstat(srcpath, (err) => {
|
||||
if (err) {
|
||||
err.message = err.message.replace('lstat', 'ensureSymlink')
|
||||
return callback(err)
|
||||
}
|
||||
return callback(null, {
|
||||
'toCwd': srcpath,
|
||||
'toDst': path.relative(dstdir, srcpath)
|
||||
})
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function symlinkPathsSync (srcpath, dstpath) {
|
||||
let exists
|
||||
if (path.isAbsolute(srcpath)) {
|
||||
exists = fs.existsSync(srcpath)
|
||||
if (!exists) throw new Error('absolute srcpath does not exist')
|
||||
return {
|
||||
'toCwd': srcpath,
|
||||
'toDst': srcpath
|
||||
}
|
||||
} else {
|
||||
const dstdir = path.dirname(dstpath)
|
||||
const relativeToDst = path.join(dstdir, srcpath)
|
||||
exists = fs.existsSync(relativeToDst)
|
||||
if (exists) {
|
||||
return {
|
||||
'toCwd': relativeToDst,
|
||||
'toDst': srcpath
|
||||
}
|
||||
} else {
|
||||
exists = fs.existsSync(srcpath)
|
||||
if (!exists) throw new Error('relative srcpath does not exist')
|
||||
return {
|
||||
'toCwd': srcpath,
|
||||
'toDst': path.relative(dstdir, srcpath)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
symlinkPaths,
|
||||
symlinkPathsSync
|
||||
}
|
||||
31
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/ensure/symlink-type.js
generated
vendored
Normal file
31
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/ensure/symlink-type.js
generated
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
'use strict'
|
||||
|
||||
const fs = require('graceful-fs')
|
||||
|
||||
function symlinkType (srcpath, type, callback) {
|
||||
callback = (typeof type === 'function') ? type : callback
|
||||
type = (typeof type === 'function') ? false : type
|
||||
if (type) return callback(null, type)
|
||||
fs.lstat(srcpath, (err, stats) => {
|
||||
if (err) return callback(null, 'file')
|
||||
type = (stats && stats.isDirectory()) ? 'dir' : 'file'
|
||||
callback(null, type)
|
||||
})
|
||||
}
|
||||
|
||||
function symlinkTypeSync (srcpath, type) {
|
||||
let stats
|
||||
|
||||
if (type) return type
|
||||
try {
|
||||
stats = fs.lstatSync(srcpath)
|
||||
} catch (e) {
|
||||
return 'file'
|
||||
}
|
||||
return (stats && stats.isDirectory()) ? 'dir' : 'file'
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
symlinkType,
|
||||
symlinkTypeSync
|
||||
}
|
||||
63
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/ensure/symlink.js
generated
vendored
Normal file
63
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/ensure/symlink.js
generated
vendored
Normal file
@ -0,0 +1,63 @@
|
||||
'use strict'
|
||||
|
||||
const u = require('universalify').fromCallback
|
||||
const path = require('path')
|
||||
const fs = require('graceful-fs')
|
||||
const _mkdirs = require('../mkdirs')
|
||||
const mkdirs = _mkdirs.mkdirs
|
||||
const mkdirsSync = _mkdirs.mkdirsSync
|
||||
|
||||
const _symlinkPaths = require('./symlink-paths')
|
||||
const symlinkPaths = _symlinkPaths.symlinkPaths
|
||||
const symlinkPathsSync = _symlinkPaths.symlinkPathsSync
|
||||
|
||||
const _symlinkType = require('./symlink-type')
|
||||
const symlinkType = _symlinkType.symlinkType
|
||||
const symlinkTypeSync = _symlinkType.symlinkTypeSync
|
||||
|
||||
const pathExists = require('../path-exists').pathExists
|
||||
|
||||
function createSymlink (srcpath, dstpath, type, callback) {
|
||||
callback = (typeof type === 'function') ? type : callback
|
||||
type = (typeof type === 'function') ? false : type
|
||||
|
||||
pathExists(dstpath, (err, destinationExists) => {
|
||||
if (err) return callback(err)
|
||||
if (destinationExists) return callback(null)
|
||||
symlinkPaths(srcpath, dstpath, (err, relative) => {
|
||||
if (err) return callback(err)
|
||||
srcpath = relative.toDst
|
||||
symlinkType(relative.toCwd, type, (err, type) => {
|
||||
if (err) return callback(err)
|
||||
const dir = path.dirname(dstpath)
|
||||
pathExists(dir, (err, dirExists) => {
|
||||
if (err) return callback(err)
|
||||
if (dirExists) return fs.symlink(srcpath, dstpath, type, callback)
|
||||
mkdirs(dir, err => {
|
||||
if (err) return callback(err)
|
||||
fs.symlink(srcpath, dstpath, type, callback)
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function createSymlinkSync (srcpath, dstpath, type) {
|
||||
const destinationExists = fs.existsSync(dstpath)
|
||||
if (destinationExists) return undefined
|
||||
|
||||
const relative = symlinkPathsSync(srcpath, dstpath)
|
||||
srcpath = relative.toDst
|
||||
type = symlinkTypeSync(relative.toCwd, type)
|
||||
const dir = path.dirname(dstpath)
|
||||
const exists = fs.existsSync(dir)
|
||||
if (exists) return fs.symlinkSync(srcpath, dstpath, type)
|
||||
mkdirsSync(dir)
|
||||
return fs.symlinkSync(srcpath, dstpath, type)
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
createSymlink: u(createSymlink),
|
||||
createSymlinkSync
|
||||
}
|
||||
109
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/fs/index.js
generated
vendored
Normal file
109
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/fs/index.js
generated
vendored
Normal file
@ -0,0 +1,109 @@
|
||||
'use strict'
|
||||
// This is adapted from https://github.com/normalize/mz
|
||||
// Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors
|
||||
const u = require('universalify').fromCallback
|
||||
const fs = require('graceful-fs')
|
||||
|
||||
const api = [
|
||||
'access',
|
||||
'appendFile',
|
||||
'chmod',
|
||||
'chown',
|
||||
'close',
|
||||
'copyFile',
|
||||
'fchmod',
|
||||
'fchown',
|
||||
'fdatasync',
|
||||
'fstat',
|
||||
'fsync',
|
||||
'ftruncate',
|
||||
'futimes',
|
||||
'lchown',
|
||||
'lchmod',
|
||||
'link',
|
||||
'lstat',
|
||||
'mkdir',
|
||||
'mkdtemp',
|
||||
'open',
|
||||
'readFile',
|
||||
'readdir',
|
||||
'readlink',
|
||||
'realpath',
|
||||
'rename',
|
||||
'rmdir',
|
||||
'stat',
|
||||
'symlink',
|
||||
'truncate',
|
||||
'unlink',
|
||||
'utimes',
|
||||
'writeFile'
|
||||
].filter(key => {
|
||||
// Some commands are not available on some systems. Ex:
|
||||
// fs.copyFile was added in Node.js v8.5.0
|
||||
// fs.mkdtemp was added in Node.js v5.10.0
|
||||
// fs.lchown is not available on at least some Linux
|
||||
return typeof fs[key] === 'function'
|
||||
})
|
||||
|
||||
// Export all keys:
|
||||
Object.keys(fs).forEach(key => {
|
||||
if (key === 'promises') {
|
||||
// fs.promises is a getter property that triggers ExperimentalWarning
|
||||
// Don't re-export it here, the getter is defined in "lib/index.js"
|
||||
return
|
||||
}
|
||||
exports[key] = fs[key]
|
||||
})
|
||||
|
||||
// Universalify async methods:
|
||||
api.forEach(method => {
|
||||
exports[method] = u(fs[method])
|
||||
})
|
||||
|
||||
// We differ from mz/fs in that we still ship the old, broken, fs.exists()
|
||||
// since we are a drop-in replacement for the native module
|
||||
exports.exists = function (filename, callback) {
|
||||
if (typeof callback === 'function') {
|
||||
return fs.exists(filename, callback)
|
||||
}
|
||||
return new Promise(resolve => {
|
||||
return fs.exists(filename, resolve)
|
||||
})
|
||||
}
|
||||
|
||||
// fs.read() & fs.write need special treatment due to multiple callback args
|
||||
|
||||
exports.read = function (fd, buffer, offset, length, position, callback) {
|
||||
if (typeof callback === 'function') {
|
||||
return fs.read(fd, buffer, offset, length, position, callback)
|
||||
}
|
||||
return new Promise((resolve, reject) => {
|
||||
fs.read(fd, buffer, offset, length, position, (err, bytesRead, buffer) => {
|
||||
if (err) return reject(err)
|
||||
resolve({ bytesRead, buffer })
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// Function signature can be
|
||||
// fs.write(fd, buffer[, offset[, length[, position]]], callback)
|
||||
// OR
|
||||
// fs.write(fd, string[, position[, encoding]], callback)
|
||||
// We need to handle both cases, so we use ...args
|
||||
exports.write = function (fd, buffer, ...args) {
|
||||
if (typeof args[args.length - 1] === 'function') {
|
||||
return fs.write(fd, buffer, ...args)
|
||||
}
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
fs.write(fd, buffer, ...args, (err, bytesWritten, buffer) => {
|
||||
if (err) return reject(err)
|
||||
resolve({ bytesWritten, buffer })
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// fs.realpath.native only available in Node v9.2+
|
||||
if (typeof fs.realpath.native === 'function') {
|
||||
exports.realpath.native = u(fs.realpath.native)
|
||||
}
|
||||
28
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/index.js
generated
vendored
Normal file
28
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/index.js
generated
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
'use strict'
|
||||
|
||||
module.exports = Object.assign(
|
||||
{},
|
||||
// Export promiseified graceful-fs:
|
||||
require('./fs'),
|
||||
// Export extra methods:
|
||||
require('./copy-sync'),
|
||||
require('./copy'),
|
||||
require('./empty'),
|
||||
require('./ensure'),
|
||||
require('./json'),
|
||||
require('./mkdirs'),
|
||||
require('./move-sync'),
|
||||
require('./move'),
|
||||
require('./output'),
|
||||
require('./path-exists'),
|
||||
require('./remove')
|
||||
)
|
||||
|
||||
// Export fs.promises as a getter property so that we don't trigger
|
||||
// ExperimentalWarning before fs.promises is actually accessed.
|
||||
const fs = require('fs')
|
||||
if (Object.getOwnPropertyDescriptor(fs, 'promises')) {
|
||||
Object.defineProperty(module.exports, 'promises', {
|
||||
get () { return fs.promises }
|
||||
})
|
||||
}
|
||||
16
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/json/index.js
generated
vendored
Normal file
16
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/json/index.js
generated
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
'use strict'
|
||||
|
||||
const u = require('universalify').fromCallback
|
||||
const jsonFile = require('./jsonfile')
|
||||
|
||||
jsonFile.outputJson = u(require('./output-json'))
|
||||
jsonFile.outputJsonSync = require('./output-json-sync')
|
||||
// aliases
|
||||
jsonFile.outputJSON = jsonFile.outputJson
|
||||
jsonFile.outputJSONSync = jsonFile.outputJsonSync
|
||||
jsonFile.writeJSON = jsonFile.writeJson
|
||||
jsonFile.writeJSONSync = jsonFile.writeJsonSync
|
||||
jsonFile.readJSON = jsonFile.readJson
|
||||
jsonFile.readJSONSync = jsonFile.readJsonSync
|
||||
|
||||
module.exports = jsonFile
|
||||
12
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/json/jsonfile.js
generated
vendored
Normal file
12
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/json/jsonfile.js
generated
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
'use strict'
|
||||
|
||||
const u = require('universalify').fromCallback
|
||||
const jsonFile = require('jsonfile')
|
||||
|
||||
module.exports = {
|
||||
// jsonfile exports
|
||||
readJson: u(jsonFile.readFile),
|
||||
readJsonSync: jsonFile.readFileSync,
|
||||
writeJson: u(jsonFile.writeFile),
|
||||
writeJsonSync: jsonFile.writeFileSync
|
||||
}
|
||||
18
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/json/output-json-sync.js
generated
vendored
Normal file
18
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/json/output-json-sync.js
generated
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
'use strict'
|
||||
|
||||
const fs = require('graceful-fs')
|
||||
const path = require('path')
|
||||
const mkdir = require('../mkdirs')
|
||||
const jsonFile = require('./jsonfile')
|
||||
|
||||
function outputJsonSync (file, data, options) {
|
||||
const dir = path.dirname(file)
|
||||
|
||||
if (!fs.existsSync(dir)) {
|
||||
mkdir.mkdirsSync(dir)
|
||||
}
|
||||
|
||||
jsonFile.writeJsonSync(file, data, options)
|
||||
}
|
||||
|
||||
module.exports = outputJsonSync
|
||||
27
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/json/output-json.js
generated
vendored
Normal file
27
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/json/output-json.js
generated
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
'use strict'
|
||||
|
||||
const path = require('path')
|
||||
const mkdir = require('../mkdirs')
|
||||
const pathExists = require('../path-exists').pathExists
|
||||
const jsonFile = require('./jsonfile')
|
||||
|
||||
function outputJson (file, data, options, callback) {
|
||||
if (typeof options === 'function') {
|
||||
callback = options
|
||||
options = {}
|
||||
}
|
||||
|
||||
const dir = path.dirname(file)
|
||||
|
||||
pathExists(dir, (err, itDoes) => {
|
||||
if (err) return callback(err)
|
||||
if (itDoes) return jsonFile.writeJson(file, data, options, callback)
|
||||
|
||||
mkdir.mkdirs(dir, err => {
|
||||
if (err) return callback(err)
|
||||
jsonFile.writeJson(file, data, options, callback)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
module.exports = outputJson
|
||||
14
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/mkdirs/index.js
generated
vendored
Normal file
14
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/mkdirs/index.js
generated
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
'use strict'
|
||||
const u = require('universalify').fromCallback
|
||||
const mkdirs = u(require('./mkdirs'))
|
||||
const mkdirsSync = require('./mkdirs-sync')
|
||||
|
||||
module.exports = {
|
||||
mkdirs,
|
||||
mkdirsSync,
|
||||
// alias
|
||||
mkdirp: mkdirs,
|
||||
mkdirpSync: mkdirsSync,
|
||||
ensureDir: mkdirs,
|
||||
ensureDirSync: mkdirsSync
|
||||
}
|
||||
54
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/mkdirs/mkdirs-sync.js
generated
vendored
Normal file
54
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/mkdirs/mkdirs-sync.js
generated
vendored
Normal file
@ -0,0 +1,54 @@
|
||||
'use strict'
|
||||
|
||||
const fs = require('graceful-fs')
|
||||
const path = require('path')
|
||||
const invalidWin32Path = require('./win32').invalidWin32Path
|
||||
|
||||
const o777 = parseInt('0777', 8)
|
||||
|
||||
function mkdirsSync (p, opts, made) {
|
||||
if (!opts || typeof opts !== 'object') {
|
||||
opts = { mode: opts }
|
||||
}
|
||||
|
||||
let mode = opts.mode
|
||||
const xfs = opts.fs || fs
|
||||
|
||||
if (process.platform === 'win32' && invalidWin32Path(p)) {
|
||||
const errInval = new Error(p + ' contains invalid WIN32 path characters.')
|
||||
errInval.code = 'EINVAL'
|
||||
throw errInval
|
||||
}
|
||||
|
||||
if (mode === undefined) {
|
||||
mode = o777 & (~process.umask())
|
||||
}
|
||||
if (!made) made = null
|
||||
|
||||
p = path.resolve(p)
|
||||
|
||||
try {
|
||||
xfs.mkdirSync(p, mode)
|
||||
made = made || p
|
||||
} catch (err0) {
|
||||
if (err0.code === 'ENOENT') {
|
||||
if (path.dirname(p) === p) throw err0
|
||||
made = mkdirsSync(path.dirname(p), opts, made)
|
||||
mkdirsSync(p, opts, made)
|
||||
} else {
|
||||
// In the case of any other error, just see if there's a dir there
|
||||
// already. If so, then hooray! If not, then something is borked.
|
||||
let stat
|
||||
try {
|
||||
stat = xfs.statSync(p)
|
||||
} catch (err1) {
|
||||
throw err0
|
||||
}
|
||||
if (!stat.isDirectory()) throw err0
|
||||
}
|
||||
}
|
||||
|
||||
return made
|
||||
}
|
||||
|
||||
module.exports = mkdirsSync
|
||||
63
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/mkdirs/mkdirs.js
generated
vendored
Normal file
63
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/mkdirs/mkdirs.js
generated
vendored
Normal file
@ -0,0 +1,63 @@
|
||||
'use strict'
|
||||
|
||||
const fs = require('graceful-fs')
|
||||
const path = require('path')
|
||||
const invalidWin32Path = require('./win32').invalidWin32Path
|
||||
|
||||
const o777 = parseInt('0777', 8)
|
||||
|
||||
function mkdirs (p, opts, callback, made) {
|
||||
if (typeof opts === 'function') {
|
||||
callback = opts
|
||||
opts = {}
|
||||
} else if (!opts || typeof opts !== 'object') {
|
||||
opts = { mode: opts }
|
||||
}
|
||||
|
||||
if (process.platform === 'win32' && invalidWin32Path(p)) {
|
||||
const errInval = new Error(p + ' contains invalid WIN32 path characters.')
|
||||
errInval.code = 'EINVAL'
|
||||
return callback(errInval)
|
||||
}
|
||||
|
||||
let mode = opts.mode
|
||||
const xfs = opts.fs || fs
|
||||
|
||||
if (mode === undefined) {
|
||||
mode = o777 & (~process.umask())
|
||||
}
|
||||
if (!made) made = null
|
||||
|
||||
callback = callback || function () {}
|
||||
p = path.resolve(p)
|
||||
|
||||
xfs.mkdir(p, mode, er => {
|
||||
if (!er) {
|
||||
made = made || p
|
||||
return callback(null, made)
|
||||
}
|
||||
switch (er.code) {
|
||||
case 'ENOENT':
|
||||
if (path.dirname(p) === p) return callback(er)
|
||||
mkdirs(path.dirname(p), opts, (er, made) => {
|
||||
if (er) callback(er, made)
|
||||
else mkdirs(p, opts, callback, made)
|
||||
})
|
||||
break
|
||||
|
||||
// In the case of any other error, just see if there's a dir
|
||||
// there already. If so, then hooray! If not, then something
|
||||
// is borked.
|
||||
default:
|
||||
xfs.stat(p, (er2, stat) => {
|
||||
// if the stat fails, then that's super weird.
|
||||
// let the original error be the failure reason.
|
||||
if (er2 || !stat.isDirectory()) callback(er, made)
|
||||
else callback(null, made)
|
||||
})
|
||||
break
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
module.exports = mkdirs
|
||||
25
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/mkdirs/win32.js
generated
vendored
Normal file
25
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/mkdirs/win32.js
generated
vendored
Normal file
@ -0,0 +1,25 @@
|
||||
'use strict'
|
||||
|
||||
const path = require('path')
|
||||
|
||||
// get drive on windows
|
||||
function getRootPath (p) {
|
||||
p = path.normalize(path.resolve(p)).split(path.sep)
|
||||
if (p.length > 0) return p[0]
|
||||
return null
|
||||
}
|
||||
|
||||
// http://stackoverflow.com/a/62888/10333 contains more accurate
|
||||
// TODO: expand to include the rest
|
||||
const INVALID_PATH_CHARS = /[<>:"|?*]/
|
||||
|
||||
function invalidWin32Path (p) {
|
||||
const rp = getRootPath(p)
|
||||
p = p.replace(rp, '')
|
||||
return INVALID_PATH_CHARS.test(p)
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getRootPath,
|
||||
invalidWin32Path
|
||||
}
|
||||
5
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/move-sync/index.js
generated
vendored
Normal file
5
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/move-sync/index.js
generated
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
'use strict'
|
||||
|
||||
module.exports = {
|
||||
moveSync: require('./move-sync')
|
||||
}
|
||||
47
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/move-sync/move-sync.js
generated
vendored
Normal file
47
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/move-sync/move-sync.js
generated
vendored
Normal file
@ -0,0 +1,47 @@
|
||||
'use strict'
|
||||
|
||||
const fs = require('graceful-fs')
|
||||
const path = require('path')
|
||||
const copySync = require('../copy-sync').copySync
|
||||
const removeSync = require('../remove').removeSync
|
||||
const mkdirpSync = require('../mkdirs').mkdirpSync
|
||||
const stat = require('../util/stat')
|
||||
|
||||
function moveSync (src, dest, opts) {
|
||||
opts = opts || {}
|
||||
const overwrite = opts.overwrite || opts.clobber || false
|
||||
|
||||
const { srcStat } = stat.checkPathsSync(src, dest, 'move')
|
||||
stat.checkParentPathsSync(src, srcStat, dest, 'move')
|
||||
mkdirpSync(path.dirname(dest))
|
||||
return doRename(src, dest, overwrite)
|
||||
}
|
||||
|
||||
function doRename (src, dest, overwrite) {
|
||||
if (overwrite) {
|
||||
removeSync(dest)
|
||||
return rename(src, dest, overwrite)
|
||||
}
|
||||
if (fs.existsSync(dest)) throw new Error('dest already exists.')
|
||||
return rename(src, dest, overwrite)
|
||||
}
|
||||
|
||||
function rename (src, dest, overwrite) {
|
||||
try {
|
||||
fs.renameSync(src, dest)
|
||||
} catch (err) {
|
||||
if (err.code !== 'EXDEV') throw err
|
||||
return moveAcrossDevice(src, dest, overwrite)
|
||||
}
|
||||
}
|
||||
|
||||
function moveAcrossDevice (src, dest, overwrite) {
|
||||
const opts = {
|
||||
overwrite,
|
||||
errorOnExist: true
|
||||
}
|
||||
copySync(src, dest, opts)
|
||||
return removeSync(src)
|
||||
}
|
||||
|
||||
module.exports = moveSync
|
||||
6
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/move/index.js
generated
vendored
Normal file
6
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/move/index.js
generated
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
'use strict'
|
||||
|
||||
const u = require('universalify').fromCallback
|
||||
module.exports = {
|
||||
move: u(require('./move'))
|
||||
}
|
||||
65
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/move/move.js
generated
vendored
Normal file
65
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/move/move.js
generated
vendored
Normal file
@ -0,0 +1,65 @@
|
||||
'use strict'
|
||||
|
||||
const fs = require('graceful-fs')
|
||||
const path = require('path')
|
||||
const copy = require('../copy').copy
|
||||
const remove = require('../remove').remove
|
||||
const mkdirp = require('../mkdirs').mkdirp
|
||||
const pathExists = require('../path-exists').pathExists
|
||||
const stat = require('../util/stat')
|
||||
|
||||
function move (src, dest, opts, cb) {
|
||||
if (typeof opts === 'function') {
|
||||
cb = opts
|
||||
opts = {}
|
||||
}
|
||||
|
||||
const overwrite = opts.overwrite || opts.clobber || false
|
||||
|
||||
stat.checkPaths(src, dest, 'move', (err, stats) => {
|
||||
if (err) return cb(err)
|
||||
const { srcStat } = stats
|
||||
stat.checkParentPaths(src, srcStat, dest, 'move', err => {
|
||||
if (err) return cb(err)
|
||||
mkdirp(path.dirname(dest), err => {
|
||||
if (err) return cb(err)
|
||||
return doRename(src, dest, overwrite, cb)
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function doRename (src, dest, overwrite, cb) {
|
||||
if (overwrite) {
|
||||
return remove(dest, err => {
|
||||
if (err) return cb(err)
|
||||
return rename(src, dest, overwrite, cb)
|
||||
})
|
||||
}
|
||||
pathExists(dest, (err, destExists) => {
|
||||
if (err) return cb(err)
|
||||
if (destExists) return cb(new Error('dest already exists.'))
|
||||
return rename(src, dest, overwrite, cb)
|
||||
})
|
||||
}
|
||||
|
||||
function rename (src, dest, overwrite, cb) {
|
||||
fs.rename(src, dest, err => {
|
||||
if (!err) return cb()
|
||||
if (err.code !== 'EXDEV') return cb(err)
|
||||
return moveAcrossDevice(src, dest, overwrite, cb)
|
||||
})
|
||||
}
|
||||
|
||||
function moveAcrossDevice (src, dest, overwrite, cb) {
|
||||
const opts = {
|
||||
overwrite,
|
||||
errorOnExist: true
|
||||
}
|
||||
copy(src, dest, opts, err => {
|
||||
if (err) return cb(err)
|
||||
return remove(src, cb)
|
||||
})
|
||||
}
|
||||
|
||||
module.exports = move
|
||||
40
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/output/index.js
generated
vendored
Normal file
40
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/output/index.js
generated
vendored
Normal file
@ -0,0 +1,40 @@
|
||||
'use strict'
|
||||
|
||||
const u = require('universalify').fromCallback
|
||||
const fs = require('graceful-fs')
|
||||
const path = require('path')
|
||||
const mkdir = require('../mkdirs')
|
||||
const pathExists = require('../path-exists').pathExists
|
||||
|
||||
function outputFile (file, data, encoding, callback) {
|
||||
if (typeof encoding === 'function') {
|
||||
callback = encoding
|
||||
encoding = 'utf8'
|
||||
}
|
||||
|
||||
const dir = path.dirname(file)
|
||||
pathExists(dir, (err, itDoes) => {
|
||||
if (err) return callback(err)
|
||||
if (itDoes) return fs.writeFile(file, data, encoding, callback)
|
||||
|
||||
mkdir.mkdirs(dir, err => {
|
||||
if (err) return callback(err)
|
||||
|
||||
fs.writeFile(file, data, encoding, callback)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function outputFileSync (file, ...args) {
|
||||
const dir = path.dirname(file)
|
||||
if (fs.existsSync(dir)) {
|
||||
return fs.writeFileSync(file, ...args)
|
||||
}
|
||||
mkdir.mkdirsSync(dir)
|
||||
fs.writeFileSync(file, ...args)
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
outputFile: u(outputFile),
|
||||
outputFileSync
|
||||
}
|
||||
12
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/path-exists/index.js
generated
vendored
Normal file
12
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/path-exists/index.js
generated
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
'use strict'
|
||||
const u = require('universalify').fromPromise
|
||||
const fs = require('../fs')
|
||||
|
||||
function pathExists (path) {
|
||||
return fs.access(path).then(() => true).catch(() => false)
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
pathExists: u(pathExists),
|
||||
pathExistsSync: fs.existsSync
|
||||
}
|
||||
9
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/remove/index.js
generated
vendored
Normal file
9
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/remove/index.js
generated
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
'use strict'
|
||||
|
||||
const u = require('universalify').fromCallback
|
||||
const rimraf = require('./rimraf')
|
||||
|
||||
module.exports = {
|
||||
remove: u(rimraf),
|
||||
removeSync: rimraf.sync
|
||||
}
|
||||
314
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/remove/rimraf.js
generated
vendored
Normal file
314
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/remove/rimraf.js
generated
vendored
Normal file
@ -0,0 +1,314 @@
|
||||
'use strict'
|
||||
|
||||
const fs = require('graceful-fs')
|
||||
const path = require('path')
|
||||
const assert = require('assert')
|
||||
|
||||
const isWindows = (process.platform === 'win32')
|
||||
|
||||
function defaults (options) {
|
||||
const methods = [
|
||||
'unlink',
|
||||
'chmod',
|
||||
'stat',
|
||||
'lstat',
|
||||
'rmdir',
|
||||
'readdir'
|
||||
]
|
||||
methods.forEach(m => {
|
||||
options[m] = options[m] || fs[m]
|
||||
m = m + 'Sync'
|
||||
options[m] = options[m] || fs[m]
|
||||
})
|
||||
|
||||
options.maxBusyTries = options.maxBusyTries || 3
|
||||
}
|
||||
|
||||
function rimraf (p, options, cb) {
|
||||
let busyTries = 0
|
||||
|
||||
if (typeof options === 'function') {
|
||||
cb = options
|
||||
options = {}
|
||||
}
|
||||
|
||||
assert(p, 'rimraf: missing path')
|
||||
assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
|
||||
assert.strictEqual(typeof cb, 'function', 'rimraf: callback function required')
|
||||
assert(options, 'rimraf: invalid options argument provided')
|
||||
assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')
|
||||
|
||||
defaults(options)
|
||||
|
||||
rimraf_(p, options, function CB (er) {
|
||||
if (er) {
|
||||
if ((er.code === 'EBUSY' || er.code === 'ENOTEMPTY' || er.code === 'EPERM') &&
|
||||
busyTries < options.maxBusyTries) {
|
||||
busyTries++
|
||||
const time = busyTries * 100
|
||||
// try again, with the same exact callback as this one.
|
||||
return setTimeout(() => rimraf_(p, options, CB), time)
|
||||
}
|
||||
|
||||
// already gone
|
||||
if (er.code === 'ENOENT') er = null
|
||||
}
|
||||
|
||||
cb(er)
|
||||
})
|
||||
}
|
||||
|
||||
// Two possible strategies.
|
||||
// 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR
|
||||
// 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR
|
||||
//
|
||||
// Both result in an extra syscall when you guess wrong. However, there
|
||||
// are likely far more normal files in the world than directories. This
|
||||
// is based on the assumption that a the average number of files per
|
||||
// directory is >= 1.
|
||||
//
|
||||
// If anyone ever complains about this, then I guess the strategy could
|
||||
// be made configurable somehow. But until then, YAGNI.
|
||||
function rimraf_ (p, options, cb) {
|
||||
assert(p)
|
||||
assert(options)
|
||||
assert(typeof cb === 'function')
|
||||
|
||||
// sunos lets the root user unlink directories, which is... weird.
|
||||
// so we have to lstat here and make sure it's not a dir.
|
||||
options.lstat(p, (er, st) => {
|
||||
if (er && er.code === 'ENOENT') {
|
||||
return cb(null)
|
||||
}
|
||||
|
||||
// Windows can EPERM on stat. Life is suffering.
|
||||
if (er && er.code === 'EPERM' && isWindows) {
|
||||
return fixWinEPERM(p, options, er, cb)
|
||||
}
|
||||
|
||||
if (st && st.isDirectory()) {
|
||||
return rmdir(p, options, er, cb)
|
||||
}
|
||||
|
||||
options.unlink(p, er => {
|
||||
if (er) {
|
||||
if (er.code === 'ENOENT') {
|
||||
return cb(null)
|
||||
}
|
||||
if (er.code === 'EPERM') {
|
||||
return (isWindows)
|
||||
? fixWinEPERM(p, options, er, cb)
|
||||
: rmdir(p, options, er, cb)
|
||||
}
|
||||
if (er.code === 'EISDIR') {
|
||||
return rmdir(p, options, er, cb)
|
||||
}
|
||||
}
|
||||
return cb(er)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function fixWinEPERM (p, options, er, cb) {
|
||||
assert(p)
|
||||
assert(options)
|
||||
assert(typeof cb === 'function')
|
||||
if (er) {
|
||||
assert(er instanceof Error)
|
||||
}
|
||||
|
||||
options.chmod(p, 0o666, er2 => {
|
||||
if (er2) {
|
||||
cb(er2.code === 'ENOENT' ? null : er)
|
||||
} else {
|
||||
options.stat(p, (er3, stats) => {
|
||||
if (er3) {
|
||||
cb(er3.code === 'ENOENT' ? null : er)
|
||||
} else if (stats.isDirectory()) {
|
||||
rmdir(p, options, er, cb)
|
||||
} else {
|
||||
options.unlink(p, cb)
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function fixWinEPERMSync (p, options, er) {
|
||||
let stats
|
||||
|
||||
assert(p)
|
||||
assert(options)
|
||||
if (er) {
|
||||
assert(er instanceof Error)
|
||||
}
|
||||
|
||||
try {
|
||||
options.chmodSync(p, 0o666)
|
||||
} catch (er2) {
|
||||
if (er2.code === 'ENOENT') {
|
||||
return
|
||||
} else {
|
||||
throw er
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
stats = options.statSync(p)
|
||||
} catch (er3) {
|
||||
if (er3.code === 'ENOENT') {
|
||||
return
|
||||
} else {
|
||||
throw er
|
||||
}
|
||||
}
|
||||
|
||||
if (stats.isDirectory()) {
|
||||
rmdirSync(p, options, er)
|
||||
} else {
|
||||
options.unlinkSync(p)
|
||||
}
|
||||
}
|
||||
|
||||
function rmdir (p, options, originalEr, cb) {
|
||||
assert(p)
|
||||
assert(options)
|
||||
if (originalEr) {
|
||||
assert(originalEr instanceof Error)
|
||||
}
|
||||
assert(typeof cb === 'function')
|
||||
|
||||
// try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
|
||||
// if we guessed wrong, and it's not a directory, then
|
||||
// raise the original error.
|
||||
options.rmdir(p, er => {
|
||||
if (er && (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM')) {
|
||||
rmkids(p, options, cb)
|
||||
} else if (er && er.code === 'ENOTDIR') {
|
||||
cb(originalEr)
|
||||
} else {
|
||||
cb(er)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function rmkids (p, options, cb) {
|
||||
assert(p)
|
||||
assert(options)
|
||||
assert(typeof cb === 'function')
|
||||
|
||||
options.readdir(p, (er, files) => {
|
||||
if (er) return cb(er)
|
||||
|
||||
let n = files.length
|
||||
let errState
|
||||
|
||||
if (n === 0) return options.rmdir(p, cb)
|
||||
|
||||
files.forEach(f => {
|
||||
rimraf(path.join(p, f), options, er => {
|
||||
if (errState) {
|
||||
return
|
||||
}
|
||||
if (er) return cb(errState = er)
|
||||
if (--n === 0) {
|
||||
options.rmdir(p, cb)
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// this looks simpler, and is strictly *faster*, but will
|
||||
// tie up the JavaScript thread and fail on excessively
|
||||
// deep directory trees.
|
||||
function rimrafSync (p, options) {
|
||||
let st
|
||||
|
||||
options = options || {}
|
||||
defaults(options)
|
||||
|
||||
assert(p, 'rimraf: missing path')
|
||||
assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
|
||||
assert(options, 'rimraf: missing options')
|
||||
assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')
|
||||
|
||||
try {
|
||||
st = options.lstatSync(p)
|
||||
} catch (er) {
|
||||
if (er.code === 'ENOENT') {
|
||||
return
|
||||
}
|
||||
|
||||
// Windows can EPERM on stat. Life is suffering.
|
||||
if (er.code === 'EPERM' && isWindows) {
|
||||
fixWinEPERMSync(p, options, er)
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
// sunos lets the root user unlink directories, which is... weird.
|
||||
if (st && st.isDirectory()) {
|
||||
rmdirSync(p, options, null)
|
||||
} else {
|
||||
options.unlinkSync(p)
|
||||
}
|
||||
} catch (er) {
|
||||
if (er.code === 'ENOENT') {
|
||||
return
|
||||
} else if (er.code === 'EPERM') {
|
||||
return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)
|
||||
} else if (er.code !== 'EISDIR') {
|
||||
throw er
|
||||
}
|
||||
rmdirSync(p, options, er)
|
||||
}
|
||||
}
|
||||
|
||||
function rmdirSync (p, options, originalEr) {
|
||||
assert(p)
|
||||
assert(options)
|
||||
if (originalEr) {
|
||||
assert(originalEr instanceof Error)
|
||||
}
|
||||
|
||||
try {
|
||||
options.rmdirSync(p)
|
||||
} catch (er) {
|
||||
if (er.code === 'ENOTDIR') {
|
||||
throw originalEr
|
||||
} else if (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM') {
|
||||
rmkidsSync(p, options)
|
||||
} else if (er.code !== 'ENOENT') {
|
||||
throw er
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function rmkidsSync (p, options) {
|
||||
assert(p)
|
||||
assert(options)
|
||||
options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options))
|
||||
|
||||
if (isWindows) {
|
||||
// We only end up here once we got ENOTEMPTY at least once, and
|
||||
// at this point, we are guaranteed to have removed all the kids.
|
||||
// So, we know that it won't be ENOENT or ENOTDIR or anything else.
|
||||
// try really hard to delete stuff on windows, because it has a
|
||||
// PROFOUNDLY annoying habit of not closing handles promptly when
|
||||
// files are deleted, resulting in spurious ENOTEMPTY errors.
|
||||
const startTime = Date.now()
|
||||
do {
|
||||
try {
|
||||
const ret = options.rmdirSync(p, options)
|
||||
return ret
|
||||
} catch (er) { }
|
||||
} while (Date.now() - startTime < 500) // give up after 500ms
|
||||
} else {
|
||||
const ret = options.rmdirSync(p, options)
|
||||
return ret
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = rimraf
|
||||
rimraf.sync = rimrafSync
|
||||
12
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/util/buffer.js
generated
vendored
Normal file
12
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/util/buffer.js
generated
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
'use strict'
|
||||
/* eslint-disable node/no-deprecated-api */
|
||||
module.exports = function (size) {
|
||||
if (typeof Buffer.allocUnsafe === 'function') {
|
||||
try {
|
||||
return Buffer.allocUnsafe(size)
|
||||
} catch (e) {
|
||||
return new Buffer(size)
|
||||
}
|
||||
}
|
||||
return new Buffer(size)
|
||||
}
|
||||
172
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/util/stat.js
generated
vendored
Normal file
172
plugins/cordova-sqlite-storage/node_modules/fs-extra/lib/util/stat.js
generated
vendored
Normal file
@ -0,0 +1,172 @@
|
||||
'use strict'
|
||||
|
||||
const fs = require('graceful-fs')
|
||||
const path = require('path')
|
||||
|
||||
const NODE_VERSION_MAJOR_WITH_BIGINT = 10
|
||||
const NODE_VERSION_MINOR_WITH_BIGINT = 5
|
||||
const NODE_VERSION_PATCH_WITH_BIGINT = 0
|
||||
const nodeVersion = process.versions.node.split('.')
|
||||
const nodeVersionMajor = Number.parseInt(nodeVersion[0], 10)
|
||||
const nodeVersionMinor = Number.parseInt(nodeVersion[1], 10)
|
||||
const nodeVersionPatch = Number.parseInt(nodeVersion[2], 10)
|
||||
|
||||
function nodeSupportsBigInt () {
|
||||
if (nodeVersionMajor > NODE_VERSION_MAJOR_WITH_BIGINT) {
|
||||
return true
|
||||
} else if (nodeVersionMajor === NODE_VERSION_MAJOR_WITH_BIGINT) {
|
||||
if (nodeVersionMinor > NODE_VERSION_MINOR_WITH_BIGINT) {
|
||||
return true
|
||||
} else if (nodeVersionMinor === NODE_VERSION_MINOR_WITH_BIGINT) {
|
||||
if (nodeVersionPatch >= NODE_VERSION_PATCH_WITH_BIGINT) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
function getStats (src, dest, cb) {
|
||||
if (nodeSupportsBigInt()) {
|
||||
fs.stat(src, { bigint: true }, (err, srcStat) => {
|
||||
if (err) return cb(err)
|
||||
fs.stat(dest, { bigint: true }, (err, destStat) => {
|
||||
if (err) {
|
||||
if (err.code === 'ENOENT') return cb(null, { srcStat, destStat: null })
|
||||
return cb(err)
|
||||
}
|
||||
return cb(null, { srcStat, destStat })
|
||||
})
|
||||
})
|
||||
} else {
|
||||
fs.stat(src, (err, srcStat) => {
|
||||
if (err) return cb(err)
|
||||
fs.stat(dest, (err, destStat) => {
|
||||
if (err) {
|
||||
if (err.code === 'ENOENT') return cb(null, { srcStat, destStat: null })
|
||||
return cb(err)
|
||||
}
|
||||
return cb(null, { srcStat, destStat })
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function getStatsSync (src, dest) {
|
||||
let srcStat, destStat
|
||||
if (nodeSupportsBigInt()) {
|
||||
srcStat = fs.statSync(src, { bigint: true })
|
||||
} else {
|
||||
srcStat = fs.statSync(src)
|
||||
}
|
||||
try {
|
||||
if (nodeSupportsBigInt()) {
|
||||
destStat = fs.statSync(dest, { bigint: true })
|
||||
} else {
|
||||
destStat = fs.statSync(dest)
|
||||
}
|
||||
} catch (err) {
|
||||
if (err.code === 'ENOENT') return { srcStat, destStat: null }
|
||||
throw err
|
||||
}
|
||||
return { srcStat, destStat }
|
||||
}
|
||||
|
||||
function checkPaths (src, dest, funcName, cb) {
|
||||
getStats(src, dest, (err, stats) => {
|
||||
if (err) return cb(err)
|
||||
const { srcStat, destStat } = stats
|
||||
if (destStat && destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev) {
|
||||
return cb(new Error('Source and destination must not be the same.'))
|
||||
}
|
||||
if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
|
||||
return cb(new Error(errMsg(src, dest, funcName)))
|
||||
}
|
||||
return cb(null, { srcStat, destStat })
|
||||
})
|
||||
}
|
||||
|
||||
function checkPathsSync (src, dest, funcName) {
|
||||
const { srcStat, destStat } = getStatsSync(src, dest)
|
||||
if (destStat && destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev) {
|
||||
throw new Error('Source and destination must not be the same.')
|
||||
}
|
||||
if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
|
||||
throw new Error(errMsg(src, dest, funcName))
|
||||
}
|
||||
return { srcStat, destStat }
|
||||
}
|
||||
|
||||
// recursively check if dest parent is a subdirectory of src.
|
||||
// It works for all file types including symlinks since it
|
||||
// checks the src and dest inodes. It starts from the deepest
|
||||
// parent and stops once it reaches the src parent or the root path.
|
||||
function checkParentPaths (src, srcStat, dest, funcName, cb) {
|
||||
const srcParent = path.resolve(path.dirname(src))
|
||||
const destParent = path.resolve(path.dirname(dest))
|
||||
if (destParent === srcParent || destParent === path.parse(destParent).root) return cb()
|
||||
if (nodeSupportsBigInt()) {
|
||||
fs.stat(destParent, { bigint: true }, (err, destStat) => {
|
||||
if (err) {
|
||||
if (err.code === 'ENOENT') return cb()
|
||||
return cb(err)
|
||||
}
|
||||
if (destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev) {
|
||||
return cb(new Error(errMsg(src, dest, funcName)))
|
||||
}
|
||||
return checkParentPaths(src, srcStat, destParent, funcName, cb)
|
||||
})
|
||||
} else {
|
||||
fs.stat(destParent, (err, destStat) => {
|
||||
if (err) {
|
||||
if (err.code === 'ENOENT') return cb()
|
||||
return cb(err)
|
||||
}
|
||||
if (destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev) {
|
||||
return cb(new Error(errMsg(src, dest, funcName)))
|
||||
}
|
||||
return checkParentPaths(src, srcStat, destParent, funcName, cb)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function checkParentPathsSync (src, srcStat, dest, funcName) {
|
||||
const srcParent = path.resolve(path.dirname(src))
|
||||
const destParent = path.resolve(path.dirname(dest))
|
||||
if (destParent === srcParent || destParent === path.parse(destParent).root) return
|
||||
let destStat
|
||||
try {
|
||||
if (nodeSupportsBigInt()) {
|
||||
destStat = fs.statSync(destParent, { bigint: true })
|
||||
} else {
|
||||
destStat = fs.statSync(destParent)
|
||||
}
|
||||
} catch (err) {
|
||||
if (err.code === 'ENOENT') return
|
||||
throw err
|
||||
}
|
||||
if (destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev) {
|
||||
throw new Error(errMsg(src, dest, funcName))
|
||||
}
|
||||
return checkParentPathsSync(src, srcStat, destParent, funcName)
|
||||
}
|
||||
|
||||
// return true if dest is a subdir of src, otherwise false.
|
||||
// It only checks the path strings.
|
||||
function isSrcSubdir (src, dest) {
|
||||
const srcArr = path.resolve(src).split(path.sep).filter(i => i)
|
||||
const destArr = path.resolve(dest).split(path.sep).filter(i => i)
|
||||
return srcArr.reduce((acc, cur, i) => acc && destArr[i] === cur, true)
|
||||
}
|
||||
|
||||
function errMsg (src, dest, funcName) {
|
||||
return `Cannot ${funcName} '${src}' to a subdirectory of itself, '${dest}'.`
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
checkPaths,
|
||||
checkPathsSync,
|
||||
checkParentPaths,
|
||||
checkParentPathsSync,
|
||||
isSrcSubdir
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user