Compare commits

...

233 Commits

Author SHA1 Message Date
Ibby
1d8ae5abab style(screen-orientation): double quote to single 2017-03-17 17:57:59 -04:00
Ibby
0fc534699b 3.1.0-rc.6 2017-03-17 17:56:40 -04:00
Ibby
7f39af3af3 feat(linkedin): add LinkedIn plugin 2017-03-17 17:33:10 -04:00
Ibby
dd8888c369 feat(stripe): add new methods 2017-03-17 17:21:55 -04:00
Ibby
e0138a10ab feat(screen-orientation): update wrapper to match v2 of the plugin
The whole implementation has changed now. You must update your code.
2017-03-17 17:14:21 -04:00
Ibby Hadeed
5492239ff4 refactor(): general cleanup (#1193) 2017-03-16 22:05:09 -04:00
Ibby
18fe9c9825 feat(action-sheet): add ANDROID_THEMES constant 2017-03-16 17:42:54 -04:00
Ibby
3b804dfc6d chore(build): add aot path to core tsconfig 2017-03-16 17:09:52 -04:00
Ibby
959e132909 chore(): add dashify filter 2017-03-16 17:03:05 -04:00
Ibby
d498f9823a chore(docs): replace all spaces with dashes 2017-03-16 17:00:10 -04:00
Ibby
0c2e84c9c0 refactor(paypal): PayPal is brand name 2017-03-16 16:39:59 -04:00
Ibby
28a24f6413 fix(transfer): fix v3 implementation 2017-03-16 16:11:48 -04:00
Ibby
78c4b6a85c chore(docs): fix readme generation 2017-03-14 21:21:56 -04:00
Ibby
bc7aef92f3 3.1.0-rc.5 2017-03-14 20:08:46 -04:00
Ibby
2b161bbbe0 fix(decorators): fix InstanceCheck decorator 2017-03-14 20:08:22 -04:00
Ibby
4da9fab97e chore(plugin): fix pluginWarn 2017-03-14 19:33:30 -04:00
Ibby
78c37f847a chore(plugin): fix pluginWarn 2017-03-14 19:32:05 -04:00
Ibby
b93e321b1b chore(decorators): do not check method name on cordovacheck 2017-03-14 18:26:21 -04:00
Ibby
b704d2875b chore(decorators): do not check method name on instancecheck 2017-03-14 18:25:23 -04:00
Ibby
56263e13fe docs(): rename plugins 2017-03-13 18:39:14 -04:00
Ibby
a2f379e98e remove extra docs 2017-03-13 18:13:41 -04:00
Ibby
7a7b7b885a remove extra docs 2017-03-13 18:13:21 -04:00
Ibby
0a6ad5f231 remove duplicate method 2017-03-13 18:05:07 -04:00
Ibby
15fb82730d docs update + remove any static methods/properties 2017-03-13 18:00:03 -04:00
Ibby
699af1e1c2 feat(media): create method now returns a promise
Breaking change: create no longer returns a MediaObject instance. Make changes to your app accordingly.
2017-03-13 17:52:24 -04:00
Ibby
a3cde90e2e fix diagnostic 2017-03-13 17:22:02 -04:00
Ibby
230efdb728 Merge branch 'master' into v3-injectable 2017-03-13 17:17:51 -04:00
Quentin
9a733c3b4a docs(in-app-browser): fix typo (#1183)
text fix
2017-03-13 17:17:30 -04:00
Ibby
7a02d61224 chore(): merge master updates 2017-03-13 17:16:11 -04:00
gujiman
95ac7e1855 feat(background-mode): added moveToBackground and moveToForeground (#1181)
feat(background-mode): add missing functions moveToBackground and moveToForeground as explained in https://github.com/driftyco/ionic-native/issues/1180
2017-03-13 16:59:20 -04:00
Perry Govier
0103ebc288 Merge pull request #1182 from driftyco/v3-latest-dgeni
chore(docs): update to latest dgeni version
2017-03-13 15:34:56 -05:00
Ibby
ba3487dd55 chore(docs): update to latest dgeni version 2017-03-13 16:00:28 -04:00
Perry Govier
c1bac59b07 Merge pull request #1179 from driftyco/v3-docs-fix
chore(docs): remove gitPackage from doc generator
2017-03-13 13:45:10 -05:00
Ibby
37082cf783 chore(docs): remove gitPackage from doc generator 2017-03-13 14:42:33 -04:00
Ibby
91bc6380d0 3.1.0-rc.4 2017-03-12 19:41:26 -04:00
Ibby
760b238a6b chore(decorators): fix cordovaCheck and instanceCheck 2017-03-12 19:38:46 -04:00
Lukas Heddendorp
6683aa450c Updated AppPreferences docs (#1175)
Close code block to make it render properly
2017-03-12 14:59:37 -04:00
Ibby
da02a2ec51 push instance based push plugin 2017-03-11 14:40:02 -05:00
Ibby
a4078995db docs(): update plugin docs 2017-03-11 14:18:26 -05:00
Ibby
3fd0185d4e chore(): add check decroators 2017-03-11 11:29:11 -05:00
Ibby
8aa19525cc chore(decorators): promise is default for Cordova/Instance check 2017-03-11 11:17:55 -05:00
Ibby
96de5d9c31 chore(): add options to InstanceCheck 2017-03-11 11:13:40 -05:00
Ibby Hadeed
63c34cade4 chore(): organize and enhance decorators (#1171)
* fix/add decorators

* fix google maps design

* chore(): add root tsconfig to resolve imports in IDE

* updates

* more fixes
2017-03-11 11:03:40 -05:00
Ibby
5b03b578dc chore(): update rxjs to 5.0.1 2017-03-10 12:11:49 -05:00
Ibby
2a4f228bdf chore(): update angular to 2.4.8 2017-03-10 12:11:29 -05:00
Ibby
d189a5bbc1 3.1.0-rc.3 2017-03-10 12:08:18 -05:00
Ibby
ec57f00d2b chore(): update angular to 2.4.8 2017-03-10 12:08:06 -05:00
Ibby Hadeed
d0cb3049e5 Remove overeloads 2017-03-10 10:41:20 -05:00
Ibby
d36a8c8257 3.1.0-rc.2 2017-03-10 10:39:55 -05:00
Ibby
3665781b40 chore(): update deps 2017-03-10 10:39:40 -05:00
Ibby
8036d6392d chore(): update changelog 2017-03-10 10:31:53 -05:00
Ibby
8602fde936 2.8.1 2017-03-10 10:31:03 -05:00
Ibby
0f8c3ce376 fix(health): fix return type 2017-03-10 10:30:57 -05:00
Ibby
5880491c0e chore(): update rxjs to 5.0.1 2017-03-10 10:29:34 -05:00
Ibby
9108db7653 Merge branch 'v3-injectable' of github.com:driftyco/ionic-native into v3-injectable 2017-03-10 10:22:15 -05:00
Ibby
00d1ad7d3b set concurrency to number of cores 2017-03-10 10:22:03 -05:00
gujiman
62c7a60aee fix(paypal): sku param is optional (#1161)
'sku' needs to be made 'optional' as explained in the documented comment
2017-03-10 03:56:02 -05:00
Sabari Ferin
6fdeeaf6f2 fix(fingerprint-aio): add useBackup property (#1158) 2017-03-09 05:20:45 -05:00
Lukas Heddendorp
16ff420bfa Update File path plugin docs (#1153)
Fix demo code
2017-03-09 04:43:00 -05:00
perry
de51ef8a82 chore(CI): fixing npm install instructions in generated readmes 2017-03-08 13:08:10 -06:00
Ibby
0009cbf3a0 feat(firebase): add new setScreenName method
closes #1149
2017-03-08 05:55:15 -05:00
Ibby
74971feb98 fix(bluetooth-serial): add missing disconnect method
closes #1151
2017-03-08 05:46:35 -05:00
Ibby
9a68ea242c docs(health): fix return type 2017-03-08 05:44:56 -05:00
Ibby
10daa1f1dd docs(background-fetch): fix return type 2017-03-07 06:01:43 -05:00
Ibby
38bb8410e5 refactor(background-geolocation): update imports 2017-03-07 05:58:00 -05:00
Ibby
d35d176a79 3.1.0-rc.1 2017-03-07 05:53:34 -05:00
Ibby
fe8a380902 docs(): update docs 2017-03-07 05:52:20 -05:00
Ibby
a8edd53d26 fix(background-geolocation): configure returns an observable 2017-03-07 05:30:58 -05:00
Ibby Hadeed
00a7fa547e chore(): merge master into v3-injectable (#1146)
* 2.5.0

* chore(): update changelog

* fix(pin-dialog): add missing errorIndex

* 2.5.1

* chore(): update changelog

* fix(zip): progress callback is optional (#1049)

* fix(apprate): add missing Windows Store option (#1072)

* Update file-chooser.ts (#1071)

Removed semicolon after .then() in usage instructions

* docs(device-motion): update interface names (#1076)

AccelerationData interface is wrongly named in docs. It should be DeviceMotionAccelerationData. And I added it to import statement.

* feat(inappbrowser): add interface for IAB options (#1065)

* Add InAppBrowserOptions Interface for better tooling.

* feat(inappbrowser): add  interface for IAB options

* Add more constructor tests.

* Add missing iOS options.

* docs(media): update method usage (#1089)

* fix(push): add the missing option clearBadge (#1087)

* docs(badge): fix example (#1096)

Error in code example (supplied parameters do not match call signature)

* fix(imagepicker): add outputType option (#1098)

* fix(facebook): fixes issue when not supplying default params (#1088)

* Fix default facebook logEvent parameters

* Implement correct parameters format in facebook logEvent method

* Update ibeacon.ts (#1099)

Return type of `getAuthorizationStatus()` made more explicit.

* fix(file): add missing exports (#1101)

Any declaration that is not being exported is missing from the resulting d.ts declaration files.

* Add InAppBrowserOptions interface to documentation. (#1103)

* Update sqlite.ts (#1106)

Added a bracket to remove the syntax error

* update device orientation docs to reflect renaming of CompassHeading interface (#1107)

* Move marker code inside MAP_READY (#1108)

The code to set the camera position and marker should be moved inside the function handling MAP_READY.  Otherwise they execute before the event is fired and it doesn't work.

* refactor(file): accept ArrayBuffer for data to write (#1109)

* docs(google-maps): fix param type

closes #1110

* fix(media): add missing pauseRecord and resumeRecord methods (#1122)

* docs(stripe): fix type and naming issues (#1129)

* refactor(paypal): fix type of items (#1125)

Type of items should be Array<PayPalItem> instead of string.

* fix(serial): Serial.requestPermission() options are optional (#1128)

* add success/error indices

* feat(browser-tab): add browser tab plugin (#1126)

* feature: added hasPermission function to Firebase fixes #1115

* feat: Implemented support for BrowserTab #1077

* docs(browser-tab): add proper docs

* fix(background-geolocation): configure returns a promise

closes #1118

* docs(background-geolocation): add return types and platforms

* fix(contacts): allow passing asterisk as contact field type

closes 1093

* fix(contacts): allow passing asterisk as contact field type

closes #1093

* fix(plugin): revert changes to support stable version (#1116)

 fix #1001

* feat(file): add system paths

* feat(app-update): add cordova-plugin-app-update support (#1105)

* add new app-update plugin

* update plugin info

* docs(app-update): add docs

* feat(alipay): add alipay support. (#1097)

* add cordova-alipay-base plugin. to support Alipay payment

* change ALI_PID to APP_ID, make it same with the latest SDK

* rewrite comments

* docs(google-maps): improve docs (#1095)

Move `map.moveCamera(position);` inside the MAP_READY event.
Allow to zoom the map on first launch (both iOS and Android).

* fix(file): remove FileError from return type (#1086)

Promises that reject with a `FileError` are not of the type `Promise<T|FileError>`, but `Promise<T>`.

The previous declarations of `Promise<T|FileError>` would break typing further down the chain where you are trying to use the value that the typing says could be `T|FileError` but in reality could only be `T`.

* feat(google-maps): add constant for map type

* fix(file): platform Browser will raise a an DOMException (#1082)

fix(File): Platform Browser will raise a an DOMException on resoleLocalFilesystemUrl and tries to write on readonly property DOMException err.message in fillErrorMessage

* feat(local-notifications): support for icon background color (#1079)

The Cordova plugin Ionic Natives uses allows specifying the background color of the smallIcon.  By not including it in your interface you force users to use the default color for their version of Android.  While the LocalNotification plugin is not well documented, it does include this feature, see Options.java line 253:

```
/**
     * @return
     *      The notification background color for the small icon
     *      Returns null, if no color is given.
     */
    public int getColor() {
        String hex = options.optString("color", null);

        if (hex == null) {
            return NotificationCompat.COLOR_DEFAULT;
        }

        int aRGB = Integer.parseInt(hex, 16);

        return aRGB + 0xFF000000;
    }
```

I've simply added the option to the interface as well as a short description.

This lets you go from the default color (varies by Android version): https://goo.gl/photos/nERcj4GZgapy8aee9
To any color you'd like: https://goo.gl/photos/t8V9WVba8jDU49aHA
And also works if you also specify a large icon: https://goo.gl/photos/gWQYwa12djmdXfYcA

* feat(unique-device-add): add UniqueDeviceId plugin (#1064)

* fix plugin

* feat(text-to-speech): Add stop method (#1063)

https://github.com/vilic/cordova-plugin-tts/pull/32

* feat(appodeal): adds Appodeal SDK wrappers for iOS and Android (#1031)

* feat(Appodeal) bootrapping

* starting docs

* more docs

* feat(appodeal): add event Observables

* feat(appodeal): replace Cordova Observable events with #.fromEvent()

* feat(appodeal): update decorator metadata

* feat(couchbase-lite): add CouchbaseLite cordova plugin (#1025)

* feat(CouchbaseLite): add CouchbaseLite cordova plugin

* add plugin url

* feat(background-fetch): Adding Background Fetch requested in #990 (#1013)

* Adding Background Fetch (https://github.com/transistorsoft/cordova-plugin-background-fetch) requested in #990

* Adding BackgroundFetch to index

* feat(gyroscope): add Gyroscope plugin (#1004)

* add gyroscope.ts to plugins

* add gyroscope to index

* Update gyroscope.ts

* Update gyroscope.ts

* Revert "fix(File): typing where `FileError` can be thrown" (#1130)

* tslint and fix build issues

* 2.6.0

* chore(): update changelog

* fix(core): dont check if method exists when overriding

fixes #1043

* fix(file): fix writeExistingFile

closes #1044

* feat(diagnostic): add new methods

closes #1045

* feat(background-mode): replace event listeners with on method

The methods onactivate, ondeactive and onfailure no longer exist. You must now use `on` method.

* feat(background-mode): add missing functions

 closes #1078

* tslint

* set GoogleMapsMapTypeId to private

* remove beta from stripe

* 2.7.0

* chore(): update changelog

* feat(app-preferences): added cordova-plugin-app-preferences support (#1084)

* (feat) added cordova-plugin-app-preferences support

* replaced callback functions with promises

* updated example

* (feat) added cordova-plugin-browsertab support

* Revert "(feat) added cordova-plugin-browsertab support"

This reverts commit 00eb5cf5d8.

* (update) synchronize fetch

* feat(photo-library): added cordova-plugin-photo-library (#1102)

* feat(photo-library): added cordova-plugin-photo-library

* CordovaFiniteObservable moved to photo-library.
Overloads are marked as private.

* refactor(photo-library): fixed circleci failing in 2.7.0 (#1132)

* feat(photo-library): added cordova-plugin-photo-library

* CordovaFiniteObservable moved to photo-library.
Overloads are marked as private.

* fixed typescript error in 2.7.0

* feat(health): add wrapper for cordova-plugin-health (#1039)

* feat(health): add wrapper for cordova-plugin-health

* fix(Health): add optional params to QueryOptions for .query()

* docs(health): fix javadoc of interfaces

* fix(health): remove unused Plugin option

* docs(health): add missing documentation

* doc(health): add promise to return

* doc(health): remove empty lines

* doc(health): Add description & reference to repo

* doc(health: add "return {Promise<any>}"

* refactor(safari-view-controller): hide returns promise

* fix typo in ibeacon plugin (#1138)

* fix(file): fix return types

fixes #1139

* docs(background-geolocation): fix param docs

* refactor(health): fix return types and prefix interfaces

* 2.8.0

* chore(): update changelog

* docs(sqlite): syntax error resolved (#1142)

* Syntax error resolved

The `{}` should be `[]`, but since there is no binding we do not get error. In case we add one, then the syntax will be incorrect.

* Fixed a syntax error
2017-03-07 05:06:38 -05:00
Ibby
b393c7448b remove console logs
closes #1145
2017-03-06 04:31:31 -05:00
Musa Haidari
683b808f27 docs(sqlite): syntax error resolved (#1142)
* Syntax error resolved

The `{}` should be `[]`, but since there is no binding we do not get error. In case we add one, then the syntax will be incorrect.

* Fixed a syntax error
2017-03-05 17:40:24 -05:00
Ibby
f11be169b0 chore(): update changelog 2017-03-04 08:21:10 -05:00
Ibby
3a4dc73229 2.8.0 2017-03-04 08:20:59 -05:00
Ibby
b851de9cc8 refactor(health): fix return types and prefix interfaces 2017-03-04 08:20:35 -05:00
Ibby
b8c8a1aa8d docs(background-geolocation): fix param docs 2017-03-04 08:15:21 -05:00
Ibby
8f1e729f0e Merge branch 'master' of github.com:driftyco/ionic-native 2017-03-04 08:11:46 -05:00
Ibby
b4583271b8 fix(file): fix return types
fixes #1139
2017-03-04 08:11:41 -05:00
Edoardo Tassinari
50c03b2a49 fix typo in ibeacon plugin (#1138) 2017-03-03 05:21:03 -05:00
Ibby Hadeed
27fdce7af2 refactor(safari-view-controller): hide returns promise 2017-03-03 01:13:57 -05:00
Alex
3500d80b9c feat(health): add wrapper for cordova-plugin-health (#1039)
* feat(health): add wrapper for cordova-plugin-health

* fix(Health): add optional params to QueryOptions for .query()

* docs(health): fix javadoc of interfaces

* fix(health): remove unused Plugin option

* docs(health): add missing documentation

* doc(health): add promise to return

* doc(health): remove empty lines

* doc(health): Add description & reference to repo

* doc(health: add "return {Promise<any>}"
2017-03-02 11:20:14 -05:00
viskin
f599b0418d refactor(photo-library): fixed circleci failing in 2.7.0 (#1132)
* feat(photo-library): added cordova-plugin-photo-library

* CordovaFiniteObservable moved to photo-library.
Overloads are marked as private.

* fixed typescript error in 2.7.0
2017-03-02 05:34:53 -05:00
viskin
384dfc263d feat(photo-library): added cordova-plugin-photo-library (#1102)
* feat(photo-library): added cordova-plugin-photo-library

* CordovaFiniteObservable moved to photo-library.
Overloads are marked as private.
2017-03-02 04:42:48 -05:00
Michel Ruffieux
12280dda2b feat(app-preferences): added cordova-plugin-app-preferences support (#1084)
* (feat) added cordova-plugin-app-preferences support

* replaced callback functions with promises

* updated example

* (feat) added cordova-plugin-browsertab support

* Revert "(feat) added cordova-plugin-browsertab support"

This reverts commit 00eb5cf5d8.

* (update) synchronize fetch
2017-03-01 23:33:43 -05:00
Ibby
5d091d21fb chore(): update changelog 2017-03-01 23:31:59 -05:00
Ibby
b83c1bf767 2.7.0 2017-03-01 23:31:23 -05:00
Ibby
6ebd2703ee remove beta from stripe 2017-03-01 22:13:58 -05:00
Ibby
3dfea7d02d set GoogleMapsMapTypeId to private 2017-03-01 22:13:13 -05:00
Ibby
44b7e301b5 tslint 2017-03-01 22:10:09 -05:00
Ibby
906401b236 feat(background-mode): add missing functions
closes #1078
2017-03-01 22:09:46 -05:00
Ibby
ffdbab7b26 feat(background-mode): replace event listeners with on method
The methods onactivate, ondeactive and onfailure no longer exist. You must now use `on` method.
2017-03-01 22:03:23 -05:00
Ibby
5144345c9e feat(diagnostic): add new methods
closes #1045
2017-03-01 21:56:56 -05:00
Ibby
47f48bae8d fix(file): fix writeExistingFile
closes #1044
2017-03-01 21:36:06 -05:00
Ibby
754c5ecbcb fix(core): dont check if method exists when overriding
fixes #1043
2017-03-01 21:34:05 -05:00
Ibby
86097b0ce6 chore(): update changelog 2017-03-01 21:29:34 -05:00
Ibby
d46067764b 2.6.0 2017-03-01 21:28:29 -05:00
Ibby
7f368b61be tslint and fix build issues 2017-03-01 21:28:05 -05:00
Ibby Hadeed
af4d5e8968 Revert "fix(File): typing where FileError can be thrown" (#1130) 2017-03-01 21:24:34 -05:00
Vlado Velichkovski
0378b1d7fd feat(gyroscope): add Gyroscope plugin (#1004)
* add gyroscope.ts to plugins

* add gyroscope to index

* Update gyroscope.ts

* Update gyroscope.ts
2017-03-01 21:16:57 -05:00
Josh Strange
57e2691889 feat(background-fetch): Adding Background Fetch requested in #990 (#1013)
* Adding Background Fetch (https://github.com/transistorsoft/cordova-plugin-background-fetch) requested in #990

* Adding BackgroundFetch to index
2017-03-01 21:16:31 -05:00
Sumama Waheed
09a7dcf594 feat(couchbase-lite): add CouchbaseLite cordova plugin (#1025)
* feat(CouchbaseLite): add CouchbaseLite cordova plugin

* add plugin url
2017-03-01 21:15:51 -05:00
Michael Trilus
fd8107b79a feat(appodeal): adds Appodeal SDK wrappers for iOS and Android (#1031)
* feat(Appodeal) bootrapping

* starting docs

* more docs

* feat(appodeal): add event Observables

* feat(appodeal): replace Cordova Observable events with #.fromEvent()

* feat(appodeal): update decorator metadata
2017-03-01 21:11:00 -05:00
Tom Sundstrom
4f86320696 feat(text-to-speech): Add stop method (#1063)
https://github.com/vilic/cordova-plugin-tts/pull/32
2017-03-01 21:01:39 -05:00
Ibby
39f1971471 fix plugin 2017-03-01 21:00:49 -05:00
David Pfeffer
60db10c1d3 feat(unique-device-add): add UniqueDeviceId plugin (#1064) 2017-03-01 20:59:41 -05:00
Rob
2a32624d9d feat(local-notifications): support for icon background color (#1079)
The Cordova plugin Ionic Natives uses allows specifying the background color of the smallIcon.  By not including it in your interface you force users to use the default color for their version of Android.  While the LocalNotification plugin is not well documented, it does include this feature, see Options.java line 253:

```
/**
     * @return
     *      The notification background color for the small icon
     *      Returns null, if no color is given.
     */
    public int getColor() {
        String hex = options.optString("color", null);

        if (hex == null) {
            return NotificationCompat.COLOR_DEFAULT;
        }

        int aRGB = Integer.parseInt(hex, 16);

        return aRGB + 0xFF000000;
    }
```

I've simply added the option to the interface as well as a short description.

This lets you go from the default color (varies by Android version): https://goo.gl/photos/nERcj4GZgapy8aee9
To any color you'd like: https://goo.gl/photos/t8V9WVba8jDU49aHA
And also works if you also specify a large icon: https://goo.gl/photos/gWQYwa12djmdXfYcA
2017-03-01 20:58:53 -05:00
Jan
2fba915b88 fix(file): platform Browser will raise a an DOMException (#1082)
fix(File): Platform Browser will raise a an DOMException on resoleLocalFilesystemUrl and tries to write on readonly property DOMException err.message in fillErrorMessage
2017-03-01 20:58:09 -05:00
Andrew Martin
318ad3f4e0 feat(google-maps): add constant for map type 2017-03-01 20:57:44 -05:00
Vegard Andreas Larsen
c1748bbc28 fix(file): remove FileError from return type (#1086)
Promises that reject with a `FileError` are not of the type `Promise<T|FileError>`, but `Promise<T>`.

The previous declarations of `Promise<T|FileError>` would break typing further down the chain where you are trying to use the value that the typing says could be `T|FileError` but in reality could only be `T`.
2017-03-01 20:56:21 -05:00
PERRONCEL
06fa7452dd docs(google-maps): improve docs (#1095)
Move `map.moveCamera(position);` inside the MAP_READY event.
Allow to zoom the map on first launch (both iOS and Android).
2017-03-01 20:55:42 -05:00
Xueron Nee
2eea3df2c4 feat(alipay): add alipay support. (#1097)
* add cordova-alipay-base plugin. to support Alipay payment

* change ALI_PID to APP_ID, make it same with the latest SDK

* rewrite comments
2017-03-01 20:54:27 -05:00
Ibby
13484f9843 docs(app-update): add docs 2017-03-01 20:33:21 -05:00
Ibby
91ee5bde5f Merge branch 'master' of github.com:driftyco/ionic-native 2017-03-01 20:29:44 -05:00
Xueron Nee
21d40888d8 feat(app-update): add cordova-plugin-app-update support (#1105)
* add new app-update plugin

* update plugin info
2017-03-01 20:29:38 -05:00
Ibby
f0e219570e feat(file): add system paths 2017-03-01 20:26:55 -05:00
JiaLiPassion
104532e1d7 fix(plugin): revert changes to support stable version (#1116)
fix #1001
2017-03-01 20:10:05 -05:00
Ibby
97cf22eedb Merge branch 'master' of github.com:driftyco/ionic-native 2017-03-01 20:06:11 -05:00
Ibby
9c5b593d6b fix(contacts): allow passing asterisk as contact field type
closes #1093
2017-03-01 20:06:03 -05:00
Ibby
26394865fc fix(contacts): allow passing asterisk as contact field type
closes 1093
2017-03-01 20:05:39 -05:00
Ibby
07c867d98e docs(background-geolocation): add return types and platforms 2017-03-01 19:53:50 -05:00
Ibby
fc879926b2 fix(background-geolocation): configure returns a promise
closes #1118
2017-03-01 19:50:40 -05:00
Ibby
281e37ee04 docs(browser-tab): add proper docs 2017-03-01 19:45:46 -05:00
Aaron Czichon
8de37939fb feat(browser-tab): add browser tab plugin (#1126)
* feature: added hasPermission function to Firebase fixes #1115

* feat: Implemented support for BrowserTab #1077
2017-03-01 19:41:54 -05:00
Ibby
448ec7a72b add success/error indices 2017-03-01 19:40:18 -05:00
Thomas Kemmer
da72500c4b fix(serial): Serial.requestPermission() options are optional (#1128) 2017-03-01 19:39:39 -05:00
idroxid
0c466d9739 refactor(paypal): fix type of items (#1125)
Type of items should be Array<PayPalItem> instead of string.
2017-03-01 19:38:43 -05:00
jsteffensen
8e0027b974 docs(stripe): fix type and naming issues (#1129) 2017-03-01 19:37:57 -05:00
Ibby
46f80555f7 refactor(): remove some prefixes 2017-03-01 19:35:35 -05:00
Shane Smith
234ed6e9e7 fix(media): add missing pauseRecord and resumeRecord methods (#1122) 2017-02-28 17:31:35 -05:00
Ibby Hadeed
4426e59176 docs(google-maps): fix param type
closes #1110
2017-02-23 18:57:29 -05:00
Michael Nishikawa
f22874342a refactor(file): accept ArrayBuffer for data to write (#1109) 2017-02-23 18:56:26 -05:00
coreyroth
6bcd5d3183 Move marker code inside MAP_READY (#1108)
The code to set the camera position and marker should be moved inside the function handling MAP_READY.  Otherwise they execute before the event is fired and it doesn't work.
2017-02-23 18:55:19 -05:00
Robert Coie
407659a3ef update device orientation docs to reflect renaming of CompassHeading interface (#1107) 2017-02-23 04:30:18 -05:00
Musa Haidari
5ef669ae91 Update sqlite.ts (#1106)
Added a bracket to remove the syntax error
2017-02-23 04:30:02 -05:00
Eric Horodyski
4a39ebd873 Add InAppBrowserOptions interface to documentation. (#1103) 2017-02-23 04:29:33 -05:00
Josep Sayol
23b97f6b4a fix(file): add missing exports (#1101)
Any declaration that is not being exported is missing from the resulting d.ts declaration files.
2017-02-23 03:54:57 -05:00
Markus Wagner
093c8a8231 Update ibeacon.ts (#1099)
Return type of `getAuthorizationStatus()` made more explicit.
2017-02-23 03:53:11 -05:00
Noel De Martin
85a3a40795 fix(facebook): fixes issue when not supplying default params (#1088)
* Fix default facebook logEvent parameters

* Implement correct parameters format in facebook logEvent method
2017-02-23 03:52:49 -05:00
Xueron Nee
b4b7cfa473 fix(imagepicker): add outputType option (#1098) 2017-02-23 03:51:44 -05:00
Tommertom
884ce54181 docs(badge): fix example (#1096)
Error in code example (supplied parameters do not match call signature)
2017-02-23 03:50:05 -05:00
Ibby
0aee729e8e remove utils from publish command 2017-02-22 19:16:00 -05:00
Ibby
06c8c44efc 3.1.0-alpha.3 2017-02-22 19:10:23 -05:00
Ibby
6df3383585 remove auto-install and cleanup 2017-02-22 19:08:34 -05:00
3dd13
70847d1b2b fix(push): add the missing option clearBadge (#1087) 2017-02-18 17:14:57 -05:00
Grisha Rozhnov
ff26f2a019 docs(media): update method usage (#1089) 2017-02-17 13:11:04 -05:00
Ibby
f912a452dc remove alpha tag 2017-02-16 22:05:36 -05:00
Ibby
ea697bd884 edit publish command 2017-02-16 22:05:23 -05:00
Ibby
6e7b087cff 3.1.0-alpha.2 2017-02-16 22:00:12 -05:00
Ibby
87b5327a42 fix AoT support and add publish script 2017-02-16 22:00:06 -05:00
Ibby
1b1a0e99e8 3.1.0-alpha.1 2017-02-16 20:53:30 -05:00
Ibby
2828319d0a 3.0.1-0 2017-02-16 20:51:44 -05:00
Ibby
d3c87fd95a fix build 2017-02-16 20:38:13 -05:00
Ibby
964cc91548 Merge branch 'v3-injectable' into v3-injectable-ngc 2017-02-16 19:49:56 -05:00
Ibby
a2e410c4cb resolve merge conflict 2017-02-16 19:49:25 -05:00
Ibby
9055154781 chore(): ngc build 2017-02-16 19:47:50 -05:00
Eric Horodyski
f4b8236c8d feat(inappbrowser): add interface for IAB options (#1065)
* Add InAppBrowserOptions Interface for better tooling.

* feat(inappbrowser): add  interface for IAB options

* Add more constructor tests.

* Add missing iOS options.
2017-02-15 16:57:16 -05:00
Tine
03ff0a58cf docs(device-motion): update interface names (#1076)
AccelerationData interface is wrongly named in docs. It should be DeviceMotionAccelerationData. And I added it to import statement.
2017-02-15 15:41:48 -05:00
perry
822a4120c7 updating package name in usage instructions 2017-02-15 14:17:53 -06:00
perry
bc60d0678b outputting readmes to dist dir instead of src 2017-02-15 10:29:47 -06:00
perry
9aa7ad0221 automating readme file generation and adding it to CI
# Conflicts:
#	src/@ionic-native/plugins/googlemap/index.ts
#	src/@ionic-native/plugins/inappbrowser/index.ts
#	src/@ionic-native/plugins/media/index.ts
#	src/@ionic-native/plugins/sqlite/index.ts
2017-02-15 10:19:26 -06:00
perry
e965d654c5 readme templates 2017-02-15 09:48:46 -06:00
perry
82d6efac76 gulp task to generate readme files 2017-02-15 09:48:32 -06:00
Tedy Kanjirathinkal
c7a888e2de Update file-chooser.ts (#1071)
Removed semicolon after .then() in usage instructions
2017-02-13 18:18:52 -05:00
John Woodruff
439cceea23 fix(apprate): add missing Windows Store option (#1072) 2017-02-13 18:17:43 -05:00
Ibby Hadeed
83f57b9820 fix(zip): progress callback is optional (#1049) 2017-02-13 15:06:33 -05:00
Ibby
de51746bfc rename google maps 2017-02-13 15:06:09 -05:00
Ibby
157367ddb6 fix(plugins): rename packages/classes 2017-02-13 15:02:36 -05:00
Ibby Hadeed
6de9697aa9 chore(build): add auto install scripts (#1059)
* feat(core): auto install scripts

* minor fixes

* minor fixes

* remove prompt message
2017-02-13 14:51:10 -05:00
Ibby
1dfdbaf1f0 chore(build): convert dependencies to peer dependencies 2017-02-13 14:31:41 -05:00
Max Lynch
1fe1cd6f75 Cleanup 2017-02-13 12:21:47 -06:00
Max Lynch
dcd5e3ac9f Merge branch 'v3-injectable-instance-plugins' into v3-injectable 2017-02-13 12:14:11 -06:00
Max Lynch
aa44c09ec4 Merge branch 'v3-injectable' into v3-injectable-instance-plugins 2017-02-13 12:13:50 -06:00
Max Lynch
281e8b737e Merge remote-tracking branch 'origin/v3-node-build' into v3-injectable 2017-02-09 08:29:19 -06:00
Ibby
b5ce8e9fbb feat(): make instance based plugins injectable 2017-02-09 09:28:52 -05:00
Ibby
0b17b253d9 chore(): move fs-extra-promise to devDeps 2017-02-09 08:49:30 -05:00
Ibby
faffc76a76 chore(): nodejs build script 2017-02-09 08:48:29 -05:00
Max Lynch
20fbfb91ca Fix build errors 2017-02-08 22:25:16 -06:00
Max Lynch
4acdd41837 Remove lots of static stuff with a fancy regex 2017-02-08 22:14:53 -06:00
Max Lynch
1f2dba0a3f Remove duplicate injectables 2017-02-08 17:30:16 -06:00
Max Lynch
76f07092df More stuff 2017-02-08 17:25:48 -06:00
Max Lynch
91a5b5bbfc Checkpoint 2017-02-08 17:14:25 -06:00
Max Lynch
e3164c95df Updates 2017-02-08 17:06:03 -06:00
Max Lynch
1933ec66d9 Working on injectable 2017-02-08 16:21:57 -06:00
Max Lynch
742df16837 3.0.0 2017-02-08 12:32:56 -06:00
Max Lynch
c742bdab85 Merge pull request #1048 from driftyco/fix-alpha-package
chore(): change rxjs version to match ionic framework
2017-02-08 10:56:46 -06:00
Ibby Hadeed
cd6d166e76 Update plugin-package.json.template 2017-02-08 08:40:44 -05:00
Ibby Hadeed
e061219aff Update core-package.json.template 2017-02-08 08:40:19 -05:00
Max Lynch
9f1ce45f06 Bump 2017-02-07 15:09:48 -06:00
Max Lynch
dd04564335 Some stuff 2017-02-07 15:09:01 -06:00
Max Lynch
03254ad4b7 Build and push 2017-02-07 14:51:40 -06:00
Max Lynch
f13a007a1c Individual packages 2017-02-07 13:29:09 -06:00
Max Lynch
9802b7f2e4 Build 2017-02-07 12:50:35 -06:00
Max Lynch
a2dcca3815 Remove core 2017-02-07 12:43:13 -06:00
Max Lynch
7226bcad50 Test 2017-02-07 12:40:50 -06:00
Ibby
78fcdc8d80 chore(): update changelog 2017-02-07 11:32:53 -05:00
Ibby
53f7056b16 2.5.1 2017-02-07 11:32:28 -05:00
Ibby
b7701cdb16 fix(pin-dialog): add missing errorIndex 2017-02-07 10:19:32 -05:00
Ibby
94a4519f2b chore(): update changelog 2017-02-07 07:27:35 -05:00
Ibby
6fe52b610b 2.5.0 2017-02-07 07:27:16 -05:00
Max Lynch
63ab1a205e Plugin tsconfig 2017-02-06 17:22:24 -06:00
Max Lynch
b6ab01d100 Core 2017-02-06 17:17:58 -06:00
Max Lynch
ecb98e2e82 Core kind of buidls 2017-02-06 17:15:46 -06:00
Max Lynch
c733127134 Plugin tsconfigs 2017-02-06 17:06:59 -06:00
Max Lynch
0cce8e9ce7 tsconfig for plugins 2017-02-06 17:05:50 -06:00
Max Lynch
b773c0709f Moving things aroudn 2017-02-06 17:00:10 -06:00
Max Lynch
d426b15c1c Removed 2017-02-06 16:38:43 -06:00
Max Lynch
b05627d2d6 Moving to modules 2017-02-06 16:37:59 -06:00
Max Lynch
dbd9df41f0 First try 2017-02-06 15:43:45 -06:00
Ibby Hadeed
434a6c8ad3 Update stepcounter.ts 2017-02-06 08:33:10 -05:00
Tom Sundstrom
97489ba573 feat(barcodescanner): add option disableSuccessBeep (#1035)
https://github.com/phonegap/phonegap-plugin-barcodescanner/pull/408
2017-02-05 05:41:49 -05:00
Ibby Hadeed
f525a25b49 refractor(google-maps): use Observable.fromEvent instead of addEventListener (#1032) 2017-02-04 04:32:41 -05:00
Ibby
add49e8b4d refractor(): use Observable.fromEvent in wrapEventObservable 2017-02-04 04:16:57 -05:00
Eds
4ab87d8abb feat(inappbrowser): add hide function (#1018) 2017-02-01 01:42:07 -05:00
Prateek Kathal
69ff7afb48 docs(file): add link to additional information (#1022)
Adding a link to **cordova plugin file** for ease of understanding file management using cordova.

It took me almost a day to figure out how to properly save things like a pdf/image in a publicly accessible directory. Having a link to the main **cordova file** documentation will save a lot of time.
2017-02-01 01:40:55 -05:00
Ibby
62a30c7d8f Merge branch 'master' of github.com:driftyco/ionic-native 2017-01-31 04:14:40 -05:00
Ibby
dc37d8f71c fix(safari-view-controller): fix issue caused by calling show without options 2017-01-31 04:14:28 -05:00
Huan LI
8864d1360a docs(streaming-media): add missing method name (#1016) 2017-01-31 01:39:21 -05:00
Ibby
613141998a docs(header-color): fix doc name 2017-01-30 11:45:36 -05:00
Ibby
c2fbb4fb64 docs(geolocation): update watchPosition example 2017-01-30 11:43:58 -05:00
Josh Strange
f0cf86076c feat(background-geolocation): add missing properties for Android 2017-01-30 05:45:42 -05:00
Ibby
a03afcf0fa fix(pinterest): fix PinterestPin interface 2017-01-29 06:49:28 -05:00
Ibby
3abe0bb97d Merge branch 'master' of github.com:driftyco/ionic-native 2017-01-26 20:30:51 -05:00
Ibby
a5b4632ceb fix(file-transfer): fix return type of upload method
fixes #1002
2017-01-26 20:30:44 -05:00
Ibby Hadeed
1c78f77c0f docs(stepcounter): update repo and plugin
closes #1003
2017-01-25 22:22:05 -05:00
Ibby
cb7d3ef3e0 chore(): update changelog 2017-01-24 15:14:36 -05:00
Ibby
5e83a09056 2.4.1 2017-01-24 15:14:07 -05:00
Ibby
b85393de89 chore(): add CordovaOptions interface 2017-01-24 15:12:35 -05:00
Ibby
68c535fd79 style(): missing semicolon 2017-01-24 15:00:43 -05:00
Ibby
1c09ee1fbc fix(screen-orientation): lockOrientation returns a promise
closes #939
2017-01-24 15:00:20 -05:00
Ibby
abe5d58f9d feat(push): add subscribe/unsubscribe
fixes #861
2016-12-15 08:16:22 -05:00
Ibby Hadeed
c081433015 final tweaks and docs 2016-12-01 19:05:47 -05:00
Ibby Hadeed
22563233a3 fix constructor 2016-12-01 18:58:13 -05:00
Ibrahim Hadeed
3aaf92090a fix(push): fix typo in PushEvents enum 2016-09-19 18:03:58 -04:00
Ibrahim Hadeed
0acbe56cfb feat(push): plugin is now instance based
no more callbacks

closes #250
2016-08-15 02:09:19 -04:00
221 changed files with 7776 additions and 7342 deletions

2
.gitignore vendored
View File

@@ -1,5 +1,7 @@
.DS_Store
node_modules/
.idea
.tmp
aot/
dist/
scripts/ionic-native-bower

View File

@@ -1,5 +1,142 @@
<a name="2.8.1"></a>
## [2.8.1](https://github.com/driftyco/ionic-native/compare/v2.8.0...v2.8.1) (2017-03-10)
### Bug Fixes
* **bluetooth-serial:** add missing disconnect method ([74971fe](https://github.com/driftyco/ionic-native/commit/74971fe)), closes [#1151](https://github.com/driftyco/ionic-native/issues/1151)
* **fingerprint-aio:** add useBackup property ([#1158](https://github.com/driftyco/ionic-native/issues/1158)) ([6fdeeaf](https://github.com/driftyco/ionic-native/commit/6fdeeaf))
* **health:** fix return type ([0f8c3ce](https://github.com/driftyco/ionic-native/commit/0f8c3ce))
* **paypal:** sku param is optional ([#1161](https://github.com/driftyco/ionic-native/issues/1161)) ([62c7a60](https://github.com/driftyco/ionic-native/commit/62c7a60))
### Features
* **firebase:** add new setScreenName method ([0009cbf](https://github.com/driftyco/ionic-native/commit/0009cbf)), closes [#1149](https://github.com/driftyco/ionic-native/issues/1149)
<a name="2.8.0"></a>
# [2.8.0](https://github.com/driftyco/ionic-native/compare/v2.7.0...v2.8.0) (2017-03-04)
### Bug Fixes
* **file:** fix return types ([b458327](https://github.com/driftyco/ionic-native/commit/b458327)), closes [#1139](https://github.com/driftyco/ionic-native/issues/1139)
### Features
* **app-preferences:** added cordova-plugin-app-preferences support ([#1084](https://github.com/driftyco/ionic-native/issues/1084)) ([12280dd](https://github.com/driftyco/ionic-native/commit/12280dd))
* **health:** add wrapper for cordova-plugin-health ([#1039](https://github.com/driftyco/ionic-native/issues/1039)) ([3500d80](https://github.com/driftyco/ionic-native/commit/3500d80))
* **photo-library:** added cordova-plugin-photo-library ([#1102](https://github.com/driftyco/ionic-native/issues/1102)) ([384dfc2](https://github.com/driftyco/ionic-native/commit/384dfc2))
<a name="2.7.0"></a>
# [2.7.0](https://github.com/driftyco/ionic-native/compare/v2.6.0...v2.7.0) (2017-03-02)
### Bug Fixes
* **core:** dont check if method exists when overriding ([754c5ec](https://github.com/driftyco/ionic-native/commit/754c5ec)), closes [#1043](https://github.com/driftyco/ionic-native/issues/1043)
* **file:** fix writeExistingFile ([47f48ba](https://github.com/driftyco/ionic-native/commit/47f48ba)), closes [#1044](https://github.com/driftyco/ionic-native/issues/1044)
### Features
* **background-mode:** add missing functions ([906401b](https://github.com/driftyco/ionic-native/commit/906401b)), closes [#1078](https://github.com/driftyco/ionic-native/issues/1078)
* **background-mode:** replace event listeners with on method ([ffdbab7](https://github.com/driftyco/ionic-native/commit/ffdbab7))
* **diagnostic:** add new methods ([5144345](https://github.com/driftyco/ionic-native/commit/5144345)), closes [#1045](https://github.com/driftyco/ionic-native/issues/1045)
<a name="2.6.0"></a>
# [2.6.0](https://github.com/driftyco/ionic-native/compare/v2.5.1...v2.6.0) (2017-03-02)
### Bug Fixes
* **apprate:** add missing Windows Store option ([#1072](https://github.com/driftyco/ionic-native/issues/1072)) ([439ccee](https://github.com/driftyco/ionic-native/commit/439ccee))
* **background-geolocation:** configure returns a promise ([fc87992](https://github.com/driftyco/ionic-native/commit/fc87992)), closes [#1118](https://github.com/driftyco/ionic-native/issues/1118)
* **contacts:** allow passing asterisk as contact field type ([9c5b593](https://github.com/driftyco/ionic-native/commit/9c5b593)), closes [#1093](https://github.com/driftyco/ionic-native/issues/1093)
* **contacts:** allow passing asterisk as contact field type ([2639486](https://github.com/driftyco/ionic-native/commit/2639486))
* **facebook:** fixes issue when not supplying default params ([#1088](https://github.com/driftyco/ionic-native/issues/1088)) ([85a3a40](https://github.com/driftyco/ionic-native/commit/85a3a40))
* **file:** add missing exports ([#1101](https://github.com/driftyco/ionic-native/issues/1101)) ([23b97f6](https://github.com/driftyco/ionic-native/commit/23b97f6))
* **file:** platform Browser will raise a an DOMException ([#1082](https://github.com/driftyco/ionic-native/issues/1082)) ([2fba915](https://github.com/driftyco/ionic-native/commit/2fba915))
* **file:** remove FileError from return type ([#1086](https://github.com/driftyco/ionic-native/issues/1086)) ([c1748bb](https://github.com/driftyco/ionic-native/commit/c1748bb))
* **imagepicker:** add outputType option ([#1098](https://github.com/driftyco/ionic-native/issues/1098)) ([b4b7cfa](https://github.com/driftyco/ionic-native/commit/b4b7cfa))
* **media:** add missing pauseRecord and resumeRecord methods ([#1122](https://github.com/driftyco/ionic-native/issues/1122)) ([234ed6e](https://github.com/driftyco/ionic-native/commit/234ed6e))
* **plugin:** revert changes to support stable version ([#1116](https://github.com/driftyco/ionic-native/issues/1116)) ([104532e](https://github.com/driftyco/ionic-native/commit/104532e)), closes [#1001](https://github.com/driftyco/ionic-native/issues/1001)
* **push:** add the missing option clearBadge ([#1087](https://github.com/driftyco/ionic-native/issues/1087)) ([70847d1](https://github.com/driftyco/ionic-native/commit/70847d1))
* **serial:** Serial.requestPermission() options are optional ([#1128](https://github.com/driftyco/ionic-native/issues/1128)) ([da72500](https://github.com/driftyco/ionic-native/commit/da72500))
* **zip:** progress callback is optional ([#1049](https://github.com/driftyco/ionic-native/issues/1049)) ([83f57b9](https://github.com/driftyco/ionic-native/commit/83f57b9))
### Features
* **alipay:** add alipay support. ([#1097](https://github.com/driftyco/ionic-native/issues/1097)) ([2eea3df](https://github.com/driftyco/ionic-native/commit/2eea3df))
* **app-update:** add cordova-plugin-app-update support ([#1105](https://github.com/driftyco/ionic-native/issues/1105)) ([21d4088](https://github.com/driftyco/ionic-native/commit/21d4088))
* **appodeal:** adds Appodeal SDK wrappers for iOS and Android ([#1031](https://github.com/driftyco/ionic-native/issues/1031)) ([fd8107b](https://github.com/driftyco/ionic-native/commit/fd8107b))
* **background-fetch:** Adding Background Fetch requested in [#990](https://github.com/driftyco/ionic-native/issues/990) ([#1013](https://github.com/driftyco/ionic-native/issues/1013)) ([57e2691](https://github.com/driftyco/ionic-native/commit/57e2691))
* **browser-tab:** add browser tab plugin ([#1126](https://github.com/driftyco/ionic-native/issues/1126)) ([8de3793](https://github.com/driftyco/ionic-native/commit/8de3793)), closes [#1115](https://github.com/driftyco/ionic-native/issues/1115)
* **couchbase-lite:** add CouchbaseLite cordova plugin ([#1025](https://github.com/driftyco/ionic-native/issues/1025)) ([09a7dcf](https://github.com/driftyco/ionic-native/commit/09a7dcf))
* **file:** add system paths ([f0e2195](https://github.com/driftyco/ionic-native/commit/f0e2195))
* **google-maps:** add constant for map type ([318ad3f](https://github.com/driftyco/ionic-native/commit/318ad3f))
* **gyroscope:** add Gyroscope plugin ([#1004](https://github.com/driftyco/ionic-native/issues/1004)) ([0378b1d](https://github.com/driftyco/ionic-native/commit/0378b1d))
* **inappbrowser:** add interface for IAB options ([#1065](https://github.com/driftyco/ionic-native/issues/1065)) ([f4b8236](https://github.com/driftyco/ionic-native/commit/f4b8236))
* **local-notifications:** support for icon background color ([#1079](https://github.com/driftyco/ionic-native/issues/1079)) ([2a32624](https://github.com/driftyco/ionic-native/commit/2a32624))
* **text-to-speech:** Add stop method ([#1063](https://github.com/driftyco/ionic-native/issues/1063)) ([4f86320](https://github.com/driftyco/ionic-native/commit/4f86320))
* **unique-device-add:** add UniqueDeviceId plugin ([#1064](https://github.com/driftyco/ionic-native/issues/1064)) ([60db10c](https://github.com/driftyco/ionic-native/commit/60db10c))
<a name="2.5.1"></a>
## [2.5.1](https://github.com/driftyco/ionic-native/compare/v2.5.0...v2.5.1) (2017-02-07)
### Bug Fixes
* **pin-dialog:** add missing errorIndex ([b7701cd](https://github.com/driftyco/ionic-native/commit/b7701cd))
<a name="2.5.0"></a>
# [2.5.0](https://github.com/driftyco/ionic-native/compare/v2.4.1...v2.5.0) (2017-02-07)
### Bug Fixes
* **file-transfer:** fix return type of upload method ([a5b4632](https://github.com/driftyco/ionic-native/commit/a5b4632)), closes [#1002](https://github.com/driftyco/ionic-native/issues/1002)
* **pinterest:** fix PinterestPin interface ([a03afcf](https://github.com/driftyco/ionic-native/commit/a03afcf))
* **safari-view-controller:** fix issue caused by calling show without options ([dc37d8f](https://github.com/driftyco/ionic-native/commit/dc37d8f))
### Features
* **background-geolocation:** add missing properties for Android ([f0cf860](https://github.com/driftyco/ionic-native/commit/f0cf860))
* **barcodescanner:** add option disableSuccessBeep ([#1035](https://github.com/driftyco/ionic-native/issues/1035)) ([97489ba](https://github.com/driftyco/ionic-native/commit/97489ba))
* **inappbrowser:** add hide function ([#1018](https://github.com/driftyco/ionic-native/issues/1018)) ([4ab87d8](https://github.com/driftyco/ionic-native/commit/4ab87d8))
<a name="2.4.1"></a>
## [2.4.1](https://github.com/driftyco/ionic-native/compare/v2.4.0...v2.4.1) (2017-01-24)
### Bug Fixes
* **screen-orientation:** lockOrientation returns a promise ([1c09ee1](https://github.com/driftyco/ionic-native/commit/1c09ee1)), closes [#939](https://github.com/driftyco/ionic-native/issues/939)
<a name="2.4.0"></a>
# [2.4.0](https://github.com/driftyco/ionic-native/compare/v2.3.2...v2.4.0) (2017-01-24)
# [2.4.0](https://github.com/driftyco/ionic-native/compare/v2.3.3...v2.4.0) (2017-01-24)
<a name="2.3.3"></a>
## [2.3.3](https://github.com/driftyco/ionic-native/compare/v2.3.2...v2.3.3) (2017-01-24)
### Bug Fixes

View File

@@ -12,6 +12,9 @@ First, let's start by creating a new plugin wrapper from template.
// Make sure to capitalize the first letter, or use CamelCase if necessary.
gulp plugin:create -n PluginName
// add -m flag to get a minimal template to start with
gulp plugin:create -m -n PluginName
```
@@ -22,17 +25,18 @@ Let's take a look at the existing plugin wrapper for Geolocation to see what goe
plugin: 'cordova-plugin-geolocation',
pluginRef: 'navigator.geolocation'
})
@Injectable()
export class Geolocation {
@Cordova()
static getCurrentPosition(options?: GeolocationOptions): Promise<Geoposition> { return }
getCurrentPosition(options?: GeolocationOptions): Promise<Geoposition> { return; }
@Cordova({
callbackOrder: 'reverse',
observable: true,
clearFunction: 'clearWatch'
})
static watchPosition(options?: GeolocationOptions): Observable<Geoposition> { return }
watchPosition(options?: GeolocationOptions): Observable<Geoposition> { return; }
}
```
@@ -41,6 +45,7 @@ export class Geolocation {
First and foremost, we want to create a class representing our plugin, in this case Geolocation.
```
@Injectable()
class Geolocation {
}
@@ -57,6 +62,7 @@ For example, the `@Plugin` decorator adds information about the plugin to our Ge
plugin: 'cordova-plugin-geolocation',
pluginRef: 'navigator.geolocation'
})
@Injectable()
export class Geolocation {
}
@@ -74,7 +80,7 @@ Let's take a look at `getCurrentPosition` first.
```
@Cordova()
static getCurrentPosition(options?: GeolocationOptions): Promise<Geoposition> { return }
getCurrentPosition(options?: GeolocationOptions): Promise<Geoposition> { return }
```
It's just a stub. The `return` is only there to keep the TypeScript type-checker from complaining since we indicate that `getCurrentPosition` returns a `Promise<Geoposition>`.
@@ -91,7 +97,7 @@ Next, let's look at the `watchPosition` method.
observable: true,
clearFunction: 'clearWatch'
})
static watchPosition(options?: GeolocationOptions): Observable<Geoposition> { return }
watchPosition(options?: GeolocationOptions): Observable<Geoposition> { return }
```
The `@Cordova` decorator has a few more options now.
@@ -102,58 +108,6 @@ The `@Cordova` decorator has a few more options now.
`clearFunction` is used in conjunction with the `observable` option and indicates the function to be called when the Observable is disposed.
### Updating index.ts
For new plugins, you will need to update `/src/index.ts` to properly export your plugin and make it available for use.
1. Import the plugin class into `index.ts`:
`import {PluginClassName} from ./plugins/filenameForPlugin`
No need to put the `.ts` extension on the filename.
2. Add the plugin class name to the list in the `export` object:
```
export {
ActionSheet,
AdMob,
AndroidFingerprintAuth,
YourPluginClassName,
...
}
```
3. Add the plugin class name to the `window['IonicNative']` object:
```
window['IonicNative'] = {
ActionSheet: ActionSheet,
AdMob: AdMob,
AndroidFingerprintAuth: AndroidFingerprintAuth,
YourPluginClassName: YourPluginClassName,
...
```
4. If your plugin exports any other objects outside of the plugin class, add an export statement for the file:
`export * from './plugins/filenameForPlugin';`
No need to put the `.ts` extension on the filename.
For example, `googlemaps.ts` exports a const outside of the plugin's main `GoogleMap` class:
```
export const GoogleMapsAnimation = {
BOUNCE: 'BOUNCE',
DROP: 'DROP'
};
```
To properly export `GoogleMapsAnimation`, `index.ts` is updated with:
`export * from './plugins/googlemaps';`
### Testing your changes
You need to run `npm run build` in the `ionic-native` project, this will create a `dist` directory. Then, you must go to your ionic application folder and replace your current `node_modules/ionic-native/dist/` with the newly generated one.
@@ -164,7 +118,7 @@ You need to run `npm run lint` to analyze the code and ensure it's consistency w
### 'Wrapping' Up
That's it! The only thing left to do is rigorously document the plugin and it's usage. Take a look at some of the other plugins for good documentation styles.
That's it! The only thing left to do is rigorously document the plugin and it's usage. Take a look at some of the other plugins for good documentation styles.
## Commit Message Format

View File

@@ -1,6 +1,6 @@
machine:
node:
version: 4.1.0
version: 7.10.0
ruby:
version: 2.1.2
@@ -17,7 +17,6 @@ dependencies:
test:
override:
- npm test
- npm run build
deployment:

View File

@@ -1,6 +1,5 @@
var gulp = require('gulp');
var minimist = require('minimist');
var uglify = require('gulp-uglify');
var rename = require("gulp-rename");
var tslint = require('gulp-tslint');
var decamelize = require('decamelize');
@@ -17,16 +16,6 @@ var flags = minimist(process.argv.slice(2), flagConfig);
/* Docs tasks */
require('./scripts/docs/gulp-tasks')(gulp, flags);
gulp.task("minify:dist", function(){
gulp.src('./dist/ionic.native.js')
.pipe(uglify())
.pipe(rename({
suffix: '.min'
}))
.pipe(gulp.dest('./dist'));
});
gulp.task('lint', function() {
gulp.src('src/**/*.ts')
.pipe(tslint({
@@ -38,12 +27,21 @@ gulp.task('lint', function() {
gulp.task('plugin:create', function(){
if(flags.n && flags.n !== ''){
var src = flags.m?'./scripts/templates/wrap-min.tmpl':'./scripts/templates/wrap.tmpl';
const src = flags.m?'./scripts/templates/wrap-min.tmpl':'./scripts/templates/wrap.tmpl',
pluginName = flags.n,
pluginPackageName = decamelize(pluginName, '-'),
pluginNameSpaced = pluginName.replace(/(?!^)([A-Z])/g, ' $1');
return gulp.src(src)
.pipe(replace('PluginName', flags.n))
.pipe(rename(decamelize(flags.n, '-') + '.ts'))
.pipe(gulp.dest('./src/plugins/'));
.pipe(replace('PluginName', pluginName))
.pipe(replace('Plugin Name', pluginNameSpaced))
.pipe(rename('index.ts'))
.pipe(gulp.dest('./src/@ionic-native/plugins/' + pluginPackageName));
} else {
console.log("Usage is: gulp plugin:create -n PluginName");
}
});

View File

@@ -1,61 +0,0 @@
const WATCH = process.argv.indexOf('--watch') > -1;
module.exports = config => {
config.set({
// base path that will be used to resolve all patterns (eg. files, exclude)
basePath: './',
// frameworks to use
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
frameworks: ['jasmine', 'browserify'],
// list of files / patterns to load in the browser
files: [
'test/**/*.spec.ts'
],
// preprocess matching files before serving them to the browser
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
preprocessors: {
'test/**/*.spec.ts': ['browserify']
},
browserify: {
debug: true,
plugin: [ 'tsify' ],
extensions: ['.js', '.ts']
},
phantomjsLauncher: {
// Have phantomjs exit if a ResourceError is encountered (useful if karma exits without killing phantom)
exitOnResourceError: true
},
// test results reporter to use
// possible values: 'dots', 'progress'
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
reporters: ['dots'],
// web server port
port: 9876,
// enable / disable colors in the output (reporters and logs)
colors: true,
// level of logging
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
logLevel: config.LOG_INFO,
// enable / disable watching file and executing tests whenever any file changes
autoWatch: WATCH,
// start these browsers
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
browsers: ['PhantomJS'],
// Continuous Integration mode
// if true, Karma captures browsers, runs the tests and exits
singleRun: !WATCH
});
};

View File

@@ -1,73 +1,50 @@
{
"name": "ionic-native",
"version": "2.4.0",
"version": "3.1.0-rc.6",
"description": "Native plugin wrappers for Cordova and Ionic with TypeScript, ES6+, Promise and Observable support",
"main": "dist/es5/index.js",
"module": "dist/esm/index.js",
"typings": "dist/es5/index.d.ts",
"files": [
"dist"
],
"dependencies": {
"rxjs": "5.0.0-beta.12"
},
"license": "MIT",
"devDependencies": {
"browserify": "^13.3.0",
"@angular/compiler": "2.4.8",
"@angular/compiler-cli": "2.4.8",
"@angular/core": "2.4.8",
"canonical-path": "0.0.2",
"conventional-changelog-cli": "^1.2.0",
"conventional-github-releaser": "^1.1.3",
"cpr": "^2.0.2",
"cz-conventional-changelog": "^1.2.0",
"decamelize": "^1.2.0",
"dgeni": "^0.4.2",
"dgeni-packages": "^0.10.18",
"es6-shim": "~0.35.2",
"glob": "^7.1.1",
"gulp": "^3.9.1",
"gulp-rename": "^1.2.2",
"gulp-replace": "^0.5.4",
"gulp-tslint": "^6.1.2",
"gulp-uglify": "^2.0.0",
"jasmine-core": "~2.5.2",
"karma": "~1.3.0",
"karma-browserify": "~5.1.0",
"karma-jasmine": "~1.1.0",
"karma-phantomjs-launcher": "~1.0.2",
"child-process-promise": "2.2.0",
"conventional-changelog-cli": "1.2.0",
"cpr": "2.0.2",
"cz-conventional-changelog": "1.2.0",
"decamelize": "1.2.0",
"dgeni": "0.4.7",
"dgeni-packages": "0.16.10",
"fs-extra": "2.0.0",
"fs-extra-promise": "0.4.1",
"gulp": "3.9.1",
"gulp-rename": "1.2.2",
"gulp-replace": "0.5.4",
"gulp-tslint": "6.1.2",
"lodash": "4.17.4",
"minimist": "^1.1.3",
"mkdirp": "^0.5.1",
"minimist": "1.1.3",
"node-html-encoder": "0.0.2",
"q": "1.4.1",
"semver": "^5.3.0",
"tsify": "~3.0.0",
"tslint": "^3.15.1",
"queue": "4.2.1",
"rimraf": "2.5.4",
"rxjs": "5.0.1",
"semver": "5.3.0",
"tslint": "3.15.1",
"tslint-ionic-rules": "0.0.7",
"typescript": "~2.0.10",
"watchify": "~3.7.0"
"typescript": "2.0.09",
"zone.js": "0.7.2"
},
"scripts": {
"test": "karma start",
"test:watch": "npm test -- --watch",
"start": "npm run test:watch",
"lint": "gulp lint",
"build": "npm run lint && npm run build:js && npm run build:esm && npm run build:bundle && npm run build:minify",
"build:js": "tsc -p tsconfig-es5.json",
"build:esm": "tsc -p tsconfig-esm.json",
"build:bundle": "browserify dist/es5/index.js > dist/ionic.native.js",
"build:minify": "gulp minify:dist",
"shipit": "npm run build && npm publish && bash ./scripts/bower.sh",
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0",
"plugin:create": "gulp plugin:create"
"build": "npm run clean && npm run lint && npm run build:core && npm run build:modules",
"build:core": "ngc -p scripts/build/tsconfig-core.json",
"build:modules": "node scripts/build/build.js",
"clean": "rimraf dist",
"shipit": "npm run build && gulp readmes && npm run npmpub",
"npmpub": "node scripts/build/publish.js",
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0"
},
"repository": {
"type": "git",
"url": "https://github.com/driftyco/ionic-native.git"
},
"license": "MIT",
"bugs": {
"url": "https://github.com/driftyco/ionic-native/issues"
},
"homepage": "https://github.com/driftyco/ionic-native",
"config": {
"commitizen": {
"path": "./node_modules/cz-conventional-changelog"

View File

@@ -1,26 +0,0 @@
{
"name": "ionic-native",
"description": "Native plugin wrappers for Cordova and Ionic with TypeScript, ES6+, Promise and Observable support",
"main": [
"ionic.native.js"
],
"authors": [
"Max Lynch <max@ionic.io>"
],
"license": "MIT",
"keywords": [
"ionic",
"native",
"html5",
"hybrid",
"mobile"
],
"homepage": "https://github.com/driftyco/ionic-native-bower",
"ignore": [
"**/.*",
"node_modules",
"bower_components",
"test",
"tests"
]
}

View File

@@ -1,28 +0,0 @@
#!/bin/bash
set -e
# readJsonProp(jsonFile, property)
# - restriction: property needs to be on an own line!
function readJsonProp {
echo $(sed -En 's/.*"'$2'"[ ]*:[ ]*"(.*)".*/\1/p' $1)
}
VERSION=$(readJsonProp "package.json" "version")
echo "BOWERING IONIC-NATIVE VERSION $VERSION. FOR GREAT JUSTICE..."
DIR="scripts/ionic-native-bower"
rm -rf $DIR
mkdir $DIR
cp dist/ionic.native.js dist/ionic.native.min.js $DIR
cd $DIR
git init
git remote add origin git@github.com:driftyco/ionic-native-bower.git
cp ../bower.json .
git add .
git commit -m "Bower release"
git tag -f -m v$VERSION v$VERSION
git push -f --tags origin master
echo "BOWERING COMPLETED SOMEWHAT SUCCESSFULLY"

135
scripts/build/build.js Normal file
View File

@@ -0,0 +1,135 @@
// Node module dependencies
const fs = require('fs-extra-promise').useFs(require('fs-extra')),
queue = require('queue'),
path = require('path'),
exec = require('child_process').exec;
// Constants for the build process. Paths and JSON files templates
const ROOT = path.resolve(path.join(__dirname, '../../')), // root ionic-native directory
PLUGINS_PATH = path.resolve(ROOT, 'src/@ionic-native/plugins'), // path to plugins source files
CORE_PACKAGE_JSON = require(path.resolve(__dirname, 'core-package.json')), // core package.json
PLUGIN_PACKAGE_JSON = require(path.resolve(__dirname, 'plugin-package.json')), // plugin package.json template
PLUGIN_TS_CONFIG = require(path.resolve(__dirname, 'tsconfig-plugin.json')), // plugin tsconfig template
BUILD_TMP = path.resolve(ROOT, '.tmp'), // tmp directory path
BUILD_DIST_ROOT = path.resolve(ROOT, 'dist/packages-dist/@ionic-native'), // dist directory root path
BUILD_PLUGINS_DIST = path.resolve(BUILD_DIST_ROOT, 'plugins'), // plugins dist directory path
BUILD_CORE_DIST = path.resolve(BUILD_DIST_ROOT, 'core'); // core dist directory path
// dependency versions
const ANGULAR_VERSION = '2.4.8',
RXJS_VERSION = '5.0.1',
IONIC_NATIVE_VERSION = require(path.resolve(ROOT, 'package.json')).version;
// package dependencies
const CORE_PEER_DEPS = {
'rxjs': RXJS_VERSION
};
const PLUGIN_PEER_DEPS = {
'@ionic-native/core': IONIC_NATIVE_VERSION,
'@angular/core': ANGULAR_VERSION,
'rxjs': RXJS_VERSION
};
// set peer dependencies for all plugins
PLUGIN_PACKAGE_JSON.peerDependencies = PLUGIN_PEER_DEPS;
// Delete dist directory and any temporary files
console.log('Removing old TMP directory');
fs.removeSync(BUILD_TMP);
fs.removeSync(BUILD_PLUGINS_DIST);
// Create tmp/dist directories
console.log('Making new TMP directory');
fs.mkdirpSync(BUILD_TMP);
// Prepare and copy the core module's package.json
console.log('Preparing core module package.json');
CORE_PACKAGE_JSON.version = IONIC_NATIVE_VERSION;
CORE_PACKAGE_JSON.peerDependencies = CORE_PEER_DEPS;
fs.writeJsonSync(path.resolve(BUILD_CORE_DIST, 'package.json'), CORE_PACKAGE_JSON);
// Fetch a list of the plugins
const PLUGINS = fs.readdirSync(PLUGINS_PATH);
// Create a queue to process tasks
const QUEUE = queue({
concurrency: require('os').cpus().length
});
// Function to process a single plugin
const addPluginToQueue = pluginName => {
QUEUE.push((callback) => {
console.log(`Building plugin: ${pluginName}`);
const PLUGIN_BUILD_DIR = path.resolve(BUILD_TMP, 'plugins', pluginName),
PLUGIN_SRC_PATH = path.resolve(PLUGINS_PATH, pluginName, 'index.ts');
let tsConfigPath;
fs.mkdirpAsync(PLUGIN_BUILD_DIR) // create tmp build dir
.then(() => fs.mkdirpAsync(path.resolve(BUILD_PLUGINS_DIST, pluginName))) // create dist dir
.then(() => {
// Write tsconfig.json
const tsConfig = JSON.parse(JSON.stringify(PLUGIN_TS_CONFIG));
tsConfig.files = [PLUGIN_SRC_PATH];
// tsConfig.compilerOptions.paths['@ionic-native/core'] = [BUILD_CORE_DIST];
tsConfigPath = path.resolve(PLUGIN_BUILD_DIR, 'tsconfig.json');
return fs.writeJsonAsync(tsConfigPath, tsConfig);
})
.then(() => {
// clone package.json
const packageJson = JSON.parse(JSON.stringify(PLUGIN_PACKAGE_JSON));
packageJson.name = `@ionic-native/${pluginName}`;
packageJson.version = IONIC_NATIVE_VERSION;
return fs.writeJsonAsync(path.resolve(BUILD_PLUGINS_DIST, pluginName, 'package.json'), packageJson);
})
.then(() => {
// compile the plugin
exec(`${ROOT}/node_modules/.bin/ngc -p ${tsConfigPath}`, (err, stdout, stderr) => {
if (err) {
// oops! something went wrong.
callback(`\n\nBuilding ${pluginName} failed.`);
console.log(err);
return;
}
// we're done with this plugin!
callback();
});
})
.catch(callback);
}); // QUEUE.push end
};
PLUGINS.forEach(addPluginToQueue);
QUEUE.start((err) => {
if (err) {
console.log('Error building plugins. ', err);
} else {
console.log('Done processing plugins!');
}
});

View File

@@ -0,0 +1,14 @@
{
"name": "@ionic-native/core",
"version": "{{VERSION}}",
"description": "Ionic Native - Native plugins for ionic apps",
"module": "index.js",
"typings": "index.d.ts",
"author": "ionic",
"license": "MIT",
"peerDependencies": {},
"repository": {
"type": "git",
"url": "https://github.com/driftyco/ionic-native.git"
}
}

View File

@@ -0,0 +1,14 @@
{
"name": "@ionic-native/{{PLUGIN}}",
"version": "{{VERSION}}",
"description": "Ionic Native - Native plugins for ionic apps",
"module": "index.js",
"typings": "index.d.ts",
"author": "ionic",
"license": "MIT",
"peerDependencies": {},
"repository": {
"type": "git",
"url": "https://github.com/driftyco/ionic-native.git"
}
}

56
scripts/build/publish.js Normal file
View File

@@ -0,0 +1,56 @@
// Node module dependencies
const fs = require('fs-extra-promise').useFs(require('fs-extra')),
queue = require('queue'),
path = require('path'),
exec = require('child-process-promise').exec;
const ROOT = path.resolve(path.join(__dirname, '../../')),
DIST = path.resolve(ROOT, 'dist', 'packages-dist', '@ionic-native'),
PLUGINS_ROOT = path.resolve(DIST, 'plugins'),
CORE = path.resolve(DIST, 'core');
const FLAGS = '--access public'; // add any flags here if you want... (example: --tag alpha)
console.log('Publishing @ionic-native/core');
exec(`npm publish ${CORE} ${FLAGS}`)
.then(() => {
const PLUGINS = fs.readdirSync(PLUGINS_ROOT);
const QUEUE = queue({
concurrency: 10
});
PLUGINS.forEach(pluginName => {
QUEUE.push(done => {
console.log(`Publishing plugin ${pluginName}`);
const pluginPath = path.resolve(PLUGINS_ROOT, pluginName);
exec(`npm publish ${pluginPath} ${FLAGS}`)
.then(() => done())
.catch(done);
});
});
QUEUE.start((err) => {
if (err) {
console.log('Error publishing ionic-native. ', err);
} else {
console.log('Done publishing ionic-native!');
}
});
})
.catch(e => {
console.log('Publish failed');
console.log(e);
});

View File

@@ -0,0 +1,22 @@
{
"compilerOptions": {
"baseUrl": ".",
"declaration": true,
"stripInternal": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"module": "es2015",
"moduleResolution": "node",
"outDir": "../../dist/packages-dist/",
"rootDir": "../../src/",
"target": "es5",
"skipLibCheck": true,
"lib": ["es2015", "dom"]
},
"files": [
"../../src/@ionic-native/core/index.ts"
],
"angularCompilerOptions": {
"genDir": "../../.tmp/core-aot"
}
}

View File

@@ -0,0 +1,22 @@
{
"compilerOptions": {
"baseUrl": ".",
"declaration": true,
"stripInternal": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"module": "es2015",
"moduleResolution": "node",
"outDir": "../../../dist/packages-dist/",
"paths": {
"@ionic-native/core": ["../../../dist/packages-dist/@ionic-native/core"]
},
"rootDir": "../../../src/",
"target": "es5",
"skipLibCheck": true,
"lib": ["es2015", "dom"]
},
"files": [
"../../../src/@ionic-native/plugins/{{PLUGIN}}/index.ts"
]
}

View File

@@ -1,5 +1,6 @@
{
"sitePath": "../ionic-site",
"v2DocsDir": "docs/v2/native",
"docsDest": "../ionic-site/content/docs/v2/native"
"docsDest": "../ionic-site/content/docs/v2/native",
"pluginDir": "dist/packages-dist/@ionic-native/plugins"
}

View File

@@ -1,9 +1,8 @@
var Package = require('dgeni').Package;
var jsdocPackage = require('dgeni-packages/jsdoc');
var nunjucksPackage = require('dgeni-packages/nunjucks');
var typescriptPackage = require('./typescript-package');
var linksPackage = require('./links-package');
var gitPackage = require('dgeni-packages/git');
var typescriptPackage = require('dgeni-packages/typescript');
var linksPackage = require('dgeni-packages/links');
var path = require('path');
var semver = require('semver');
var fs = require('fs');
@@ -14,9 +13,7 @@ var projectPackage = require('../../package.json');
// Define the dgeni package for generating the docs
module.exports = function(currentVersion) {
return new Package('ionic-v2-docs',
[jsdocPackage, nunjucksPackage, typescriptPackage,
linksPackage, gitPackage])
return new Package('ionic-v2-docs', [jsdocPackage, nunjucksPackage, typescriptPackage, linksPackage])
// .processor(require('./processors/latest-version'))
.processor(require('./processors/jekyll'))
@@ -72,7 +69,7 @@ module.exports = function(currentVersion) {
log.level = 'error'; //'silly', 'debug', 'info', 'warn', 'error'
})
.config(function(renderDocsProcessor, computePathsProcessor, versionInfo) {
.config(function(renderDocsProcessor, computePathsProcessor) {
versions = [];
// new version, add it to the versions list
@@ -98,7 +95,6 @@ module.exports = function(currentVersion) {
};
renderDocsProcessor.extraData.version = versionData;
renderDocsProcessor.extraData.versionInfo = versionInfo;
computePathsProcessor.pathTemplates = [{
docTypes: ['class', 'var', 'function', 'let'],
getOutputPath: function(doc) {
@@ -117,10 +113,9 @@ module.exports = function(currentVersion) {
readFilesProcessor.$enabled = false;
readFilesProcessor.basePath = path.resolve(__dirname, '../..');
readTypeScriptModules.basePath = path.resolve(path.resolve(__dirname,
'../..'));
readTypeScriptModules.basePath = path.resolve(__dirname, '../..');
readTypeScriptModules.sourceFiles = [
'src/index.ts'
'./src/@ionic-native/plugins/**/*.ts'
];
})
@@ -148,7 +143,7 @@ module.exports = function(currentVersion) {
// Configure file writing
.config(function(writeFilesProcessor) {
writeFilesProcessor.outputFolder = config.sitePath;
writeFilesProcessor.outputFolder = '../ionic-site/';
})
// Configure rendering
@@ -169,7 +164,8 @@ module.exports = function(currentVersion) {
templateEngine.filters.push(
require('./filters/capital'),
require('./filters/code'),
require('./filters/dump')
require('./filters/dump'),
require('./filters/dashify')
);
templateFinder.templateFolders.unshift(path.resolve(__dirname, 'templates'));

View File

@@ -0,0 +1,177 @@
var Package = require('dgeni').Package;
var jsdocPackage = require('dgeni-packages/jsdoc');
var nunjucksPackage = require('dgeni-packages/nunjucks');
var typescriptPackage = require('dgeni-packages/typescript');
var linksPackage = require('dgeni-packages/links');
var path = require('path');
var semver = require('semver');
var fs = require('fs');
var _ = require('lodash');
var config = require('../config.json');
var projectPackage = require('../../package.json');
// jscs:disable validateIndentation
// Define the dgeni package for generating the docs
module.exports = function(currentVersion) {
return new Package('ionic-v2-docs', [jsdocPackage, nunjucksPackage, typescriptPackage, linksPackage])
// .processor(require('./processors/latest-version'))
.processor(require('./processors/readmes'))
.processor(require('./processors/remove-private-members'))
.processor(require('./processors/hide-private-api'))
// .processor(require('./processors/collect-inputs-outputs'))
// for debugging docs
// .processor(function test(){
// return {
//
// $runBefore: ['rendering-docs'],
// $process: function(docs){
// docs.forEach(function(doc){
// if (doc.name == "Camera"){
//
// // console.log(doc.tags);
// // doc.tags.forEach(function(tag){
// // if(tag.tagName == 'classes'){
// //
// // }
// // });
//
// // doc.moduleDoc.exports.forEach(function(d,i){
// // if(d.name === 'CameraOptions') {
// // console.log('Name: ' + d.name);
// // console.log('Type: ' + d.docType);
// // console.log('First member: ', d.members[0]);
// // }
// // });
//
//
// // var exports = doc.exportSymbol.parent.exports;
// // for(var p in exports) {
// // if(p == 'CameraOptions')
// // {
// // var x = exports[p];
// // console.log(x.members.quality);
// // }
// // }
// // doc.members.forEach(function(method){
// // if (method.name === "getPicture") {
// // console.log(method);
// // }
// // })
// }
// })
// }
// }
// })
.config(function(log) {
log.level = 'error'; //'silly', 'debug', 'info', 'warn', 'error'
})
.config(function(renderDocsProcessor, computePathsProcessor) {
versions = [];
// new version, add it to the versions list
if (currentVersion != 'nightly' && !_.includes(versions, currentVersion)) {
versions.unshift(currentVersion);
}
//First semver valid version is latest
var latestVersion = _.find(versions, semver.valid);
versions = versions.map(function(version) {
// We don't separate by versions so always put the docs in the root
var folder = '';
return {
href: '/' + config.v2DocsDir.replace('content/', ''),
folder: folder,
name: version
};
});
var versionData = {
list: versions,
current: _.find(versions, {name: currentVersion}),
latest: _.find(versions, {name: latestVersion}) || _.first(versions)
};
renderDocsProcessor.extraData.version = versionData;
computePathsProcessor.pathTemplates = [{
docTypes: ['class'],
getOutputPath: function(doc) {
return doc.originalModule.replace(config.pluginDir + '/', '')
.replace('/index', '') + '/README.md';
}
}];
})
//configure file reading
.config(function(readFilesProcessor, readTypeScriptModules) {
// Don't run unwanted processors since we are not using the normal file reading processor
readFilesProcessor.$enabled = false;
readFilesProcessor.basePath = path.resolve(__dirname, '../..');
readTypeScriptModules.basePath = path.resolve(path.resolve(__dirname, '../..'));
readTypeScriptModules.sourceFiles = ['./src/@ionic-native/plugins/**/*.ts'];
})
.config(function(parseTagsProcessor) {
parseTagsProcessor.tagDefinitions = parseTagsProcessor.tagDefinitions
.concat(require('./tag-defs/tag-defs'));
})
// .config(function(parseTagsProcessor) {
// // We actually don't want to parse param docs in this package as we are
// // getting the data out using TS
// parseTagsProcessor.tagDefinitions.forEach(function(tagDef) {
// console.log(tagDef);
// if (tagDef.name === 'param') {
// tagDef.docProperty = 'paramData';
// tagDef.transforms = [];
// }
// });
// })
// Configure links
.config(function(getLinkInfo) {
getLinkInfo.useFirstAmbiguousLink = false;
})
// Configure file writing
.config(function(writeFilesProcessor) {
writeFilesProcessor.outputFolder = './dist/packages-dist/';
})
// Configure rendering
.config(function(templateFinder, templateEngine) {
// Nunjucks and Angular conflict in their template bindings so change the Nunjucks
// Also conflict with Jekyll
templateEngine.config.tags = {
variableStart: '<$',
variableEnd: '$>',
blockStart: '<@',
blockEnd: '@>',
commentStart: '<#',
commentEnd: '#>'
};
// add custom filters to nunjucks
templateEngine.filters.push(
require('./filters/capital'),
require('./filters/code'),
require('./filters/dump')
);
templateFinder.templateFolders.unshift(path.resolve(__dirname, 'templates'));
// Specify how to match docs to templates.
templateFinder.templatePatterns = [
'${ doc.template }',
'${ doc.docType }.template.md',
'readme.template.md'
];
});
};

View File

@@ -0,0 +1,7 @@
module.exports = {
name: 'dashify',
process: function(str) {
str || (str = '');
return str.replace(/\s/g, '-');
}
};

View File

@@ -7,7 +7,23 @@ module.exports = function(gulp) {
try {
var ionicPackage = require('./dgeni-config')(projectPackage.version);
var dgeni = new Dgeni([ionicPackage]);
return dgeni.generate();
return dgeni.generate().then(function(docs) {
console.log(docs.length + ' docs generated');
});
} catch (err) {
console.log(err.stack);
}
});
gulp.task('readmes', [], function() {
var Dgeni = require('dgeni');
var semver = require('semver');
try {
var ionicPackage = require('./dgeni-readmes-config')(projectPackage.version);
var dgeni = new Dgeni([ionicPackage]);
return dgeni.generate().then(function(docs) {
console.log(docs.length + ' README files generated');
});
} catch (err) {
console.log(err.stack);
}

View File

@@ -1,12 +0,0 @@
var Package = require('dgeni').Package;
module.exports = new Package('links', [])
.factory(require('./inline-tag-defs/link'))
.factory(require('dgeni-packages/ngdoc/services/getAliases'))
.factory(require('dgeni-packages/ngdoc/services/getDocFromAlias'))
.factory(require('./services/getLinkInfo'))
.config(function(inlineTagProcessor, linkInlineTagDef) {
inlineTagProcessor.inlineTagDefinitions.push(linkInlineTagDef);
});

View File

@@ -1,33 +0,0 @@
var INLINE_LINK = /(\S+)(?:\s+([\s\S]+))?/;
/**
* @dgService linkInlineTagDef
* @description
* Process inline link tags (of the form {@link some/uri Some Title}), replacing them with HTML anchors
* @kind function
* @param {Object} url The url to match
* @param {Function} docs error message
* @return {String} The html link information
*
* @property {boolean} relativeLinks Whether we expect the links to be relative to the originating doc
*/
module.exports = function linkInlineTagDef(getLinkInfo, createDocMessage, log) {
return {
name: 'link',
description: 'Process inline link tags (of the form {@link some/uri Some Title}), replacing them with HTML anchors',
handler: function(doc, tagName, tagDescription) {
// Parse out the uri and title
return tagDescription.replace(INLINE_LINK, function(match, uri, title) {
var linkInfo = getLinkInfo(uri, title, doc);
if ( !linkInfo.valid ) {
log.warn(createDocMessage(linkInfo.error, doc));
}
return "<a href='" + linkInfo.url + "'>" + linkInfo.title + "</a>";
});
}
};
};

View File

@@ -1,72 +0,0 @@
var _ = require('lodash');
var path = require('canonical-path');
/**
* @dgService getLinkInfo
* @description
* Get link information to a document that matches the given url
* @kind function
* @param {String} url The url to match
* @param {String} title An optional title to return in the link information
* @return {Object} The link information
*
* @property {boolean} relativeLinks Whether we expect the links to be relative to the originating doc
*/
module.exports = function getLinkInfo(getDocFromAlias, encodeCodeBlock, log) {
return function getLinkInfoImpl(url, title, currentDoc) {
var linkInfo = {
url: url,
type: 'url',
valid: true,
title: title || url
};
if ( !url ) {
throw new Error('Invalid url');
}
var docs = getDocFromAlias(url, currentDoc);
if ( !getLinkInfoImpl.useFirstAmbiguousLink && docs.length > 1 ) {
linkInfo.valid = false;
linkInfo.errorType = 'ambiguous';
linkInfo.error = 'Ambiguous link: "' + url + '".\n' +
docs.reduce(function(msg, doc) { return msg + '\n "' + doc.id + '" ('+ doc.docType + ') : (' + doc.path + ' / ' + doc.fileInfo.relativePath + ')'; }, 'Matching docs: ');
} else if ( docs.length >= 1 ) {
linkInfo.url = docs[0].path;
linkInfo.title = title || encodeCodeBlock(docs[0].name, true);
linkInfo.type = 'doc';
if ( getLinkInfoImpl.relativeLinks && currentDoc && currentDoc.path ) {
var currentFolder = path.dirname(currentDoc.path);
var docFolder = path.dirname(linkInfo.url);
var relativeFolder = path.relative(path.join('/', currentFolder), path.join('/', docFolder));
linkInfo.url = path.join(relativeFolder, path.basename(linkInfo.url));
log.debug(currentDoc.path, docs[0].path, linkInfo.url);
}
} else if ( url.indexOf('#') > 0 ) {
var pathAndHash = url.split('#');
linkInfo = getLinkInfoImpl(pathAndHash[0], title, currentDoc);
linkInfo.url = linkInfo.url + '#' + pathAndHash[1];
return linkInfo;
} else if ( url.indexOf('/') === -1 && url.indexOf('#') !== 0 ) {
linkInfo.valid = false;
linkInfo.errorType = 'missing';
linkInfo.error = 'Invalid link (does not match any doc): "' + url + '"';
} else {
linkInfo.title = title || (( url.indexOf('#') === 0 ) ? url.substring(1) : path.basename(url, '.html'));
}
return linkInfo;
};
};

View File

@@ -5,14 +5,14 @@ module.exports = function removePrivateApi() {
$runBefore: ['rendering-docs'],
$process: function(docs) {
var publicDocs = [];
docs.forEach(function(doc){
if(!doc.private){
docs.forEach(function(doc){
if (!doc.private && (!doc.tags || !doc.tags.tagsByName.get('hidden'))){
publicDocs.push(doc);
return doc
}
})
docs = publicDocs;
return docs;
});
docs = publicDocs;
return docs;
}
}
};

View File

@@ -17,7 +17,7 @@ module.exports = function jekyll(renderDocsProcessor) {
return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
});
docs.forEach(function(doc, i) {
doc.outputPath = doc.outputPath.toLowerCase().replace(' ', '-');
doc.outputPath = doc.outputPath.toLowerCase().replace(/\s/g, '-');
docs[i].URL = doc.outputPath.replace('docs/v2//', 'docs/v2/')
.replace('/index.md', '')
.replace('content/', '');

View File

@@ -0,0 +1,25 @@
module.exports = function jekyll(renderDocsProcessor) {
return {
name: 'readmes',
description: 'Create jekyll includes',
$runAfter: ['paths-computed'],
$runBefore: ['rendering-docs'],
$process: function(docs) {
var currentVersion = renderDocsProcessor.extraData.version.current.name;
// pretty up and sort the docs object for menu generation
docs = docs.filter(function(doc) {
return (!!doc.name && !!doc.outputPath) || doc.docType === 'index-page';
});
docs.forEach(function(doc, i) {
doc.npmId = doc.outputPath.replace('/README.md', '')
.replace('src/@ionic-native/plugins/','');
doc.outputPath = doc.outputPath.replace('src/', '');
});
// returning docs will replace docs object in the next process
return docs;
}
};
};

View File

@@ -6,16 +6,19 @@ module.exports = function removePrivateMembers() {
$runBefore: ['rendering-docs'],
$process: function(docs) {
docs.forEach(function(doc) {
if (doc.members) {
doc.members = doc.members.filter(function(member) {
return !member.tags.tagsByName.get('private');
return !member.tags.tagsByName.get('hidden');
});
}
if (doc.statics) {
doc.statics = doc.statics.filter(function(staticMethod) {
return !staticMethod.tags.tagsByName.get('private');
return !staticMethod.tags.tagsByName.get('hidden');
});
}
});
return docs;

View File

@@ -6,6 +6,7 @@ module.exports = [
return typeof value !== 'undefined';
}},
{'name': 'usage'},
{'name': 'hidden'}, // hide from docs
{'name': 'classes'}, // related classes
{'name': 'interfaces'} // related interfaces
];

View File

@@ -53,7 +53,7 @@ docType: "<$ doc.docType $>"
<@- endmacro -@>
<@ macro githubViewLink(doc) -@>
<a href="https://github.com/<$ versionInfo.gitRepoInfo.owner $>/<$ versionInfo.gitRepoInfo.repo $>/tree/master/<$ doc.fileInfo.relativePath $>#L<$ doc.location.start.line+1 $>-L<$ doc.location.end.line+1 $>"><$ doc.fileInfo.relativePath $> (line <$ doc.location.start.line+1 $>)</a>
<a href="https://github.com/driftyco/ionic-native/tree/master/<$ doc.fileInfo.relativePath $>#L<$ doc.location.start.line+1 $>-L<$ doc.location.end.line+1 $>"><$ doc.fileInfo.relativePath $> (line <$ doc.location.start.line+1 $>)</a>
<@- endmacro -@>
<@ macro paramTable(params, isDirective) -@>
@@ -224,7 +224,10 @@ docType: "<$ doc.docType $>"
</p>
<@ endif @>
<pre><code>$ <@ if prop.install @><$ prop.install $><@ else @>ionic plugin add <$ prop.plugin $><@ endif -@></code></pre>
<pre><code>
$ <@ if prop.install @><$ prop.install $><@ else @>ionic plugin add <$ prop.plugin $><@ endif -@>
$ npm install --save @ionic-native/<$ prop.pluginRef $>
</code></pre>
<p>Repo:
<a href="<$ prop.repo $>">
<$ prop.repo $>

View File

@@ -1,9 +1,9 @@
<@ for doc in docs @><@ if doc.URL and doc.private != true and doc.beta != true @>
<li class="capitalize {% if page.id == '<$ doc.name|lower|replace(' ','-') $>' %}active{% endif %}">
<li class="capitalize {% if page.id == '<$ doc.name|lower|dashify $>' %}active{% endif %}">
<a href="/<$ doc.URL $>"><$ doc.name $></a>
</li><@ endif @><@ endfor @>
<@ for doc in docs @><@ if doc.URL and doc.private != true and doc.beta == true @>
<li class="capitalize {% if page.id == '<$ doc.name|lower|replace(' ','-') $>' %}active{% endif %}">
<li class="capitalize {% if page.id == '<$ doc.name|lower|dashify $>' %}active{% endif %}">
<a href="/<$ doc.URL $>"><$ doc.name $> <span class="beta">&beta;</span></a>
</li><@ endif @><@ endfor @>

View File

@@ -0,0 +1,38 @@
<a style="float:right;font-size:12px;" href="http://github.com/driftyco/ionic-native/edit/master/<$ doc.fileInfo.relativePath|replace('/home/ubuntu/ionic-native/', '')|replace('//','/') $>#L<$ doc.location.start.line $>">
Improve this doc
</a>
# <$ doc.name $>
<@- if doc.beta == true @>
<p style="color:orange">
This plugin is still in beta stage and may not work as expected. Please
submit any issues to the <a target="_blank"
href="<$ prop.repo $>/issues">plugin repo</a>.
</p>
<@ endif -@>
<@ for prop in doc.decorators[0].argumentInfo @>
```
$ <@ if prop.install @><$ prop.install $><@ else @>ionic plugin add <$ prop.plugin $><@ endif @>
$ npm install --save @ionic-native/<$ doc.npmId $>
```
## [Usage Documentation](https://ionicframework.com/docs/v2/native/<$ doc.fileInfo.relativePath|replace('/home/ubuntu/ionic-native/', '')|replace('//','/')|replace('index.ts','')|replace('src/@ionic-native/plugins/','') $>)
Plugin Repo: [<$ prop.repo $>](<$ prop.repo $>)
<$ doc.description $>
<@- if prop.platforms @>
## Supported platforms
<@ for platform in prop.platforms -@>
- <$ platform $>
<@ endfor @>
<@ endif -@>
<@ endfor @>

View File

@@ -1,100 +0,0 @@
var Package = require('dgeni').Package;
var jsdocPackage = require('dgeni-packages/jsdoc');
var nunjucksPackage = require('dgeni-packages/nunjucks');
var typescriptPackage = require('../typescript-package');
var gitPackage = require('dgeni-packages/git');
var path = require('canonical-path');
// Define the dgeni package for generating the docs
module.exports = new Package('angular-v2-docs', [jsdocPackage, nunjucksPackage, typescriptPackage, gitPackage])
// Register the processors
.processor(require('./processors/createTypeDefinitionFile'))
.config(function(readFilesProcessor, inlineTagProcessor) {
readFilesProcessor.basePath = path.resolve(__dirname, '../..');
// Don't run unwanted processors
readFilesProcessor.$enabled = false;
inlineTagProcessor.$enabled = false;
})
// Configure the log service
.config(function(log) {
log.level = 'info';
})
.config(function(renderDocsProcessor, versionInfo) {
renderDocsProcessor.extraData.versionInfo = versionInfo;
})
.config(function(readFilesProcessor, inlineTagProcessor, readTypeScriptModules, createTypeDefinitionFile) {
// Don't run unwanted processors
readFilesProcessor.$enabled = false; // We are not using the normal file reading processor
inlineTagProcessor.$enabled = false; // We are not actually processing the inline link tags
// Configure file reading
readFilesProcessor.basePath = path.resolve(__dirname, '../..');
readTypeScriptModules.sourceFiles = [
'angular2/angular2.ts',
'angular2/router.ts'
];
readTypeScriptModules.basePath = path.resolve(path.resolve(__dirname, '../../modules'));
createTypeDefinitionFile.typeDefinitions = [
{
id: 'angular2/angular2',
modules: {
'angular2/angular2': 'angular2/angular2',
}
},
{
id: 'angular2/router',
modules: {
'angular2/router': 'angular2/router'
}
}
];
})
.config(function(parseTagsProcessor, getInjectables) {
// We actually don't want to parse param docs in this package as we are getting the data out using TS
parseTagsProcessor.tagDefinitions.forEach(function(tagDef) {
if (tagDef.name === 'param') {
tagDef.docProperty = 'paramData';
tagDef.transforms = [];
}
});
})
// Configure file writing
.config(function(writeFilesProcessor) {
writeFilesProcessor.outputFolder = 'dist/docs';
})
// Configure rendering
.config(function(templateFinder, templateEngine) {
// Nunjucks and Angular conflict in their template bindings so change Nunjucks
templateEngine.config.tags = {
variableStart: '{$',
variableEnd: '$}'
};
templateFinder.templateFolders
.unshift(path.resolve(__dirname, 'templates'));
templateFinder.templatePatterns = [
'${ doc.template }',
'${ doc.id }.${ doc.docType }.template.html',
'${ doc.id }.template.html',
'${ doc.docType }.template.html',
'common.template.html'
];
});

View File

@@ -1,11 +0,0 @@
var Package = require('dgeni').Package;
module.exports = function mockPackage() {
return new Package('mockPackage', [require('../')])
// provide a mock log service
.factory('log', function() { return require('dgeni/lib/mocks/log')(false); })
// .factory('templateEngine', function() { return {}; });
};

View File

@@ -1,86 +0,0 @@
var _ = require('lodash');
var path = require('canonical-path');
module.exports = function createTypeDefinitionFile(log) {
return {
$runAfter: ['processing-docs'],
$runBefore: ['docs-processed'],
$validate: {
dtsPath: { presence: true },
dtsExtension: { presence: true },
typeDefinitions: { presence: true }
},
dtsPath: 'typings',
dtsExtension: '.d.ts',
typeDefinitions: [],
$process: function(docs) {
var dtsPath = this.dtsPath;
var dtsExtension = this.dtsExtension;
// For each type definition that we wish to create we define a dgeni "doc" for it
var typeDefDocs = _.map(this.typeDefinitions, function(def) {
var id = def.id + dtsExtension;
var docPath = path.join(dtsPath, id);
return {
docType: 'type-definition',
id: id,
aliases: [id],
path: docPath,
outputPath: docPath,
// A type definition may include a number of top level modules
// And those modules could be aliased (such as 'angular2/angular2.api' -> 'angular2/angular2')
moduleDocs: _.transform(def.modules, function(moduleDocs, id, alias) {
moduleDocs[id] = { id: alias, doc: null };
})
};
});
// Now add all the module docs to their corresponding type definition doc
_.forEach(docs, function(doc) {
_.forEach(typeDefDocs, function(typeDefDoc) {
if(typeDefDoc.moduleDocs[doc.id]) {
// Add a copy, because we are going to modify it
typeDefDoc.moduleDocs[doc.id].doc = doc;
}
});
});
return _.filter(typeDefDocs, function(doc) {
_.forEach(doc.moduleDocs, function(modDoc, alias) {
if (!doc || !modDoc.doc) {
log.error('createTypeDefinitionFile processor: no such module "' + alias + '" (Did you forget to add it to the modules to load?)');
doc = null;
return;
}
_.forEach(modDoc.doc.exports, function(exportDoc) {
// Search for classes with a constructor marked as `@private`
if (exportDoc.docType === 'class' && exportDoc.constructorDoc && exportDoc.constructorDoc.private) {
// Convert this class to an interface with no constructor
exportDoc.docType = 'interface';
exportDoc.constructorDoc = null;
if (exportDoc.heritage) {
// convert the heritage since interfaces use `extends` not `implements`
exportDoc.heritage = exportDoc.heritage.replace('implements', 'extends');
}
// Add the `declare var SomeClass extends InjectableReference` construct
modDoc.doc.exports.push({
docType: 'var',
name: exportDoc.name,
id: exportDoc.id,
heritage: ': InjectableReference'
});
}
});
});
return !!doc;
});
}
};
};

View File

@@ -1,48 +0,0 @@
var mockPackage = require('../mocks/mockPackage');
var Dgeni = require('dgeni');
var path = require('canonical-path');
var _ = require('lodash');
describe('createTypeDefinitionFile processor', function() {
var dgeni, injector, processor;
beforeEach(function() {
dgeni = new Dgeni([mockPackage()]);
injector = dgeni.configureInjector();
processor = injector.get('createTypeDefinitionFile');
// Initialize the processor
processor.typeDefinitions = [{
id: 'angular2/angular2',
modules: { 'angular2/angular2': 'angular2/angular2' }
}];
});
describe('classes with private constructors', function() {
it('should convert heritage from `implements` into `extends`', function() {
// Create some mock docs for testing
var docs = [
{
id: 'angular2/angular2',
exports: [
{ docType: 'class', heritage: 'implements Xyz', constructorDoc: { private: true } }
]
}
];
docs = processor.$process(docs);
expect(docs.length).toEqual(1);
expect(docs[0].docType).toEqual('type-definition');
var moduleDoc = docs[0].moduleDocs['angular2/angular2'].doc;
expect(moduleDoc.exports.length).toEqual(2);
expect(moduleDoc.exports[0].heritage).toEqual('extends Xyz');
});
});
});

View File

@@ -1,17 +0,0 @@
{% extends '../type-definition.template.html' %}
{% block staticDeclarations %}
interface List<T> extends Array<T> {}
interface Map<K,V> {}
interface StringMap<K,V> extends Map<K,V> {}
declare module ng {
// See https://github.com/Microsoft/TypeScript/issues/1168
class BaseException /* extends Error */ {
message: string;
stack: string;
toString(): string;
}
interface InjectableReference {}
}
{% endblock %}

View File

@@ -1,72 +0,0 @@
{%- macro commentBlock(doc, level) -%}
{%- if doc.content | trim %}
{% if level > 1 %}{$ '/**' | indent(level-1, true) | replace(r/\n$/, "") $}{% else %}/**{% endif %}
{$ doc.content | trim | replace(r/^/gm, "* ") | indent(level, true) | replace(r/\n$/, "") $}
{$ '*/' | indent(level, true) | replace(r/\n$/, "") $}{% endif -%}
{%- endmacro -%}
{%- macro memberInfo(member) -%}
{$ commentBlock(member, 5) $}
{$ member.name $}{% if member.optional %}?{% endif -%}
{% if member.typeParameters %}<{% for typeParam in member.typeParameters %}{$ typeParam $}{% if not loop.last %}, {% endif %}{% endfor %}>{% endif -%}
{%- if member.parameters -%}({% for param in member.parameters %}{$ param $}{% if not loop.last %}, {% endif %}{% endfor %}){%- endif -%}
{%- if member.returnType == 'Directive' %}: DirectiveAnnotation{%- elif member.returnType -%}: {$ member.returnType $}{%- else -%}: void
{%- endif -%};
{%- endmacro -%}
// Type definitions for Angular v{$ versionInfo.currentVersion.full | replace(r/\+/, "_") $}
// Project: http://angular.io/
// Definitions by: angular team <https://github.com/angular/>
// Definitions: https://github.com/borisyankov/DefinitelyTyped
// ***********************************************************
// This file is generated by the Angular build process.
// Please do not create manual edits or send pull requests
// modifying this file.
// ***********************************************************
{% block staticDeclarations %}{% endblock %}
{% for alias, module in doc.moduleDocs %}
{$ commentBlock(module.doc, 1) $}
declare module ng {
{%- for export in module.doc.exports -%}
{%- if export.content -%}
{$ commentBlock(export, 3) $}
{%- endif %}
{$ export.docType $} {$ export.name $}{$ export.typeParams $}{%- if export.heritage == ' extends Directive' %} extends DirectiveAnnotation{% else %}{$ export.heritage $}{% endif %}
{%- if export.docType == 'class' or export.docType == 'interface' %} {
{%- if export.newMember %}
{$ memberInfo(export.newMember) $}
{% endif %}
{%- if export.callMember %}
{$ memberInfo(export.callMember) $}
{% endif -%}
{%- for member in export.members %}
{$ memberInfo(member) $}
{%- endfor %}
}
{%- elif export.docType == 'enum' %} {
{%- for member in export.members %}
{$ member $}{% if not loop.last %},
{%- endif -%}
{%- endfor %}
}
{%- else -%}
{% if export.parameters %}({% for param in export.parameters %}{$ param $}{% if not loop.last %}, {% endif %}{% endfor %}){%- endif %}
{%- if export.returnType %} : {$ export.returnType $} {% endif -%}
;
{%- endif %}
{% endfor %}
}
{% endfor %}
declare module "angular2/angular2" {
export = ng;
}

View File

@@ -1,74 +0,0 @@
var basePackage = require('dgeni-packages/base');
var Package = require('dgeni').Package;
var path = require('canonical-path');
// Define the dgeni package for generating the docs
module.exports = new Package('typescript-parsing', [basePackage])
// Register the services and file readers
.factory(require('./services/modules'))
.factory(require('./services/tsParser'))
.factory(require('./services/tsParser/createCompilerHost'))
.factory(require('./services/tsParser/getFileInfo'))
.factory(require('./services/tsParser/getExportDocType'))
.factory(require('./services/tsParser/getContent'))
.factory(require('./services/tsParser/getDirectiveInfo'))
.factory(require('./services/convertPrivateClassesToInterfaces'))
.factory('EXPORT_DOC_TYPES', function() {
return [
'class',
'interface',
'function',
'var',
'const',
'let',
'enum',
'type-alias'
];
})
// Register the processors
.processor(require('./processors/readTypeScriptModules'))
// Configure the log service
.config(function(log) {
log.level = 'warn';
})
// Configure ids and paths
.config(function(computeIdsProcessor, computePathsProcessor, EXPORT_DOC_TYPES) {
computeIdsProcessor.idTemplates.push({
docTypes: ['member'],
idTemplate: '${classDoc.id}.${name}',
getAliases: function(doc) {
return doc.classDoc.aliases.map(function(alias) { return alias + '.' + doc.name; });
}
});
computePathsProcessor.pathTemplates.push({
docTypes: ['member'],
pathTemplate: '${classDoc.path}#${name}',
getOutputPath: function() {} // These docs are not written to their own file, instead they are part of their class doc
});
var MODULES_DOCS_PATH = 'partials/modules';
computePathsProcessor.pathTemplates.push({
docTypes: ['module'],
pathTemplate: '/${id}',
outputPathTemplate: MODULES_DOCS_PATH + '/${id}/index.html'
});
computePathsProcessor.pathTemplates.push({
docTypes: EXPORT_DOC_TYPES,
pathTemplate: '${moduleDoc.path}/${name}',
outputPathTemplate: MODULES_DOCS_PATH + '/${path}/index.html'
});
});

View File

@@ -1,11 +0,0 @@
var Package = require('dgeni').Package;
module.exports = function mockPackage() {
return new Package('mockPackage', [require('../')])
// provide a mock log service
.factory('log', function() { return require('dgeni/lib/mocks/log')(false); })
.factory('templateEngine', function() { return {}; });
};

View File

@@ -1,4 +0,0 @@
export var __esModule = true;
export class OKToExport {}
export function _thisIsPrivate() {}
export var thisIsOK = '!';

View File

@@ -1,5 +0,0 @@
export interface MyInterface {
optionalProperty? : string
<T, U extends Findable<T>>(param: T) : U
new (param: number) : MyInterface
}

View File

@@ -1,6 +0,0 @@
export class Test {
firstItem;
constructor() { this.doStuff(); }
otherMethod() {}
doStuff() {}
}

View File

@@ -1,3 +0,0 @@
export { x as y} from './privateModule';
export abstract class AbstractClass {}

View File

@@ -1 +0,0 @@
export var x = 100;

View File

@@ -1,34 +0,0 @@
/**
* @module
* @description
* This is the module description
*/
export * from 'importedSrc';
/**
* This is some random other comment
*/
/**
* This is MyClass
*/
export class MyClass {
message: String;
/**
* Create a new MyClass
* @param {String} name The name to say hello to
*/
constructor(name) { this.message = 'hello ' + name; }
/**
* Return a greeting message
*/
greet() { return this.message; }
}
/**
* An exported function
*/
export var myFn = (val: number) => return val * 2;

View File

@@ -1,454 +0,0 @@
var glob = require('glob');
var path = require('canonical-path');
var _ = require('lodash');
var ts = require('typescript');
module.exports = function readTypeScriptModules(tsParser, modules, getFileInfo,
getDirectiveInfo,
getExportDocType, getContent,
createDocMessage, log) {
return {
$runAfter: ['files-read'],
$runBefore: ['parsing-tags'],
$validate: {
sourceFiles: {presence: true},
basePath: {presence: true},
hidePrivateMembers: {inclusion: [true, false]},
sortClassMembers: {inclusion: [true, false]},
ignoreExportsMatching: {}
},
// A collection of globs that identify those modules for which we should create docs
sourceFiles: [],
// The base path from which to load the source files
basePath: '.',
// We can ignore members of classes that are private
hidePrivateMembers: true,
// We leave class members sorted in order of declaration
sortClassMembers: false,
// We can provide a collection of strings or regexes to ignore exports whose export names match
ignoreExportsMatching: ['___esModule'],
$process: function(docs) {
// Convert ignoreExportsMatching to an array of regexes
var ignoreExportsMatching = convertToRegexCollection(this.ignoreExportsMatching);
var hidePrivateMembers = this.hidePrivateMembers;
var sortClassMembers = this.sortClassMembers;
var basePath = path.resolve(this.basePath);
var filesPaths = expandSourceFiles(this.sourceFiles, basePath);
var parseInfo = tsParser.parse(filesPaths, this.basePath);
var moduleSymbols = parseInfo.moduleSymbols;
// Iterate through each of the modules that were parsed and generate a module doc
// as well as docs for each module's exports.
moduleSymbols.forEach(function(moduleSymbol) {
var moduleDoc = createModuleDoc(moduleSymbol, basePath);
// Add this module doc to the module lookup collection and the docs collection
modules[moduleDoc.id] = moduleDoc;
docs.push(moduleDoc);
// Iterate through this module's exports and generate a doc for each
moduleSymbol.exportArray.forEach(function(exportSymbol) {
// Ignore exports starting with an underscore
if (anyMatches(ignoreExportsMatching, exportSymbol.name)) return;
// If the symbol is an Alias then for most things we want the original resolved symbol
var resolvedExport = exportSymbol.resolvedSymbol || exportSymbol;
// If the resolved symbol contains no declarations then it is invalid
// (probably an abstract class)
// For the moment we are just going to ignore such exports
// TODO: find a way of generating docs for them
if (!resolvedExport.declarations) return;
var exportDoc = createExportDoc(exportSymbol.name, resolvedExport, moduleDoc, basePath, parseInfo.typeChecker);
log.debug('>>>> EXPORT: ' + exportDoc.name + ' (' + exportDoc.docType + ') from ' + moduleDoc.id);
// Add this export doc to its module doc
moduleDoc.exports.push(exportDoc);
docs.push(exportDoc);
exportDoc.members = [];
exportDoc.statics = [];
// Generate docs for each of the export's members
if (resolvedExport.flags & ts.SymbolFlags.HasMembers) {
for(var memberName in resolvedExport.members) {
// FIXME(alexeagle): why do generic type params appear in members?
if (memberName === 'T') {
continue;
}
log.silly('>>>>>> member: ' + memberName + ' from ' + exportDoc.id + ' in ' + moduleDoc.id);
var memberSymbol = resolvedExport.members[memberName];
var memberDoc = createMemberDoc(memberSymbol, exportDoc, basePath, parseInfo.typeChecker);
// We special case the constructor and sort the other members alphabetically
if (memberSymbol.flags & ts.SymbolFlags.Constructor) {
exportDoc.constructorDoc = memberDoc;
docs.push(memberDoc);
} else if (!hidePrivateMembers || memberSymbol.name.charAt(0) !== '_') {
docs.push(memberDoc);
exportDoc.members.push(memberDoc);
} else if (memberSymbol.name === '__call' && memberSymbol.flags & ts.SymbolFlags.Signature) {
docs.push(memberDoc);
exportDoc.callMember = memberDoc;
} else if (memberSymbol.name === '__new' && memberSymbol.flags & ts.SymbolFlags.Signature) {
docs.push(memberDoc);
exportDoc.newMember = memberDoc;
}
}
}
if (exportDoc.docType === 'enum') {
for(var memberName in resolvedExport.exports) {
log.silly('>>>>>> member: ' + memberName + ' from ' + exportDoc.id + ' in ' + moduleDoc.id);
var memberSymbol = resolvedExport.exports[memberName];
var memberDoc = createMemberDoc(memberSymbol, exportDoc, basePath, parseInfo.typeChecker);
docs.push(memberDoc);
exportDoc.members.push(memberDoc);
}
} else if (resolvedExport.flags & ts.SymbolFlags.HasExports) {
for (var exported in resolvedExport.exports) {
if (exported === 'prototype') continue;
if (hidePrivateMembers && exported.charAt(0) === '_') continue;
var memberSymbol = resolvedExport.exports[exported];
var memberDoc = createMemberDoc(memberSymbol, exportDoc, basePath, parseInfo.typeChecker);
memberDoc.isStatic = true;
docs.push(memberDoc);
exportDoc.statics.push(memberDoc);
}
}
if (sortClassMembers) {
exportDoc.members.sort(function(a, b) {
if (a.name > b.name) return 1;
if (a.name < b.name) return -1;
return 0;
});
exportDoc.statics.sort(function(a, b) {
if (a.name > b.name) return 1;
if (a.name < b.name) return -1;
return 0;
});
}
});
});
}
};
function createModuleDoc(moduleSymbol, basePath) {
var id = moduleSymbol.name.replace(/^"|"$/g, '');
var name = id.split('/').pop();
var moduleDoc = {
docType: 'module',
name: name,
id: id,
aliases: [id, name],
moduleTree: moduleSymbol,
content: getContent(moduleSymbol),
exports: [],
fileInfo: getFileInfo(moduleSymbol, basePath),
location: getLocation(moduleSymbol)
};
return moduleDoc;
}
function createExportDoc(name, exportSymbol, moduleDoc, basePath, typeChecker) {
var typeParamString = '';
var heritageString = '';
var typeDefinition = '';
exportSymbol.declarations.forEach(function(decl) {
var sourceFile = ts.getSourceFileOfNode(decl);
if (decl.typeParameters) {
typeParamString = '<' + getText(sourceFile, decl.typeParameters) + '>';
}
if (decl.symbol.flags & ts.SymbolFlags.TypeAlias) {
typeDefinition = getText(sourceFile, decl.type);
}
if (decl.heritageClauses) {
decl.heritageClauses.forEach(function(heritage) {
if (heritage.token == ts.SyntaxKind.ExtendsKeyword) {
heritageString += " extends";
heritage.types.forEach(function(typ, idx) {
heritageString += (idx > 0 ? ',' : '') + typ.getFullText();
});
}
if (heritage.token == ts.SyntaxKind.ImplementsKeyword) {
heritageString += " implements";
heritage.types.forEach(function(typ, idx) {
heritageString += (idx > 0 ? ', ' : '') + typ.getFullText();
});
}
});
}
});
//Make sure duplicate aliases aren't created, so "Ambiguous link" warnings are prevented
var aliasNames = [name, moduleDoc.id + '/' + name];
if (typeParamString) {
aliasNames.push(name + typeParamString);
aliasNames.push(moduleDoc.id + '/' + name + typeParamString);
}
var exportDoc = {
docType: getExportDocType(exportSymbol),
exportSymbol: exportSymbol,
name: name,
id: moduleDoc.id + '/' + name,
typeParams: typeParamString,
heritage: heritageString,
decorators: getDecorators(exportSymbol),
aliases: aliasNames,
moduleDoc: moduleDoc,
content: getContent(exportSymbol),
fileInfo: getFileInfo(exportSymbol, basePath),
location: getLocation(exportSymbol),
directiveInfo: getDirectiveInfo(exportSymbol)
};
if (exportDoc.docType === 'var' || exportDoc.docType === 'const' || exportDoc.docType === 'let') {
exportDoc.symbolTypeName = exportSymbol.valueDeclaration.type &&
exportSymbol.valueDeclaration.type.typeName &&
exportSymbol.valueDeclaration.type.typeName.text;
}
if (exportDoc.docType === 'type-alias') {
exportDoc.returnType = getReturnType(typeChecker, exportSymbol);
}
if(exportSymbol.flags & ts.SymbolFlags.Function) {
exportDoc.parameters = getParameters(typeChecker, exportSymbol);
}
if(exportSymbol.flags & ts.SymbolFlags.Value) {
exportDoc.returnType = getReturnType(typeChecker, exportSymbol);
}
if (exportSymbol.flags & ts.SymbolFlags.TypeAlias) {
exportDoc.typeDefinition = typeDefinition;
}
// Compute the original module name from the relative file path
exportDoc.originalModule = exportDoc.fileInfo.relativePath
.replace(new RegExp('\.' + exportDoc.fileInfo.extension + '$'), '');
return exportDoc;
}
function createMemberDoc(memberSymbol, classDoc, basePath, typeChecker) {
var memberDoc = {
docType: 'member',
classDoc: classDoc,
name: memberSymbol.name,
decorators: getDecorators(memberSymbol),
content: getContent(memberSymbol),
fileInfo: getFileInfo(memberSymbol, basePath),
location: getLocation(memberSymbol)
};
memberDoc.typeParameters = getTypeParameters(typeChecker, memberSymbol);
if(memberSymbol.flags & (ts.SymbolFlags.Signature) ) {
memberDoc.parameters = getParameters(typeChecker, memberSymbol);
memberDoc.returnType = getReturnType(typeChecker, memberSymbol);
switch(memberDoc.name) {
case '__call':
memberDoc.name = '';
break;
case '__new':
memberDoc.name = 'new';
break;
}
}
if (memberSymbol.flags & ts.SymbolFlags.Method) {
// NOTE: we use the property name `parameters` here so we don't conflict
// with the `params` property that will be updated by dgeni reading the
// `@param` tags from the docs
memberDoc.parameters = getParameters(typeChecker, memberSymbol);
}
if (memberSymbol.flags & ts.SymbolFlags.Constructor) {
memberDoc.parameters = getParameters(typeChecker, memberSymbol);
memberDoc.name = 'constructor';
}
if(memberSymbol.flags & ts.SymbolFlags.Value) {
memberDoc.returnType = getReturnType(typeChecker, memberSymbol);
}
if(memberSymbol.flags & ts.SymbolFlags.Optional) {
memberDoc.optional = true;
}
return memberDoc;
}
function getDecorators(symbol) {
var declaration = symbol.valueDeclaration || symbol.declarations[0];
var sourceFile = ts.getSourceFileOfNode(declaration);
var decorators = declaration.decorators && declaration.decorators.map(function(decorator) {
decorator = decorator.expression;
return {
name: decorator.expression ? decorator.expression.text : decorator.text,
arguments: decorator.arguments && decorator.arguments.map(function(argument) {
return getText(sourceFile, argument).trim();
}),
argumentInfo: decorator.arguments && decorator.arguments.map(function(argument) {
return parseArgument(argument);
}),
expression: decorator
};
});
return decorators;
}
function parseProperties(properties) {
var result = {};
_.forEach(properties, function(property) {
result[property.name.text] = parseArgument(property.initializer);
});
return result;
}
function parseArgument(argument) {
if (argument.text) return argument.text;
if (argument.properties) return parseProperties(argument.properties);
if (argument.elements) return argument.elements.map(function(element) { return element.text; });
var sourceFile = ts.getSourceFileOfNode(argument);
var text = getText(sourceFile, argument).trim();
return text;
}
function getParameters(typeChecker, symbol) {
var declaration = symbol.valueDeclaration || symbol.declarations[0];
var sourceFile = ts.getSourceFileOfNode(declaration);
if (!declaration.parameters) {
var location = getLocation(symbol);
throw new Error('missing declaration parameters for "' + symbol.name +
'" in ' + sourceFile.fileName +
' at line ' + location.start.line);
}
return declaration.parameters.map(function(parameter) {
var paramText = '';
if (parameter.dotDotDotToken) {
paramText += '...';
}
paramText += getText(sourceFile, parameter.name);
if (parameter.questionToken || parameter.initializer) {
paramText += '?';
}
if (parameter.type) {
paramText += ':' + getType(sourceFile, parameter.type);
} else {
paramText += ': any';
if (parameter.dotDotDotToken) {
paramText += '[]';
}
}
return paramText.trim();
});
}
function getTypeParameters(typeChecker, symbol) {
var declaration = symbol.valueDeclaration || symbol.declarations[0];
var sourceFile = ts.getSourceFileOfNode(declaration);
if (!declaration.typeParameters) return;
var typeParams = declaration.typeParameters.map(function(type) {
return getText(sourceFile, type).trim();
});
return typeParams;
}
function getReturnType(typeChecker, symbol) {
var declaration = symbol.valueDeclaration || symbol.declarations[0];
var sourceFile = ts.getSourceFileOfNode(declaration);
if (declaration.type) {
return getType(sourceFile, declaration.type).trim();
} else if (declaration.initializer) {
// The symbol does not have a "type" but it is being initialized
// so we can deduce the type of from the initializer (mostly).
if (declaration.initializer.expression) {
return declaration.initializer.expression.text.trim();
} else {
return getType(sourceFile, declaration.initializer).trim();
}
}
}
function expandSourceFiles(sourceFiles, basePath) {
var filePaths = [];
sourceFiles.forEach(function(sourcePattern) {
filePaths = filePaths.concat(glob.sync(sourcePattern, { cwd: basePath }));
});
return filePaths;
}
function getText(sourceFile, node) {
return sourceFile.text.substring(node.pos, node.end);
}
// Strip any local renamed imports from the front of types
function getType(sourceFile, type) {
var text = getText(sourceFile, type);
while (text.indexOf(".") >= 0) {
// Keep namespaced symbols in RxNext
if (text.match(/^\s*RxNext\./)) break;
// handle the case List<thing.stuff> -> List<stuff>
text = text.replace(/([^.<]*)\.([^>]*)/, "$2");
}
return text;
}
function getLocation(symbol) {
var node = symbol.valueDeclaration || symbol.declarations[0];
var sourceFile = ts.getSourceFileOfNode(node);
var location = {
start: ts.getLineAndCharacterOfPosition(sourceFile, node.pos),
end: ts.getLineAndCharacterOfPosition(sourceFile, node.end)
};
return location;
}
};
function convertToRegexCollection(items) {
if (!items) return [];
// Must be an array
if (!_.isArray(items)) {
items = [items];
}
// Convert string to exact matching regexes
return items.map(function(item) {
return _.isString(item) ? new RegExp('^' + item + '$') : item;
});
}
function anyMatches(regexes, item) {
for(var i=0; i<regexes.length; ++i) {
if ( item.match(regexes[i]) ) return true;
}
return false;
}

View File

@@ -1,136 +0,0 @@
var mockPackage = require('../mocks/mockPackage');
var Dgeni = require('dgeni');
var path = require('canonical-path');
var _ = require('lodash');
describe('readTypeScriptModules', function() {
var dgeni, injector, processor;
beforeEach(function() {
dgeni = new Dgeni([mockPackage()]);
injector = dgeni.configureInjector();
processor = injector.get('readTypeScriptModules');
processor.basePath = path.resolve(__dirname, '../mocks/readTypeScriptModules');
});
describe('exportDocs', function() {
it('should provide the original module if the export is re-exported', function() {
processor.sourceFiles = [ 'publicModule.ts' ];
var docs = [];
processor.$process(docs);
var exportedDoc = docs[1];
expect(exportedDoc.originalModule).toEqual('privateModule');
});
it('should include exported abstract classes', function() {
processor.sourceFiles = [ 'publicModule.ts' ];
var docs = [];
processor.$process(docs);
var exportedDoc = docs[2];
expect(exportedDoc.name).toEqual('AbstractClass');
});
});
describe('ignoreExportsMatching', function() {
it('should ignore exports that match items in the `ignoreExportsMatching` property', function() {
processor.sourceFiles = [ 'ignoreExportsMatching.ts'];
processor.ignoreExportsMatching = [/^_/];
var docs = [];
processor.$process(docs);
var moduleDoc = docs[0];
expect(moduleDoc.docType).toEqual('module');
expect(moduleDoc.exports).toEqual([
jasmine.objectContaining({ name: 'OKToExport' }),
jasmine.objectContaining({ name: 'thisIsOK' })
]);
});
it('should only ignore `___esModule` exports by default', function() {
processor.sourceFiles = [ 'ignoreExportsMatching.ts'];
var docs = [];
processor.$process(docs);
var moduleDoc = docs[0];
expect(moduleDoc.docType).toEqual('module');
expect(getNames(moduleDoc.exports)).toEqual([
'OKToExport',
'_thisIsPrivate',
'thisIsOK'
]);
});
});
describe('interfaces', function() {
it('should mark optional properties', function() {
processor.sourceFiles = [ 'interfaces.ts'];
var docs = [];
processor.$process(docs);
var moduleDoc = docs[0];
var exportedInterface = moduleDoc.exports[0];
var member = exportedInterface.members[0];
expect(member.name).toEqual('optionalProperty');
expect(member.optional).toEqual(true);
});
it('should handle "call" type interfaces', function() {
processor.sourceFiles = [ 'interfaces.ts'];
var docs = [];
processor.$process(docs);
var moduleDoc = docs[0];
var exportedInterface = moduleDoc.exports[0];
expect(exportedInterface.callMember).toBeDefined();
expect(exportedInterface.callMember.parameters).toEqual(['param: T']);
expect(exportedInterface.callMember.returnType).toEqual('U');
expect(exportedInterface.callMember.typeParameters).toEqual(['T', 'U extends Findable<T>']);
expect(exportedInterface.newMember).toBeDefined();
expect(exportedInterface.newMember.parameters).toEqual(['param: number']);
expect(exportedInterface.newMember.returnType).toEqual('MyInterface');
});
});
describe('ordering of members', function() {
it('should order class members in order of appearance (by default)', function() {
processor.sourceFiles = ['orderingOfMembers.ts'];
var docs = [];
processor.$process(docs);
var classDoc = _.find(docs, { docType: 'class' });
expect(classDoc.docType).toEqual('class');
expect(getNames(classDoc.members)).toEqual([
'firstItem',
'otherMethod',
'doStuff',
]);
});
it('should not order class members if not sortClassMembers is false', function() {
processor.sourceFiles = ['orderingOfMembers.ts'];
processor.sortClassMembers = false;
var docs = [];
processor.$process(docs);
var classDoc = _.find(docs, { docType: 'class' });
expect(classDoc.docType).toEqual('class');
expect(getNames(classDoc.members)).toEqual([
'firstItem',
'otherMethod',
'doStuff'
]);
});
});
});
function getNames(collection) {
return collection.map(function(item) { return item.name; });
}

View File

@@ -1,31 +0,0 @@
var _ = require('lodash');
module.exports = function convertPrivateClassesToInterfaces() {
return function(exportDocs, addInjectableReference) {
_.forEach(exportDocs, function(exportDoc) {
// Search for classes with a constructor marked as `@internal`
if (exportDoc.docType === 'class' && exportDoc.constructorDoc && exportDoc.constructorDoc.internal) {
// Convert this class to an interface with no constructor
exportDoc.docType = 'interface';
exportDoc.constructorDoc = null;
if (exportDoc.heritage) {
// convert the heritage since interfaces use `extends` not `implements`
exportDoc.heritage = exportDoc.heritage.replace('implements', 'extends');
}
if (addInjectableReference) {
// Add the `declare var SomeClass extends InjectableReference` construct
exportDocs.push({
docType: 'var',
name: exportDoc.name,
id: exportDoc.id,
returnType: 'InjectableReference'
});
}
}
});
};
};

View File

@@ -1,76 +0,0 @@
var mockPackage = require('../mocks/mockPackage');
var Dgeni = require('dgeni');
var _ = require('lodash');
describe('readTypeScriptModules', function() {
var dgeni, injector, convertPrivateClassesToInterfaces;
beforeEach(function() {
dgeni = new Dgeni([mockPackage()]);
injector = dgeni.configureInjector();
convertPrivateClassesToInterfaces = injector.get('convertPrivateClassesToInterfaces');
});
it('should convert private class docs to interface docs', function() {
var docs = [
{
docType: 'class',
name: 'privateClass',
id: 'privateClass',
constructorDoc: { internal: true }
}
];
convertPrivateClassesToInterfaces(docs, false);
expect(docs[0].docType).toEqual('interface');
});
it('should not touch non-private class docs', function() {
var docs = [
{
docType: 'class',
name: 'privateClass',
id: 'privateClass',
constructorDoc: { }
}
];
convertPrivateClassesToInterfaces(docs, false);
expect(docs[0].docType).toEqual('class');
});
it('should convert the heritage since interfaces use `extends` not `implements`', function() {
var docs = [
{
docType: 'class',
name: 'privateClass',
id: 'privateClass',
constructorDoc: { internal: true },
heritage: 'implements parentInterface'
}
];
convertPrivateClassesToInterfaces(docs, false);
expect(docs[0].heritage).toEqual('extends parentInterface');
});
it('should add new injectable reference types, if specified, to the passed in collection', function() {
var docs = [
{
docType: 'class',
name: 'privateClass',
id: 'privateClass',
constructorDoc: { internal: true },
heritage: 'implements parentInterface'
}
];
convertPrivateClassesToInterfaces(docs, true);
expect(docs[1]).toEqual({
docType : 'var',
name : 'privateClass',
id : 'privateClass',
returnType : 'InjectableReference'
});
});
});

View File

@@ -1,3 +0,0 @@
module.exports = function modules() {
return {};
};

View File

@@ -1,80 +0,0 @@
var ts = require('typescript');
var fs = require('fs');
var path = require('canonical-path');
// We need to provide our own version of CompilerHost because we want to set the
// base directory and specify what extensions to consider when trying to load a source
// file
module.exports = function createCompilerHost(log) {
return function createCompilerHost(options, baseDir, extensions) {
return {
getSourceFile: function(fileName, languageVersion, onError) {
var text, resolvedPath, resolvedPathWithExt;
// Strip off the extension and resolve relative to the baseDir
baseFilePath = fileName.replace(/\.[^.]+$/, '');
resolvedPath = path.resolve(baseDir, baseFilePath);
// Iterate through each possible extension and return the first source file that is actually found
for(var i=0; i<extensions.length; i++) {
// Try reading the content from files using each of the given extensions
try {
resolvedPathWithExt = resolvedPath + extensions[i];
log.silly('getSourceFile:', resolvedPathWithExt);
text = fs.readFileSync(resolvedPathWithExt, { encoding: options.charset });
log.debug('found source file:', fileName, resolvedPathWithExt);
return ts.createSourceFile(baseFilePath + extensions[i], text, languageVersion);
}
catch(e) {
// Try again if the file simply did not exist, otherwise report the error as a warning
if(e.code !== 'ENOENT') {
if (onError) onError(e.message);
log.warn('Error reading ' + resolvedPathWithExt + ' : ' + e.message);
}
}
}
},
getDefaultLibFileName: function(options) {
return path.resolve(path.dirname(ts.sys.getExecutingFilePath()), ts.getDefaultLibFileName(options));
},
writeFile: function(fileName, data, writeByteOrderMark, onError) {
// no-op
},
getCurrentDirectory: function() {
return baseDir;
},
useCaseSensitiveFileNames: function() {
return ts.sys.useCaseSensitiveFileNames;
},
getCanonicalFileName: function(fileName) {
// if underlying system can distinguish between two files whose names differs only in cases then file name already in canonical form.
// otherwise use toLowerCase as a canonical form.
return ts.sys.useCaseSensitiveFileNames ? fileName : fileName.toLowerCase();
},
getNewLine: function() {
return ts.sys.newLine;
},
fileExists: function(fileName) {
var text, resolvedPath, resolvedPathWithExt;
// Strip off the extension and resolve relative to the baseDir
baseFilePath = fileName.replace(/\.[^.]+$/, '');
resolvedPath = path.resolve(baseDir, baseFilePath);
// Iterate through each possible extension and return the first source file that is actually found
for(var i=0; i<extensions.length; i++) {
// Try reading the content from files using each of the given extensions
resolvedPathWithExt = resolvedPath + extensions[i];
if (fs.existsSync(resolvedPathWithExt)) return true;
}
return false;
},
readFile: function(fileName) {
console.log('readFile - NOT IMPLEMENTED', fileName);
}
};
};
};

View File

@@ -1,80 +0,0 @@
var mockPackage = require('../../mocks/mockPackage');
var Dgeni = require('dgeni');
var path = require('canonical-path');
var ts = require('typescript');
describe('createCompilerHost', function() {
var dgeni, injector, options, host, baseDir, extensions;
beforeEach(function() {
dgeni = new Dgeni([mockPackage()]);
injector = dgeni.configureInjector();
var createCompilerHost = injector.get('createCompilerHost');
options = { charset: 'utf8' };
baseDir = path.resolve(__dirname, '../../mocks/tsParser');
extensions = ['.ts', '.js'];
host = createCompilerHost(options, baseDir, extensions);
});
describe('getSourceFile', function() {
it('should return a SourceFile object for a given path, with fileName relative to baseDir', function() {
var sourceFile = host.getSourceFile('testSrc.ts');
expect(sourceFile.fileName).toEqual('testSrc.ts');
expect(sourceFile.pos).toEqual(0);
expect(sourceFile.text).toEqual(jasmine.any(String));
});
it('should try each of the configured extensions and update the filename to the correct extension', function() {
var sourceFile = host.getSourceFile('testSrc.js');
expect(sourceFile.fileName).toEqual('testSrc.ts');
sourceFile = host.getSourceFile('../mockPackage.ts');
expect(sourceFile.fileName).toEqual('../mockPackage.js');
});
});
describe('getDefaultLibFileName', function() {
it('should return a path to the default library', function() {
expect(host.getDefaultLibFileName(options)).toContain('typescript/lib/lib.d.ts');
});
});
describe('writeFile', function() {
it('should do nothing', function() {
host.writeFile();
});
});
describe('getCurrentDirectory', function() {
it('should return the baseDir', function() {
expect(host.getCurrentDirectory()).toEqual(baseDir);
});
});
describe('useCaseSensitiveFileNames', function() {
it('should return true if the OS is case sensitive', function() {
expect(host.useCaseSensitiveFileNames()).toBe(ts.sys.useCaseSensitiveFileNames);
});
});
describe('getCanonicalFileName', function() {
it('should lower case the filename', function() {
var expectedFilePath = host.useCaseSensitiveFileNames() ? 'SomeFile.ts' : 'somefile.ts';
expect(host.getCanonicalFileName('SomeFile.ts')).toEqual(expectedFilePath);
});
});
describe('getNewLine', function() {
it('should return the newline character for the OS', function() {
expect(host.getNewLine()).toEqual(require('os').EOL);
});
});
});

View File

@@ -1,49 +0,0 @@
var ts = require('typescript');
var LEADING_STAR = /^[^\S\r\n]*\*[^\S\n\r]?/gm;
module.exports = function getContent() {
return function(symbol) {
var content = "";
if (!symbol.declarations) return content;
symbol.declarations.forEach(function(declaration) {
// If this is left side of dotted module declaration, there is no doc comment associated with this declaration
if (declaration.kind === ts.SyntaxKind.ModuleDeclaration && declaration.body.kind === ts.SyntaxKind.ModuleDeclaration) {
return content;
}
// If this is dotted module name, get the doc comments from the parent
while (declaration.kind === ts.SyntaxKind.ModuleDeclaration && declaration.parent.kind === ts.SyntaxKind.ModuleDeclaration) {
declaration = declaration.parent;
}
// If this is a variable declaration then we get the doc comments from the grand parent
if (declaration.kind === ts.SyntaxKind.VariableDeclaration) {
declaration = declaration.parent.parent;
}
// Get the source file of this declaration
var sourceFile = ts.getSourceFileOfNode(declaration);
var commentRanges = ts.getJsDocComments(declaration, sourceFile);
if (commentRanges) {
commentRanges.forEach(function(commentRange) {
content += sourceFile.text
.substring(commentRange.pos+ '/**'.length, commentRange.end - '*/'.length)
.replace(LEADING_STAR, '')
.trim();
if (commentRange.hasTrailingNewLine) {
content += '\n';
}
});
}
content += '\n';
});
return content;
};
};

View File

@@ -1,34 +0,0 @@
module.exports = function getDirectiveInfo() {
return function (symbol) {
var directiveInfo;
if (symbol.valueDeclaration) {
var decorators = symbol.valueDeclaration.decorators;
decorators && decorators.forEach(function(decorator){
try {
var expr = decorator.expression;
var type = expr.expression.text.match(/Component|Directive/);
if (type) {
// type is either Component or Directive
// properties are selector, inputs and outputs
directiveInfo = { type: type[0], properties: [] };
//Directive only takes one argument
expr.arguments[0].properties.forEach(function(prop){
var name = prop.name.text;
if (name === "selector") {
directiveInfo.properties.push({name: name, values: prop.initializer.text.split(",")});
}
if (name === "inputs" || name === "outputs") {
var values = prop.initializer.elements.map(function(e){ return e.text });
directiveInfo.properties.push({name: name, values: values });
}
});
}
} catch(e){}
});
}
return directiveInfo;
};
};

View File

@@ -1,54 +0,0 @@
var ts = require('typescript');
module.exports = function getExportDocType(log) {
return function(symbol) {
if(symbol.flags & ts.SymbolFlags.Function) {
return 'function';
}
if(symbol.flags & ts.SymbolFlags.Class) {
return 'class';
}
if(symbol.flags & ts.SymbolFlags.Interface) {
return 'interface';
}
if(symbol.flags & ts.SymbolFlags.ConstEnum) {
return 'enum';
}
if(symbol.flags & ts.SymbolFlags.RegularEnum) {
return 'enum';
}
if(symbol.flags & ts.SymbolFlags.Property) {
return 'module-property';
}
if(symbol.flags & ts.SymbolFlags.TypeAlias) {
return 'type-alias';
}
if(symbol.flags & ts.SymbolFlags.FunctionScopedVariable) {
return 'var';
}
if(symbol.flags & ts.SymbolFlags.BlockScopedVariable) {
return getBlockScopedVariableDocType(symbol);
}
log.warn('getExportDocType(): Unknown symbol type', {
symbolName: symbol.name,
symbolType: symbol.flags,
symbolTarget: symbol.target,
file: ts.getSourceFileOfNode(symbol.declarations[0]).fileName
});
return 'unknown';
};
function getBlockScopedVariableDocType(symbol) {
var node = symbol.valueDeclaration;
while(node) {
if ( node.flags & 0x2000 /* const */) {
return 'const';
}
node = node.parent;
}
return 'let';
}
};

View File

@@ -1,20 +0,0 @@
var path = require('canonical-path');
var ts = require('typescript');
module.exports = function getFileInfo(log) {
return function (symbol, basePath) {
var fileName = ts.getSourceFileOfNode(symbol.declarations[0]).fileName;
var file = path.resolve(basePath, fileName);
var fileInfo = {
filePath: file,
baseName: path.basename(file, path.extname(file)),
extension: path.extname(file).replace(/^\./, ''),
basePath: basePath,
relativePath: fileName,
projectRelativePath: fileName
};
return fileInfo;
};
};

View File

@@ -1,74 +0,0 @@
var ts = require('typescript');
var path = require('canonical-path');
module.exports = function tsParser(createCompilerHost, log) {
return {
// These are the extension that we should consider when trying to load a module
// During migration from Traceur, there is a mix of `.ts`, `.es6` and `.js` (atScript)
// files in the project and the TypeScript compiler only looks for `.ts` files when trying
// to load imports.
extensions: ['.ts', '.js'],
// The options for the TS compiler
options: {
allowNonTsExtensions: true,
charset: 'utf8'
},
parse: function(fileNames, baseDir) {
// "Compile" a program from the given module filenames, to get hold of a
// typeChecker that can be used to interrogate the modules, exports and so on.
var host = createCompilerHost(this.options, baseDir, this.extensions);
var program = ts.createProgram(fileNames, this.options, host);
var typeChecker = program.getTypeChecker();
// Create an array of module symbols for each file we were given
var moduleSymbols = [];
fileNames.forEach(function(fileName) {
var sourceFile = program.getSourceFile(fileName);
if (!sourceFile) {
throw new Error('Invalid source file: ' + fileName);
} else if (!sourceFile.symbol) {
// Some files contain only a comment and no actual module code
log.warn('No module code found in ' + fileName);
} else {
moduleSymbols.push(sourceFile.symbol);
}
});
moduleSymbols.forEach(function(tsModule) {
// The type checker has a nice helper function that returns an array of Symbols
// representing the exports for a given module
tsModule.exportArray = typeChecker.getExportsOfModule(tsModule);
// Although 'star' imports (e.g. `export * from 'some/module';) get resolved automatically
// by the compiler/binder, it seems that explicit imports (e.g. `export {SomeClass} from 'some/module'`)
// do not so we have to do a little work.
tsModule.exportArray.forEach(function(moduleExport) {
if (moduleExport.flags & ts.SymbolFlags.Alias) {
// To maintain the alias information (particularly the alias name)
// we just attach the original "resolved" symbol to the alias symbol
moduleExport.resolvedSymbol = typeChecker.getAliasedSymbol(moduleExport);
}
});
});
moduleSymbols.typeChecker = typeChecker;
return {
moduleSymbols: moduleSymbols,
typeChecker: typeChecker,
program: program,
host: host
};
}
};
};

View File

@@ -1,21 +0,0 @@
var mockPackage = require('../../mocks/mockPackage');
var Dgeni = require('dgeni');
var path = require('canonical-path');
describe('tsParser', function() {
var dgeni, injector, parser;
beforeEach(function() {
dgeni = new Dgeni([mockPackage()]);
injector = dgeni.configureInjector();
parser = injector.get('tsParser');
});
it("should parse a TS file", function() {
var parseInfo = parser.parse(['testSrc.ts'], path.resolve(__dirname, '../../mocks/tsParser'));
var tsModules = parseInfo.moduleSymbols;
expect(tsModules.length).toEqual(1);
expect(tsModules[0].exportArray.length).toEqual(3);
expect(tsModules[0].exportArray.map(function(i) { return i.name; })).toEqual(['MyClass', 'myFn', 'x']);
});
});

View File

@@ -1,7 +1,7 @@
#!/bin/bash
echo "##### "
echo "##### ci/deploy.sh"
echo "##### ci/update_docs.sh"
echo "#####"

38
scripts/docs/update_readmes.sh Executable file
View File

@@ -0,0 +1,38 @@
#!/bin/bash
echo "##### "
echo "##### ci/update_docs.sh"
echo "#####"
function init {
cd ../..
}
function run {
# process new docs
./node_modules/.bin/gulp readmes
# if no changes, don't commit
CHANGED=$(git diff-index --name-only HEAD --)
if [ -z "$CHANGED" ];
then
echo "-- No changes detected for the following commit, docs not updated."
echo "https://github.com/driftyco/$CIRCLE_PROJECT_REPONAME/commit/$CIRCLE_SHA1"
else
git config --global user.email "hi@ionicframework.com"
git config --global user.name "Ionitron"
git add -A
git commit -am "Automated build of native readmes for driftyco/$CIRCLE_PROJECT_REPONAME@$CIRCLE_SHA1"
# in case a different commit was pushed to ionic-site during doc/demo gen,
# try to rebase around it before pushing
git fetch
git rebase
# git push origin master || :
echo "-- Updated docs for $VERSION_NAME succesfully!"
fi
}
source $(dirname $0)/../utils.inc.sh

View File

@@ -1,6 +1,8 @@
import { Plugin } from './plugin';
import { Plugin } from '@ionic-native/core';
import { Injectable } from '@angular/core';
/**
* @name PluginName
* @name Plugin Name
* @description
*
* @usage
@@ -16,5 +18,7 @@ import { Plugin } from './plugin';
pluginRef: '',
repo: ''
})
@Injectable()
export class PluginName {
}

View File

@@ -6,15 +6,16 @@
* - Document usage (importing, executing main functionality)
* - Remove any imports that you are not using
* - Add this file to /src/index.ts (follow style of other plugins)
* - Remove all the comments included in this template, EXCEPT the @Plugin wrapper docs.
* - Remove all the comments included in this template, EXCEPT the @Plugin wrapper docs and any other docs you added
* - Remove this note
*
*/
import { Plugin, Cordova, CordovaProperty, CordovaInstance, InstanceProperty } from './plugin';
import { Plugin, Cordova, CordovaProperty, CordovaInstance, InstanceProperty } from '@ionic-native/core';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
/**
* @name PluginName
* @name Plugin Name
* @description
* This plugin does something
*
@@ -35,6 +36,7 @@ import { Observable } from 'rxjs/Observable';
repo: '', // the github repository URL for the plugin
install: '' // OPTIONAL install command, in case the plugin requires variables
})
@Injectable()
export class PluginName {
/**
@@ -44,7 +46,7 @@ export class PluginName {
* @return {Promise<any>} Returns a promise that resolves when something happens
*/
@Cordova()
static functionName(arg1: string, arg2: number): Promise<any> {
functionName(arg1: string, arg2: number): Promise<any> {
return; // We add return; here to avoid any IDE / Compiler errors
}

View File

@@ -0,0 +1,23 @@
declare var window;
export function checkReady() {
const DEVICE_READY_TIMEOUT = 5000;
// To help developers using cordova, we listen for the device ready event and
// log an error if it didn't fire in a reasonable amount of time. Generally,
// when this happens, developers should remove and reinstall plugins, since
// an inconsistent plugin is often the culprit.
const before = Date.now();
let didFireReady = false;
document.addEventListener('deviceready', () => {
console.log(`Ionic Native: deviceready event fired after ${(Date.now() - before)} ms`);
didFireReady = true;
});
setTimeout(() => {
if (!didFireReady && window.cordova) {
console.warn(`Ionic Native: deviceready did not fire within ${DEVICE_READY_TIMEOUT}ms. This can happen when plugins are in an inconsistent state. Try removing plugins from plugins/ and reinstalling them.`);
}
}, DEVICE_READY_TIMEOUT);
}

View File

@@ -0,0 +1,344 @@
import { instanceAvailability, checkAvailability, wrap, wrapInstance, overrideFunction } from './plugin';
import { getPlugin, getPromise } from './util';
import { Observable } from 'rxjs/Observable';
export interface PluginConfig {
/**
* Plugin name, this should match the class name
*/
pluginName: string;
/**
* Plugin NPM package name
*/
plugin: string;
/**
* Plugin object reference
*/
pluginRef?: string;
/**
* Github repository URL
*/
repo?: string;
/**
* Custom install command
*/
install?: string;
/**
* Available installation variables
*/
installVariables?: string[];
/**
* Supported platforms
*/
platforms?: string[];
}
export interface CordovaOptions {
/**
* Set to true if the wrapped method is a sync function
*/
sync?: boolean;
/**
* Callback order. Set to reverse if the success/error callbacks are the first 2 arguments that the wrapped method takes.
*/
callbackOrder?: 'reverse';
/**
* Callback style
*/
callbackStyle?: 'node' | 'object';
/**
* Set a custom index for the success callback function. This doesn't work if callbackOrder or callbackStyle are set.
*/
successIndex?: number;
/**
* Set a custom index for the error callback function. This doesn't work if callbackOrder or callbackStyle are set.
*/
errorIndex?: number;
/**
* Success function property name. This must be set if callbackStyle is set to object.
*/
successName?: string;
/**
* Error function property name. This must be set if callbackStyle is set to object.
*/
errorName?: string;
/**
* Set to true to return an observable
*/
observable?: boolean;
/**
* If observable is set to true, this can be set to a different function name that will cancel the observable.
*/
clearFunction?: string;
/**
* This can be used if clearFunction is set. Set this to true to call the clearFunction with the same arguments used in the initial function.
*/
clearWithArgs?: boolean;
/**
* Creates an observable that wraps a global event. Replaces document.addEventListener
*/
eventObservable?: boolean;
/**
* Event name, this must be set if eventObservable is set to true
*/
event?: string;
/**
* Element to attach the event listener to, this is optional, defaults to `window`
*/
element?: any;
/**
* Set to true if the wrapped method returns a promise
*/
otherPromise?: boolean;
/**
* Supported platforms
*/
platforms?: string[];
}
export interface CordovaCheckOptions {
sync?: boolean;
observable?: boolean;
}
export interface CordovaFiniteObservableOptions extends CordovaOptions {
/**
* Function that gets a result returned from plugin's success callback, and decides whether it is last value and observable should complete.
*/
resultFinalPredicate?: (result: any) => boolean;
/**
* Function that gets called after resultFinalPredicate, and removes service data that indicates end of stream from the result.
*/
resultTransform?: (result: any) => any;
}
/**
* @private
*/
export function InstanceCheck(opts: CordovaCheckOptions = {}) {
return (pluginObj: Object, methodName: string, descriptor: TypedPropertyDescriptor<any>): TypedPropertyDescriptor<any> => {
return {
value: function(...args: any[]): any {
if (instanceAvailability(this)) {
return descriptor.value.apply(this, args);
} else {
if (opts.sync) {
return;
} else if (opts.observable) {
return new Observable<any>(() => {});
}
return getPromise(() => {});
}
}
};
};
}
/**
* Executes function only if plugin is available
* @private
*/
export function CordovaCheck(opts: CordovaCheckOptions = {}) {
return (pluginObj: Object, methodName: string, descriptor: TypedPropertyDescriptor<any>): TypedPropertyDescriptor<any> => {
return {
value: function(...args: any[]): any {
if (checkAvailability(pluginObj) === true) {
return descriptor.value.apply(this, args);
} else {
if (opts.sync) {
return;
} else if (opts.observable) {
return new Observable<any>(() => {});
}
return getPromise(() => {});
}
}
};
};
}
/**
* @private
*
* Class decorator specifying Plugin metadata. Required for all plugins.
*
* @usage
* ```typescript
* @Plugin({
* pluginName: 'MyPlugin',
* plugin: 'cordova-plugin-myplugin',
* pluginRef: 'window.myplugin'
* })
* export class MyPlugin {
*
* // Plugin wrappers, properties, and functions go here ...
*
* }
* ```
*/
export function Plugin(config: PluginConfig) {
return function(cls) {
// Add these fields to the class
for (let k in config) {
cls[k] = config[k];
}
cls['installed'] = function(printWarning?: boolean) {
return !!getPlugin(config.pluginRef);
};
cls['getPlugin'] = function() {
return getPlugin(config.pluginRef);
};
cls['checkInstall'] = function() {
return checkAvailability(cls) === true;
};
cls['getPluginName'] = function() {
return config.pluginName;
};
cls['getPluginRef'] = function() {
return config.pluginRef;
};
cls['getPluginInstallName'] = function() {
return config.plugin;
};
cls['getPluginRepo'] = function() {
return config.repo;
};
cls['getSupportedPlatforms'] = function() {
return config.platforms;
};
return cls;
};
}
/**
* @private
*
* Wrap a stub function in a call to a Cordova plugin, checking if both Cordova
* and the required plugin are installed.
*/
export function Cordova(opts: CordovaOptions = {}) {
return (target: Object, methodName: string, descriptor: TypedPropertyDescriptor<any>) => {
return {
value: function(...args: any[]) {
return wrap(this, methodName, opts).apply(this, args);
}
};
};
}
/**
* @private
*
* Wrap an instance method
*/
export function CordovaInstance(opts: any = {}) {
return (target: Object, methodName: string) => {
return {
value: function(...args: any[]) {
return wrapInstance(this, methodName, opts).apply(this, args);
}
};
};
}
/**
* @private
*
*
* Before calling the original method, ensure Cordova and the plugin are installed.
*/
export function CordovaProperty(target: any, key: string) {
Object.defineProperty(target, key, {
get: () => {
if (checkAvailability(target, key) === true) {
return getPlugin(target.constructor.getPluginRef())[key];
} else {
return null;
}
},
set: (value) => {
if (checkAvailability(target, key) === true) {
getPlugin(target.constructor.getPluginRef())[key] = value;
}
}
});
}
/**
* @private
* @param target
* @param key
* @constructor
*/
export function InstanceProperty(target: any, key: string) {
Object.defineProperty(target, key, {
get: function(){
return this._objectInstance[key];
},
set: function(value){
this._objectInstance[key] = value;
}
});
}
/**
* @private
*
* Wrap a stub function in a call to a Cordova plugin, checking if both Cordova
* and the required plugin are installed.
*/
export function CordovaFunctionOverride(opts: any = {}) {
return (target: Object, methodName: string, descriptor: TypedPropertyDescriptor<any>) => {
return {
value: function(...args: any[]) {
return overrideFunction(this, methodName, opts);
}
};
};
}
/**
* @private
*
* Wraps method that returns an observable that can be completed. Provided opts.resultFinalPredicate dictates when the observable completes.
*
*/
export function CordovaFiniteObservable(opts: CordovaFiniteObservableOptions = {}) {
if (opts.observable === false) {
throw new Error('CordovaFiniteObservable decorator can only be used on methods that returns observable. Please provide correct option.');
}
opts.observable = true;
return (target: Object, methodName: string, descriptor: TypedPropertyDescriptor<any>) => {
return {
value: function(...args: any[]) {
let wrappedObservable: Observable<any> = wrap(this, methodName, opts).apply(this, args);
return new Observable<any>((observer) => {
let wrappedSubscription = wrappedObservable.subscribe({
next: (x) => {
observer.next(opts.resultTransform ? opts.resultTransform(x) : x);
if (opts.resultFinalPredicate && opts.resultFinalPredicate(x)) {
observer.complete();
}
},
error: (err) => { observer.error(err); },
complete: () => { observer.complete(); }
});
return () => {
wrappedSubscription.unsubscribe();
};
});
}
};
};
}

View File

@@ -0,0 +1,3 @@
export * from './plugin';
export * from './decorators';
export * from './util';

View File

@@ -0,0 +1,309 @@
import { get, getPlugin, getPromise, cordovaWarn, pluginWarn } from './util';
import { checkReady } from './bootstrap';
import { CordovaOptions } from './decorators';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/fromEvent';
checkReady();
declare var window;
declare var Promise;
/**
* Checks if plugin/cordova is available
* @return {boolean | { error: string } }
* @private
*/
export function checkAvailability(pluginRef: string, methodName?: string, pluginName?: string);
export function checkAvailability(pluginObj: any, methodName?: string, pluginName?: string);
export function checkAvailability(plugin: any, methodName?: string, pluginName?: string): boolean | { error: string } {
let pluginRef, pluginInstance, pluginPackage;
if (typeof plugin === 'string') {
pluginRef = plugin;
} else {
pluginRef = plugin.constructor.getPluginRef();
pluginName = plugin.constructor.getPluginName();
pluginPackage = plugin.constructor.getPluginInstallName();
}
pluginInstance = getPlugin(pluginRef);
if (!pluginInstance || (!!methodName && pluginInstance[methodName] === 'undefined')) {
if (!window.cordova) {
cordovaWarn(pluginName, methodName);
return {
error: 'cordova_not_available'
};
}
pluginWarn(pluginName, pluginPackage, methodName);
return {
error: 'plugin_not_installed'
};
}
return true;
}
/**
* Checks if _objectInstance exists and has the method/property
* @private
*/
export function instanceAvailability(pluginObj: any, methodName?: string): boolean {
return pluginObj._objectInstance && (!methodName || pluginObj._objectInstance[methodName] !== 'undefined');
}
function setIndex(args: any[], opts: any = {}, resolve?: Function, reject?: Function): any {
// ignore resolve and reject in case sync
if (opts.sync) {
return args;
}
// If the plugin method expects myMethod(success, err, options)
if (opts.callbackOrder === 'reverse') {
// Get those arguments in the order [resolve, reject, ...restOfArgs]
args.unshift(reject);
args.unshift(resolve);
} else if (opts.callbackStyle === 'node') {
args.push((err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
});
} else if (opts.callbackStyle === 'object' && opts.successName && opts.errorName) {
let obj: any = {};
obj[opts.successName] = resolve;
obj[opts.errorName] = reject;
args.push(obj);
} else if (typeof opts.successIndex !== 'undefined' || typeof opts.errorIndex !== 'undefined') {
const setSuccessIndex = () => {
// If we've specified a success/error index
if (opts.successIndex > args.length) {
args[opts.successIndex] = resolve;
} else {
args.splice(opts.successIndex, 0, resolve);
}
};
const setErrorIndex = () => {
// We don't want that the reject cb gets spliced into the position of an optional argument that has not been defined and thus causing non expected behaviour.
if (opts.errorIndex > args.length) {
args[opts.errorIndex] = reject; // insert the reject fn at the correct specific index
} else {
args.splice(opts.errorIndex, 0, reject); // otherwise just splice it into the array
}
};
if (opts.successIndex > opts.errorIndex) {
setErrorIndex();
setSuccessIndex();
} else {
setSuccessIndex();
setErrorIndex();
}
} else {
// Otherwise, let's tack them on to the end of the argument list
// which is 90% of cases
args.push(resolve);
args.push(reject);
}
return args;
}
function callCordovaPlugin(pluginObj: any, methodName: string, args: any[], opts: any = {}, resolve?: Function, reject?: Function) {
// Try to figure out where the success/error callbacks need to be bound
// to our promise resolve/reject handlers.
args = setIndex(args, opts, resolve, reject);
const availabilityCheck = checkAvailability(pluginObj, methodName);
if (availabilityCheck === true) {
const pluginInstance = getPlugin(pluginObj.constructor.getPluginRef());
return pluginInstance[methodName].apply(pluginInstance, args);
} else {
return availabilityCheck;
}
}
function wrapPromise(pluginObj: any, methodName: string, args: any[], opts: any = {}) {
let pluginResult, rej;
const p = getPromise((resolve, reject) => {
pluginResult = callCordovaPlugin(pluginObj, methodName, args, opts, resolve, reject);
rej = reject;
});
// Angular throws an error on unhandled rejection, but in this case we have already printed
// a warning that Cordova is undefined or the plugin is uninstalled, so there is no reason
// to error
if (pluginResult && pluginResult.error) {
p.catch(() => { });
rej(pluginResult.error);
}
return p;
}
function wrapOtherPromise(pluginObj: any, methodName: string, args: any[], opts: any= {}) {
return getPromise((resolve, reject) => {
let pluginResult = callCordovaPlugin(pluginObj, methodName, args, opts);
if (pluginResult && pluginResult.error) {
reject(pluginResult.error);
}
pluginResult.then(resolve).catch(reject);
});
}
function wrapObservable(pluginObj: any, methodName: string, args: any[], opts: any = {}) {
return new Observable(observer => {
let pluginResult = callCordovaPlugin(pluginObj, methodName, args, opts, observer.next.bind(observer), observer.error.bind(observer));
if (pluginResult && pluginResult.error) {
observer.error(pluginResult.error);
observer.complete();
}
return () => {
try {
if (opts.clearFunction) {
if (opts.clearWithArgs) {
return callCordovaPlugin(pluginObj, opts.clearFunction, args, opts, observer.next.bind(observer), observer.error.bind(observer));
}
return get(window, pluginObj.constructor.getPluginRef())[opts.clearFunction].call(pluginObj, pluginResult);
}
} catch (e) {
console.warn('Unable to clear the previous observable watch for', pluginObj.constructor.getPluginName(), methodName);
console.error(e);
}
};
});
}
function callInstance(pluginObj: any, methodName: string, args: any[], opts: any = {}, resolve?: Function, reject?: Function) {
args = setIndex(args, opts, resolve, reject);
if (instanceAvailability(pluginObj, methodName)) {
return pluginObj._objectInstance[methodName].apply(pluginObj._objectInstance, args);
}
}
/**
* Wrap the event with an observable
* @private
* @param event even name
* @param element The element to attach the event listener to
* @returns {Observable}
*/
export function wrapEventObservable(event: string, element: any = window): Observable<any> {
return Observable.fromEvent(element, event);
}
/**
* Certain plugins expect the user to override methods in the plugin. For example,
* window.cordova.plugins.backgroundMode.onactivate = function() { ... }.
*
* Unfortunately, this is brittle and would be better wrapped as an Observable. overrideFunction
* does just this.
* @private
*/
export function overrideFunction(pluginObj: any, methodName: string, args: any[], opts: any = {}): Observable<any> {
return new Observable(observer => {
const availabilityCheck = checkAvailability(pluginObj, methodName);
if (availabilityCheck === true) {
const pluginInstance = getPlugin(pluginObj.constructor.getPluginRef());
pluginInstance[methodName] = observer.next.bind(observer);
return () => pluginInstance[methodName] = () => {};
} else {
observer.error(availabilityCheck);
observer.complete();
}
});
}
/**
* @private
*/
export const wrap = function(pluginObj: any, methodName: string, opts: CordovaOptions = {}) {
return (...args) => {
if (opts.sync) {
// Sync doesn't wrap the plugin with a promise or observable, it returns the result as-is
return callCordovaPlugin(pluginObj, methodName, args, opts);
} else if (opts.observable) {
return wrapObservable(pluginObj, methodName, args, opts);
} else if (opts.eventObservable && opts.event) {
return wrapEventObservable(opts.event, opts.element);
} else if (opts.otherPromise) {
return wrapOtherPromise(pluginObj, methodName, args, opts);
} else {
return wrapPromise(pluginObj, methodName, args, opts);
}
};
};
/**
* @private
*/
export function wrapInstance(pluginObj: any, methodName: string, opts: any = {}) {
return (...args) => {
if (opts.sync) {
return callInstance(pluginObj, methodName, args, opts);
} else if (opts.observable) {
return new Observable(observer => {
let pluginResult = callInstance(pluginObj, methodName, args, opts, observer.next.bind(observer), observer.error.bind(observer));
if (pluginResult && pluginResult.error) {
observer.error(pluginResult.error);
observer.complete();
}
return () => {
try {
if (opts.clearWithArgs) {
return pluginObj._objectInstance[opts.clearFunction].apply(pluginObj._objectInstance, args);
}
return pluginObj._objectInstance[opts.clearFunction].call(pluginObj, pluginResult);
} catch (e) {
console.warn('Unable to clear the previous observable watch for', pluginObj.constructor.getPluginName(), methodName);
console.error(e);
}
};
});
} else if (opts.otherPromise) {
return getPromise((resolve, reject) => {
let result = callInstance(pluginObj, methodName, args, opts, resolve, reject);
if (result && !result.error) {
result.then(resolve, reject);
}
});
} else {
let pluginResult, rej;
const p = getPromise((resolve, reject) => {
pluginResult = callInstance(pluginObj, methodName, args, opts, resolve, reject);
rej = reject;
});
if (pluginResult && pluginResult.error) {
p.catch(() => { });
rej(pluginResult.error);
}
return p;
}
};
}

View File

@@ -0,0 +1,68 @@
declare var window: any;
/**
* @private
*/
export function get(obj, path) {
path = path.split('.');
for (let i = 0; i < path.length; i++) {
if (!obj) { return null; }
obj = obj[path[i]];
}
return obj;
}
/**
* @private
*/
export function getPromise(cb) {
const tryNativePromise = () => {
if (window.Promise) {
return new Promise((resolve, reject) => {
cb(resolve, reject);
});
} else {
console.error('No Promise support or polyfill found. To enable Ionic Native support, please add the es6-promise polyfill before this script, or run with a library like Angular 2 or on a recent browser.');
}
};
return tryNativePromise();
}
/**
* @private
* @param pluginRef
* @returns {null|*}
*/
export function getPlugin(pluginRef: string): any {
return get(window, pluginRef);
};
/**
* @private
*/
export const pluginWarn = function(pluginName: string, plugin?: string, method?: string) {
if (method) {
console.warn('Native: tried calling ' + pluginName + '.' + method + ', but the ' + pluginName + ' plugin is not installed.');
} else {
console.warn('Native: tried accessing the ' + pluginName + ' plugin but it\'s not installed.');
}
if (plugin) {
console.warn('Install the ' + pluginName + ' plugin: \'ionic plugin add ' + plugin + '\'');
}
};
/**
* @private
* @param pluginName
* @param method
*/
export const cordovaWarn = function(pluginName: string, method?: string) {
if (method) {
console.warn('Native: tried calling ' + pluginName + '.' + method + ', but Cordova is not available. Make sure to include cordova.js or run in a device/simulator');
} else {
console.warn('Native: tried accessing the ' + pluginName + ' plugin but Cordova is not available. Make sure to include cordova.js or run in a device/simulator');
}
};

View File

@@ -1,4 +1,5 @@
import { Cordova, Plugin } from './plugin';
import { Injectable } from '@angular/core';
import { Cordova, Plugin, CordovaProperty } from '@ionic-native/core';
export interface ActionSheetOptions {
@@ -53,15 +54,24 @@ export interface ActionSheetOptions {
*
* @usage
* ```typescript
* import { ActionSheet } from 'ionic-native';
* import { ActionSheet, ActionSheetOptions } from '@ionic-native/action-sheet';
*
* constructor(private actionSheet: ActionSheet) { }
*
* ...
*
*
* let buttonLabels = ['Share via Facebook', 'Share via Twitter'];
* ActionSheet.show({
* 'title': 'What do you want with this image?',
* 'buttonLabels': buttonLabels,
* 'addCancelButtonWithLabel': 'Cancel',
* 'addDestructiveButtonWithLabel' : 'Delete'
* }).then((buttonIndex: number) => {
*
* const options: ActionSheetOptions = {
* title: 'What do you want with this image?',
* buttonLabels: buttonLabels,
* addCancelButtonWithLabel: 'Cancel',
* addDestructiveButtonWithLabel: 'Delete',
* androidTheme: this.actionSheet.ANDROID_THEMES.THEME_HOLO_DARK
* };
*
* this.actionSheet.show(options).then((buttonIndex: number) => {
* console.log('Button pressed: ' + buttonIndex);
* });
* ```
@@ -75,8 +85,18 @@ export interface ActionSheetOptions {
repo: 'https://github.com/EddyVerbruggen/cordova-plugin-actionsheet',
platforms: ['Android', 'iOS', 'Windows Phone 8']
})
@Injectable()
export class ActionSheet {
@CordovaProperty
ANDROID_THEMES: {
THEME_TRADITIONAL: number;
THEME_HOLO_DARK: number;
THEME_HOLO_LIGHT: number;
THEME_DEVICE_DEFAULT_DARK: number;
THEME_DEVICE_DEFAULT_LIGHT: number;
};
/**
* Show a native ActionSheet component. See below for options.
* @param options {ActionSheetOptions} Options See table below
@@ -84,7 +104,7 @@ export class ActionSheet {
* button pressed (1 based, so 1, 2, 3, etc.)
*/
@Cordova()
static show(options?: ActionSheetOptions): Promise<any> { return; }
show(options?: ActionSheetOptions): Promise<any> { return; }
/**
@@ -92,6 +112,5 @@ export class ActionSheet {
* @returns {Promise<any>} Returns a Promise that resolves when the actionsheet is closed
*/
@Cordova()
static hide(options?: any): Promise<any> { return; }
hide(options?: any): Promise<any> { return; }
}

View File

@@ -1,7 +1,8 @@
import { Cordova, Plugin } from './plugin';
import { Injectable } from '@angular/core';
import { Cordova, Plugin } from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
export type AdMobAdSize = 'SMART_BANNER' | 'BANNER' | 'MEDIUM_RECTANGLE' | 'FULL_BANNER' | 'LEADERBOARD' | 'SKYSCRAPER' | 'CUSTOM';
export type AdSize = 'SMART_BANNER' | 'BANNER' | 'MEDIUM_RECTANGLE' | 'FULL_BANNER' | 'LEADERBOARD' | 'SKYSCRAPER' | 'CUSTOM';
export interface AdMobOptions {
@@ -13,7 +14,7 @@ export interface AdMobOptions {
/**
* Banner Ad Size, defaults to `SMART_BANNER`. IT can be: `SMART_BANNER`, `BANNER`, `MEDIUM_RECTANGLE`, `FULL_BANNER`, `LEADERBOARD`, `SKYSCRAPER`, or `CUSTOM`
*/
adSize?: AdMobAdSize;
adSize?: AdSize;
/**
* Banner width, valid when `adSize` is set to `CUSTOM`
@@ -63,11 +64,11 @@ export interface AdMobOptions {
/**
* Set extra color style for Ad
*/
adExtras?: AdMobAdExtras;
adExtras?: AdExtras;
}
export interface AdMobAdExtras {
export interface AdExtras {
color_bg: string;
@@ -89,23 +90,25 @@ export interface AdMobAdExtras {
* Plugin for Google Ads, including AdMob / DFP (doubleclick for publisher) and mediations to other Ad networks.
* @usage
* ```typescript
* import { AdMob } from 'ionic-native';
* import { AdMob, AdMobOptions, AdSize, AdExtras } from '@ionic-native/ad-mob';
*
* constructor(private admob: AdMob){}
*
* ionViewDidLoad() {
* AdMob.onAdDismiss()
* this.admob.onAdDismiss()
* .subscribe(() => { console.log('User dismissed ad'); });
* }
*
* onClick() {
* AdMob.prepareInterstitial('YOUR_ADID')
* .then(() => { AdMob.showInterstitial(); });
* this.admob.prepareInterstitial('YOUR_ADID')
* .then(() => { this.admob.showInterstitial(); });
* }
*
* ```
*
* @interfaces
* AdMobOptions
* AdMobAdExtras
* AdExtras
*/
@Plugin({
pluginName: 'AdMob',
@@ -114,12 +117,22 @@ export interface AdMobAdExtras {
repo: 'https://github.com/floatinghotpot/cordova-admob-pro',
platforms: ['Android', 'iOS', 'Windows Phone 8']
})
@Injectable()
export class AdMob {
/**
* @private
*/
static AD_POSITION = {
AD_POSITION: {
NO_CHANGE: number;
TOP_LEFT: number;
TOP_CENTER: number;
TOP_RIGHT: number;
LEFT: number;
CENTER: number;
RIGHT: number;
BOTTOM_LEFT: number;
BOTTOM_CENTER: number;
BOTTOM_RIGHT: number;
POS_XY: number;
} = {
NO_CHANGE: 0,
TOP_LEFT: 1,
TOP_CENTER: 2,
@@ -139,7 +152,7 @@ export class AdMob {
* @returns {Promise<any>} Returns a Promise that resolves when the banner is created
*/
@Cordova()
static createBanner(adIdOrOptions: string | AdMobOptions): Promise<any> { return; }
createBanner(adIdOrOptions: string | AdMobOptions): Promise<any> { return; }
/**
* Destroy the banner, remove it from screen.
@@ -147,7 +160,7 @@ export class AdMob {
@Cordova({
sync: true
})
static removeBanner(): void { }
removeBanner(): void { }
/**
* Show banner at position
@@ -156,7 +169,7 @@ export class AdMob {
@Cordova({
sync: true
})
static showBanner(position: number): void { }
showBanner(position: number): void { }
/**
* Show banner at custom position
@@ -166,7 +179,7 @@ export class AdMob {
@Cordova({
sync: true
})
static showBannerAtXY(x: number, y: number): void { }
showBannerAtXY(x: number, y: number): void { }
/**
* Hide the banner, remove it from screen, but can show it later
@@ -174,7 +187,7 @@ export class AdMob {
@Cordova({
sync: true
})
static hideBanner(): void { }
hideBanner(): void { }
/**
* Prepare interstitial banner
@@ -182,7 +195,7 @@ export class AdMob {
* @returns {Promise<any>} Returns a Promise that resolves when interstitial is prepared
*/
@Cordova()
static prepareInterstitial(adIdOrOptions: string | AdMobOptions): Promise<any> { return; }
prepareInterstitial(adIdOrOptions: string | AdMobOptions): Promise<any> { return; }
/**
* Show interstitial ad when it's ready
@@ -190,7 +203,7 @@ export class AdMob {
@Cordova({
sync: true
})
static showInterstitial(): void { }
showInterstitial(): void { }
/**
* Prepare a reward video ad
@@ -198,7 +211,7 @@ export class AdMob {
* @returns {Promise<any>} Returns a Promise that resolves when the ad is prepared
*/
@Cordova()
static prepareRewardVideoAd(adIdOrOptions: string | AdMobOptions): Promise<any> { return; }
prepareRewardVideoAd(adIdOrOptions: string | AdMobOptions): Promise<any> { return; }
/**
* Show a reward video ad
@@ -206,7 +219,7 @@ export class AdMob {
@Cordova({
sync: true
})
static showRewardVideoAd(): void { }
showRewardVideoAd(): void { }
/**
* Sets the values for configuration and targeting
@@ -214,14 +227,14 @@ export class AdMob {
* @returns {Promise<any>} Returns a Promise that resolves when the options have been set
*/
@Cordova()
static setOptions(options: AdMobOptions): Promise<any> { return; }
setOptions(options: AdMobOptions): Promise<any> { return; }
/**
* Get user ad settings
* @returns {Promise<any>} Returns a promise that resolves with the ad settings
*/
@Cordova()
static getAdSettings(): Promise<any> { return; }
getAdSettings(): Promise<any> { return; }
/**
* Triggered when failed to receive Ad
@@ -231,7 +244,7 @@ export class AdMob {
eventObservable: true,
event: 'onAdFailLoad'
})
static onAdFailLoad(): Observable<any> { return; }
onAdFailLoad(): Observable<any> { return; }
/**
* Triggered when Ad received
@@ -241,7 +254,7 @@ export class AdMob {
eventObservable: true,
event: 'onAdLoaded'
})
static onAdLoaded(): Observable<any> { return; }
onAdLoaded(): Observable<any> { return; }
/**
* Triggered when Ad will be showed on screen
@@ -251,7 +264,7 @@ export class AdMob {
eventObservable: true,
event: 'onAdPresent'
})
static onAdPresent(): Observable<any> { return; }
onAdPresent(): Observable<any> { return; }
/**
* Triggered when user click the Ad, and will jump out of your App
@@ -261,7 +274,7 @@ export class AdMob {
eventObservable: true,
event: 'onAdLeaveApp'
})
static onAdLeaveApp(): Observable<any> { return; }
onAdLeaveApp(): Observable<any> { return; }
/**
* Triggered when dismiss the Ad and back to your App
@@ -271,6 +284,6 @@ export class AdMob {
eventObservable: true,
event: 'onAdDismiss'
})
static onAdDismiss(): Observable<any> { return; }
onAdDismiss(): Observable<any> { return; }
}

View File

@@ -0,0 +1,115 @@
import { Plugin, Cordova } from '@ionic-native/core';
import { Injectable } from '@angular/core';
export interface AlipayOrder {
/**
* appId assigned by Alipay
*/
app_id: string;
/**
* Api name.
* Should be: alipay.trade.app.pay
*/
method: string;
/**
* Data format
* Default: "JSON"
*/
format?: string;
/**
* Charset
* Possible values: "UTF-8", "GBK"
* Default: "UTF-8"
*/
charset: string;
/**
* Sign method
* Default: 'RSA'
*/
sign_type: string;
/**
* Sign value. Should be got from server side.
* Default: 'RSA'
*/
sign: string;
/**
* Timestamp, formated like "yyyy-MM-dd HH:mm:ss", e.g. 2014-07-24 03:07:50
*/
timestamp: string;
/**
* Api version. Fixed value '1.0'
*/
version: string;
/**
* Notify url.
*/
notify_url: string;
/**
* biz content. formated in json. see alipay doc for detail.
*/
biz_content: string;
}
/**
* @name Alipay
* @description
* This plugin is used for Alipay APP support. Integrated with the latest SDK.
*
* Requires Cordova plugin: `cordova-alipay-base`. For more info, please see the [Alipay plugin docs](https://github.com/xueron/cordova-alipay-base).
*
* @usage
* ```
* import { Alipay, AlipayOrder } from '@ionic-native/alipay';
*
* constructor(private alipay: Alipay) {
*
* // Should get from server side with sign.
* const alipayOrder: AlipayOrder = {
* ...
* };
*
*
* this.alipay.pay(alipayOrder)
* .then(result => {
* console.log(result); // Success
* })
* .catch(error => {
* console.log(error); // Failed
* });
*
* }
*
*
* ```
*
* @interfaces
* AlipayOrder
*/
@Plugin({
pluginName: 'Alipay',
plugin: 'cordova-alipay-base',
pluginRef: 'Alipay.Base',
repo: 'https://github.com/xueron/cordova-alipay-base',
platforms: ['Android', 'iOS'],
install: 'ionic plugin add https://github.com/xueron/cordova-alipay-base --variable APP_ID=your_app_id'
})
@Injectable()
export class Alipay {
/**
* Open Alipay to perform App pay
* @param order { AlipayOrder } alipay options
* @returns {Promise<any>} Returns a Promise that resolves with the success return, or rejects with an error.
*/
@Cordova()
pay(order: AlipayOrder): Promise<any> { return; }
}

View File

@@ -1,6 +1,8 @@
import { Cordova, Plugin } from './plugin';
import { Injectable } from '@angular/core';
import { Cordova, Plugin } from '@ionic-native/core';
export interface AndroidFingerprintAuthOptions {
export interface AFAAuthOptions {
/**
* Required
@@ -63,20 +65,56 @@ export interface AndroidFingerprintAuthOptions {
}
export interface AFADecryptOptions {
/**
* Biometric authentication
*/
withFingerprint: boolean;
/**
* Authentication using backup credential activity
*/
withBackup: boolean;
/**
* FingerprintAuth.CipherMode.DECRYPT
* Decrypted password
*/
password: string;
}
export interface AFAEncryptResponse {
/**
* Biometric authentication
*/
withFingerprint: boolean;
/**
* Authentication using backup credential activity
*/
withBackup: boolean;
/**
* base64encoded string representation of user credentials
*/
token: string;
}
/**
* @name Android Fingerprint Auth
* @description
* This plugin will open a native dialog fragment prompting the user to authenticate using their fingerprint. If the device has a secure lockscreen (pattern, PIN, or password), the user may opt to authenticate using that method as a backup.
* @usage
* ```typescript
* import { AndroidFingerprintAuth } from 'ionic-native';
* import { AndroidFingerprintAuth, AFAAuthOptions } from '@ionic-native/android-fingerprint-auth';
*
* AndroidFingerprintAuth.isAvailable()
* constructor(private androidFingerprintAuth: AndroidFingerprintAuth) { }
*
* ...
*
*
* this.androidFingerprintAuth.isAvailable()
* .then((result)=> {
* if(result.isAvailable){
* // it is available
*
* AndroidFingerprintAuth.encrypt({ clientId: "myAppName", username: "myUsername", password: "myPassword" })
* this.androidFingerprintAuth.encrypt({ clientId: "myAppName", username: "myUsername", password: "myPassword" })
* .then(result => {
* if (result.withFingerprint) {
* console.log("Successfully encrypted credentials.");
@@ -98,7 +136,9 @@ export interface AndroidFingerprintAuthOptions {
* .catch(error => console.error(error));
* ```
* @interfaces
* AndroidFingerprintAuthOptions
* AFAAuthOptions
* AFAEncryptResponse
* AFADecryptOptions
*/
@Plugin({
pluginName: 'AndroidFingerprintAuth',
@@ -106,62 +146,36 @@ export interface AndroidFingerprintAuthOptions {
pluginRef: 'FingerprintAuth',
repo: 'https://github.com/mjwheatley/cordova-plugin-android-fingerprint-auth'
})
@Injectable()
export class AndroidFingerprintAuth {
/**
* Opens a native dialog fragment to use the device hardware fingerprint scanner to authenticate against fingerprints registered for the device.
* @param options {AndroidFingerprintAuthOptions} Options
* @param options {AFAAuthOptions} Options
* @returns {Promise<any>}
*/
@Cordova()
static encrypt(options: AndroidFingerprintAuthOptions): Promise<{
/**
* Biometric authentication
*/
withFingerprint: boolean;
/**
* Authentication using backup credential activity
*/
withBackup: boolean;
/**
* base64encoded string representation of user credentials
*/
token: string;
}> {return; }
encrypt(options: AFAAuthOptions): Promise<AFAEncryptResponse> {return; }
/**
* Opens a native dialog fragment to use the device hardware fingerprint scanner to authenticate against fingerprints registered for the device.
* @param options {AndroidFingerprintAuthOptions} Options
* @param options {AFAAuthOptions} Options
* @returns {Promise<any>}
*/
@Cordova()
static decrypt(options: AndroidFingerprintAuthOptions): Promise<{
/**
* Biometric authentication
*/
withFingerprint: boolean;
/**
* Authentication using backup credential activity
*/
withBackup: boolean;
/**
* FingerprintAuth.CipherMode.DECRYPT
* Decrypted password
*/
password: string;
}> {return; }
decrypt(options: AFAAuthOptions): Promise<AFADecryptOptions> {return; }
/**
* Check if service is available
* @returns {Promise<any>} Returns a Promise that resolves if fingerprint auth is available on the device
*/
@Cordova()
static isAvailable(): Promise<{isAvailable: boolean}> { return; }
isAvailable(): Promise<{isAvailable: boolean}> { return; }
/**
* Delete the cipher used for encryption and decryption by username
* @returns {Promise<any>} Returns a Promise that resolves if the cipher was successfully deleted
*/
@Cordova()
static delete(options: {clientId: string; username: string; }): Promise<{deleted: boolean}> { return; }
delete(options: {clientId: string; username: string; }): Promise<{deleted: boolean}> { return; }
}

View File

@@ -1,4 +1,5 @@
import { Cordova, Plugin } from './plugin';
import { Injectable } from '@angular/core';
import { Cordova, Plugin } from '@ionic-native/core';
/**
* @name App Availability
@@ -9,18 +10,22 @@ import { Cordova, Plugin } from './plugin';
*
* @usage
* ```typescript
* import { AppAvailability, Device } from 'ionic-native';
* import { AppAvailability } from '@ionic-native/app-availability';
* import { Platform } from 'ionic-angular';
*
* constructor(private appAvailability: AppAvailability, private platform: Platform) { }
*
* ...
*
* let app;
*
* if (Device.platform === 'iOS') {
* if (this.platform.is('ios')) {
* app = 'twitter://';
* } else if (Device.platform === 'Android') {
* } else if (this.platform.is('android')) {
* app = 'com.twitter.android';
* }
*
* AppAvailability.check(app)
* this.appAvailability.check(app)
* .then(
* (yes: string) => console.log(app + ' is available'),
* (no: string) => console.log(app + ' is NOT available')
@@ -34,6 +39,7 @@ import { Cordova, Plugin } from './plugin';
repo: 'https://github.com/ohh2ahh/AppAvailability',
platforms: ['Android', 'iOS']
})
@Injectable()
export class AppAvailability {
/**
@@ -42,6 +48,6 @@ export class AppAvailability {
* @returns {Promise<boolean>}
*/
@Cordova()
static check(app: string): Promise<boolean> { return; }
check(app: string): Promise<boolean> { return; }
}

View File

@@ -0,0 +1,139 @@
import { Cordova, Plugin } from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
import { Injectable } from '@angular/core';
/**
* @name App Preferences
* @description
* This plugin allows you to read and write app preferences
*
* @usage
* ```typescript
* import { AppPreferences } from '@ionic-native/app-preferences';
*
* constructor(private appPreferences: AppPreferences) {
*
* this.appPreferences.fetch('key').then((res) => { console.log(res); });
*
* }
* ```
*
*/
@Plugin({
pluginName: 'AppPreferences',
plugin: 'cordova-plugin-app-preferences', // npm package name, example: cordova-plugin-camera
pluginRef: 'plugins.appPreferences', // the variable reference to call the plugin, example: navigator.geolocation
repo: 'https://github.com/apla/me.apla.cordova.app-preferences', // the github repository URL for the plugin
})
@Injectable()
export class AppPreferences {
/**
* Get a preference value
*
* @param {string} dict Dictionary for key (OPTIONAL)
* @param {string} key Key
* @return {Promise<any>} Returns a promise
*/
@Cordova({
sync: true,
callbackOrder: 'reverse'
})
fetch(dict: string, key?: string): Promise<any> { return; }
/**
* Set a preference value
*
* @param {string} dict Dictionary for key (OPTIONAL)
* @param {string} key Key
* @param {string} value Value
* @return {Promise<any>} Returns a promise
*/
@Cordova({
callbackOrder: 'reverse'
})
store(dict: string, key: string, value?: string): Promise<any> {
return;
}
/**
* Remove value from preferences
*
* @param {string} dict Dictionary for key (OPTIONAL)
* @param {string} key Key
* @return {Promise<any>} Returns a promise
*/
@Cordova({
callbackOrder: 'reverse'
})
remove(dict: string, key?: string): Promise<any> { return; }
/**
* Clear preferences
*
* @return {Promise<any>} Returns a promise
*/
@Cordova({
callbackOrder: 'reverse'
})
clearAll(): Promise<any> { return; }
/**
* Show native preferences interface
*
* @return {Promise<any>} Returns a promise
*/
@Cordova({
callbackOrder: 'reverse'
})
show(): Promise<any> { return; }
/**
* Show native preferences interface
*
* @param {boolean} subscribe true value to subscribe, false - unsubscribe
* @return {Observable<any>} Returns an observable
*/
@Cordova({
observable: true
})
watch(subscribe: boolean): Observable<any> { return; }
/**
* Return named configuration context
* In iOS you'll get a suite configuration, on Android — named file
* Supports: Android, iOS
* @param {string} suiteName suite name
* @returns {Object} Custom object, bound to that suite
*/
@Cordova({
platforms: ['Android']
})
suite(suiteName: string): Object { return; }
@Cordova({
platforms: ['iOS']
})
iosSuite(suiteName: string): Object { return; }
/**
* Return cloud synchronized configuration context
* Currently supports Windows and iOS/macOS
* @returns {Object} Custom object, bound to that suite
*/
@Cordova({
platforms: ['iOS', 'Windows', 'Windows Phone 8']
})
cloudSync(): Object { return; }
/**
* Return default configuration context
* Currently supports Windows and iOS/macOS
* @returns {Object} Custom Object, bound to that suite
*/
@Cordova({
platforms: ['iOS', 'Windows', 'Windows Phone 8']
})
defaults(): Object { return; }
}

View File

@@ -1,4 +1,6 @@
import { Cordova, CordovaProperty, Plugin } from './plugin';
import { Injectable } from '@angular/core';
import { Cordova, CordovaProperty, Plugin } from '@ionic-native/core';
declare var window;
@@ -47,7 +49,7 @@ export interface AppRatePreferences {
/**
* App Store URLS
*/
storeAppURL?: AppRateStoreAppUrls;
storeAppURL?: AppUrls;
}
@@ -65,7 +67,7 @@ export interface AppRateCallbacks {
}
export interface AppRateStoreAppUrls {
export interface AppUrls {
/**
* application id in AppStore
@@ -77,6 +79,11 @@ export interface AppRateStoreAppUrls {
*/
android?: string;
/**
* application URL in Windows Store
*/
windows?: string;
/**
* application URL in AppWorld
*/
@@ -98,19 +105,24 @@ export interface AppRateStoreAppUrls {
*
* @usage
* ```typescript
* import { AppRate } from 'ionic-native';
* import { AppRate } from '@ionic-native/app-rate';
*
* AppRate.preferences.storeAppURL = {
* constructor(private appRate: AppRate) { }
*
* ...
*
* this.appRate.preferences.storeAppURL = {
* ios: '<my_app_id>',
* android: 'market://details?id=<package_name>',
* windows: 'ms-windows-store://review/?ProductId=<Store_ID>'
* };
*
* AppRate.promptForRating(false);
* this.appRate.promptForRating(false);
* ```
*
* @interfaces
* AppRatePreferences
* AppRateStoreAppUrls
* AppUrls
* AppRateCallbacks
*
*/
@@ -119,8 +131,9 @@ export interface AppRateStoreAppUrls {
plugin: 'cordova-plugin-apprate',
pluginRef: 'AppRate',
repo: 'https://github.com/pushandplay/cordova-plugin-apprate',
platforms: ['Android', 'iOS']
platforms: ['Android', 'iOS', 'Windows (experimental)']
})
@Injectable()
export class AppRate {
/**
@@ -128,13 +141,13 @@ export class AppRate {
* See table below for options
*/
@CordovaProperty
static preferences: AppRatePreferences;
preferences: AppRatePreferences;
/**
* Prompts the user for rating
* @param {boolean} immediately Show the rating prompt immediately.
*/
@Cordova()
static promptForRating(immediately: boolean): void { };
promptForRating(immediately: boolean): void { };
}

View File

@@ -0,0 +1,56 @@
import { Plugin, Cordova } from '@ionic-native/core';
import { Injectable } from '@angular/core';
/**
* @name App Update
* @description
* This plugin does self-update for android
*
* @usage
*
* You should first host an XML file on your server with the following data in it:
* ```xml
* <update>
* <version>302048</version>
* <name>APK Name</name>
* <url>https://your-remote-api.com/YourApp.apk</url>
* </update>
* ```
*
* Then use the following code:
*
* ```
* import { AppUpdate } from '@ionic-native/app-update';
*
* constructor(private appUpdate: AppUpdate) {
*
* const updateUrl = 'http://your-remote-api.com/update.xml';
* this.appUpdate.checkAppUpdate(updateUrl);
*
* }
*
*
* ```
*
* The plugin will compare the app version and update it automatically if the API has a newer version to install.
*/
@Plugin({
pluginName: 'AppUpdate',
plugin: 'cordova-plugin-app-update',
pluginRef: 'AppUpdate',
repo: 'https://github.com/vaenow/cordova-plugin-app-update',
platforms: ['Android']
})
@Injectable()
export class AppUpdate {
/**
* Check and update
* @param updateUrl {string} update api url
* @return {Promise<any>} Returns a promise that resolves when something happens
*/
@Cordova({
callbackOrder: 'reverse'
})
checkAppUpdate(updateUrl: string): Promise<any> { return; }
}

View File

@@ -1,4 +1,7 @@
import { Cordova, Plugin } from './plugin';
import { Injectable } from '@angular/core';
import { Cordova, Plugin } from '@ionic-native/core';
/**
* @name App Version
@@ -9,13 +12,18 @@ import { Cordova, Plugin } from './plugin';
*
* @usage
* ```typescript
* import { AppVersion } from 'ionic-native';
* import { AppVersion } from '@ionic-native/app-version';
*
* constructor(private appVersion: AppVersion) { }
*
* ...
*
*
* AppVersion.getAppName();
* AppVersion.getPackageName();
* AppVersion.getVersionCode();
* AppVersion.getVersionNumber();
* this.appVersion.getAppName();
* this.appVersion.getPackageName();
* this.appVersion.getVersionCode();
* this.appVersion.getVersionNumber();
*
* ```
*/
@Plugin({
@@ -25,6 +33,7 @@ import { Cordova, Plugin } from './plugin';
repo: 'https://github.com/whiteoctober/cordova-plugin-app-version',
platforms: ['Android', 'iOS']
})
@Injectable()
export class AppVersion {
/**
@@ -32,27 +41,27 @@ export class AppVersion {
* @returns {Promise<any>}
*/
@Cordova()
static getAppName(): Promise<any> { return; }
getAppName(): Promise<any> { return; }
/**
* Returns the package name of the app
* @returns {Promise<any>}
*/
@Cordova()
static getPackageName(): Promise<any> { return; }
getPackageName(): Promise<any> { return; }
/**
* Returns the build identifier of the app
* @returns {Promise<any>}
*/
@Cordova()
static getVersionCode(): Promise<any> { return; }
getVersionCode(): Promise<any> { return; }
/**
* Returns the version of the app
* @returns {Promise<any>}
*/
@Cordova()
static getVersionNumber(): Promise<any> { return; }
getVersionNumber(): Promise<any> { return; }
}

View File

@@ -0,0 +1,519 @@
import { Plugin, Cordova } from '@ionic-native/core';
import { Observable } from 'rxjs';
import { Injectable } from '@angular/core';
/**
* @name Appodeal
* @description
* Plugin to serve ads through native Appodeal SDKs
*
* @usage
* ```
* import { Appodeal } from '@ionic-native/appodeal';
*
* constructor(private appodeal: Appodeal) {
*
* const appKey = '<your app key>';
* appodeal.initialize(appKey, appodeal.AD_TYPES.REWARDED_VIDEO);
* appodeal.show(appodeal.AD_TYPES.REWARDED_VIDEO);
*
* }
*
*
*
* ```
*/
@Plugin({
pluginName: 'Appodeal',
plugin: 'https://github.com/appodeal/appodeal-cordova-plugin',
pluginRef: 'Appodeal',
repo: 'https://github.com/appodeal/appodeal-cordova-plugin.git',
platforms: [ 'ios', 'android' ]
})
@Injectable()
export class Appodeal {
// available types of advertisements
readonly AD_TYPES = {
INTERSTITIAL: 1,
SKIPPABLE_VIDEO: 2,
BANNER: 4,
BANNER_BOTTOM: 8,
BANNER_TOP: 16,
REWARDED_VIDEO: 128,
NON_SKIPPABLE_VIDEO: 256
};
/**
* initialize Appodeal SDK
* @param {string} appKey
* @param {number} adType
*/
@Cordova()
initialize(appKey: string, adType: number): void {};
/**
* check if SDK has been initialized
* @returns {Promise<boolean>}
*/
@Cordova()
isInitialized(): Promise<any> { return; };
/**
* show ad of specified type
* @param {number} adType
* @returns {Promise<boolean>}
*/
@Cordova()
show(adType: number): Promise<any> { return; };
/**
* show ad of specified type with placement options
* @param {number} adType
* @param {any} placement
* @returns {Promise<boolean>}
*/
@Cordova()
showWithPlacement(
adType: number,
placement: any
): Promise<any> { return; };
/**
* hide ad of specified type
* @param {number} adType
*/
@Cordova()
hide(adType: number): void {};
/**
* confirm use of ads of specified type
* @param {number} adType
*/
@Cordova()
confirm(adType: number): void {};
/**
* check if ad of specified type has been loaded
* @param {number} adType
* @returns {Promise<boolean>}
*/
@Cordova()
isLoaded(adType: number): Promise<any> { return; };
/**
* check if ad of specified
* @param {number} adType
* @returns {Promise<boolean>}
*/
@Cordova()
isPrecache(adType: number): Promise<any> { return; };
/**
*
* @param {number} adType
* @param autoCache
*/
@Cordova()
setAutoCache(adType: number, autoCache: any): void {};
/**
* forcefully cache an ad by type
* @param {number} adType
*/
@Cordova()
cache(adType: number): void {};
/**
*
* @param {boolean} set
*/
@Cordova()
setOnLoadedTriggerBoth(set: boolean): void {};
/**
* enable or disable Smart Banners
* @param {boolean} enabled
*/
@Cordova()
setSmartBanners(enabled: boolean): void {};
/**
* enable or disable banner backgrounds
* @param {boolean} enabled
*/
@Cordova()
setBannerBackground(enabled: boolean): void {};
/**
* enable or disable banner animations
* @param {boolean} enabled
*/
@Cordova()
setBannerAnimation(enabled: boolean): void {};
/**
*
* @param value
*/
@Cordova()
set728x90Banners(value: any): void {};
/**
* enable or disable logging
* @param {boolean} logging
*/
@Cordova()
setLogging(logging: boolean): void {};
/**
* enable or disable testing mode
* @param {boolean} testing
*/
@Cordova()
setTesting(testing: boolean): void {};
/**
* reset device ID
*/
@Cordova()
resetUUID(): void {};
/**
* get version of Appdeal SDK
*/
@Cordova()
getVersion(): Promise<any> { return; };
/**
*
* @param {string} network
* @param {number} adType
*/
@Cordova()
disableNetwork(network?: string, adType?: number): void {};
/**
*
* @param {string} network
* @param {number} adType
*/
@Cordova()
disableNetworkType(network?: string, adType?: number): void {};
/**
* disable Location permissions for Appodeal SDK
*/
@Cordova()
disableLocationPermissionCheck(): void {};
/**
* disable Storage permissions for Appodeal SDK
*/
@Cordova()
disableWriteExternalStoragePermissionCheck(): void {};
/**
* enable event listeners
* @param {boolean} enabled
*/
@Cordova()
enableInterstitialCallbacks(enabled: boolean): void {};
/**
* enable event listeners
* @param {boolean} enabled
*/
@Cordova()
enableSkippableVideoCallbacks(enabled: boolean): void {};
/**
* enable event listeners
* @param {boolean} enabled
*/
@Cordova()
enableNonSkippableVideoCallbacks(enabled: boolean): void {};
/**
* enable event listeners
* @param {boolean} enabled
*/
@Cordova()
enableBannerCallbacks(enabled: boolean): void {};
/**
* enable event listeners
* @param {boolean} enabled
*/
@Cordova()
enableRewardedVideoCallbacks(enabled: boolean): void {};
/**
*
* @param {string} name - name of rule
* @param {boolean} value
*/
@Cordova()
setCustomBooleanRule(name: string, value: boolean): void {};
/**
*
* @param {string} name - name of rule
* @param {number} value
*/
@Cordova()
setCustomIntegerRule(name: string, value: number): void {};
/**
* set rule with float value
* @param {string} name
* @param {number} value
*/
@Cordova()
setCustomDoubleRule(name: string, value: number): void {};
/**
* set rule with string value
* @param {string} name - name of rule
* @param {string} value
*/
@Cordova()
setCustomStringRule(name: string, value: string): void {};
/**
* set ID preference in Appodeal for current user
* @param id
*/
@Cordova()
setUserId(id: any): void {};
/**
* set Email preference in Appodeal for current user
* @param email
*/
@Cordova()
setEmail(email: any): void {};
/**
* set Birthday preference in Appodeal for current user
* @param birthday
*/
@Cordova()
setBirthday(birthday: any): void {};
/**
* et Age preference in Appodeal for current user
* @param age
*/
@Cordova()
setAge(age: any): void {};
/**
* set Gender preference in Appodeal for current user
* @param gender
*/
@Cordova()
setGender(gender: any): void {};
/**
* set Occupation preference in Appodeal for current user
* @param occupation
*/
@Cordova()
setOccupation(occupation: any): void {};
/**
* set Relation preference in Appodeal for current user
* @param relation
*/
@Cordova()
setRelation(relation: any): void {};
/**
* set Smoking preference in Appodeal for current user
* @param smoking
*/
@Cordova()
setSmoking(smoking: any): void {};
/**
* set Alcohol preference in Appodeal for current user
* @param alcohol
*/
@Cordova()
setAlcohol(alcohol: any): void {};
/**
* set Interests preference in Appodeal for current user
* @param interests
*/
@Cordova()
setInterests(interests: any): void {};
@Cordova({
eventObservable: true,
event: 'onInterstitialLoaded',
element: document
})
onInterstitialLoaded(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onInterstitialFailedToLoad',
element: document
})
onInterstitialFailedToLoad(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onInterstitialShown',
element: document
})
onInterstitialShown(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onInterstitialClicked',
element: document
})
onInterstitialClicked(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onInterstitialClosed',
element: document
})
onInterstitialClosed(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onSkippableVideoLoaded',
element: document
})
onSkippableVideoLoaded(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onSkippableVideoFailedToLoad',
element: document
})
onSkippableVideoFailedToLoad(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onSkippableVideoShown',
element: document
})
onSkippableVideoShown(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onSkippableVideoFinished',
element: document
})
onSkippableVideoFinished(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onSkippableVideoClosed',
element: document
})
onSkippableVideoClosed(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onRewardedVideoLoaded',
element: document
})
onRewardedVideoLoaded(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onRewardedVideoFailedToLoad',
element: document
})
onRewardedVideoFailedToLoad(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onRewardedVideoShown',
element: document
})
onRewardedVideoShown(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onRewardedVideoFinished',
element: document
})
onRewardedVideoFinished(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onRewardedVideoClosed',
element: document
})
onRewardedVideoClosed(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onNonSkippableVideoLoaded',
element: document
})
onNonSkippableVideoLoaded(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onNonSkippableVideoFailedToLoad',
element: document
})
onNonSkippableVideoFailedToLoad(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onNonSkippableVideoShown',
element: document
})
onNonSkippableVideoShown(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onNonSkippableVideoFinished',
element: document
})
onNonSkippableVideoFinished(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onNonSkippableVideoClosed',
element: document
})
onNonSkippableVideoClosed(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onBannerClicked',
element: document
})
onBannerClicked(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onBannerFailedToLoad',
element: document
})
onBannerFailedToLoad(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onBannerLoaded',
element: document
})
onBannerLoaded(): Observable<any> { return; }
@Cordova({
eventObservable: true,
event: 'onBannerShown',
element: document
})
onBannerShown(): Observable<any> { return; }
}

View File

@@ -0,0 +1,103 @@
import { Cordova, Plugin } from '@ionic-native/core';
import { Injectable } from '@angular/core';
declare var window;
export interface BackgroundFetchConfig {
/**
* Set true to cease background-fetch from operating after user "closes" the app. Defaults to true.
*/
stopOnTerminate?: boolean;
}
/**
* @name Background Fetch
* @description
* iOS Background Fetch Implementation. See: https://developer.apple.com/reference/uikit/uiapplication#1657399
* iOS Background Fetch is basically an API which wakes up your app about every 15 minutes (during the user's prime-time hours) and provides your app exactly 30s of background running-time. This plugin will execute your provided callbackFn whenever a background-fetch event occurs. There is no way to increase the rate which a fetch-event occurs and this plugin sets the rate to the most frequent possible value of UIApplicationBackgroundFetchIntervalMinimum -- iOS determines the rate automatically based upon device usage and time-of-day (ie: fetch-rate is about ~15min during prime-time hours; less frequently when the user is presumed to be sleeping, at 3am for example).
* For more detail, please see https://github.com/transistorsoft/cordova-plugin-background-fetch
*
* @usage
*
* ```typescript
* import { BackgroundFetch, BackgroundFetchConfig } from '@ionic-native/background-fetch';
*
*
* constructor(private backgroundFetch: BackgroundFetch) {
*
* const config: BackgroundFetchConfig = {
* stopOnTerminate: false, // Set true to cease background-fetch from operating after user "closes" the app. Defaults to true.
* };
*
* backgroundFetch.configure(config)
* .then(() => {
* console.log('Background Fetch initialized');
*
* this.backgroundFetch.finish();
*
* })
* .catch(e => console.log('Error initializing background fetch', e));
*
* // Start the background-fetch API. Your callbackFn provided to #configure will be executed each time a background-fetch event occurs. NOTE the #configure method automatically calls #start. You do not have to call this method after you #configure the plugin
* backgroundFetch.start();
*
* // Stop the background-fetch API from firing fetch events. Your callbackFn provided to #configure will no longer be executed.
* backgroundFetch.stop();
*
*
* }
*
* ```
* @interfaces
* BackgroundFetchConfig
*
*/
@Plugin({
pluginName: 'BackgroundFetch',
plugin: 'cordova-plugin-background-fetch',
pluginRef: 'BackgroundFetch',
repo: 'https://github.com/transistorsoft/cordova-plugin-background-fetch',
platforms: ['iOS']
})
@Injectable()
export class BackgroundFetch {
/**
* Configures the plugin's fetch callbackFn
*
* @param {BackgroundFetchConfig} config Configuration for plugin
* @return {Promise<any>}
*/
@Cordova({
callbackOrder: 'reverse'
})
configure(config: BackgroundFetchConfig): Promise<any> { return; }
/**
* Start the background-fetch API.
* Your callbackFn provided to #configure will be executed each time a background-fetch event occurs. NOTE the #configure method automatically calls #start. You do not have to call this method after you #configure the plugin
* @returns {Promise<any>}
*/
@Cordova()
start(): Promise<any> { return; }
/**
* Stop the background-fetch API from firing fetch events. Your callbackFn provided to #configure will no longer be executed.
* @returns {Promise<any>}
*/
@Cordova()
stop(): Promise<any> { return; }
/**
* You MUST call this method in your fetch callbackFn provided to #configure in order to signal to iOS that your fetch action is complete. iOS provides only 30s of background-time for a fetch-event -- if you exceed this 30s, iOS will kill your app.
*/
@Cordova({
sync: true
})
finish(): void { }
}

View File

@@ -1,4 +1,7 @@
import {Cordova, Plugin} from './plugin';
import { Injectable } from '@angular/core';
import { Cordova, Plugin } from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
declare var window;
@@ -126,10 +129,14 @@ export interface BackgroundGeolocationConfig {
/**
* ANDROID, WP8 ONLY
* The minimum time interval between location updates in seconds.
* When using BackgroundGeolocation.LocationProvider.ANDROID_DISTANCE_FILTER_PROVIDER:
* The minimum time interval between location updates in milliseconds.
* @see Android docs (http://developer.android.com/reference/android/location/LocationManager.html#requestLocationUpdates(long,%20float,%20android.location.Criteria,%20android.app.PendingIntent))
* and the MS doc (http://msdn.microsoft.com/en-us/library/windows/apps/windows.devices.geolocation.geolocator.reportinterval)
* for more information
* When using BackgroundGeolocation.LocationProvider.ANDROID_ACTIVITY_PROVIDER:
* Rate in milliseconds at which your app prefers to receive location updates.
* @see Android docs (https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#getInterval())
*/
interval?: number;
@@ -225,26 +232,48 @@ export interface BackgroundGeolocationConfig {
* Defaults to 10000
*/
maxLocations?: number;
/**
* ANDROID ONLY with BackgroundGeolocation.LocationProvider.ANDROID_ACTIVITY_PROVIDER
*
* Fastest rate in milliseconds at which your app can handle location updates.
* @see Android docs (https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#getFastestInterval())
*/
fastestInterval?: number;
/**
* ANDROID ONLY with BackgroundGeolocation.LocationProvider.ANDROID_ACTIVITY_PROVIDER
*
* Rate in milliseconds at which activity recognition occurs. Larger values will result in fewer activity detections while improving battery life.
*/
activitiesInterval?: number;
/**
* ANDROID ONLY with BackgroundGeolocation.LocationProvider.ANDROID_ACTIVITY_PROVIDER
*
* stop() is forced, when the STILL activity is detected (default is true)
*/
stopOnStillActivity?: boolean;
}
/**
* @name BackgroundGeolocation
* @name Background Geolocation
* @description
* This plugin provides foreground and background geolocation with battery-saving "circular region monitoring" and "stop detection". For
* more detail, please see https://github.com/mauron85/cordova-plugin-background-geolocation
*
* @usage
*
* BackgroundGeolocation must be called within app.ts and or before Geolocation. Otherwise the platform will not ask you for background tracking permission.
*
* ```typescript
* import { BackgroundGeolocation } from 'ionic-native';
* import { BackgroundGeolocation, BackgroundGeolocationConfig } from '@ionic-native/background-geolocation';
*
* constructor(private backgroundGeolocation: BackgroundGeolocation) { }
*
* // When device is ready :
* platform.ready().then(() => {
* // IMPORTANT: BackgroundGeolocation must be called within app.ts and or before Geolocation. Otherwise the platform will not ask you for background tracking permission.
* ...
*
* // BackgroundGeolocation is highly configurable. See platform specific configuration options
* let config = {
* const config: BackgroundGeolocationConfig = {
* desiredAccuracy: 10,
* stationaryRadius: 20,
* distanceFilter: 30,
@@ -252,24 +281,23 @@ export interface BackgroundGeolocationConfig {
* stopOnTerminate: false, // enable this to clear background location settings when the app terminates
* };
*
* BackgroundGeolocation.configure((location) => {
console.log('[js] BackgroundGeolocation callback: ' + location.latitude + ',' + location.longitude);
// IMPORTANT: You must execute the finish method here to inform the native plugin that you're finished,
// and the background-task may be completed. You must do this regardless if your HTTP request is successful or not.
// IF YOU DON'T, ios will CRASH YOUR APP for spending too much time in the background.
BackgroundGeolocation.finish(); // FOR IOS ONLY
* }, (error) => {
* console.log('BackgroundGeolocation error');
* }, config);
* this.backgroundGeolocation.configure(config)
* .subscribe((location: BackgroundGeolocationResponse) => {
*
* // Turn ON the background-geolocation system. The user will be tracked whenever they suspend the app.
* BackgroundGeolocation.start();
* })
* console.log(location);
*
* // IMPORTANT: You must execute the finish method here to inform the native plugin that you're finished,
* // and the background-task may be completed. You must do this regardless if your HTTP request is successful or not.
* // IF YOU DON'T, ios will CRASH YOUR APP for spending too much time in the background.
* BackgroundGeolocation.finish(); // FOR IOS ONLY
*
* });
*
* // start recording location
* this.backgroundGeolocation.start();
*
* // If you wish to turn OFF background-tracking, call the #stop method.
* BackgroundGeolocation.stop();
* this.backgroundGeolocation.stop();
*
* ```
* @interfaces
@@ -283,6 +311,7 @@ export interface BackgroundGeolocationConfig {
repo: 'https://github.com/mauron85/cordova-plugin-background-geolocation',
platforms: ['iOS', 'Android', 'Windows Phone 8']
})
@Injectable()
export class BackgroundGeolocation {
/**
@@ -294,7 +323,7 @@ export class BackgroundGeolocation {
*
* @enum {number}
*/
static LocationProvider: any = {
LocationProvider: any = {
ANDROID_DISTANCE_FILTER_PROVIDER: 0,
ANDROID_ACTIVITY_PROVIDER: 1
};
@@ -312,7 +341,7 @@ export class BackgroundGeolocation {
*
* enum {number}
*/
static Accuracy: any = {
Accuracy: any = {
HIGH: 0,
MEDIUM: 10,
LOW: 100,
@@ -328,7 +357,7 @@ export class BackgroundGeolocation {
*
* @enum {number}
*/
static Mode: any = {
Mode: any = {
BACKGROUND: 0,
FOREGROUND: 1
};
@@ -336,17 +365,14 @@ export class BackgroundGeolocation {
/**
* Configure the plugin.
*
* @param {Function} callback callback will be called when background location is determined.
* @param {Function} errorCallback callback to be executed every time a geolocation error occurs.
* @param {Config} options An object of type Config
* @return Location object, which tries to mimic w3c Coordinates interface.
* See http://dev.w3.org/geo/api/spec-source.html#coordinates_interface
* Callback to be executed every time a geolocation is recorded in the background.
* @param options {BackgroundGeolocationConfig} options An object of type Config
* @return {Observable<BackgroundGeolocationResponse>}
*/
@Cordova({
sync: true
callbackOrder: 'reverse',
observable: true
})
static configure(callback: Function, errorCallback: Function, options: BackgroundGeolocationConfig): any { return; }
configure(options: BackgroundGeolocationConfig): Observable<BackgroundGeolocationResponse> { return; }
/**
* Turn ON the background-geolocation system.
@@ -354,91 +380,103 @@ export class BackgroundGeolocation {
* @returns {Promise<any>}
*/
@Cordova()
static start(): Promise<any> { return; }
start(): Promise<any> { return; }
/**
* Turn OFF background-tracking
* @returns {Promise<any>}
*/
@Cordova()
static stop(): Promise<any> { return; }
stop(): Promise<any> { return; }
/**
* Inform the native plugin that you're finished, the background-task may be completed
* NOTE: IOS, WP only
* @returns {Promise<any>}
*/
@Cordova()
static finish() { }
@Cordova({
platforms: ['iOS', 'Windows Phone']
})
finish(): Promise<any> { return; }
/**
* Force the plugin to enter "moving" or "stationary" state
* NOTE: IOS, WP only
* @param isMoving {boolean}
* @returns {Promise<any>}
*/
@Cordova()
static changePace(isMoving: boolean) { }
@Cordova({
platforms: ['iOS', 'Windows Phone']
})
changePace(isMoving: boolean): Promise<any> { return; }
/**
* Setup configuration
* @param options {BackgroundGeolocationConfig}
* @returns {Promise<any>}
*/
@Cordova({
callbackOrder: 'reverse'
})
static setConfig(options: BackgroundGeolocationConfig): Promise<any> { return; }
setConfig(options: BackgroundGeolocationConfig): Promise<any> { return; }
/**
* Returns current stationaryLocation if available. null if not
* NOTE: IOS, WP only
* @returns {Promise<Location>}
*/
@Cordova()
static getStationaryLocation(): Promise<BackgroundGeolocationResponse> { return; }
@Cordova({
platforms: ['iOS', 'Windows Phone']
})
getStationaryLocation(): Promise<BackgroundGeolocationResponse> { return; }
/**
* Add a stationary-region listener. Whenever the devices enters "stationary-mode",
* your #success callback will be executed with #location param containing #radius of region
* NOTE: IOS, WP only
* @returns {Promise<any>}
*/
@Cordova()
static onStationary(): Promise<any> { return; }
@Cordova({
platforms: ['iOS', 'Windows Phone']
})
onStationary(): Promise<any> { return; }
/**
* Check if location is enabled on the device
* @returns {Promise<number>} Returns a promise with int argument that takes values 0, 1 (true).
* NOTE: ANDROID only
*/
@Cordova()
static isLocationEnabled(): Promise<number> { return; }
@Cordova({
platforms: ['Android']
})
isLocationEnabled(): Promise<number> { return; }
/**
* Display app settings to change permissions
*/
@Cordova({sync: true})
static showAppSettings(): void { }
showAppSettings(): void { }
/**
* Display device location settings
*/
@Cordova({sync: true})
static showLocationSettings(): void { }
showLocationSettings(): void { }
/**
* Method can be used to detect user changes in location services settings.
* If user enable or disable location services then success callback will be executed.
* In case or error (SettingNotFoundException) fail callback will be executed.
* NOTE: ANDROID only
* @returns {Promise<boolean>}
*/
@Cordova()
static watchLocationMode(): Promise<boolean> { return; }
@Cordova({
platforms: ['Android']
})
watchLocationMode(): Promise<boolean> { return; }
/**
* Stop watching for location mode changes.
* NOTE: ANDROID only
* @returns {Promise<any>}
*/
@Cordova()
static stopWatchingLocationMode() { }
@Cordova({
platforms: ['Android']
})
stopWatchingLocationMode(): Promise<any> { return; }
/**
* Method will return all stored locations.
@@ -447,34 +485,38 @@ export class BackgroundGeolocation {
* by the system
* or
* - option.debug is true
* NOTE: ANDROID only
* @returns {Promise<any>}
*/
@Cordova()
static getLocations(): Promise<any> { return; }
@Cordova({
platforms: ['Android']
})
getLocations(): Promise<any> { return; }
/**
* Method will return locations, which has not been yet posted to server. NOTE: Locations does contain locationId.
* @returns {Promise<any>}
*/
@Cordova()
static getValidLocations(): Promise<any> { return; }
getValidLocations(): Promise<any> { return; }
/**
* Delete stored location by given locationId.
* NOTE: ANDROID only
* @param locationId {number}
* @returns {Promise<any>}
*/
@Cordova()
static deleteLocation(locationId: number): Promise<any> { return; }
@Cordova({
platforms: ['Android']
})
deleteLocation(locationId: number): Promise<any> { return; }
/**
* Delete all stored locations.
* NOTE: ANDROID only
* @returns {Promise<any>}
*/
@Cordova()
static deleteAllLocations(): Promise<any> { return; }
@Cordova({
platforms: ['Android']
})
deleteAllLocations(): Promise<any> { return; }
/**
* Normally plugin will handle switching between BACKGROUND and FOREGROUND mode itself.
@@ -485,23 +527,23 @@ export class BackgroundGeolocation {
*
* BackgroundGeolocation.Mode.FOREGROUND
* BackgroundGeolocation.Mode.BACKGROUND
*
* NOTE: iOS only
*
* @param {number} See above.
**
* @param modeId {number}
* @returns {Promise<any>}
*/
@Cordova()
static switchMode(modeId: number): Promise<any> { return; }
@Cordova({
platforms: ['iOS']
})
switchMode(modeId: number): Promise<any> { return; }
/**
* Return all logged events. Useful for plugin debugging. Parameter limit limits number of returned entries.
* @see https://github.com/mauron85/cordova-plugin-background-geolocation/tree/v2.2.1#debugging for more information.
*
* @param {number} Limits the number of entries
* @param limit {number} Limits the number of entries
* @returns {Promise<any>}
*/
@Cordova()
static getLogEntries(limit: number): Promise<any> { return; }
getLogEntries(limit: number): Promise<any> { return; }
}

View File

@@ -0,0 +1,195 @@
import { Injectable } from '@angular/core';
import { Cordova, Plugin } from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
/**
* Configurations items that can be updated.
*/
export interface BackgroundModeConfiguration {
/**
* Title of the background task
*/
title?: String;
/**
* The text that scrolls itself on statusbar
*/
ticker?: String;
/**
* Description of background task
*/
text?: String;
/**
* if true plugin will not display a notification. Default is false.
*/
silent?: boolean;
/**
* By default the app will come to foreground when taping on the notification. If false, plugin wont come to foreground when tapped.
*/
resume?: boolean;
}
/**
* @name Background Mode
* @description
* Cordova plugin to prevent the app from going to sleep while in background.
* Requires Cordova plugin: cordova-plugin-background-mode. For more info about plugin, vist: https://github.com/katzer/cordova-plugin-background-mode
*@usage
* ```typescript
* import { BackgroundMode } from '@ionic-native/background-mode';
*
* constructor(private backgroundMode: BackgroundMode) { }
*
* ...
*
* this.backgroundMode.enable();
* ```
*
* @interfaces
* BackgroundModeConfiguration
*/
@Plugin({
pluginName: 'BackgroundMode',
plugin: 'cordova-plugin-background-mode',
pluginRef: 'cordova.plugins.backgroundMode',
repo: 'https://github.com/katzer/cordova-plugin-background-mode',
platforms: ['Android', 'iOS', 'Windows Phone 8']
})
@Injectable()
export class BackgroundMode {
/**
* Enable the background mode.
* Once called, prevents the app from being paused while in background.
*/
@Cordova({
sync: true
})
enable(): void { }
/**
* Disable the background mode.
* Once the background mode has been disabled, the app will be paused when in background.
*/
@Cordova()
disable(): Promise<any> { return; }
/**
* Checks if background mode is enabled or not.
* @returns {boolean} returns a boolean that indicates if the background mode is enabled.
*/
@Cordova({
sync: true
})
isEnabled(): boolean { return; }
/**
* Can be used to get the information if the background mode is active.
* @returns {boolean} returns a boolean that indicates if the background mode is active.
*/
@Cordova({
sync: true
})
isActive(): boolean { return; }
/**
* Override the default title, ticker and text.
* Available only for Android platform.
* @param {Configure} options List of option to configure. See table below
*/
@Cordova({
platforms: ['Android']
})
setDefaults(options?: BackgroundModeConfiguration): Promise<any> { return; }
/**
* Modify the displayed information.
* Available only for Android platform.
* @param {Configure} options Any options you want to update. See table below.
*/
@Cordova({
platforms: ['Android']
})
configure(options?: BackgroundModeConfiguration): Promise<any> { return; }
/**
* Listen for events that the plugin fires. Available events are `enable`, `disable`, `activate`, `deactivate` and `failure`.
* @param event {string} Event name
* @returns {Observable<any>}
*/
@Cordova({
observable: true,
clearFunction: 'un',
clearWithArgs: true
})
on(event: string): Observable<any> { return; }
/**
* Android allows to programmatically move from foreground to background.
*/
@Cordova({
platforms: ['Android'],
sync: true
})
moveToBackground(): void {}
/**
* Android allows to programmatically move from background to foreground.
*/
@Cordova({
platforms: ['Android'],
sync: true
})
moveToForeground(): void {}
/**
* Override the back button on Android to go to background instead of closing the app.
*/
@Cordova({
platforms: ['Android'],
sync: true
})
overrideBackButton(): void {}
/**
* Exclude the app from the recent task list works on Android 5.0+.
*/
@Cordova({
platforms: ['Android'],
sync: true
})
excludeFromTaskList(): void {}
/**
* The method works async instead of isActive() or isEnabled().
*/
@Cordova({
platforms: ['Android']
})
isScreenOff(): Promise<boolean> { return; }
/**
* Turn screen on
*/
@Cordova({
platforms: ['Android'],
sync: true
})
wakeUp(): void {}
/**
* Turn screen on and show app even locked
*/
@Cordova({
platforms: ['Android'],
sync: true
})
unlock(): void {}
}

View File

@@ -1,4 +1,6 @@
import { Plugin, Cordova } from './plugin';
import { Injectable } from '@angular/core';
import { Plugin, Cordova } from '@ionic-native/core';
/**
* @beta
@@ -8,13 +10,17 @@ import { Plugin, Cordova } from './plugin';
*
* @usage
* ```
* import { Backlight } from 'ionic-native';
* import { Backlight } from '@ionic-native/backlight';
*
* constructor(private backlight: Backlight) { }
*
* ...
*
* // Turn backlight on
* Backlight.on().then(() => console.log('backlight on'));
* this.backlight.on().then(() => console.log('backlight on'));
*
* // Turn backlight off
* Backlight.off().then(() => console.log('backlight off'));
* this.backlight.off().then(() => console.log('backlight off'));
*
* ```
*/
@@ -25,6 +31,7 @@ import { Plugin, Cordova } from './plugin';
repo: 'https://github.com/mebibou/cordova-plugin-backlight',
platforms: ['Android']
})
@Injectable()
export class Backlight {
/**
@@ -32,13 +39,13 @@ export class Backlight {
* @return {Promise<any>} Returns a promise that resolves when the backlight is on
*/
@Cordova()
static on(): Promise<any> { return; }
on(): Promise<any> { return; }
/**
* This function turns backlight off
* @return {Promise<any>} Returns a promise that resolves when the backlight is off
*/
@Cordova()
static off(): Promise<any> { return; }
off(): Promise<any> { return; }
}

View File

@@ -1,4 +1,6 @@
import { Cordova, Plugin } from './plugin';
import { Injectable } from '@angular/core';
import { Cordova, Plugin } from '@ionic-native/core';
/**
* @name Badge
@@ -9,12 +11,15 @@ import { Cordova, Plugin } from './plugin';
*
* @usage
* ```typescript
* import { Badge } from 'ionic-native';
* import { Badge } from '@ionic-native/badge';
*
* constructor(private badge: Badge) { }
*
* Badge.set(10);
* Badge.increase();
* Badge.clear();
* ...
*
* this.badge.set(10);
* this.badge.increase(1);
* this.badge.clear();
* ```
*/
@Plugin({
@@ -24,6 +29,7 @@ import { Cordova, Plugin } from './plugin';
repo: 'https://github.com/katzer/cordova-plugin-badge',
platforms: ['Android', 'iOS', 'Browser', 'Windows', 'Amazon FireOS', 'Windows Phone 8']
})
@Injectable()
export class Badge {
/**
@@ -31,7 +37,7 @@ export class Badge {
* @returns {Promise<boolean>}
*/
@Cordova()
static clear(): Promise<boolean> { return; }
clear(): Promise<boolean> { return; }
/**
* Set the badge of the app icon.
@@ -39,14 +45,14 @@ export class Badge {
* @returns {Promise<any>}
*/
@Cordova()
static set(badgeNumber: number): Promise<any> { return; }
set(badgeNumber: number): Promise<any> { return; }
/**
* Get the badge of the app icon.
* @returns {Promise<any>}
*/
@Cordova()
static get(): Promise<any> { return; }
get(): Promise<any> { return; }
/**
* Increase the badge number.
@@ -54,7 +60,7 @@ export class Badge {
* @returns {Promise<any>}
*/
@Cordova()
static increase(increaseBy: number): Promise<any> { return; }
increase(increaseBy: number): Promise<any> { return; }
/**
* Decrease the badge number.
@@ -62,20 +68,20 @@ export class Badge {
* @returns {Promise<any>}
*/
@Cordova()
static decrease(decreaseBy: number): Promise<any> { return; }
decrease(decreaseBy: number): Promise<any> { return; }
/**
* Determine if the app has permission to show badges.
* @returns {Promise<any>}
*/
@Cordova()
static hasPermission(): Promise<any> { return; }
hasPermission(): Promise<any> { return; }
/**
* Register permission to set badge notifications
* @returns {Promise<any>}
*/
@Cordova()
static registerPermission(): Promise<any> { return; }
registerPermission(): Promise<any> { return; }
}

View File

@@ -1,4 +1,6 @@
import { Cordova, Plugin } from './plugin';
import { Injectable } from '@angular/core';
import { Cordova, Plugin } from '@ionic-native/core';
export interface BarcodeScannerOptions {
@@ -22,6 +24,11 @@ export interface BarcodeScannerOptions {
*/
disableAnimations?: boolean;
/**
* Disable success beep. Supported on iOS only.
*/
disableSuccessBeep?: boolean;
/**
* Prompt text. Supported on Android only.
*/
@@ -58,10 +65,14 @@ export interface BarcodeScannerOptions {
*
* @usage
* ```typescript
* import { BarcodeScanner } from 'ionic-native';
* import { BarcodeScanner } from '@ionic-native/barcode-scanner';
*
* constructor(private barcodeScanner: BarcodeScanner) { }
*
* ...
*
*
* BarcodeScanner.scan().then((barcodeData) => {
* this.barcodeScanner.scan().then((barcodeData) => {
* // Success! Barcode data is here
* }, (err) => {
* // An error occurred
@@ -77,12 +88,15 @@ export interface BarcodeScannerOptions {
repo: 'https://github.com/phonegap/phonegap-plugin-barcodescanner',
platforms: ['Android', 'iOS', 'Windows Phone 8', 'Windows 10', 'Windows 8', 'BlackBerry 10', 'Browser']
})
@Injectable()
export class BarcodeScanner {
/**
* @private
*/
static Encode: any = {
Encode: {
TEXT_TYPE: string;
EMAIL_TYPE: string;
PHONE_TYPE: string;
SMS_TYPE: string;
} = {
TEXT_TYPE: 'TEXT_TYPE',
EMAIL_TYPE: 'EMAIL_TYPE',
PHONE_TYPE: 'PHONE_TYPE',
@@ -97,7 +111,7 @@ export class BarcodeScanner {
@Cordova({
callbackOrder: 'reverse'
})
static scan(options?: BarcodeScannerOptions): Promise<any> { return; }
scan(options?: BarcodeScannerOptions): Promise<any> { return; }
/**
* Encodes data into a barcode.
@@ -107,6 +121,6 @@ export class BarcodeScanner {
* @returns {Promise<any>}
*/
@Cordova()
static encode(type: string, data: any): Promise<any> { return; }
encode(type: string, data: any): Promise<any> { return; }
}

View File

@@ -1,14 +1,20 @@
import { Cordova, Plugin } from './plugin';
import { Injectable } from '@angular/core';
import { Cordova, Plugin } from '@ionic-native/core';
/**
* @name Base64 To Gallery
* @description This plugin allows you to save base64 data as a png image into the device
* @usage
* ```typescript
* import { Base64ToGallery } from 'ionic-native';
* import { Base64ToGallery } from '@ionic-native/base64-to-gallery';
*
* constructor(private base64ToGallery: Base64ToGallery) { }
*
*
* Base64ToGallery.base64ToGallery(base64Data, 'img_').then(
* ...
*
*
* this.base64ToGallery.base64ToGallery(base64Data, { prefix: '_img' }).then(
* res => console.log('Saved image to gallery ', res),
* err => console.log('Error saving image to gallery ', err)
* );
@@ -21,6 +27,7 @@ import { Cordova, Plugin } from './plugin';
repo: 'https://github.com/Nexxa/cordova-base64-to-gallery',
platforms: ['Android', 'iOS', 'Windows Phone 8']
})
@Injectable()
export class Base64ToGallery {
/**
@@ -33,7 +40,7 @@ export class Base64ToGallery {
successIndex: 2,
errorIndex: 3
})
static base64ToGallery(data: string, options?: {prefix?: string; mediaScanner?: boolean}): Promise<any> {
base64ToGallery(data: string, options?: {prefix?: string; mediaScanner?: boolean}): Promise<any> {
return;
}

View File

@@ -1,4 +1,5 @@
import { Cordova, Plugin } from './plugin';
import { Injectable } from '@angular/core';
import { Cordova, Plugin } from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
export interface BatteryStatusResponse {
@@ -22,11 +23,15 @@ export interface BatteryStatusResponse {
*
* @usage
* ```typescript
* import { BatteryStatus } from 'ionic-native';
* import { BatteryStatus } from '@ionic-native/battery-status';
*
* constructor(private batteryStatus: BatteryStatus) { }
*
* ...
*
*
* // watch change in battery status
* let subscription = BatteryStatus.onChange().subscribe(
* let subscription = this.batteryStatus.onChange().subscribe(
* (status: StatusObject) => {
* console.log(status.level, status.isPlugged);
* }
@@ -46,6 +51,7 @@ export interface BatteryStatusResponse {
repo: 'https://github.com/apache/cordova-plugin-battery-status',
platforms: ['Amazon Fire OS', 'iOS', 'Android', 'BlackBerry 10', 'Windows Phone 7', 'Windows Phone 8', 'Windows', 'Firefox OS', 'Browser']
})
@Injectable()
export class BatteryStatus {
/**
@@ -56,7 +62,7 @@ export class BatteryStatus {
eventObservable: true,
event: 'batterystatus'
})
static onChange(): Observable<BatteryStatusResponse> { return; }
onChange(): Observable<BatteryStatusResponse> { return; }
/**
* Watch when the battery level goes low
@@ -66,7 +72,7 @@ export class BatteryStatus {
eventObservable: true,
event: 'batterylow'
})
static onLow(): Observable<BatteryStatusResponse> { return; }
onLow(): Observable<BatteryStatusResponse> { return; }
/**
* Watch when the battery level goes to critial
@@ -76,6 +82,6 @@ export class BatteryStatus {
eventObservable: true,
event: 'batterycritical'
})
static onCritical(): Observable<BatteryStatusResponse> { return; }
onCritical(): Observable<BatteryStatusResponse> { return; }
}

View File

@@ -1,4 +1,5 @@
import { Cordova, Plugin } from './plugin';
import { Injectable } from '@angular/core';
import { Cordova, Plugin } from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
/**
@@ -20,6 +21,14 @@ import { Observable } from 'rxjs/Observable';
*
* @usage
*
* ```typescript
*
* import { BLE } from '@ionic-native/ble';
*
* constructor(private ble: BLE) { }
*
* ```
*
* ## Peripheral Data
*
* Peripheral Data is passed to the success callback when scanning and connecting. Limited data is passed when scanning.
@@ -166,6 +175,7 @@ import { Observable } from 'rxjs/Observable';
repo: 'https://github.com/don/cordova-plugin-ble-central',
platforms: ['iOS', 'Android']
})
@Injectable()
export class BLE {
/**
@@ -184,7 +194,7 @@ export class BLE {
@Cordova({
observable: true
})
static scan(services: string[], seconds: number): Observable<any> { return; }
scan(services: string[], seconds: number): Observable<any> { return; }
/**
* Scan and discover BLE peripherals until `stopScan` is called.
@@ -207,7 +217,7 @@ export class BLE {
clearFunction: 'stopScan',
clearWithArgs: false
})
static startScan(services: string[]): Observable<any> { return; }
startScan(services: string[]): Observable<any> { return; }
/**
* Scans for BLE devices. This function operates similarly to the `startScan` function, but allows you to specify extra options (like allowing duplicate device reports).
@@ -220,7 +230,7 @@ export class BLE {
clearFunction: 'stopScan',
clearWithArgs: false
})
static startScanWithOptions(services: string[], options: {reportDuplicates?: boolean} | any): Observable<any> { return; }
startScanWithOptions(services: string[], options: {reportDuplicates?: boolean} | any): Observable<any> { return; }
/**
* Stop a scan started by `startScan`.
@@ -237,7 +247,7 @@ export class BLE {
* @return returns a Promise.
*/
@Cordova()
static stopScan(): Promise<any> { return; }
stopScan(): Promise<any> { return; }
/**
* Connect to a peripheral.
@@ -258,7 +268,7 @@ export class BLE {
clearFunction: 'disconnect',
clearWithArgs: true
})
static connect(deviceId: string): Observable<any> { return; }
connect(deviceId: string): Observable<any> { return; }
/**
* Disconnect from a peripheral.
@@ -272,7 +282,7 @@ export class BLE {
* @return Returns a Promise
*/
@Cordova()
static disconnect(deviceId: string): Promise<any> { return; }
disconnect(deviceId: string): Promise<any> { return; }
/**
* Read the value of a characteristic.
@@ -283,7 +293,7 @@ export class BLE {
* @return Returns a Promise
*/
@Cordova()
static read(
read(
deviceId: string,
serviceUUID: string,
characteristicUUID: string
@@ -318,7 +328,7 @@ export class BLE {
* @return Returns a Promise
*/
@Cordova()
static write(
write(
deviceId: string,
serviceUUID: string,
characteristicUUID: string,
@@ -335,7 +345,7 @@ export class BLE {
* @return Returns a Promise
*/
@Cordova()
static writeWithoutResponse(
writeWithoutResponse(
deviceId: string,
serviceUUID: string,
characteristicUUID: string,
@@ -362,7 +372,7 @@ export class BLE {
clearFunction: 'stopNotification',
clearWithArgs: true
})
static startNotification(
startNotification(
deviceId: string,
serviceUUID: string,
characteristicUUID: string
@@ -377,7 +387,7 @@ export class BLE {
* @returns {Promise<any>}
*/
@Cordova()
static stopNotification(
stopNotification(
deviceId: string,
serviceUUID: string,
characteristicUUID: string
@@ -397,7 +407,7 @@ export class BLE {
* @returns {Promise<any>}
*/
@Cordova()
static isConnected(deviceId: string): Promise<any> { return; }
isConnected(deviceId: string): Promise<any> { return; }
/**
* Report if bluetooth is enabled.
@@ -405,7 +415,7 @@ export class BLE {
* @returns {Promise<void>} Returns a Promise that resolves if Bluetooth is enabled, and rejects if disabled.
*/
@Cordova()
static isEnabled(): Promise<void> { return; }
isEnabled(): Promise<void> { return; }
/**
* Open System Bluetooth settings (Android only).
@@ -413,7 +423,7 @@ export class BLE {
* @returns {Promise<any>}
*/
@Cordova()
static showBluetoothSettings(): Promise<any> { return; }
showBluetoothSettings(): Promise<any> { return; }
/**
* Enable Bluetooth on the device (Android only).
@@ -421,6 +431,6 @@ export class BLE {
* @returns {Promise<any>}
*/
@Cordova()
static enable(): Promise<any> { return; }
enable(): Promise<any> { return; }
}

View File

@@ -1,4 +1,5 @@
import { Cordova, Plugin } from './plugin';
import { Injectable } from '@angular/core';
import { Cordova, Plugin } from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
/**
@@ -6,14 +7,16 @@ import { Observable } from 'rxjs/Observable';
* @description This plugin enables serial communication over Bluetooth. It was written for communicating between Android or iOS and an Arduino.
* @usage
* ```typescript
* import { BluetoothSerial } from 'ionic-native';
* import { BluetoothSerial } from '@ionic-native/bluetooth-serial';
*
* constructor(private bluetoothSerial: BluetoothSerial) { }
*
*
* // Write a string
* BluetoothSerial.write("hello world").then(success, failure);
* this.bluetoothSerial.write("hello world").then(success, failure);
*
* // Array of int or bytes
* BluetoothSerial.write([186, 220, 222]).then(success, failure);
* this.bluetoothSerial.write([186, 220, 222]).then(success, failure);
*
* // Typed Array
* var data = new Uint8Array(4);
@@ -21,10 +24,10 @@ import { Observable } from 'rxjs/Observable';
* data[1] = 0x42;
* data[2] = 0x43;
* data[3] = 0x44;
* BluetoothSerial.write(data).then(success, failure);
* this.bluetoothSerial.write(data).then(success, failure);
*
* // Array Buffer
* BluetoothSerial.write(data.buffer).then(success, failure);
* this.bluetoothSerial.write(data.buffer).then(success, failure);
* ```
*/
@Plugin({
@@ -34,6 +37,7 @@ import { Observable } from 'rxjs/Observable';
pluginRef: 'bluetoothSerial',
platforms: ['Android', 'iOS', 'Windows Phone', 'Browser']
})
@Injectable()
export class BluetoothSerial {
/**
@@ -46,7 +50,7 @@ export class BluetoothSerial {
observable: true,
clearFunction: 'disconnect'
})
static connect(macAddress_or_uuid: string): Observable<any> { return; }
connect(macAddress_or_uuid: string): Observable<any> { return; }
/**
* Connect insecurely to a Bluetooth device
@@ -58,7 +62,14 @@ export class BluetoothSerial {
observable: true,
clearFunction: 'disconnect'
})
static connectInsecure(macAddress: string): Observable<any> { return; }
connectInsecure(macAddress: string): Observable<any> { return; }
/**
* Disconnect from the connected device
* @returns {Promise<any>}
*/
@Cordova()
disconnect(): Promise<any> { return; }
/**
* Writes data to the serial port
@@ -68,7 +79,7 @@ export class BluetoothSerial {
@Cordova({
platforms: ['Android', 'iOS', 'Windows Phone']
})
static write(data: any): Promise<any> { return; }
write(data: any): Promise<any> { return; }
/**
* Gets the number of bytes of data available
@@ -76,7 +87,7 @@ export class BluetoothSerial {
*/
@Cordova({
platforms: ['Android', 'iOS', 'Windows Phone']
}) static available(): Promise<any> { return; }
}) available(): Promise<any> { return; }
/**
* Reads data from the buffer
@@ -85,7 +96,7 @@ export class BluetoothSerial {
@Cordova({
platforms: ['Android', 'iOS', 'Windows Phone']
})
static read(): Promise<any> { return; }
read(): Promise<any> { return; }
/**
* Reads data from the buffer until it reaches a delimiter
@@ -95,7 +106,7 @@ export class BluetoothSerial {
@Cordova({
platforms: ['Android', 'iOS', 'Windows Phone']
})
static readUntil(delimiter: string): Promise<any> { return; }
readUntil(delimiter: string): Promise<any> { return; }
/**
* Subscribe to be notified when data is received
@@ -107,7 +118,7 @@ export class BluetoothSerial {
observable: true,
clearFunction: 'unsubscribe'
})
static subscribe(delimiter: string): Observable<any> { return; }
subscribe(delimiter: string): Observable<any> { return; }
/**
* Subscribe to be notified when data is received
@@ -118,7 +129,7 @@ export class BluetoothSerial {
observable: true,
clearFunction: 'unsubscribeRawData'
})
static subscribeRawData(): Observable<any> { return; }
subscribeRawData(): Observable<any> { return; }
/**
* Clears data in buffer
@@ -127,7 +138,7 @@ export class BluetoothSerial {
@Cordova({
platforms: ['Android', 'iOS', 'Windows Phone']
})
static clear(): Promise<any> { return; }
clear(): Promise<any> { return; }
/**
* Lists bonded devices
@@ -136,7 +147,7 @@ export class BluetoothSerial {
@Cordova({
platforms: ['Android', 'iOS', 'Windows Phone']
})
static list(): Promise<any> { return; }
list(): Promise<any> { return; }
/**
* Reports if bluetooth is enabled
@@ -145,7 +156,7 @@ export class BluetoothSerial {
@Cordova({
platforms: ['Android', 'iOS', 'Windows Phone']
})
static isEnabled(): Promise<any> { return; }
isEnabled(): Promise<any> { return; }
/**
* Reports the connection status
@@ -154,7 +165,7 @@ export class BluetoothSerial {
@Cordova({
platforms: ['Android', 'iOS', 'Windows Phone']
})
static isConnected(): Promise<any> { return; }
isConnected(): Promise<any> { return; }
/**
* Reads the RSSI from the connected peripheral
@@ -163,7 +174,7 @@ export class BluetoothSerial {
@Cordova({
platforms: ['Android', 'iOS', 'Windows Phone']
})
static readRSSI(): Promise<any> { return; }
readRSSI(): Promise<any> { return; }
/**
* Show the Bluetooth settings on the device
@@ -172,7 +183,7 @@ export class BluetoothSerial {
@Cordova({
platforms: ['Android', 'iOS', 'Windows Phone']
})
static showBluetoothSettings(): Promise<any> { return; }
showBluetoothSettings(): Promise<any> { return; }
/**
* Enable Bluetooth on the device
@@ -181,7 +192,7 @@ export class BluetoothSerial {
@Cordova({
platforms: ['Android', 'iOS', 'Windows Phone']
})
static enable(): Promise<any> { return; }
enable(): Promise<any> { return; }
/**
* Discover unpaired devices
@@ -190,7 +201,7 @@ export class BluetoothSerial {
@Cordova({
platforms: ['Android', 'iOS', 'Windows Phone']
})
static discoverUnpaired(): Promise<any> { return; }
discoverUnpaired(): Promise<any> { return; }
/**
* Subscribe to be notified on Bluetooth device discovery. Discovery process must be initiated with the `discoverUnpaired` function.
@@ -201,7 +212,7 @@ export class BluetoothSerial {
observable: true,
clearFunction: 'clearDeviceDiscoveredListener'
})
static setDeviceDiscoveredListener(): Observable<any> { return; }
setDeviceDiscoveredListener(): Observable<any> { return; }
/**
* Sets the human readable device name that is broadcasted to other devices
@@ -211,7 +222,7 @@ export class BluetoothSerial {
platforms: ['Android'],
sync: true
})
static setName(newName: string): void { }
setName(newName: string): void { }
/**
* Makes the device discoverable by other devices
@@ -221,6 +232,6 @@ export class BluetoothSerial {
platforms: ['Android'],
sync: true
})
static setDiscoverable(discoverableDuration: number): void { }
setDiscoverable(discoverableDuration: number): void { }
}

View File

@@ -1,4 +1,5 @@
import { Cordova, Plugin } from './plugin';
import { Injectable } from '@angular/core';
import { Cordova, Plugin } from '@ionic-native/core';
/**
* @name Brightness
@@ -9,11 +10,14 @@ import { Cordova, Plugin } from './plugin';
*
* @usage
* ```typescript
* import { Brightness } from 'ionic-native';
* import { Brightness } from '@ionic-native/brightness';
*
* constructor(private brightness: Brightness) { }
*
* ...
*
* let brightnessValue: number = 0.8;
* Brightness.setBrightness(brightnessValue);
* this.brightness.setBrightness(brightnessValue);
* ```
*
*/
@@ -24,6 +28,7 @@ import { Cordova, Plugin } from './plugin';
repo: 'https://github.com/mgcrea/cordova-plugin-brightness',
platforms: ['Android', 'iOS']
})
@Injectable()
export class Brightness {
/**
@@ -33,7 +38,7 @@ export class Brightness {
* @returns {Promise<any>} Returns a Promise that resolves if setting brightness was successful.
*/
@Cordova()
static setBrightness(value: number): Promise<any> { return; }
setBrightness(value: number): Promise<any> { return; }
/**
* Reads the current brightness of the device display.
@@ -42,12 +47,12 @@ export class Brightness {
* brightness value of the device display (floating number between 0 and 1).
*/
@Cordova()
static getBrightness(): Promise<any> { return; }
getBrightness(): Promise<any> { return; }
/**
* Keeps the screen on. Prevents the device from setting the screen to sleep.
*/
@Cordova()
static setKeepScreenOn(value: boolean): void { }
setKeepScreenOn(value: boolean): void { }
}

View File

@@ -1,4 +1,5 @@
import { Plugin, Cordova } from './plugin';
import { Injectable } from '@angular/core';
import { Plugin, Cordova } from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
/**
@@ -8,13 +9,17 @@ import { Observable } from 'rxjs/Observable';
*
* @usage
* ```
* import { Broadcaster } from 'ionic-native';
* import { Broadcaster } from '@ionic-native/broadcaster';
*
* constructor(private broadcaster: Broadcaster) { }
*
* ...
*
* // Listen to events from Native
* Broadcaster.addEventListener('eventName').then((event) => console.log(event));
* this.broadcaster.addEventListener('eventName').then((event) => console.log(event));
*
* // Send event to Native
* Broadcaster.fireNativeEvent('eventName', {}).then(() => console.log('success'));
* this.broadcaster.fireNativeEvent('eventName', {}).then(() => console.log('success'));
*
* ```
*/
@@ -25,6 +30,7 @@ import { Observable } from 'rxjs/Observable';
repo: 'https://github.com/bsorrentino/cordova-broadcaster',
platforms: ['Android', 'iOS']
})
@Injectable()
export class Broadcaster {
/**
@@ -37,7 +43,7 @@ export class Broadcaster {
clearFunction: 'removeEventListener',
clearWithArgs: true
})
static addEventListener(eventName: string): Observable<any> { return; }
addEventListener(eventName: string): Observable<any> { return; }
/**
* This function sends data to the native code
@@ -46,6 +52,6 @@ export class Broadcaster {
* @return {Promise<any>} Returns a promise that resolves when an event is successfully fired
*/
@Cordova()
static fireNativeEvent(eventName: string, eventData: any): Promise<any> { return; }
fireNativeEvent(eventName: string, eventData: any): Promise<any> { return; }
}

View File

@@ -0,0 +1,66 @@
import { Plugin, Cordova } from '@ionic-native/core';
import { Injectable } from '@angular/core';
/**
* @name Browser Tab
* @description
* This plugin provides an interface to in-app browser tabs that exist on some mobile platforms, specifically [Custom Tabs](http://developer.android.com/tools/support-library/features.html#custom-tabs) on Android (including the [Chrome Custom Tabs](https://developer.chrome.com/multidevice/android/customtabs) implementation), and [SFSafariViewController](https://developer.apple.com/library/ios/documentation/SafariServices/Reference/SFSafariViewController_Ref/) on iOS.
*
* @usage
* ```
* import { BrowserTab } from '@ionic-native/browser-tab';
*
* constructor(private browserTab: BrowserTab) {
*
* browserTab.isAvailable()
* .then((isAvailable: boolean) => {
*
* if (isAvailable) {
*
* browserTab.open('https://ionic.io');
*
* } else {
*
* // open URL with InAppBrowser instead or SafariViewController
*
* }
*
* });
*
*
* }
*
* ```
*/
@Plugin({
pluginName: 'BrowserTab',
plugin: 'cordova-plugin-browsertab',
pluginRef: 'cordova.plugins.browsertab',
repo: 'https://github.com/google/cordova-plugin-browsertab',
platforms: ['Android', 'iOS']
})
@Injectable()
export class BrowserTab {
/**
* Check if BrowserTab option is available
* @return {Promise<any>} Returns a promise that resolves when check is successful and returns true or false
*/
@Cordova()
isAvailable(): Promise<any> { return; }
/**
* Opens the provided URL using a browser tab
* @param {string} url The URL you want to open
* @return {Promise<any>} Returns a promise that resolves when check open was successful
*/
@Cordova()
openUrl(url: string): Promise<any> { return; }
/**
* Closes browser tab
* @return {Promise<any>} Returns a promise that resolves when close was finished
*/
@Cordova()
close(): Promise<any> { return; }
}

View File

@@ -1,8 +1,6 @@
import { Cordova, Plugin } from './plugin';
import { Injectable } from '@angular/core';
import { Cordova, Plugin } from '@ionic-native/core';
/**
* @private
*/
export interface CalendarOptions {
/**
@@ -62,11 +60,12 @@ export interface CalendarOptions {
*
* @usage
* ```
* import {Calendar} from 'ionic-native';
* import {Calendar} from '@ionic-native/calendar';
*
* constructor(private calendar: Calendar) { }
*
*
*
* Calendar.createCalendar('MyCalendar').then(
* this.calendar.createCalendar('MyCalendar').then(
* (msg) => { console.log(msg); },
* (err) => { console.log(err); }
* );
@@ -81,6 +80,7 @@ export interface CalendarOptions {
repo: 'https://github.com/EddyVerbruggen/Calendar-PhoneGap-Plugin',
platforms: ['Android', 'iOS']
})
@Injectable()
export class Calendar {
/**
@@ -95,42 +95,42 @@ export class Calendar {
* @returns {Promise<boolean>}
*/
@Cordova()
static hasReadWritePermission(): Promise<boolean> { return; }
hasReadWritePermission(): Promise<boolean> { return; }
/**
* Check if we have read permission
* @returns {Promise<boolean>}
*/
@Cordova()
static hasReadPermission(): Promise<boolean> { return; }
hasReadPermission(): Promise<boolean> { return; }
/**
* Check if we have write permission
* @returns {Promise<boolean>}
*/
@Cordova()
static hasWritePermission(): Promise<boolean> { return; }
hasWritePermission(): Promise<boolean> { return; }
/**
* Request write permission
* @returns {Promise<any>}
*/
@Cordova()
static requestWritePermission(): Promise<any> { return; }
requestWritePermission(): Promise<any> { return; }
/**
* Request read permission
* @returns {Promise<any>}
*/
@Cordova()
static requestReadPermission(): Promise<any> { return; }
requestReadPermission(): Promise<any> { return; }
/**
* Requests read/write permissions
* @returns {Promise<any>}
*/
@Cordova()
static requestReadWritePermission(): Promise<any> { return; }
requestReadWritePermission(): Promise<any> { return; }
/**
* Create a calendar. (iOS only)
@@ -139,7 +139,7 @@ export class Calendar {
* @returns {Promise<any>} Returns a Promise
*/
@Cordova()
static createCalendar(nameOrOptions: string | any): Promise<any> { return; }
createCalendar(nameOrOptions: string | any): Promise<any> { return; }
/**
* Delete a calendar. (iOS only)
@@ -147,7 +147,7 @@ export class Calendar {
* @returns {Promise<any>} Returns a Promise
*/
@Cordova()
static deleteCalendar(name: string): Promise<any> { return; }
deleteCalendar(name: string): Promise<any> { return; }
/**
* Returns the default calendar options.
@@ -157,7 +157,7 @@ export class Calendar {
@Cordova({
sync: true
})
static getCalendarOptions(): CalendarOptions { return; }
getCalendarOptions(): CalendarOptions { return; }
/**
* Silently create an event.
@@ -169,7 +169,7 @@ export class Calendar {
* @returns {Promise<any>} Returns a Promise
*/
@Cordova()
static createEvent(
createEvent(
title?: string,
location?: string,
notes?: string,
@@ -189,7 +189,7 @@ export class Calendar {
* @returns {Promise<any>} Returns a Promise
*/
@Cordova()
static createEventWithOptions(
createEventWithOptions(
title?: string,
location?: string,
notes?: string,
@@ -209,7 +209,7 @@ export class Calendar {
* @returns {Promise<any>} Returns a Promise
*/
@Cordova()
static createEventInteractively(
createEventInteractively(
title?: string,
location?: string,
notes?: string,
@@ -229,7 +229,7 @@ export class Calendar {
* @returns {Promise<any>}
*/
@Cordova()
static createEventInteractivelyWithOptions(
createEventInteractivelyWithOptions(
title?: string,
location?: string,
notes?: string,
@@ -238,17 +238,6 @@ export class Calendar {
options?: CalendarOptions
): Promise<any> { return; }
// deprecated
// @Cordova()
// static createEventInNamedCalendar(
// title?: string,
// location?: string,
// notes?: string,
// startDate?: Date,
// endDate?: Date,
// calendarName?: string
// ) {}
/**
* Find an event.
*
@@ -260,7 +249,7 @@ export class Calendar {
* @returns {Promise<any>}
*/
@Cordova()
static findEvent(
findEvent(
title?: string,
location?: string,
notes?: string,
@@ -279,7 +268,7 @@ export class Calendar {
* @returns {Promise<any>} Returns a Promise that resolves with the event, or rejects with an error.
*/
@Cordova()
static findEventWithOptions(
findEventWithOptions(
title?: string,
location?: string,
notes?: string,
@@ -298,14 +287,14 @@ export class Calendar {
@Cordova({
platforms: ['Android']
})
static listEventsInRange(startDate: Date, endDate: Date): Promise<any> { return; }
listEventsInRange(startDate: Date, endDate: Date): Promise<any> { return; }
/**
* Get a list of all calendars.
* @returns {Promise<any>} A Promise that resolves with the list of calendars, or rejects with an error.
*/
@Cordova()
static listCalendars(): Promise<any> { return; }
listCalendars(): Promise<any> { return; }
/**
* Get a list of all future events in the specified calendar. (iOS only)
@@ -314,7 +303,7 @@ export class Calendar {
@Cordova({
platforms: ['iOS']
})
static findAllEventsInNamedCalendar(calendarName: string): Promise<any> { return; }
findAllEventsInNamedCalendar(calendarName: string): Promise<any> { return; }
/**
* Modify an event. (iOS only)
@@ -334,7 +323,7 @@ export class Calendar {
@Cordova({
platforms: ['iOS']
})
static modifyEvent(
modifyEvent(
title?: string,
location?: string,
notes?: string,
@@ -367,7 +356,7 @@ export class Calendar {
@Cordova({
platforms: ['iOS']
})
static modifyEventWithOptions(
modifyEventWithOptions(
title?: string,
location?: string,
notes?: string,
@@ -393,7 +382,7 @@ export class Calendar {
* @return Returns a Promise
*/
@Cordova()
static deleteEvent(
deleteEvent(
title?: string,
location?: string,
notes?: string,
@@ -415,7 +404,7 @@ export class Calendar {
@Cordova({
platforms: ['iOS']
})
static deleteEventFromNamedCalendar(
deleteEventFromNamedCalendar(
title?: string,
location?: string,
notes?: string,
@@ -430,6 +419,6 @@ export class Calendar {
* @return {Promise<any>} Promise returns a promise
*/
@Cordova()
static openCalendar(date: Date): Promise<any> { return; }
openCalendar(date: Date): Promise<any> { return; }
}

View File

@@ -1,15 +1,20 @@
import { Plugin, Cordova } from './plugin';
import { Injectable } from '@angular/core';
import { Plugin, Cordova } from '@ionic-native/core';
/**
* @name CallNumber
* @name Call Number
* @description
* Call a number directly from your Cordova/Ionic application.
*
* @usage
* ```
* import {CallNumber} from 'ionic-native';
* import {CallNumber} from '@ionic-native/call-number';
*
* CallNumber.callNumber(18001010101, true)
* constructor(private callNumber: CallNumber) { }
*
* ...
*
*
* this.callNumber.callNumber(18001010101, true)
* .then(() => console.log('Launched dialer!'))
* .catch(() => console.log('Error launching dialer'));
*
@@ -22,6 +27,7 @@ import { Plugin, Cordova } from './plugin';
repo: 'https://github.com/Rohfosho/CordovaCallNumberPlugin',
platforms: ['iOS', 'Android']
})
@Injectable()
export class CallNumber {
/**
@@ -33,7 +39,7 @@ export class CallNumber {
@Cordova({
callbackOrder: 'reverse'
})
static callNumber(numberToCall: string, bypassAppChooser: boolean): Promise<any> {
callNumber(numberToCall: string, bypassAppChooser: boolean): Promise<any> {
return;
}

View File

@@ -1,6 +1,6 @@
import { Cordova, Plugin } from './plugin';
import { Injectable } from '@angular/core';
import { Cordova, Plugin } from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
export interface CameraPreviewRect {
x: number;
@@ -23,7 +23,7 @@ export interface CameraPreviewSize {
/**
* @beta
* @name CameraPreview
* @name Camera Preview
* @description
* Showing camera preview in HTML
*
@@ -31,7 +31,11 @@ export interface CameraPreviewSize {
*
* @usage
* ```
* import { CameraPreview, CameraPreviewRect } from 'ionic-native';
* import { CameraPreview, CameraPreviewRect } from '@ionic-native/camera-preview';
*
* constructor(private cameraPreview: CameraPreview) { }
*
* ...
*
* // camera options (Size and location)
* let cameraRect: CameraPreviewRect = {
@@ -43,7 +47,7 @@ export interface CameraPreviewSize {
*
*
* // start camera
* CameraPreview.startCamera(
* this.cameraPreview.startCamera(
* cameraRect, // position and size of preview
* 'front', // default camera
* true, // tap to take picture
@@ -53,26 +57,26 @@ export interface CameraPreviewSize {
* );
*
* // Set the handler to run every time we take a picture
* CameraPreview.setOnPictureTakenHandler().subscribe((result) => {
* this.cameraPreview.setOnPictureTakenHandler().subscribe((result) => {
* console.log(result);
* // do something with the result
* });
*
*
* // take a picture
* CameraPreview.takePicture({
* this.cameraPreview.takePicture({
* maxWidth: 640,
* maxHeight: 640
* });
*
* // Switch camera
* CameraPreview.switchCamera();
* this.cameraPreview.switchCamera();
*
* // set color effect to negative
* CameraPreview.setColorEffect('negative');
* this.cameraPreview.setColorEffect('negative');
*
* // Stop the camera preview
* CameraPreview.stopCamera();
* this.cameraPreview.stopCamera();
*
* ```
*
@@ -87,6 +91,7 @@ export interface CameraPreviewSize {
repo: 'https://github.com/cordova-plugin-camera-preview/cordova-plugin-camera-preview',
platforms: ['Android', 'iOS']
})
@Injectable()
export class CameraPreview {
/**
@@ -101,7 +106,7 @@ export class CameraPreview {
@Cordova({
sync: true
})
static startCamera(rect: CameraPreviewRect, defaultCamera: string, tapEnabled: boolean, dragEnabled: boolean, toBack: boolean, alpha: number): void { }
startCamera(rect: CameraPreviewRect, defaultCamera: string, tapEnabled: boolean, dragEnabled: boolean, toBack: boolean, alpha: number): void { }
/**
* Stops the camera preview instance.
@@ -109,7 +114,7 @@ export class CameraPreview {
@Cordova({
sync: true
})
static stopCamera(): void { }
stopCamera(): void { }
/**
* Take the picture, the parameter size is optional
@@ -118,7 +123,7 @@ export class CameraPreview {
@Cordova({
sync: true
})
static takePicture(size?: CameraPreviewSize): void { }
takePicture(size?: CameraPreviewSize): void { }
/**
* Register a callback function that receives the original picture and the image captured from the preview box.
@@ -127,7 +132,7 @@ export class CameraPreview {
@Cordova({
observable: true
})
static setOnPictureTakenHandler(): Observable<any> { return; }
setOnPictureTakenHandler(): Observable<any> { return; }
/**
* Switch from the rear camera and front camera, if available.
@@ -135,7 +140,7 @@ export class CameraPreview {
@Cordova({
sync: true
})
static switchCamera(): void { }
switchCamera(): void { }
/**
* Show the camera preview box.
@@ -143,7 +148,7 @@ export class CameraPreview {
@Cordova({
sync: true
})
static show(): void { }
show(): void { }
/**
* Hide the camera preview box.
@@ -151,7 +156,7 @@ export class CameraPreview {
@Cordova({
sync: true
})
static hide(): void { }
hide(): void { }
/**
* Disables the camera preview
@@ -159,7 +164,7 @@ export class CameraPreview {
@Cordova({
sync: true
})
static disable(): void { }
disable(): void { }
/**
* Set camera color effect.
@@ -167,6 +172,6 @@ export class CameraPreview {
@Cordova({
sync: true
})
static setColorEffect(effect: string): void { }
setColorEffect(effect: string): void { }
}

View File

@@ -1,5 +1,5 @@
import { Cordova, Plugin } from './plugin';
import { Injectable } from '@angular/core';
import { Cordova, Plugin } from '@ionic-native/core';
export interface CameraOptions {
/** Picture quality in range 0-100. Default is 50 */
@@ -94,10 +94,21 @@ export interface CameraPopoverOptions {
*
* @usage
* ```typescript
* import { Camera } from 'ionic-native';
* import { Camera, CameraOptions } from '@ionic-native/camera';
*
* constructor(private camera: Camera) { }
*
* ...
*
*
* Camera.getPicture(options).then((imageData) => {
* constant options: CameraOptions = {
* quality: 100,
* destinationType: this.camera.DestinationType.DATA_URL,
* enodingType: this.camera.EncodingType.JPEG,
* mediaType: this.camera.MediaType.PICTURE
* }
*
* this.camera.getPicture(options).then((imageData) => {
* // imageData is either a base64 encoded string or a file URI
* // If it's base64:
* let base64Image = 'data:image/jpeg;base64,' + imageData;
@@ -109,6 +120,7 @@ export interface CameraPopoverOptions {
* CameraOptions
* CameraPopoverOptions
*/
@Injectable()
@Plugin({
pluginName: 'Camera',
plugin: 'cordova-plugin-camera',
@@ -119,10 +131,9 @@ export interface CameraPopoverOptions {
export class Camera {
/**
* @private
* @enum {number}
* Constant for possible destination types
*/
static DestinationType = {
DestinationType = {
/** Return base64 encoded string. DATA_URL can be very memory intensive and cause app crashes or out of memory errors. Use FILE_URI or NATIVE_URI if possible */
DATA_URL: 0,
/** Return file uri (content://media/external/images/media/2 for Android) */
@@ -132,20 +143,19 @@ export class Camera {
};
/**
* @private
* @enum {number}
* Convenience constant
*/
static EncodingType = {
EncodingType = {
/** Return JPEG encoded image */
JPEG: 0,
/** Return PNG encoded image */
PNG: 1
};
/**
* @private
* @enum {number}
* Convenience constant
*/
static MediaType = {
MediaType = {
/** Allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType */
PICTURE: 0,
/** Allow selection of video only, ONLY RETURNS URL */
@@ -154,11 +164,11 @@ export class Camera {
ALLMEDIA: 2
};
/**
* @private
* @enum {number}
* Convenience constant
*/
static PictureSourceType = {
PictureSourceType = {
/** Choose image from picture library (same as SAVEDPHOTOALBUM for Android) */
PHOTOLIBRARY: 0,
/** Take picture from camera */
@@ -167,12 +177,11 @@ export class Camera {
SAVEDPHOTOALBUM: 2
};
/**
* @private
* Matches iOS UIPopoverArrowDirection constants to specify arrow location on popover.
* @enum {number}
* Convenience constant
*/
static PopoverArrowDirection = {
PopoverArrowDirection = {
ARROW_UP: 1,
ARROW_DOWN: 2,
ARROW_LEFT: 4,
@@ -181,10 +190,9 @@ export class Camera {
};
/**
* @private
* @enum {number}
* Convenience constant
*/
static Direction = {
Direction = {
/** Use the back-facing camera */
BACK: 0,
/** Use the front-facing camera */
@@ -199,7 +207,7 @@ export class Camera {
@Cordova({
callbackOrder: 'reverse'
})
static getPicture(options?: CameraOptions): Promise<any> { return; }
getPicture(options?: CameraOptions): Promise<any> { return; }
/**
* Remove intermediate image files that are kept in temporary storage after calling camera.getPicture.
@@ -209,6 +217,6 @@ export class Camera {
@Cordova({
platforms: ['iOS']
})
static cleanup(): Promise<any> { return; };
cleanup(): Promise<any> { return; };
}

View File

@@ -1,5 +1,5 @@
import { Cordova, Plugin } from './plugin';
import { Injectable } from '@angular/core';
import { Cordova, Plugin } from '@ionic-native/core';
export interface CardIOOptions {
@@ -130,14 +130,18 @@ export interface CardIOResponse {
}
/**
* @name CardIO
* @name Card IO
* @description
* @usage
* ```
* import { CardIO } from 'ionic-native';
* import { CardIO } from '@ionic-native/card-io';
*
* constructor(private cardIO: CardIO) { }
*
* ...
*
*
* CardIO.canScan()
* this.cardIO.canScan()
* .then(
* (res: boolean) => {
* if(res){
@@ -162,6 +166,7 @@ export interface CardIOResponse {
repo: 'https://github.com/card-io/card.io-Cordova-Plugin',
platforms: ['iOS', 'Android']
})
@Injectable()
export class CardIO {
/**
@@ -171,7 +176,7 @@ export class CardIO {
* @returns {Promise<boolean>}
*/
@Cordova()
static canScan(): Promise<boolean> { return; }
canScan(): Promise<boolean> { return; }
/**
* Scan a credit card with card.io.
@@ -179,13 +184,13 @@ export class CardIO {
* @returns {Promise<any>}
*/
@Cordova()
static scan(options?: CardIOOptions): Promise<CardIOResponse> { return; }
scan(options?: CardIOOptions): Promise<CardIOResponse> { return; }
/**
* Retrieve the version of the card.io library. Useful when contacting support.
* @returns {Promise<string>}
*/
@Cordova()
static version(): Promise<string> { return; }
version(): Promise<string> { return; }
}

View File

@@ -1,5 +1,5 @@
import { Cordova, Plugin } from './plugin';
import { Injectable } from '@angular/core';
import { Cordova, Plugin } from '@ionic-native/core';
/**
* @name Clipboard
* @description
@@ -10,20 +10,23 @@ import { Cordova, Plugin } from './plugin';
*
* @usage
* ```typescript
* import { Clipboard } from 'ionic-native';
* import { Clipboard } from '@ionic-native/clipboard';
*
* constructor(private clipboard: Clipboard) { }
*
* ...
*
*
* Clipboard.copy('Hello world');
* this.clipboard.copy('Hello world');
*
* Clipboard.paste().then(
* this.clipboard.paste().then(
* (resolve: string) => {
* alert(resolve);
* alert(resolve);
* },
* (reject: string) => {
* alert('Error: ' + reject);
* alert('Error: ' + reject);
* }
* );
* );
* );
* ```
*/
@Plugin({
@@ -33,6 +36,7 @@ import { Cordova, Plugin } from './plugin';
repo: 'https://github.com/VersoSolutions/CordovaClipboard',
platforms: ['Amazon Fire OS', 'iOS', 'Android', 'BlackBerry 10', 'Windows Phone 7', 'Windows Phone 8', 'Windows', 'Firefox OS', 'Browser']
})
@Injectable()
export class Clipboard {
/**
@@ -41,13 +45,13 @@ export class Clipboard {
* @returns {Promise<any>} Returns a promise after the text has been copied
*/
@Cordova()
static copy(text: string): Promise<any> { return; }
copy(text: string): Promise<any> { return; }
/**
* Pastes the text stored in clipboard
* @returns {Promise<any>} Returns a promise after the text has been pasted
*/
@Cordova()
static paste(): Promise<any> { return; }
paste(): Promise<any> { return; }
}

View File

@@ -1,6 +1,6 @@
import { Cordova, Plugin } from './plugin';
import { Injectable } from '@angular/core';
import { Cordova, Plugin } from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
namespace Http {
export const enum Verb {
GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, CONNECT, PATCH
@@ -396,7 +396,7 @@ export interface DownloadProgress {
}
/**
* @name CodePush
* @name Code Push
* @description
* CodePush plugin for Cordova by Microsoft that supports iOS and Android.
*
@@ -404,14 +404,18 @@ export interface DownloadProgress {
*
* @usage
* ```typescript
* import { CodePush } from 'ionic-native';
* import { CodePush } from '@ionic-native/code-push';
*
* constructor(private codePush: CodePush) { }
*
* ...
*
* // note - mostly error & completed methods of observable will not fire
* // as syncStatus will contain the current state of the update
* CodePush.sync().subscribe((syncStatus) => console.log(syncStatus));
* this.codePush.sync().subscribe((syncStatus) => console.log(syncStatus));
*
* const downloadProgress = (progress) => { console.log(`Downloaded ${progress.receivedBytes} of ${progress.totalBytes}`); }
* CodePush.sync({}, downloadProgress).subscribe((syncStatus) => console.log(syncStatus));
* this.codePush.sync({}, downloadProgress).subscribe((syncStatus) => console.log(syncStatus));
*
* ```
*/
@@ -422,6 +426,7 @@ export interface DownloadProgress {
repo: 'https://github.com/Microsoft/cordova-plugin-code-push',
platforms: ['Android', 'iOS']
})
@Injectable()
export class CodePush {
/**
@@ -432,7 +437,7 @@ export class CodePush {
* @returns {Promise<ILocalPackage>}
*/
@Cordova()
static getCurrentPackage(): Promise<ILocalPackage> {
getCurrentPackage(): Promise<ILocalPackage> {
return;
}
@@ -442,7 +447,7 @@ export class CodePush {
* @returns {Promise<ILocalPackage>}
*/
@Cordova()
static getPendingPackage(): Promise<ILocalPackage> {
getPendingPackage(): Promise<ILocalPackage> {
return;
}
@@ -459,7 +464,7 @@ export class CodePush {
@Cordova({
callbackOrder: 'reverse'
})
static checkForUpdate(deploymentKey?: string): Promise<IRemotePackage> {
checkForUpdate(deploymentKey?: string): Promise<IRemotePackage> {
return;
}
@@ -473,7 +478,7 @@ export class CodePush {
* @returns {Promise<void>}
*/
@Cordova()
static notifyApplicationReady(): Promise<void> {
notifyApplicationReady(): Promise<void> {
return;
}
@@ -483,7 +488,7 @@ export class CodePush {
* @returns {Promise<void>}
*/
@Cordova()
static restartApplication(): Promise<void> {
restartApplication(): Promise<void> {
return;
}
@@ -513,7 +518,7 @@ export class CodePush {
successIndex: 0,
errorIndex: 3 // we don't need this, so we set it to a value higher than # of args
})
static sync(syncOptions?: SyncOptions, downloadProgress?: SuccessCallback<DownloadProgress>): Observable<SyncStatus> {
sync(syncOptions?: SyncOptions, downloadProgress?: SuccessCallback<DownloadProgress>): Observable<SyncStatus> {
return;
}

View File

@@ -1,13 +1,11 @@
import { CordovaInstance, InstanceProperty, Plugin, getPromise } from './plugin';
import { Injectable } from '@angular/core';
import { CordovaInstance, InstanceProperty, Plugin, getPromise } from '@ionic-native/core';
declare var window: any,
navigator: any;
export type ContactFieldType = 'addresses' | 'birthday' | 'categories' | 'country' | 'department' | 'displayName' | 'emails' | 'familyName' | 'formatted' | 'givenName' | 'honorificPrefix' | 'honorificSuffix' | 'id' | 'ims' | 'locality' | 'middleName' | 'name' | 'nickname' | 'note' | 'organizations' | 'phoneNumbers' | 'photos' | 'postalCode' | 'region' | 'streetAddress' | 'title' | 'urls';
export type ContactFieldType = '*' | 'addresses' | 'birthday' | 'categories' | 'country' | 'department' | 'displayName' | 'emails' | 'familyName' | 'formatted' | 'givenName' | 'honorificPrefix' | 'honorificSuffix' | 'id' | 'ims' | 'locality' | 'middleName' | 'name' | 'nickname' | 'note' | 'organizations' | 'phoneNumbers' | 'photos' | 'postalCode' | 'region' | 'streetAddress' | 'title' | 'urls';
/**
* @private
*/
export interface IContactProperties {
/** A globally unique identifier. */
@@ -54,7 +52,7 @@ export interface IContactProperties {
}
/**
* @private
* @hidden
*/
export class Contact implements IContactProperties {
private _objectInstance: any;
@@ -100,7 +98,7 @@ export class Contact implements IContactProperties {
}
/**
* @private
* @hidden
*/
export interface IContactError {
/** Error code */
@@ -110,7 +108,7 @@ export interface IContactError {
}
/**
* @private
* @hidden
*/
export declare var ContactError: {
new (code: number): IContactError;
@@ -139,7 +137,7 @@ export interface IContactName {
}
/**
* @private
* @hidden
*/
export class ContactName implements IContactName {
constructor(public formatted?: string,
@@ -160,7 +158,7 @@ export interface IContactField {
}
/**
* @private
* @hidden
*/
export class ContactField implements IContactField {
constructor(public type?: string,
@@ -188,7 +186,7 @@ export interface IContactAddress {
}
/**
* @private
* @hidden
*/
export class ContactAddress implements IContactAddress {
constructor(public pref?: boolean,
@@ -215,7 +213,7 @@ export interface IContactOrganization {
}
/**
* @private
* @hidden
*/
export class ContactOrganization implements IContactOrganization {
constructor(
@@ -242,7 +240,7 @@ export interface IContactFindOptions {
}
/**
* @private
* @hidden
*/
export class ContactFindOptions implements IContactFindOptions {
constructor(public filter?: string,
@@ -259,10 +257,11 @@ export class ContactFindOptions implements IContactFindOptions {
* @usage
*
* ```typescript
* import { Contacts, Contact, ContactField, ContactName } from 'ionic-native';
* import { Contacts, Contact, ContactField, ContactName } from '@ionic-native/contacts';
*
* constructor(private contacts: Contacts) { }
*
* let contact: Contact = Contacts.create();
* let contact: Contact = this.contacts.create();
*
* contact.name = new ContactName(null, 'Smith', 'John');
* contact.phoneNumbers = [new ContactField('mobile', '6471234567')];
@@ -272,6 +271,8 @@ export class ContactFindOptions implements IContactFindOptions {
* );
*
* ```
* @classes
* Contact
* @interfaces
* IContactProperties
* IContactError
@@ -287,13 +288,14 @@ export class ContactFindOptions implements IContactFindOptions {
pluginRef: 'navigator.contacts',
repo: 'https://github.com/apache/cordova-plugin-contacts'
})
@Injectable()
export class Contacts {
/**
* Create a single contact.
* @returns {Contact} Returns a Contact object
*/
static create(): Contact {
create(): Contact {
return new Contact();
}
@@ -303,7 +305,7 @@ export class Contacts {
* @param options {IContactFindOptions} Optional options for the query
* @returns {Promise<Contact[]>} Returns a Promise that resolves with the search results (an array of Contact objects)
*/
static find(fields: ContactFieldType[], options?: IContactFindOptions): Promise<Contact[]> {
find(fields: ContactFieldType[], options?: IContactFindOptions): Promise<Contact[]> {
return getPromise((resolve, reject) => {
navigator.contacts.find(fields, (contacts) => {
resolve(contacts.map(processContact));
@@ -315,7 +317,7 @@ export class Contacts {
* Select a single Contact.
* @returns {Promise<Contact>} Returns a Promise that resolves with the selected Contact
*/
static pickContact(): Promise<Contact> {
pickContact(): Promise<Contact> {
return getPromise((resolve, reject) => {
navigator.contacts.pickContact((contact) => resolve(processContact(contact)), reject);
});
@@ -324,7 +326,7 @@ export class Contacts {
}
/**
* @private
* @hidden
*/
function processContact(contact) {
let newContact = new Contact();

View File

@@ -0,0 +1,42 @@
import { Plugin, Cordova } from '@ionic-native/core';
import { Injectable } from '@angular/core';
/**
* @name Couchbase Lite
* @description
* Plugin to install Couchbase Lite in your PhoneGap app on iOS or Android
*
* @usage
* ```
* import { CouchbaseLite } from '@ionic-native/couchbase-lite';
*
* constructor(private couchbase: CouchbaseLite) {
*
* couchbase.getURL()
* .then(url => console.log(url))
* .catch(error => console.error(error));
*
* }
*
* ```
*/
@Plugin({
pluginName: 'CouchbaseLite',
plugin: 'https://github.com/couchbaselabs/Couchbase-Lite-PhoneGap-Plugin',
pluginRef: 'cblite',
repo: 'https://github.com/couchbaselabs/Couchbase-Lite-PhoneGap-Plugin',
})
@Injectable()
export class CouchbaseLite {
/**
* Get the database url
* @return {Promise<any>} Returns a promise that resolves with the local database url
*/
@Cordova({
callbackStyle: 'node'
})
getURL(): Promise<any> { return; }
}

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