Compare commits

..
Author SHA1 Message Date
Daniel 3ed896960e chore(): update changelog 2018-06-28 14:12:07 +02:00
Daniel 249d62d4ba set version 2018-06-28 14:04:42 +02:00
Daniel 1d71bdc284 chore(build): test against node 8 2018-06-28 13:51:35 +02:00
Daniel 189d66cc47 fix(index-app-content): fix imports 2018-06-28 13:49:30 +02:00
Daniel fe5b7ce0af docs(index-app-content): fix spelling and lint errors 2018-06-28 13:47:09 +02:00
Adrian SavinandDaniel Sogl 98d44e6294 fix(healt): add correct return type for query function (#2565)
* update query return type

query is always returning an array

* refactor
2018-06-25 20:09:46 +02:00
Daniel SoglandGitHub 8d571989d4 fix(index-app-content): add missing function 2018-06-25 20:08:28 +02:00
Simpler1andDaniel Sogl e61d574849 feat(plugin): add Sensors plugin (#2268)
* feat(sensors): New plugin for sensors

* refactor

* refactor
2018-06-25 14:35:37 +02:00
Pandiarajan NagarajanandDaniel Sogl fdd63153e0 feat(aes-256): AES256 encryption and decryption plugin added (#2562)
* feat(aes-256): AES256 encryption and decryption plugin added

* refactor
2018-06-25 14:28:15 +02:00
Florian GouyandDaniel Sogl 9dd4ecde9c docs(camera): Update docs to advise against DATA_URL (#2474)
DATA_URL can be very memory intensive and cause app crashes or out of memory errors.
Use FILE_URI or NATIVE_URI if possible
2018-06-23 17:18:34 +02:00
RobandDaniel Sogl dd9ba0ad3f feat(image-picker): add DATA_URL as an option to ImagePicker (#2325)
As documented in the image picker plugin, it also supports a data url, just like the camera does. However, this option is not documented in Ionic Native currently. I've added this documentation, and have also added an enum with a naming pattern that matches the DestinationType in Camera.

Docs from the image picker plugin:
```
    ...
    // output type, defaults to FILE_URIs.
    // available options are 
    // window.imagePicker.OutputType.FILE_URI (0) or 
    // window.imagePicker.OutputType.BASE64_STRING (1)
    outputType: int
};
```
2018-06-23 17:14:55 +02:00
Sebastian BaarandDaniel Sogl 9f662b6a04 feat(nativegeocoder): change return type to array and add options param (#2319)
* feat(nativegeocoder): add NativeGeocoder plugin

* add district

* update NativeGeocoderReverseResult & refactor code

* delete plugins

* delete index.ts

* type(feat): change return type to array and add options param

* Add 'defaultLocale' to options Object

* let options be optional
2018-06-23 17:14:14 +02:00
Gustav BylundandDaniel Sogl 1dc48e943c docs(pro): add types for return values in deploy (#2292) 2018-06-23 17:14:03 +02:00
Daniel 15a334d87a Merge remote-tracking branch 'origin/master' 2018-06-22 17:54:46 +02:00
Daniel 4d742438b4 chore(): update changelog 2018-06-22 17:54:19 +02:00
Daniel 1013a7d38a 4.8.0 2018-06-22 17:38:17 +02:00
Daniel c574428e0e chore(package): bump deps 2018-06-22 17:36:50 +02:00
MosheandDaniel Sogl ce3591200e docs(card-io): fix example (#2560)
Property 'scan' does not exist on type 'typeof CardIO'
2018-06-21 07:45:44 +02:00
Jonathan FernandezandDaniel Sogl fc088f8431 fix(onesignal): update OSPermissionState interface (#2561)
fix(onesignal): update OSPermissionState interface
2018-06-21 07:45:02 +02:00
Cristian Rivas GómezandDaniel Sogl 392bc5c80a docs(hotspot): add plugin description (#2555) 2018-06-16 11:36:36 +02:00
devdaddyandDaniel Sogl 31fc892b70 feat(photo-library): add maxItems to limit items-iOS (#2554) 2018-06-15 18:14:39 +02:00
Cristian Rivas GómezandDaniel Sogl 5794d249c4 docs(spinner-dialog): add plugin description (#2553) 2018-06-15 17:45:01 +02:00
Frank KönigsteinandDaniel Sogl 3f8a6f2425 fix(background-geolocation): watchLocationMode returns observable (#2547)
* fix(background-geolocation): watchLocationMode returns observable

* fix(package): rm version change
2018-06-14 11:36:02 +02:00
Cristian Rivas GómezandDaniel Sogl dd769b0226 docs(safari-view-controller): add plugin description (#2552) 2018-06-14 07:58:38 +02:00
GabrielTKandDaniel Sogl 8460e6838a feat(hce): add hce plugin wrapper (#2534)
feat(hce): add hce plugin wrapper
2018-06-13 20:06:37 +02:00
DomvelandDaniel Sogl 03e6afbad4 feat(ble): update wrapper to match latest plugin release (#2548)
feat(ble): update wrapper to match latest plugin release
2018-06-13 20:05:05 +02:00
Gaetan WczandDaniel Sogl be370a4f99 fix(healths): add missing attribute on HealthQueryOptionsAggregated (#2550) 2018-06-13 20:04:32 +02:00
Cristian Rivas GómezandDaniel Sogl bb9c581f42 docs(qr-scanner): add plugin description (#2546) 2018-06-11 17:47:24 +02:00
Cristian Rivas GómezandDaniel Sogl d988e12353 docs(pin-dialog): add plugin description (#2545) 2018-06-10 10:54:00 +02:00
Bart WesselinkandDaniel Sogl df254de88b feat(SiriShortcuts): implement Siri Shortcuts plugin in Ionic (#2542)
* feat(SiriShortcuts): implement Siri Shortcuts plugin in Ionic

* refactor
2018-06-09 09:26:15 +02:00
Cristian Rivas GómezandDaniel Sogl 5803c069a3 Add Media Capture plugin description to documentation (#2539) 2018-06-07 08:47:38 +02:00
Cristian Rivas GómezandDaniel Sogl dfbbfc7bd5 docs(card-io): add plugin description (#2530)
* Add description to AdMob Free plugin documentation

* Add description to Card IO plugin documentation
2018-06-06 17:00:27 +02:00
Cristian Rivas GómezandDaniel Sogl 16980f1b6a docs(keyboard): add plugin description (#2533)
* Add description to AdMob Free plugin documentation

* Add plugin description to Keyboard plugin documentation
2018-06-06 13:46:12 +02:00
Cristian Rivas GómezandDaniel Sogl 3311d73730 docs(admob-free): add plugin description (#2529) 2018-06-04 11:29:55 +02:00
hiepxanhandDaniel Sogl a4cc7f7ae1 fix(themeable-browser): allow hidden and clear cache
it wrong from boolean to string, after 1 year i update it
2018-06-03 15:42:17 +02:00
Cristian Rivas GómezandDaniel Sogl e6b02b1875 docs(three-dee-touch): add plugin description (#2524) 2018-06-03 15:41:07 +02:00
Adam DurenandDaniel Sogl c03b73f69c feat(firebase-messaging): add firebase-messaging (#2518)
* feat(firebase-messaging): add firebase-messaging

* refactor
2018-06-03 15:33:18 +02:00
Adam DurenandDaniel Sogl 05423ce299 feat(firebase-config): add firebase-config wrapper (#2517)
* feat(firebase-config): add firebase-config wrapper

* refactor

* refactor
2018-06-03 15:32:04 +02:00
Wouter Klein HeerenbrinkandDaniel Sogl 34aeb19628 feat(send-result): add sendResult method for WebIntent plugin (#2495) 2018-05-27 19:01:36 +02:00
Geoff TripoliandDaniel Sogl d6a9ed134e fix(stripe): fixed casing of postal code param (#2520) 2018-05-22 22:12:13 +02:00
Behrooz ShafieeandIbby Hadeed a0183811f6 fix(in-app-purchase-2): fix ready method signature (#2043) 2018-05-20 13:21:21 -04:00
Cristian Rivas GómezandDaniel Sogl e6d4b41e7e docs(navigation-bar): fix typo
A small misspelling detected here 🙂
2018-05-19 16:56:04 +02:00
Dave AldenandDaniel Sogl 400dbcb1fb feat(cloud-settings): add support for cordova-plugin-cloud-settings (#2494)
* feat(cloud-settings): add support for cordova-plugin-cloud-settings

* refactor
2018-05-19 12:16:14 +02:00
mino922andDaniel Sogl ae6e28de88 feat(local-notifications): added support for foreground option in version 0.9.0-beta.3 of cordova-plugin-local-notifications (#2506) 2018-05-19 12:15:22 +02:00
Geoff TripoliandDaniel Sogl 58615f1cab feat(star-prnt): Added support for connected to devices with barcode readers (#2509) 2018-05-19 12:14:30 +02:00
Kheva MannandDaniel Sogl 7c355350fe feat(onesignal): Added notification stacking (#2512)
* Added collapse_id

Added collapse_id to allow for notification stacking

* Update index.ts
2018-05-19 12:14:12 +02:00
Szymon StasikandIbby Hadeed defb276b22 fix(native-geocoder): set response type to an array (#2505) 2018-05-16 19:16:39 -04:00
Kheva MannandIbby Hadeed e6db28123d fix(onesignal): make params optional (#2507)
Made all properties in OSNotification optional because when you create a push notification the type is OSNotification but it does not have all the same properties required as the OSNotification as a response from a received notification. For example, you don't pass in isAppInFocus when you create a notification but it was causing issues when trying to post a notification because it was showing as required because OSNotification as a response will always have isAppInFocus.
2018-05-16 19:14:27 -04:00
Marty AlcalaandIbby Hadeed 714114d1e0 fix(android-fingerprint-auth): ensure ERRORS array is defined (#2508) 2018-05-16 19:13:24 -04:00
AndyandDaniel Sogl 37ef2fc93f docs(file): fix example
docs(file): fix example
2018-05-09 18:11:55 +02:00
Eran ShmilovichandDaniel Sogl 41a4a43c0c fix(docs) replace android platform with ios (#2500) 2018-05-09 18:11:26 +02:00
Craig RouseandDaniel Sogl 5f41ef1cbc feat(tealium): add tealium ionic wrappers (#2414) 2018-05-03 12:42:47 +02:00
Daniel Imhoff cea1dc14d3 fix(site): no prepended slash 2018-05-02 11:28:40 -05:00
infoxicatorandDaniel Sogl 49ad2118a3 feat(star-prnt) add Encoding and CodePageType enum (#2488)
feat(star-prnt) add Encoding and CodePageType enum
2018-05-01 14:42:17 +02:00
Omar Ben brahimandDaniel Sogl bfe5ae9cf2 feat(InAppReview): add InAppReview plugin (#2483) 2018-05-01 14:41:57 +02:00
DarrynandDaniel Sogl 47f739777e fix(web-intent): registerBroadcastReceiver as Observable (#2491)
* Correcting format of registerBroadcastReceiver, current implementation provides no way to receive the registered broadcasts.
Usage is as follows:
webintent.registerBroadcastReceiver({
      filterActions: [
        'com.example.ACTION'
      ],
      filterCategories: [
        'android.intent.category.DEFAULT'
      ]
    }).subscribe((intent) => {console.log('Received Intent: ' + JSON.stringify(intent.extras));});

* Resolving linting errors

* Resolving additional linting error
2018-05-01 14:41:09 +02:00
Perry GovierandGitHub a1c54f36b4 Merge pull request #2490 from ionic-team/google-maps-docs
docs(google-maps): add menu entry for google maps plugin
2018-04-30 10:17:00 -05:00
Daniel Imhoff 22d5d92dd3 docs(google-maps): add menu entry for google maps plugin 2018-04-30 10:09:23 -05:00
Rida AmiriniandDaniel Sogl 3fa2eff580 docs(android-full-screen): edit example 2018-04-29 18:35:00 +02:00
Brian SoumakianandDaniel Sogl 567f525837 feat(firebase): add verifyPhoneNumber support for iOS
feat(firebase): verifyPhoneNumber now supports iOS
2018-04-26 08:14:14 +02:00
Silviu Bogdan StroeandDaniel Sogl 24cd0a91c4 docs(uptime): remove unnecessary line (#2479)
* docs(uptime): add cordova installation

* feat(uptime): add deep sleep parameter

* Update index.ts

* docs(Uptime): remove unnecessary line
2018-04-24 14:15:07 +02:00
Niklas MerzandDaniel Sogl 50c8c154e3 docs(calldirectory): fix typo (#2478)
I have spotted some typos and added an example for reload.
2018-04-24 11:38:02 +02:00
Niklas MerzandDaniel Sogl 1bfe82959b feat(calldirectory): add call directory plugin (#2473)
* feat(calldirectory): add call directory plugin

* feat(calldirectory): fix parameters and description

* fix typos
2018-04-23 19:36:33 +02:00
Niklas MerzandDaniel Sogl 35e5cfe102 chore(plugin-generator): remove notice of /src/index.ts (#2459) 2018-04-23 18:33:37 +02:00
infoxicatorandDaniel Sogl a1e6befbc0 feat(star-prnt): add StarPRNT plugin
* feat(star-prnt): create StarPRNT base class

* refactor(): refactor code

* refactor(): change JSDOC style
2018-04-23 18:30:58 +02:00
Daniel 234b6ffd44 chore(build): fix build 2018-04-21 15:39:43 +02:00
Daniel 5387bc985a refactor(network): fix rxjs imports 2018-04-21 15:30:41 +02:00
Daniel 8b1bb3ba17 refactor(ftp): fix rxjs import 2018-04-21 15:29:59 +02:00
Daniel a6450c6d07 refactor(appodeal): fix rxjs import 2018-04-21 15:29:47 +02:00
Daniel d68a0373e8 refactor(admob-free): fix rxjs import 2018-04-21 15:29:34 +02:00
Daniel 8cd2da1c5b chore(package): bump rxjs and zone.js 2018-04-21 15:23:29 +02:00
David Dal BuscoandDaniel Sogl 633e9d8e9a refactor(facebook): remove deprecated function appInvite 2018-04-21 13:04:08 +02:00
Angel CareagaandIbby Hadeed 30f5b71f4a Added ability to clean clipboard (#2468)
-  Added the possibility to clean the clipboard on Android, iOS and Windows.
2018-04-20 22:58:39 -04:00
Daniel SoglandGitHub 5dede9b536 docs(google-nearby): rename plugin docs name 2018-04-15 15:07:04 +02:00
Daniel SoglandGitHub 8be98a0cc1 docs(firebase): add jsdoc types 2018-04-15 10:44:48 +02:00
Daniel SoglandGitHub 36450e13cf feat(firebase): add new functions 2018-04-15 10:43:13 +02:00
Daniel SoglandGitHub d4c98362d9 docs(firebase): remove beta notice 2018-04-15 10:18:40 +02:00
Niklas MerzandDaniel Sogl ec69a0cbac docs(inappbrowser): add new option hidespinner (#2460) 2018-04-15 10:01:40 +02:00
Daniel SoglandGitHub f49d2a964e fix(call-number): fix isCallSupported function
closes: #2428
2018-04-14 16:44:57 +02:00
Silviu Bogdan StroeandDaniel Sogl 91d22c5211 feat(uptime): add deep sleep parameter (#2456)
* docs(uptime): add cordova installation

* feat(uptime): add deep sleep parameter

* Update index.ts
2018-04-13 22:01:23 +02:00
Sascha MerkoferandDaniel Sogl 300db62731 fix(ibeacon): correct Type {Region} in some params (#2453)
Changes wrongly typed @param {BeaconRegion} to @param {Region}
2018-04-13 12:03:44 +02:00
mcelottiandDaniel Sogl 23b760bb01 fix(web-intent): fix options param (#2450)
* fix(web-intent): fix options param for startService, sendBroadcast, startActivityForResult, startActivity

* Update index.ts

* Update index.ts
2018-04-12 17:09:19 +02:00
Andrew LivelyandDaniel Sogl 84e0aa1f94 fix(calendar): Fixes createCalendar parameter typing
The createCalendar should allow a string or `NameOrOptions`, not `CalendarOptions`
2018-04-12 17:07:03 +02:00
MarkandDaniel Sogl 1d9c449b24 feat(file-picker): add missing options
feat(file-picker): add missing options
2018-04-12 08:24:00 +02:00
Ibby Hadeed a3c46216f6 chore(): update changelog 2018-04-09 07:44:58 -04:00
Ibby Hadeed 1be1d5b577 4.7.0 2018-04-09 07:44:51 -04:00
Daniel SoglandGitHub eb760a5136 Merge pull request #2441 from hahahannes/master
feat(plugin): Add google nearby plugin
2018-04-09 06:49:47 +02:00
Hannes 8f1854c180 refactor(GoogleNearby): add requested changes 2018-04-08 22:21:18 +02:00
Daniel 5d1c8c225b docs(ftp): fix jsdoc 2018-04-08 21:48:34 +02:00
Daniel 237ea0d90d docs(flurry-analytics): fix jsdoc 2018-04-08 21:47:25 +02:00
Daniel bee3d639cb docs(firebase-analytics): fix jsdoc 2018-04-08 21:45:48 +02:00
Daniel 1cc7243ef9 docs(firebase): fix docs 2018-04-08 21:44:57 +02:00
Daniel 87f8505d93 docs(fingerprint-aio): typo 2018-04-08 21:39:33 +02:00
Daniel 7e0b9a488d docs(file-transfer): fix jsdoc 2018-04-08 21:33:19 +02:00
Daniel 3e9e578781 docs(file-path): fix jsdoc 2018-04-08 21:32:20 +02:00
Daniel 06094c2b53 docs(file-opener): typo 2018-04-08 21:31:06 +02:00
Daniel d598bf3416 docs(file-encryption): typo 2018-04-08 21:30:20 +02:00
Daniel 624f94f9f6 docs(file): typo 2018-04-08 21:29:39 +02:00
Daniel e70885ca2f docs(fcm): typo 2018-04-08 21:26:14 +02:00
Daniel 095a6c5cf7 docs(estimote-beacons): typos 2018-04-08 21:24:30 +02:00
Daniel 38e7e65557 docs(email-composer): fix jsdoc 2018-04-08 21:21:37 +02:00
Daniel 4ab4aaf178 docs(document-picker): fix docs 2018-04-08 21:20:35 +02:00
Daniel fc9add88dc docs(dialogs): fix jsdoc 2018-04-08 21:05:44 +02:00
Daniel 9e744e7c29 docs(diagnostic): typo 2018-04-08 21:00:17 +02:00
Daniel a235b2493f docs(device-orientation): fix jsodc 2018-04-08 20:51:53 +02:00
Daniel 48ccc4c24e docs(device-feedback): fix jsdoc 2018-04-08 20:50:25 +02:00
Daniel 18da591f03 docs(device-accounts): add missing docs 2018-04-08 20:49:46 +02:00
Daniel bca7f38bbf docs(crop): add missing docs 2018-04-08 20:48:14 +02:00
Daniel 7f24f89fc4 docs(contacts): fix jsdoc 2018-04-08 20:47:18 +02:00
Daniel 62241105c8 docs(card-io): fix jsdoc 2018-04-08 20:44:06 +02:00
Daniel SoglandGitHub 1e8626c435 chore(travis): fix lint 2018-04-08 19:52:33 +02:00
Daniel 7520a96cc6 docs(camera-preview): fix typos 2018-04-08 19:32:19 +02:00
Daniel 0af33923a8 BREAKING CHANGE: Removed Google Maps Plugin
Use this repository instead: https://github.com/ionic-team/ionic-native-google-maps
2018-04-08 19:30:04 +02:00
Daniel 9b83615af6 docs(call-number): fix jsdoc 2018-04-08 19:28:24 +02:00
Daniel 7f274ba9a3 docs(call-log): fix jsdoc 2018-04-08 19:27:40 +02:00
Daniel 1e539f8cd9 docs(calendar): typos 2018-04-08 19:20:20 +02:00
Daniel 87ba4b4d32 docs(browser-tab): improve example 2018-04-08 19:18:36 +02:00
Daniel 7ed6ab894b docs(broadcaster): fix jsdocs 2018-04-08 19:17:17 +02:00
Daniel e095eecf5b docs(brightness): add missing doc 2018-04-08 19:12:38 +02:00
Daniel 502203936c docs(braintree): typo 2018-04-08 19:11:52 +02:00
Daniel 7cbe7a6287 docs(ble): add missing documentations 2018-04-08 19:09:43 +02:00
Daniel 376d16904c docs(battery-status): typo 2018-04-08 19:06:48 +02:00
Daniel 7a6b8ac917 docs(barcode-scanner): fix wrong jsdocs 2018-04-08 19:05:45 +02:00
Daniel 64cbb6181a docs(background-mode): add missing return types 2018-04-08 19:04:37 +02:00
Daniel c26735f366 docs(apple-pay): typos 2018-04-08 19:00:09 +02:00
Daniel 2e07a7c04e docs(app-update): add missing param 2018-04-08 18:56:49 +02:00
Daniel 3bfc95ed78 refactor(app-center-push): rename variable 2018-04-08 18:52:49 +02:00
Daniel 4be721b8f5 refactor(core): beautify files and reorder imports 2018-04-08 18:48:55 +02:00
Daniel 15c73e46d0 docs(android-permissions): fix wrong jsdocs 2018-04-08 18:47:50 +02:00
Daniel dd4d35d9e0 docs(android-fingerprint-auth): add missing interfaces 2018-04-08 18:46:21 +02:00
Daniel d8f030b67d docs(android-exoplayer): fix typo and jsdocs 2018-04-08 18:39:07 +02:00
Daniel 3f82cfa527 docs(code-push): fix wrong jsdocs 2018-04-08 18:37:34 +02:00
Daniel 348dbb85b3 docs(alipay): fix wrong jsdoc 2018-04-08 18:28:52 +02:00
Daniel 2fda70a3c6 docs(admob-pro): fix wrong jsdocs 2018-04-08 18:27:59 +02:00
Daniel 5648bfc70f docs(action-sheet): add missing param interface 2018-04-08 18:26:01 +02:00
Daniel 1c03c3ff3c docs(admob-free): add missing documentation 2018-04-08 18:24:41 +02:00
Daniel 31c696d59d docs(action-sheet): fix wrong jsdocs 2018-04-08 18:22:48 +02:00
Hannes eb1bcdd078 feat(plugin): Add google nearby plugin 2018-04-07 14:47:33 +02:00
Daniel SoglandGitHub f7b5e2f15f docs(uptime): add iOS support
docs(uptime): add iOS support
2018-04-07 11:06:03 +02:00
Daniel SoglandGitHub 2628798064 docs(uptime): remove unneeded lines of code 2018-04-07 11:01:53 +02:00
Daniel SoglandGitHub b3082bf5ac refactor(uptime): beautify 2018-04-07 11:00:19 +02:00
Silviu Bogdan Stroe e6f6158b43 feat(uptime): add iOS support 2018-04-07 11:49:53 +03:00
Daniel 548860b1ff Merge remote-tracking branch 'origin/master' 2018-04-06 23:14:28 +02:00
Daniel 9aff5eaa13 fix(speech-recognition): add missing options
fix:  #2165
2018-04-06 23:14:11 +02:00
Daniel 67cf61d2a8 fear(speech-recognition): add missing options
fix:  #2165
2018-04-06 23:05:07 +02:00
Daniel 707ca8ea3c docs(qr-scanner): improve example
fix: #1876
2018-04-06 22:57:43 +02:00
Daniel 4cb28c41c8 feat(social-sharing): add missing function
fix: #2209
2018-04-06 22:54:11 +02:00
Daniel e828100a40 refactor(sms): reorder imports 2018-04-06 22:48:42 +02:00
Daniel 439960092e fix(email-composer): add missing options
#175
2018-04-06 22:38:59 +02:00
Daniel a81a4d3edf fix(uuid): add correct plugin source
fix: #2324
2018-04-06 22:34:06 +02:00
Daniel 859cbfcfc6 fix(image-resizer): add missing option 2018-04-06 22:30:25 +02:00
Daniel SoglandGitHub 4b4eb76352 feat(plugin): add Uptime plugin
feat(plugin): add Uptime plugin
2018-04-06 16:34:35 +02:00
Daniel SoglandGitHub bc7bdc60b7 refactor(uptime): beautify 2018-04-06 16:33:00 +02:00
Silviu Bogdan Stroe 35ad7f6387 style(uptime): remove the unneeded comments
perf(uptime): add promise return type
2018-04-06 16:11:55 +03:00
Daniel SoglandGitHub 399055b963 docs(camera): fix small typo
docs(camera): fix small typo
2018-04-05 22:03:51 +02:00
Benjamin MorelandGitHub 3a286b0243 Fix typo 2018-04-05 11:34:50 +02:00
Daniel SoglandGitHub 830b0e0ef9 feat(plugin): add Microsoft App Center Push plugin
feat(plugin): add Microsoft App Center Push plugin
2018-04-04 18:58:32 +02:00
Daniel cdabebd487 feat(plugin): add Microsoft App Center Push plugin 2018-04-04 18:56:38 +02:00
Daniel SoglandGitHub a38381d06c feat(plugin): add Microsoft App Center Analytics plugin
feat(plugin): add Microsoft App Center Analytics plugin
2018-04-04 18:34:37 +02:00
Daniel 44e0e2483a feat(plugin): add Microsoft App Center Crashes plugin 2018-04-04 18:25:34 +02:00
Daniel a1ad658d05 Merge remote-tracking branch 'origin/master' into app-center-crashes 2018-04-04 18:07:31 +02:00
Daniel SoglandGitHub 7362a41b55 feat(plugin): add Microsoft App Center Analytics plugin
feat(plugin): add Microsoft App Center Analytics plugin
2018-04-04 18:06:58 +02:00
Daniel SoglandGitHub b65946b1a8 feat(plugin): add Microdoft App Center Analytics plugin 2018-04-04 17:42:30 +02:00
Daniel 7a5bee914f feat(plugin): add Microdoft App Center Analytics plugin 2018-04-04 17:28:29 +02:00
Daniel 84c9bfbca3 feat(plugin): add Microdoft App Center Analytics plugin 2018-04-04 17:24:29 +02:00
Silviu Bogdan Stroe 6be38328b0 feat(plugin): add Uptime plugin 2018-04-04 16:53:19 +03:00
Daniel SoglandGitHub e27009e7b5 docs(autostart): add correct plugin description
docs(autostart): add correct plugin description
2018-04-04 10:56:06 +02:00
Daniel SoglandGitHub fa1cb407dd fix(file-picker): use correct plugin ref
fix(file-picker): use correct plugin ref
2018-04-04 10:54:30 +02:00
Hanut SinghandGitHub 6314c28aa8 Fixed the description text 2018-04-04 14:06:16 +05:30
MarkandGitHub 7f55a8f963 Use Correct Plugin Ref 2018-04-04 14:17:47 +09:30
Daniel SoglandGitHub 25f158629d fix(card-io): Fix typo in the "suppressManual" property name
fix(card-io): Fix typo in the "suppressManual" property name.
2018-04-02 13:57:26 +02:00
Said AandGitHub 5c81ff4875 Fix typo in the "suppressManual" property name. 2018-03-31 11:24:10 +05:00
Daniel SoglandGitHub f33eaed266 docs(launch-review): fix example 2018-03-30 20:02:11 +02:00
Daniel SoglandGitHub 40807b8c8c docs(ble): fix typo
docs(ble): fix typo
2018-03-27 11:40:22 +02:00
Iván PérezandGitHub 17a3ac1b70 Small typo 2018-03-27 10:23:16 +02:00
Daniel SoglandGitHub c8bce6fef9 feat(camera-preview): disable exif stripping conf
feat(camera-preview): disable exif stripping conf
2018-03-26 11:19:21 +02:00
David Quon e231bf8507 feat(camera-preview): disable exif stripping conf 2018-03-26 02:00:13 -07:00
Daniel SoglandGitHub 50ac4e711e fix(firebase): optional params, callback indexes fix
fix(firebase): optional params, callback indexes fix
2018-03-25 10:14:52 +02:00
Vlado VelichkovskiandGitHub 22cb2e3f45 Merge branch 'master' into patch-1 2018-03-25 00:32:45 +01:00
Daniel SoglandGitHub 3d081b5f60 feat(plugin): add OpenALPR plugin
feat(plugin): add OpenALPR plugin
2018-03-23 22:08:31 +01:00
Daniel SoglandGitHub 2ae2a683d2 lint 2018-03-23 22:06:20 +01:00
Perry GovierandGitHub 6d68167530 fixing typo in install instructions 2018-03-23 12:40:03 -05:00
Daniel SoglandGitHub 3bd6135730 add CODE_OF_CONDUCT 2018-03-23 11:07:24 +01:00
Daniel SoglandGitHub 0aaec10a3e feat(http): add support for new methods
feat(http): add support for new methods
2018-03-23 08:22:18 +01:00
Daniel SoglandGitHub 761ac4a328 feat(zeroconf): add watchAddressFamily and registerAddressFamily
feat(zeroconf): add watchAddressFamily and registerAddressFamily
2018-03-23 08:20:20 +01:00
Daniel SoglandGitHub ff4a61d0ec feat(local-notifications): Support latest beta
feat(local-notifications): Support latest beta
2018-03-23 08:19:52 +01:00
Daniel SoglandGitHub 3c6122e503 feat(call-log): add operator 'like' and array of values
feat(call-log): add operator 'like' and array of values
2018-03-23 08:16:19 +01:00
Nicolas 84cecf7841 feat(call-log): add operator 'like' and array of values 2018-03-22 22:42:45 +01:00
Lorenz an Mey 37833fe41d docs(local-notifications): Complete sourcecode docs 2018-03-22 17:25:41 +01:00
Lorenz an Mey 8a2637789f fix(local-notifications): fixed linting errors 2018-03-22 17:18:44 +01:00
Thomas Linford b05c9a4f8b feat(zeroconf) add watchAddressFamily and registerAddressFamily properties 2018-03-22 17:10:35 +01:00
Lorenz an Mey e5034bf827 feat(local-notifications): Support version 0.9.0-beta.3 of cordova-plugin-local-notifications 2018-03-22 17:08:23 +01:00
Daniel SoglandGitHub 8b8ccfbdc3 docs(file-picker): change plugin name
fixes: #2413
2018-03-22 12:12:52 +01:00
Sefa Ilkimen c2a62cd3c8 feat(http): add support for new properties (#2135) 2018-03-21 21:58:48 +01:00
Sefa Ilkimen 4497e00670 feat(http): add support for new methods (#2249) 2018-03-21 21:58:47 +01:00
Daniel SoglandGitHub 0e68bd91f2 fix(web-intent): rename onNewIntent to onIntent
fix(web-intent): rename `onNewIntent` to `onIntent`
2018-03-20 20:53:39 +01:00
Rodrigo FernándezandGitHub df7f629127 Merge branch 'master' into master 2018-03-20 20:29:46 +01:00
Daniel 0b1e8f9b9d chore(): update changelog 2018-03-19 19:42:12 +01:00
Max Lynch 560d708002 4.6.0 2018-03-19 13:37:30 -05:00
Daniel SoglandDaniel f700bb3817 Revert "fix(google-maps): wrong decorators"
This reverts commit e5b9d53b17.
2018-03-19 09:14:11 +01:00
Daniel SoglandGitHub e5b9d53b17 fix(google-maps): wrong decorators 2018-03-19 09:10:25 +01:00
Mick Vleeshouwer bf88f6ee51 Update countries 2018-03-17 21:45:24 +01:00
Mick Vleeshouwer 11a402626c Update documentation 2018-03-17 20:44:56 +01:00
Mick Vleeshouwer e27fbf47bd feat(plugin): add OpenALPR plugin 2018-03-17 20:37:57 +01:00
Daniel SoglandGitHub f1bf2fa151 fix circle 2018-03-17 16:00:52 +01:00
Daniel SoglandGitHub 1bedb49152 docs(uid): add correct npm repository
fixes: #2105
2018-03-17 15:57:14 +01:00
Daniel SoglandGitHub 4948640db2 fix(Radmob-pro): add offsetTopBar option
fixes: #2100
2018-03-17 15:55:09 +01:00
Daniel SoglandGitHub 6862389651 docs(geolocation): add notes for iOS platform 2018-03-17 15:47:37 +01:00
Daniel 247a1a1d74 feat(appodeal): add new functions
fixes: #2065
2018-03-17 15:36:42 +01:00
Daniel 571df3a251 feat(plugin): add iOS File Picker 2018-03-17 14:33:21 +01:00
Daniel SoglandGitHub 1113bbad57 feat(plugin): add SpeechKit plugin
feat(plugin): add SpeechKit plugin
2018-03-17 11:51:38 +01:00
Daniel SoglandGitHub c99524c5ec feat(plugin): add cordova-hot-code-push
feat(plugin): add cordova-hot-code-push
2018-03-17 11:49:21 +01:00
Daniel SoglandGitHub 33789b2d39 feat(DocumentPicker) adds DocumentPicker ios plugin
feat(DocumentPicker) adds DocumentPicker ios plugin
2018-03-17 11:46:33 +01:00
Daniel SoglandGitHub 67ea61a3cb rename plugin 2018-03-17 11:45:12 +01:00
Daniel SoglandGitHub ab04cfe1d5 feat(BlinkupPlugin): added ElectricImp BlinkUp
feat(BlinkupPlugin): added ElectricImp BlinkUp
2018-03-17 11:44:01 +01:00
Daniel SoglandGitHub 500888e839 fix circle 2018-03-17 11:36:52 +01:00
Daniel SoglandGitHub 1c27474776 ref(globalization): change utf_offset to utc_offset
fixes: #2015
2018-03-17 11:27:16 +01:00
Daniel SoglandGitHub a345e2c6f1 feat(camera-preview): add onBackButton function
fixes: #1967
2018-03-17 11:15:42 +01:00
Daniel SoglandGitHub 8dc5ad2ee6 fix(web-intent): allow extras
fix: #1959
2018-03-17 11:08:21 +01:00
Daniel SoglandGitHub f7184325a7 fix(facebook): remove browserInit function
fix: #1901
2018-03-17 10:56:14 +01:00
Daniel SoglandGitHub 586c7e505f fix(badge): add correct requestPermission function
fixes: #105 #1856
2018-03-17 10:38:05 +01:00
Daniel SoglandGitHub 7c6b117643 docs(image-resize): add note about fileName for iOS platform 2018-03-17 10:03:06 +01:00
Daniel SoglandGitHub a3f63a61b9 docs(fcm): improve example
docs(fcm): improve example
2018-03-17 01:24:42 +01:00
Daniel SoglandGitHub b61c442fd2 fix example 2018-03-17 01:22:06 +01:00
Daniel SoglandGitHub 2e0ea0f50e feat(music-controls): add new optional parameters for icons
feat(music-controls): add new optional parameters for icons
2018-03-17 01:18:11 +01:00
Daniel SoglandGitHub 2e2c5fe82b feat(jins-meme): enable background mode data collection
feat(jins-meme): enable background mode data collection
2018-03-17 01:17:04 +01:00
Daniel SoglandGitHub 9aa73da537 fix(globalization): options as optional
fix(globalization): options as optional
2018-03-17 01:15:37 +01:00
Daniel SoglandGitHub a6b9a9237a fix lint 2018-03-17 01:15:01 +01:00
Daniel SoglandGitHub 9816ca6650 add GlobalizationOptions interface 2018-03-17 01:11:55 +01:00
Daniel SoglandGitHub 82bc6d914d docs(broadcaster): add support for browser platform
docs(broadcaster): add support for browser platform
2018-03-17 01:07:00 +01:00
Daniel SoglandGitHub 292545dc6d docs(onesignal): change docs to match new Cordova hook specs
docs(onesignal): change docs to match new Cordova hook specs
2018-03-17 01:05:34 +01:00
Daniel SoglandGitHub 39017df2e3 docs(in-app-browser): insertCSS example update
docs(in-app-browser): insertCSS example update
2018-03-17 01:05:19 +01:00
Daniel SoglandGitHub 3841219dd5 Update index.ts 2018-03-17 01:03:46 +01:00
Daniel SoglandGitHub ead0de9907 docs(background-mode): added push parameter description
docs(background-mode): added push parameter description
2018-03-17 01:00:30 +01:00
Daniel SoglandGitHub 00e42438aa Merge branch 'master' into patch-1 2018-03-17 00:58:32 +01:00
Daniel SoglandGitHub 54e8b90cdb docs(intercom): add deprecated notice for setSecureMode
docs(intercom): add deprecated notice for setSecureMode
2018-03-17 00:57:39 +01:00
Daniel SoglandGitHub b9a254aa2b feat(firebase-dynamic-links): update to conform to the latest version of the plugin
feat(firebase-dynamic-links): update to conform to the latest version of the plugin
2018-03-17 00:52:55 +01:00
Daniel SoglandGitHub 9cabbd9c69 docs(navigation-bar): rename mismatched function
docs(navigation-bar): rename mismatched function
2018-03-17 00:51:41 +01:00
Daniel SoglandGitHub 0325d09472 feat(health-kit): add missing properties to HealthKitOptions
feat(health-kit): add missing properties to HealthKitOptions
2018-03-17 00:50:40 +01:00
Daniel SoglandGitHub 973888726d feat(call-log): add plugin
feat(call-log): add plugin
2018-03-17 00:49:45 +01:00
Daniel SoglandGitHub a0a540c768 feat(in-app-browser): add new footer options for Android
feat(in-app-browser): add new footer options for Android
2018-03-17 00:49:28 +01:00
Daniel SoglandGitHub 5e40f3412a add CallLogObject interface 2018-03-17 00:47:46 +01:00
Daniel SoglandGitHub c55998c5b6 feat(local-notifications) add silent configuration parameter
feat(local-notifications) add silent configuration parameter
2018-03-17 00:39:58 +01:00
Daniel SoglandGitHub dfcc281e56 docs(cordova-file): added ArrayBuffer
docs(cordova-file): added ArrayBuffer
2018-03-17 00:37:48 +01:00
Daniel SoglandGitHub 0fe5102801 feat(push): add missing decorator option to channel
feat(push): add missing decorator option to channel
2018-03-17 00:37:14 +01:00
Daniel SoglandGitHub c8361841f4 ref jsdocs 2018-03-17 00:35:41 +01:00
Daniel SoglandGitHub 09e7afb3b4 feat(mix panel): add missing events
feat(mix panel): add missing events
2018-03-17 00:31:08 +01:00
Daniel SoglandGitHub 3d9703bfe1 docs(http): linking Stackoverflow answer for .pem to .cer
docs(http): linking Stackoverflow answer for .pem to .cer
2018-03-17 00:27:09 +01:00
Daniel SoglandGitHub 76dee252aa fix lint 2018-03-17 00:26:07 +01:00
Daniel 6c938bfdb7 Revert "chore(package): bump dependencies and lint rules"
This reverts commit 21ad4734fa.
2018-03-17 00:13:08 +01:00
Daniel 21ad4734fa chore(package): bump dependencies and lint rules 2018-03-16 22:04:01 +01:00
Daniel 7547a94c80 fix(sqlite): remove trailing whitespaces 2018-03-16 20:48:02 +01:00
Daniel SoglandGitHub f607a03c9b fix(contacts): refactor wrong ContactFieldTypes 2018-03-16 20:25:12 +01:00
Daniel SoglandGitHub 9ae9f19717 Merge pull request #2251 from Dellos7/patch-1
docs(code-push) updated example link to an up to date one
2018-03-16 19:10:51 +01:00
Daniel SoglandGitHub 72d78ec729 Merge pull request #2205 from JKH4/master
ref(local-notifications): Replace registerPermission by requestPermission
2018-03-16 18:18:19 +01:00
Daniel SoglandGitHub f795b4f917 Merge pull request #2200 from fbaew/patch-1
correct typo
2018-03-16 18:17:22 +01:00
Daniel SoglandGitHub dc5b58144c Merge pull request #2199 from mike-roberts/master
docs(GoogleMaps): GoogleMaps.prototype.create is deprecated
2018-03-16 18:17:03 +01:00
Daniel SoglandGitHub 241f0733ee feat(sqlite): add selfTest function
fix: #963
2018-03-16 17:55:42 +01:00
Daniel SoglandGitHub 9cc3d8fd74 Merge pull request #2027 from qligier/master
docs(spinner-dialog): improve options documentation
2018-03-16 17:02:51 +01:00
Daniel SoglandGitHub e58eb6e6b1 Merge pull request #2374 from andrewlively/master
Added setAnalyticsCollectionEnabled to Firebase plugin
2018-03-16 17:01:58 +01:00
Daniel SoglandGitHub 91288266cd Merge pull request #2376 from musou1500/fix-firebase-analytics
fix(firebase-analytics): add `sync` option for all methods
2018-03-16 17:01:32 +01:00
Daniel SoglandGitHub 7a31768f3d feat(device-accounts): add android account interface
feat(device-accounts): add android account interface
2018-03-16 16:58:53 +01:00
Daniel SoglandGitHub 1cf3d7da82 feat(device-feedback): add feedback interface
feat(device-feedback): add feedback interface
2018-03-16 16:58:27 +01:00
Daniel SoglandGitHub 50ae6f0888 feat(base64-to-gallery): add options interface
feat(base64-to-gallery): add options interface
2018-03-16 16:57:55 +01:00
Daniel SoglandGitHub 1bd0b591b4 docs(barcode-scanner): optimize example code
docs(barcode-scanner): optimize example code
2018-03-16 16:57:12 +01:00
Daniel SoglandGitHub 4fb73ca224 docs(battery-status): refactored example code
docs(battery-status): refactored example code
2018-03-16 16:56:33 +01:00
Daniel SoglandGitHub 11f4d208ad docs(call-number): add return values to example
docs(call-number): add return values to example
2018-03-16 16:56:05 +01:00
Daniel SoglandGitHub 020eec26b9 docs(db-meter): refactored example
docs(db-meter): refactored example
2018-03-16 16:55:45 +01:00
Daniel SoglandGitHub 73d6fa1998 docs(date-picker): fix some typos
docs(date-picker): fix some typos
2018-03-16 16:55:11 +01:00
Daniel SoglandGitHub a9674f0348 feat(calendar): add getCreateCalendarOptions function
feat(calendar): add getCreateCalendarOptions function
2018-03-16 16:53:48 +01:00
Daniel SoglandGitHub 2536ef2009 docs(brightness): add correct types
docs(brightness): add correct types
2018-03-16 16:52:56 +01:00
Daniel SoglandGitHub 6066f9f8ad feat(ble): add scan options interface
feat(ble): add scan options interface
2018-03-16 16:52:20 +01:00
Daniel SoglandGitHub c421d43155 ref(background-mode): fix wrong types
ref(background-mode): fix wrong types
2018-03-16 16:51:23 +01:00
Daniel SoglandGitHub 6fe3a5f90a ref(app-version): add corrent return types
ref(app-version): add corrent return types
2018-03-16 16:49:01 +01:00
Daniel SoglandGitHub d1d7404a09 feat(app-update): add app update options
feat(app-update): add app update options
2018-03-16 16:48:35 +01:00
Daniel SoglandGitHub c774466e62 feat(app-rate): add custom locale interface
feat(app-rate): add custom locale interface
2018-03-16 16:47:58 +01:00
Daniel SoglandGitHub b8e101de5a ref(android-full-screen): remove unsupported flag
ref(android-full-screen): remove unsupported flag
2018-03-16 16:47:25 +01:00
Daniel SoglandGitHub f3f83de008 ref(action-sheet): add corrent types
ref(action-sheet): add corrent types
2018-03-16 16:46:45 +01:00
Daniel SoglandGitHub a456738d15 docs(debug): Improve example
docs(debug): Improve example
2018-03-16 16:46:27 +01:00
Daniel SoglandGitHub 428b36e948 fix(index-app-content): remove onItemPressed function
fix(index-app-content): remove onItemPressed function
2018-03-16 16:45:55 +01:00
Daniel SoglandGitHub 57696a9ade ref(crop): add options interface
ref(crop): add options interface
2018-03-16 16:41:42 +01:00
Daniel SoglandGitHub 91f66decab feat(one-signal): add clearOneSignalNotifications function
feat(one-signal): add clearOneSignalNotifications function
2018-03-16 16:41:01 +01:00
Daniel SoglandGitHub d3dece4c52 fix(push): Android senderID as optional
fix(push): Android senderID as optional
2018-03-16 16:39:40 +01:00
Daniel SoglandGitHub a8415dab39 feat(google-analytics): add missing functions
feat(google-analytics): add missing functions
2018-03-16 16:36:21 +01:00
Daniel SoglandGitHub 658bb75b42 fix(printer): add correct npm repository
fix(printer): add correct npm repository
2018-03-16 16:35:53 +01:00
Daniel SoglandGitHub 6dcebd03ef feat(badge) add isSupported function
feat(badge) add isSupported function
2018-03-16 16:35:27 +01:00
Daniel SoglandGitHub c4eed9f362 Merge pull request #2379 from danielsogl/patch-12
feat(web-intent): add startService function
2018-03-16 16:34:33 +01:00
Daniel SoglandGitHub be02f835bc Merge pull request #2378 from danielsogl/patch-11
refactor(WheelSelector): add union type for theme
2018-03-16 16:34:08 +01:00
Daniel SoglandGitHub 8d2681a9fc ref(device-orientation): add missing type 2018-03-16 16:32:43 +01:00
Daniel SoglandGitHub 7cafebd0e8 feat(device-feedback): add feedback interface 2018-03-16 15:17:29 +01:00
Daniel SoglandGitHub d2261b6432 feat(device-accounts): add android account interface 2018-03-16 15:11:08 +01:00
Daniel SoglandGitHub 03c219936c docs(db-meter): refactored example 2018-03-16 15:00:45 +01:00
Daniel SoglandGitHub a393e5c55d date-picker(date-picker): fix some typos 2018-03-16 14:56:22 +01:00
Daniel SoglandGitHub ac303d6f7f docs(call-number): add return values to example 2018-03-16 14:45:03 +01:00
Daniel SoglandGitHub 13765d2d6a feat(calendar): add getCreateCalendarOptions function 2018-03-16 14:42:22 +01:00
Daniel SoglandGitHub 5f88ff02f2 Update index.ts 2018-03-16 14:35:12 +01:00
Daniel SoglandGitHub 447f00a202 docs(brightness): add correct types 2018-03-16 14:34:51 +01:00
Daniel SoglandGitHub e345fed09f feat(ble): add scan options interface 2018-03-16 14:30:32 +01:00
Daniel SoglandGitHub 957f278738 docs(battery-status): refactored example code 2018-03-16 14:26:33 +01:00
Daniel SoglandGitHub 11d516fb28 feat(base64-to-gallery): add options interface 2018-03-16 14:23:50 +01:00
Daniel SoglandGitHub 1546cec694 doc(barcode-scanner): optimize example code 2018-03-16 14:19:16 +01:00
Daniel SoglandGitHub 7961768803 ref(background-mode): fix wront types 2018-03-16 14:13:26 +01:00
Daniel SoglandGitHub 7e1630f5e5 ref(app-versionn): add corrent return types 2018-03-16 13:57:44 +01:00
Daniel SoglandGitHub 0f325ed772 feat(app-update): add app update options 2018-03-16 13:53:28 +01:00
Daniel SoglandGitHub 2a18dbcf3e feat(app-rate): add custom locale interface 2018-03-16 13:46:08 +01:00
Daniel SoglandGitHub bd72bbc87f ref(android-full-screen): remove unsupported flag 2018-03-16 13:36:12 +01:00
Daniel SoglandGitHub e44229471e Update index.ts 2018-03-16 13:26:49 +01:00
Daniel SoglandGitHub b616e0f0bf ref(action-sheet): add corrent types 2018-03-16 13:22:33 +01:00
Daniel SoglandGitHub 50f40bc46b docs(debug): Improve example 2018-03-16 11:29:20 +01:00
Daniel SoglandGitHub 679ad2cefc fix lint 2018-03-16 09:11:59 +01:00
Daniel SoglandGitHub 270678fb55 fix(index-app-content): remove onItemPressed function 2018-03-16 09:09:19 +01:00
Daniel SoglandGitHub 504838556e Update index.ts 2018-03-16 09:01:33 +01:00
Daniel SoglandGitHub 1e0d5ce30d ref(crop): add options interface 2018-03-16 09:00:47 +01:00
Daniel SoglandGitHub fc0338a1c5 feat(one-signal): add clearOneSignalNotifications function 2018-03-16 08:49:49 +01:00
Daniel SoglandGitHub 1b237aa996 fix(push): Android senderID as optional 2018-03-15 22:12:36 +01:00
Daniel SoglandGitHub ff0008e7eb feat(google-analytics): add missing functions 2018-03-15 22:02:58 +01:00
Daniel SoglandGitHub 4bf55d3b1a fix(printer): add correct npm repository 2018-03-15 21:30:07 +01:00
Daniel SoglandGitHub bebc5c2a50 fix lint 2018-03-15 18:06:25 +01:00
Daniel SoglandGitHub 6d07cf1a84 fix lint 2018-03-15 18:05:09 +01:00
Daniel SoglandGitHub 95822aeac2 feat(badge) add isSupported function 2018-03-15 18:02:35 +01:00
Daniel SoglandGitHub ec14e179c6 Update index.ts 2018-03-15 17:44:16 +01:00
Daniel SoglandGitHub 15bb350d8e feat(web-intent): add startService function 2018-03-15 17:42:38 +01:00
Daniel SoglandGitHub e612c5fcc3 fix linter 2018-03-15 17:29:25 +01:00
Daniel SoglandGitHub ee3a0c7c6a refactor(WheelSelector): add union type for theme 2018-03-15 17:00:54 +01:00
musou1500 42fd1f2400 fix(firebase-analytics): add sync option for all methods 2018-03-14 22:28:21 +09:00
Prabesh NiraulaandGitHub 7e0300a75f Added space after // 2018-03-12 14:20:40 -04:00
Andrew Lively 2e711b94bb Added setAnalyticsCollectionEnabled to Firebase plugin 2018-03-12 11:00:31 -04:00
pniraula 5fe579b2f3 Fixed whitespaces 2018-03-05 11:38:14 -05:00
KULDIP PIPALIYAandGitHub af75b49aa4 Update index.ts 2018-03-02 02:00:17 +05:30
Josh Babb 1932f2dd66 feat(jins-meme): enable background mode data collection
In order to enable background mode data collection we used the cordova-plugin-background-mode plugin in a new Cordova plugin repo, cordova-plugin-jins-meme (vs. cordova-plugin-jins-meme-es.)  We opted to maintain the old repository for backwards-compatibility as we have multiple apps using various versions; this is simplest.

Another unrelated change was made to silence unnecessary console logging.
2018-03-01 11:12:29 -06:00
Prabesh Niraula 8ece08379c Added new optional parameters for Icons in Interface 2018-03-01 12:03:14 -05:00
Pedro L.C.AandIbby Hadeed f11be24f74 feat(google-maps): update to match latest plugin version (#2320)
* Update index.ts

* Update index.ts

* Add missing features, and bug fix of methods

* update: classname must be in pascal case

* remove: duplicated class definition

* export encode and spherical static classes

* Add comma

* Fix Encoding and Spherical

* Add convenience methods

* Fix decorators for Encoding and Spherical

* Update: getMap() methods return the instance of the wrapper plugin

* Update: getMap() methods return the instance of the wrapper plugin

* Remove `@CordovaInstance` decorators from getMap()

* Update: GoogleMapOptions (all fields are not optional).

* Follow up:  version `2.0.0-beta2-20170719-2226` of cordova-plugin-googlemaps

* Fix: tslint error

* Fix: tslint error

* No more isAvailable() method.

* Bug fix: description is incorrect

* Bug fix: example code was wrong.

* Bug fix: HtmlInfoWindow does not work
https://github.com/ionic-team/ionic-native/pull/1815#issuecomment-318909795

* Bug fix: HtmlInfoWindow does not work

* Bug fix: HtmlInfoWindow does not work

* Bug fix: HtmlInfoWindow does not work

* Bug fix: HtmlInfoWindow does not work

* It seems the ionViewDidLoad() is enough delayed after platform.ready()

* Bug fix: map.setDiv()

* Bug fix: HtmlInfoWindow does not work

* Bug fix: BaseArrayClass definition is incorrect

* Bug fix: BaseArrayClass constructor is wrong

* Bug fix: Geocoder class does not work

* Bug fix: LatLngBounds constructor is wrong

* update: noNotify option is not declared

* Bug fix: Geocoder.geocode() returns array of GeocoderResult

* Update: clarify acceptable parameters of BaseArrayClass

* Add: AnimateCameraOption.padding is missing

* Revert: BaseClass.empty() method does not have the noNotify option

* Add `destruct` option to the CordovaOption.

- This allows BaseClass.on() is able to pass multiple retuned values from the cordova plugin side to the event lister.

* A semicolon is mixing

* update: event names

* Update: BaseClass.addEventListener(), addEventListenerOnce(), on(), and one()

* Add: destruct option for otherPromise
Change: inside event names (must use the version 2.0.0-beta3-20170808-1950 or higher)

* Build for working group

* Bug fix: map.getCameraTarget() definition is incorrect

* Bug fix: The definition of VisibleRegion interface is incorrect

* Fix: LatLng, LatLngBounds, and PolylineOptions classes
Update: map.getVisibleRegion()

Add: VisibleRegion class

* Bug fix: the definition of map.clear() method is incorrect

* Fix: map.fromLatLngToPoint()

* Ignore the dist directory on the master branch

* Remove the dist folder on the master branch

* fixes and tweaks

* use union types for CameraPosition

fixes issue mentioned on slack by @wf9a5m75

* fix types

* update AnimateCameraOptions interface

* remove AnimateCameraOptions interface

* add MarkerCluster class

* Bug fix: Can not create an instance of BaseArrayClass

* Bug fix: the icons property of MarkerClusterOptions

* Bug fix: the zoom option is missing

https://github.com/mapsplugin/cordova-plugin-googlemaps/issues/1712

* Update index.ts

* fix: need to convert instance type from the JS class to the wrapper class

https://github.com/mapsplugin/cordova-plugin-googlemaps/issues/1706

* remove test file

* fix: Error: Illegal use of "@private" tag.

* fix: The Environment, Encode, and Spherical  are static class

* fix:  convert JS instance to the ionic instance
add: BaseClass.destroy()
add: getId() method for all instance classes

* Documentation Error https://github.com/ionic-team/ionic-native/issues/1994

* Need to create another way to convert the instance for marker cluster

* save

* Remove the instance of wrapper class if the JS instance is removed.

* Bug fix: HtmlInfoWindow missing .on and .one methods
https://github.com/ionic-team/ionic-native/issues/2034

* Bug fix: HtmlInfoWindow constructor cause the error
https://github.com/mapsplugin/cordova-plugin-googlemaps/issues/1661

* Fix: Error when removing map
https://github.com/mapsplugin/cordova-plugin-googlemaps/issues/1823

* Add: the cssOptions argument for HtmlInfoWindow.setContent() method

* Bug fix: Polyline.getPoints(), Polygon.getPoints() and Polygon.getHoles()

Those methods need to create new instance of BaseArrayClass of wrapper plugin.

* Add: forEachAsync(), mapAsync(), and filterAsync() methods into BaseArray class

* update: use document.querySelector() instead of document.getElementById() if the passed element is string

update: map.setDiv()

Bug fix: can not create empty GoogleMap (pure JS version is available way)

* Fix: wait until the page is fully ready

* Fix: missing `clickable` option for PolygonOptions and PolylineOptions

* Add: accept own properties for `addMarker()` and others #2087

Fix: some properties are required, but specified as optional.

Add: descriptions for properties

* Bug fix: Static classes are defined as non static class
https://stackoverflow.com/questions/47083289/ionic-native-google-maps-plugin-set-app-background-color/47165721#47165721

* Add: poly class (plugin.google.maps.geometory.poly namespace)

* Bug fix: Ionic native googlemaps decodePath() returns undefined
https://forum.ionicframework.com/t/ionic-native-googlemaps-decodepath-returns-undefined/118624/

* PR #2254
https://github.com/ionic-team/ionic-native/pull/2254

* PR #2199
https://github.com/ionic-team/ionic-native/pull/2199

* Change defined event names for the cordova-plugin-googlemaps v2.0

* Change defined event names for the cordova-plugin-googlemaps v2.2.0

* Add Geolocation class

* Implement the `setMyLocationButtonEnabled()` method

* add: baseArrayClass.mapSeries() method
update: change internal methods

* update: implementation of the LocationService

* Implement the map.addKmlOverlay() method

* Update for the cordova-plugin-googlemaps v2.2.x
2018-02-26 07:52:58 -05:00
Attila VagoandGitHub 8b829101ff insertCSS example update
The current example in the docs is incomplete and thus quite useless. Just on its own won't manipulate the CSS of a loaded page. It requires the InAppBrowserEvent, and using it in the callback.
2018-02-25 23:12:16 +00:00
Karri RasinmäkiandGitHub 97d5d10c71 Updated to match new Cordova hook specs
- Script to match module definition (fixes paths)  
- Instructions to define hooks in recommend way
2018-02-25 00:46:08 +02:00
Markus Karileet 41e5a0f7fe feat(speechkit): plugin implementation 2018-02-22 22:02:44 +02:00
jeffreyramiaandGitHub 19c0b5812d Update index.ts
As stated in the plugin repo, the options field is optional. Also, the plugin returns a `iana_timezone` property such as 'America/New_York' which was not included.
2018-02-22 21:08:14 +02:00
bsorrentinoandGitHub ee42cd3471 add support for Browser platform 2018-02-14 12:29:19 +01:00
Elian CordobaandGitHub 714bc46342 Update index.ts
Added missing descriptions taken from the plugin repo README.
2018-02-13 12:45:53 -03:00
Ionitron 7be82a40b5 Update Intercom docs to use setUserHash 2018-02-12 17:42:20 +08:00
Adam Duren d50639fc55 Update firebase-dynamic-links to conform to the latest version of the plugin 2018-02-02 11:40:01 -05:00
Rajitha KumaraandGitHub 84a8dbc9d2 Update index.ts
In line 20, "this.navigationBar.hide(autoHide);". But there is no such a function .hide(). It shoud be correct as "this.navigationBar.setUp(autoHide);".
2018-02-02 15:38:25 +05:30
Tyler VanZanten f8e79cec5f fix(health-kit): add missing properties to HealthKitOptions 2018-02-01 15:07:28 -06:00
Niklas Merz 7db5492816 feat(inappbrowser) Add new footer options for Android 2018-02-01 19:28:45 +01:00
Guillaume Royer 04bdadedd8 feat(hot code push): add update events 2018-02-01 10:44:54 +00:00
Nicolas 61c0ecfa4f fix(call-log): update getCallLog signature 2018-01-30 22:35:48 +01:00
Nicolas 4b9cf17cbb fix(call-log): comments erratum 2018-01-28 13:53:16 +01:00
Nicolas 76a644d122 feat(call-log): add plugin 2018-01-28 02:19:09 +01:00
Max Lynch 954bd876de Tweaked pro constructor 2018-01-25 11:44:58 -06:00
Max Lynch f419db5d80 fix(Pro): CordovaCheck should sync. #2136 #2127 2018-01-25 11:39:17 -06:00
Max Lynch c8ecee01d6 fix(pro): Tweak to pro plugin. #2136 #2127 2018-01-25 11:35:39 -06:00
Max Lynch eaa87fae9b chore(): update changelog 2018-01-25 11:35:39 -06:00
Ibby Hadeed d0adae55cb Merge branch 'master' of github.com:ionic-team/ionic-native 2018-01-25 12:23:32 -05:00
Max Lynch 61293c33cc fix(pro): proper callback type and guard for plugin instantiate. #2136 #2127 2018-01-25 11:11:06 -06:00
Rory StandleyandIbby Hadeed e4dd8dcb89 docs(): type of yes is boolean not string (#2290) 2018-01-25 06:18:18 -05:00
Guillaume Royer e7968da7f4 feat(hot code push): add cordova-hot-code-push 2018-01-19 11:01:44 +00:00
Pedro Plasencia 6e58192630 feat(local-notifications): added a new param to specify if the notification will be silent 2018-01-18 10:47:04 -04:00
App EvangelistandGitHub 288d6ed894 docs(cordova-file): added ArrayBuffer 2018-01-16 14:39:12 +01:00
Dominik García 03fc978db2 fix channels
fix channels

add sound to channels

fix channels
2018-01-15 16:42:37 -06:00
MiguelandGitHub 4fc97037ac Update mixpanel
Added events: getSuperProperties, registerSuperPropertiesOnce, unregisterSuperProperty
2018-01-15 15:48:08 +01:00
Rodrigo FernándezandGitHub dbcb103adc fix(web-intent): rename onNewIntent to onIntent
The `onNewIntent` function doesn't exist in `darryncampbell-cordova-plugin-intent`, it's actually called `onIntent`.
2018-01-09 20:12:49 +01:00
David López CastelloteandGitHub a413cf02e4 updated example link to an up to date one
The example: https://github.com/Dellos7/example-cordova-code-push-plugin contains an up-to-date example of how to use this plugin with Ionic; the current link is an outdated one.
2018-01-06 01:53:06 +01:00
JKH4andGitHub bfe9fadf5a Merge pull request #1 from JKH4/JKH4-patch-1-2
Replace registerPermission by requestPermission
2017-12-15 14:05:24 +01:00
JKH4andGitHub 2714bcae7e Replace registerPermission by requestPermission
According to cordova-plugin-local-notifications update :
cordova.plugins.notification.local.requestPermission(function (granted) { ... });
2017-12-15 14:05:07 +01:00
Gregg LewisandGitHub c309a3027f correct typo 2017-12-13 21:24:27 -07:00
Mike Roberts 2da568616d docs(GoogleMaps): GoogleMaps.prototype.create is deprecated, so updating docs to use static method. 2017-12-13 19:27:52 -05:00
Andrew Crites adf10a301e docs(http): linking Stackoverflow answer for .pem to .cer 2017-12-13 14:52:45 -05:00
Ibby Hadeed e480d296fe 4.5.2 2017-12-11 19:34:54 -05:00
Jonathan Tavares e9580b46ef fix(DocumentPicker) uses String instead of DocumentPickerOptions 2017-11-02 16:38:18 +00:00
Jonathan Tavares bfbbc2ee12 feat(DocumentPicker) adds DocumentPicker ios plugin 2017-11-02 16:21:51 +00:00
Vlado VelichkovskiandGitHub 2c5aed9619 fix,docs(firebase): make 'namespace' param optional in setDefault; remove callback indexes; docs fix
Add optional label for optional parameters in docs
remove wrong callback indexes
make 'namespace' param optional in setDefault
2017-10-09 19:25:50 +02:00
Paulo Vitor Magacho da Silva 38eaeffe7e Added Electric Imp Blinkup Plugin support 2017-10-08 10:44:50 -03:00
quentin 0daab8c31d docs(spinner-dialog): improve options documentation 2017-10-06 20:12:39 +02:00
287 changed files with 15446 additions and 16760 deletions
+14 -14
View File
@@ -1,15 +1,15 @@
# http://editorconfig.org
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
insert_final_newline = false
# http://editorconfig.org
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
insert_final_newline = false
trim_trailing_whitespace = false
-3
View File
@@ -5,6 +5,3 @@ node_modules/
aot/
scripts/ionic-native-bower
dist/
src/@ionic-native/plugins/**/ngx
*.d.ts
injectable-classes.json
+2054
View File
File diff suppressed because it is too large Load Diff
+11
View File
@@ -0,0 +1,11 @@
# Contributor Code of Conduct
As contributors and maintainers of the Ionic project, we pledge to respect everyone who contributes by posting issues, updating documentation, submitting pull requests, providing feedback in comments, and any other activities.
Communication through any of Ionic's channels (GitHub, Slack, Forum, IRC, mailing lists, Twitter, etc.) must be constructive and never resort to personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
We promise to extend courtesy and respect to everyone involved in this project regardless of gender, gender identity, sexual orientation, disability, age, race, ethnicity, religion, or level of experience. We expect anyone contributing to the Ionic project to do the same.
If any member of the community violates this code of conduct, the maintainers of the Ionic project may take action, removing issues, comments, and PRs or blocking accounts as deemed appropriate.
If you are subject to or witness unacceptable behavior, or have any other concerns, please email us at [hi@ionicframework.com](mailto:hi@ionicframework.com).
+3 -3
View File
@@ -115,11 +115,11 @@ You need to run `npm run build` in the `ionic-native` project, this will create
### Cleaning the code
You need to run `npm run lint` to analyze the code and ensure it's consistency with the repository style. Fix any errors before submitting a PR.
You need to run `npm run lint` to analyze the code and ensure its consistency with the repository style. Fix any errors before submitting a PR.
### '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 its usage. Take a look at some of the other plugins for good documentation styles.
## Commit Message Format
@@ -218,4 +218,4 @@ Example:
```ts
@CordovaFunctionOverride()
someMethod(): Observable<any> { return; }
```
```
+23 -23
View File
@@ -1,23 +1,23 @@
Copyright 2015-present Drifty Co.
http://drifty.com/
MIT License
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Copyright 2015-present Drifty Co.
http://drifty.com/
MIT License
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+14 -68
View File
@@ -11,26 +11,22 @@ Ionic Native wraps plugin callbacks in a Promise or Observable, providing a comm
Run following command to install Ionic Native in your project.
```bash
npm install @ionic-native/core@beta --save
npm install @ionic-native/core --save
```
You also need to install the Ionic Native package for each plugin you want to add. Please see the [Ionic Native documentation](https://ionicframework.com/docs/native/) for complete instructions on how to add and use the plugins.
**NOTE: to use Ionic Native v5, you must use the `@beta` tag when installing any NPM package.**
## Documentation
For the full Ionic Native documentation, please visit [https://ionicframework.com/docs/native/](https://ionicframework.com/docs/native/).
### Basic Usage
#### Ionic/Angular apps
To use a plugin, import and add the plugin provider to your `@NgModule`, and then inject it where you wish to use it.
Make sure to import the injectable class from the `/ngx` directory as shown in the following examples:
To use a plugin, import and add the plugin provider to your `@NgModule`, and then inject it where you wish to use it.
```typescript
// app.module.ts
import { Camera } from '@ionic-native/camera/ngx';
import { Camera } from '@ionic-native/camera';
...
@@ -48,9 +44,11 @@ export class AppModule { }
```
```typescript
import { Geolocation } from '@ionic-native/geolocation/ngx';
import { Geolocation } from '@ionic-native/geolocation';
import { Platform } from 'ionic-angular';
import { NgZone } from '@angular/core';
@Component({ ... })
export class MyComponent {
@@ -79,71 +77,16 @@ export class MyComponent {
}
```
#### ES2015+/TypeScript
These modules can work in any ES2015+/TypeScript app (including Angular/Ionic apps). To use any plugin, import the class from the appropriate package, and use it's static methods.
```js
import { Camera } from '@ionic-native/camera';
### Mocking and Browser Development
document.addEventListener('deviceready', () => {
Camera.getPicture()
.then((data) => console.log('Took a picture!', data))
.catch((e) => console.log('Error occurred while taking a picture', e));
});
```
#### AngularJS
Ionic Native generates an AngularJS module in runtime and prepares a service for each plugin. To use the plugins in your AngularJS app:
1. Download the latest bundle from the [Github releases](https://github.com/ionic-team/ionic-native/releases) page.
2. Include it in `index.html` before your app's code.
3. Inject `ionic.native` module in your app.
4. Inject any plugin you would like to use with a `$cordova` prefix.
```js
angular.module('myApp', ['ionic.native'])
.controller('MyPageController', function($cordovaCamera) {
$cordovaCamera.getPicture()
.then(
function(data) {
console.log('Took a picture!', data);
},
function(err) {
console.log('Error occurred while taking a picture', err);
}
);
});
```
#### Vanilla JS
To use Ionic Native in any other setup:
1. Download the latest bundle from the [Github releases](https://github.com/ionic-team/ionic-native/releases) page.
2. Include it in `index.html` before your app's code.
3. Access any plugin using the global `IonicNative` variable.
```js
document.addEventListener('deviceready', function() {
IonicNative.Camera.getPicture()
.then(
function(data) {
console.log('Took a picture!', data);
},
function(err) {
console.log('Error occurred while taking a picture', err);
}
);
});
```
### Mocking and Browser Development (Ionic/Angular apps only)
Ionic Native makes it possible to mock plugins and develop nearly the entirety of your app in the browser or in `ionic serve`.
Ionic Native 3.x makes it possible to mock plugins and develop nearly the entirety of your app in the browser or in `ionic serve`.
To do this, you need to provide a mock implementation of the plugins you wish to use. Here's an example of mocking the `Camera` plugin to return a stock image while in development:
First import the `Camera` class in your `src/app/app.module.ts` file:
```typescript
import { Camera } from '@ionic-native/camera/ngx';
import { Camera } from '@ionic-native/camera';
```
Then create a new class that extends the `Camera` class with a mock implementation:
@@ -175,7 +118,7 @@ import { IonicApp, IonicModule, IonicErrorHandler } from 'ionic-angular';
import { MyApp } from './app.component';
import { HomePage } from '../pages/home/home';
import { Camera } from '@ionic-native/camera/ngx';
import { Camera } from '@ionic-native/camera';
class CameraMock extends Camera {
getPicture(options) {
@@ -200,7 +143,7 @@ class CameraMock extends Camera {
HomePage
],
providers: [
{ provide: ErrorHandler, useClass: IonicErrorHandler },
{provide: ErrorHandler, useClass: IonicErrorHandler},
{ provide: Camera, useClass: CameraMock }
]
})
@@ -218,6 +161,9 @@ Spent way too long diagnosing an issue only to realize a plugin wasn't firing or
## Plugin Missing?
Let us know or submit a PR! Take a look at [the Developer Guide](https://github.com/ionic-team/ionic-native/blob/master/DEVELOPER.md) for more on how to contribute. :heart:
## Ionic v1 (AngularJS, Angular 1.x) support
For Ionic v1 (AngularJS, Angular 1.x) support, please use version 2 of Ionic Native. See the [2.x README](https://github.com/ionic-team/ionic-native/blob/v2.x/README.md) for usage information.
# Credits
+1 -1
View File
@@ -33,7 +33,7 @@ jobs:
- run: bash ./scripts/git/config.sh
- run:
name: Build Ionic Native
command: npm run build
command: npm run build:core && ./node_modules/.bin/tsc
- run:
name: Generate README files to ensure docs are valid
command: npm run readmes
+55
View File
@@ -0,0 +1,55 @@
"use strict";
module.exports = config => {
const conf = {
frameworks: [
'jasmine',
'karma-typescript'
],
plugins: [
'karma-typescript',
'karma-jasmine',
'karma-phantomjs-launcher'
],
preprocessors: {
'src/**/*.ts': ['karma-typescript']
},
karmaTypescriptConfig: {
bundlerOptions: {
entrypoints: /\.spec\.ts$/,
transforms: [
require("karma-typescript-es6-transform")()
]
},
compilerOptions: {
lib: ['es2015', 'dom'],
paths: {
"@ionic-native/core": ["./src/@ionic-native/core"]
},
baseUrl: '.'
}
},
files: [
{ pattern: 'src/**/*.ts', included: true, watched: true }
],
reporters: ['progress'],
port: 9876,
colors: true,
logLevel: config.INFO,
autoWatch: true,
browsers: [
'PhantomJS'
],
singleRun: false
};
config.set(conf);
};
+3663 -6572
View File
File diff suppressed because it is too large Load Diff
+42 -62
View File
@@ -1,85 +1,65 @@
{
"name": "ionic-native",
"version": "5.0.0-beta.4",
"version": "4.9.0",
"description": "Native plugin wrappers for Cordova and Ionic with TypeScript, ES6+, Promise and Observable support",
"homepage": "https://ionicframework.com/",
"author": "Ionic Team <hi@ionic.io> (https://ionic.io)",
"license": "MIT",
"scripts": {
"test": "jest",
"test:watch": "jest --watch",
"build:core": "tsc -p tsconfig.core.json",
"build:esm": "ts-node -P scripts scripts/tasks/build-esm",
"build:es5": "ts-node -P scripts scripts/tasks/build-es5",
"build:ngx": "ts-node -P scripts scripts/tasks/build-ngx",
"build": "npm run build:core && npm run build:esm && npm run build:ngx && npm run build:es5",
"prebuild": "rm -rf dist",
"npmpub": "ts-node -P scripts scripts/tasks/publish",
"lint": "gulp lint",
"readmes": "gulp readmes",
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0",
"postchangelog": "git commit -am \"chore(): update changelog\"",
"shipit": "npm run build && npm run readmes && npm run npmpub"
},
"devDependencies": {
"@angular/common": "latest",
"@angular/compiler": "latest",
"@angular/compiler-cli": "latest",
"@angular/core": "latest",
"@angular/compiler": "4.4.4",
"@angular/compiler-cli": "4.4.4",
"@angular/core": "4.4.4",
"@types/cordova": "0.0.34",
"@types/fs-extra": "^4.0.5",
"@types/jest": "21.1.5",
"@types/lodash": "4.14.85",
"@types/node": "8.0.47",
"@types/rimraf": "^2.0.2",
"@types/webpack": "^3.8.1",
"async-promise-queue": "^1.0.4",
"babel-core": "^6.26.0",
"babel-preset-env": "^1.6.1",
"babelify": "^8.0.0",
"browserify": "^14.5.0",
"@types/jasmine": "^2.8.8",
"@types/node": "^8.10.20",
"canonical-path": "0.0.2",
"child-process-promise": "2.2.1",
"conventional-changelog-cli": "1.3.4",
"cpr": "2.0.0",
"cz-conventional-changelog": "2.0.0",
"decamelize": "1.2.0",
"dgeni": "0.4.7",
"dgeni-packages": "0.16.10",
"fs-extra": "^4.0.3",
"fs-extra-promise": "^1.0.1",
"fs-extra": "2.0.0",
"fs-extra-promise": "0.4.1",
"gulp": "3.9.1",
"gulp-rename": "1.2.2",
"gulp-replace": "0.6.1",
"gulp-tslint": "8.1.2",
"jest": "21.2.1",
"gulp-replace": "0.5.4",
"gulp-tslint": "6.1.2",
"jasmine-core": "^2.99.1",
"karma": "^1.7.0",
"karma-cli": "^1.0.1",
"karma-jasmine": "^1.1.2",
"karma-phantomjs-launcher": "^1.0.4",
"karma-typescript": "^3.0.12",
"karma-typescript-es6-transform": "^1.0.4",
"lodash": "4.17.4",
"minimist": "1.2.0",
"nodemon": "1.12.1",
"rimraf": "^2.6.2",
"rxjs": "5.5.2",
"string-replace-webpack-plugin": "^0.1.3",
"ts-jest": "21.1.4",
"ts-node": "3.3.0",
"tslint": "5.8.0",
"tslint-ionic-rules": "0.0.11",
"typescript": "^2.6.2",
"uglifyjs-webpack-plugin": "^1.1.2",
"unminified-webpack-plugin": "^1.4.2",
"webpack": "^3.9.1",
"winston": "^3.0.0-rc1"
"node-html-encoder": "0.0.2",
"q": "1.5.0",
"queue": "4.2.1",
"rimraf": "2.6.1",
"rxjs": "^5.5.11",
"semver": "5.3.0",
"tslint": "3.15.1",
"tslint-ionic-rules": "0.0.8",
"typescript": "~2.4.2",
"zone.js": "^0.8.26"
},
"jest": {
"transform": {
"^.+\\.tsx?$": "<rootDir>/node_modules/ts-jest/preprocessor.js"
},
"testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(js?|ts?)$",
"moduleFileExtensions": [
"ts",
"tsx",
"js",
"jsx",
"json"
]
"scripts": {
"start": "npm run test:watch",
"lint": "gulp lint",
"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 .tmp",
"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",
"postchangelog": "git commit -am \"chore(): update changelog\"",
"test": "karma start karma.conf.js --single-run",
"test:watch": "karma start karma.conf.js",
"readmes": "gulp readmes"
},
"repository": {
"type": "git",
+159
View File
@@ -0,0 +1,159 @@
"use strict";
// 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/@ionic-native'), // dist directory root path
BUILD_CORE_DIST = path.resolve(BUILD_DIST_ROOT, 'core'); // core dist directory path
// dependency versions
const ANGULAR_VERSION = '*',
RXJS_VERSION = '^5.0.1',
MIN_CORE_VERSION = '^4.2.0',
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': MIN_CORE_VERSION,
'@angular/core': ANGULAR_VERSION,
'rxjs': RXJS_VERSION
};
// set peer dependencies for all plugins
PLUGIN_PACKAGE_JSON.peerDependencies = PLUGIN_PEER_DEPS;
// 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);
// Build specific list of plugins to build from arguments, if any
let pluginsToBuild = process.argv.slice(2);
let ignoreErrors = false;
let errors = [];
const index = pluginsToBuild.indexOf('ignore-errors');
if (index > -1) {
ignoreErrors = true;
pluginsToBuild.splice(index, 1);
console.log('Build will continue even if errors were thrown. Errors will be printed when build finishes.');
}
if (!pluginsToBuild.length) {
pluginsToBuild = PLUGINS;
}
// 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_DIST_ROOT, 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_DIST_ROOT, pluginName, 'package.json'), packageJson);
})
.then(() => {
// compile the plugin
exec(`${ROOT}/node_modules/.bin/ngc -p ${tsConfigPath}`, (err, stdout, stderr) => {
if (err) {
if (!ignoreErrors) {
// oops! something went wrong.
console.log(err);
callback(`\n\nBuilding ${pluginName} failed.`);
return;
} else {
errors.push(err);
}
}
// we're done with this plugin!
callback();
});
})
.catch(callback);
}); // QUEUE.push end
};
pluginsToBuild.forEach(addPluginToQueue);
QUEUE.start((err) => {
if (err) {
console.log('Error building plugins.');
console.log(err);
process.stderr.write(err);
process.exit(1);
} else if (errors.length) {
errors.forEach(e => {
console.log(e.message) && console.log('\n');
process.stderr.write(err);
});
console.log('Build complete with errors');
process.exit(1);
} else {
console.log('Done processing plugins!');
}
});
+14
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/ionic-team/ionic-native.git"
}
}
-124
View File
@@ -1,124 +0,0 @@
import * as ts from 'typescript';
import * as fs from 'fs-extra';
import * as path from 'path';
import { camelCase, clone } from 'lodash';
import { Logger } from '../logger';
export const ROOT = path.resolve(__dirname, '../../');
export const TS_CONFIG = clone(require(path.resolve(ROOT, 'tsconfig.json')));
export const COMPILER_OPTIONS = TS_CONFIG.compilerOptions;
export const PLUGINS_ROOT = path.join(ROOT, 'src/@ionic-native/plugins/');
export const PLUGIN_PATHS = fs.readdirSync(PLUGINS_ROOT).map(d => path.join(PLUGINS_ROOT, d, 'index.ts'));
export function getDecorator(node: ts.Node, index: number = 0): ts.Decorator {
if (node.decorators && node.decorators[index])
return node.decorators[index];
}
export function hasDecorator(decoratorName: string, node: ts.Node): boolean {
return node.decorators && node.decorators.length && node.decorators.findIndex(d => getDecoratorName(d) === decoratorName) > -1;
}
export function getDecoratorName(decorator: any) {
return decorator.expression.expression.text;
}
export function getRawDecoratorArgs(decorator: any): any[] {
if (decorator.expression.arguments.length === 0) return [];
return decorator.expression.arguments[0].properties;
}
export function getDecoratorArgs(decorator: any) {
const properties: any[] = getRawDecoratorArgs(decorator);
const args = {};
properties.forEach(prop => {
let val;
switch (prop.initializer.kind) {
case ts.SyntaxKind.StringLiteral:
val = prop.initializer.text;
// args[prop.name.escapedText] = val;
break;
case ts.SyntaxKind.ArrayLiteralExpression:
val = prop.initializer.elements.map(e => e.text);
break;
case ts.SyntaxKind.TrueKeyword:
val = true;
break;
case ts.SyntaxKind.FalseKeyword:
val = false;
break;
case ts.SyntaxKind.NumericLiteral:
val = Number(prop.initializer.text);
break;
default:
Logger.debug('Unexpected property value type: ' + prop.initializer.kind);
throw 'Unexpected property value type << helpers.ts >>';
}
args[prop.name.text] = val;
});
return args;
}
/**
* FROM STENCIL
* Convert a js value into typescript AST
* @param val array, object, string, boolean, or number
* @returns Typescript Object Literal, Array Literal, String Literal, Boolean Literal, Numeric Literal
*/
export function convertValueToLiteral(val: any) {
if (Array.isArray(val)) {
return arrayToArrayLiteral(val);
}
if (typeof val === 'object') {
return objectToObjectLiteral(val);
}
if (typeof val === 'number') {
return ts.createNumericLiteral(String(val));
}
return ts.createLiteral(val);
}
/**
* FROM STENCIL
* Convert a js object into typescript AST
* @param obj key value object
* @returns Typescript Object Literal Expression
*/
function objectToObjectLiteral(obj: { [key: string]: any }): ts.ObjectLiteralExpression {
const newProperties: ts.ObjectLiteralElementLike[] = Object.keys(obj).map((key: string): ts.ObjectLiteralElementLike => {
return ts.createPropertyAssignment(ts.createLiteral(key), convertValueToLiteral(obj[key]) as ts.Expression);
});
return ts.createObjectLiteral(newProperties);
}
/**
* FROM STENCIL
* Convert a js array into typescript AST
* @param list array
* @returns Typescript Array Literal Expression
*/
function arrayToArrayLiteral(list: any[]): ts.ArrayLiteralExpression {
const newList: any[] = list.map(convertValueToLiteral);
return ts.createArrayLiteral(newList);
}
export function getMethodsForDecorator(decoratorName: string) {
switch (decoratorName) {
case 'CordovaProperty': return ['cordovaPropertyGet', 'cordovaPropertySet'];
case 'InstanceProperty': return ['instancePropertyGet', 'instancePropertySet'];
case 'CordovaCheck': return ['checkAvailability'];
case 'InstanceCheck': return ['instanceAvailability'];
}
return [camelCase(decoratorName)];
}
-105
View File
@@ -1,105 +0,0 @@
import * as ts from 'typescript';
import * as fs from 'fs-extra';
import * as path from 'path';
import * as ngc from '@angular/compiler-cli';
import * as rimraf from 'rimraf';
import { generateDeclarations } from './transpile';
import { clone } from 'lodash';
import { EmitFlags } from '@angular/compiler-cli';
import { importsTransformer } from './transformers/imports';
import { pluginClassTransformer } from './transformers/plugin-class';
import { COMPILER_OPTIONS, PLUGIN_PATHS, ROOT } from './helpers';
export function getProgram(rootNames: string[] = createSourceFiles()) {
const options: ngc.CompilerOptions = clone(COMPILER_OPTIONS);
options.basePath = ROOT;
options.moduleResolution = ts.ModuleResolutionKind.NodeJs;
options.module = ts.ModuleKind.ES2015;
options.target = ts.ScriptTarget.ES5;
options.lib = ['dom', 'es2017'];
options.inlineSourceMap = true;
options.inlineSources = true;
delete options.baseUrl;
const host: ngc.CompilerHost = ngc.createCompilerHost({ options });
return ngc.createProgram({
rootNames,
options,
host
});
}
// hacky way to export metadata only for core package
export function transpileNgxCore() {
getProgram([path.resolve(ROOT, 'src/@ionic-native/core/index.ts')]).emit({
emitFlags: EmitFlags.Metadata,
emitCallback: ({ program, writeFile, customTransformers, cancellationToken, targetSourceFile }) =>
program.emit(targetSourceFile, writeFile, cancellationToken, true, customTransformers)
});
}
export function transpileNgx() {
getProgram().emit({
emitFlags: EmitFlags.Metadata,
customTransformers: {
beforeTs: [
importsTransformer(true),
pluginClassTransformer(true)
]
}
});
}
export function generateDeclarationFiles() {
generateDeclarations(PLUGIN_PATHS.map(p => p.replace('index.ts', 'ngx/index.ts')));
}
// remove reference to @ionic-native/core decorators
export function modifyMetadata() {
PLUGIN_PATHS.map(p => p.replace('src', 'dist').replace('index.ts', 'ngx/index.metadata.json'))
.forEach(p => {
const content = fs.readJSONSync(p);
let _prop;
for (const prop in content[0].metadata) {
_prop = content[0].metadata[prop];
removeIonicNativeDecorators(_prop);
if (_prop.members) {
for (const memberProp in _prop.members) {
removeIonicNativeDecorators(_prop.members[memberProp][0]);
}
}
}
fs.writeJSONSync(p, content);
});
}
function removeIonicNativeDecorators(node: any) {
if (node.decorators && node.decorators.length) {
node.decorators = node.decorators.filter((d, i) => d.expression.module !== '@ionic-native/core');
}
if (node.decorators && !node.decorators.length) delete node.decorators;
}
function createSourceFiles(): string[] {
return PLUGIN_PATHS.map((indexPath: string) => {
const ngxPath = path.resolve(indexPath.replace('index.ts', ''), 'ngx'),
newPath = path.resolve(ngxPath, 'index.ts');
// delete directory
rimraf.sync(ngxPath);
fs.mkdirpSync(ngxPath);
fs.copyFileSync(indexPath, newPath);
return newPath;
});
}
export function cleanupNgx() {
PLUGIN_PATHS.forEach((indexPath: string) =>
rimraf.sync(indexPath.replace('index.ts', 'ngx'))
);
}
+14
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/ionic-team/ionic-native.git"
}
}
+58
View File
@@ -0,0 +1,58 @@
"use strict";
// 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', '@ionic-native');
const FLAGS = '--access public'; // add any flags here if you want... (example: --tag alpha)
const PACKAGES = fs.readdirSync(DIST);
const failedPackages = [];
const QUEUE = queue({
concurrency: 10
});
PACKAGES.forEach(packageName => {
QUEUE.push(done => {
console.log(`Publishing @ionic-native/${packageName}`);
const packagePath = path.resolve(DIST, packageName);
exec(`npm publish ${packagePath} ${FLAGS}`)
.then(() => done())
.catch((e) => {
if (e.stderr && e.stderr.indexOf('previously published version') === -1) {
failedPackages.push({
cmd: e.cmd,
stderr: e.stderr
});
}
done();
});
});
});
QUEUE.start((err) => {
if (err) {
console.log('Error publishing ionic-native. ', err);
} else if (failedPackages.length > 0) {
console.log(`${failedPackages.length} packages failed to publish.`);
console.log(failedPackages);
} else {
console.log('Done publishing ionic-native!');
}
});
-2
View File
@@ -1,2 +0,0 @@
// removes the __extends method that is added automatically by typescript
module.exports = source => source.replace(/var\s__extends\s=\s\(this\s&&[\sa-z\._\(\)\|{}=:\[\]&,;?]+}\)\(\);/i, '');
@@ -1,54 +0,0 @@
import * as ts from 'typescript';
import * as fs from 'fs-extra';
import * as path from 'path';
import { hasDecorator, ROOT } from '../helpers';
export interface InjectableClassEntry {
file: string;
className: string;
dirName: string;
}
const injectableClasses: InjectableClassEntry[] = [];
export const EMIT_PATH = path.resolve(ROOT, 'injectable-classes.json');
/**
* This transformer extracts all the injectable classes
* so we can use all the names later on when we compile
* an es5 bundle.
*
* Every injectable class will end up in the
* window['IonicNative'] object.
*/
export function extractInjectables() {
return (ctx: ts.TransformationContext) => {
return tsSourceFile => {
if (tsSourceFile.fileName.indexOf('src/@ionic-native/plugins') > -1) {
ts.visitEachChild(tsSourceFile, node => {
if (node.kind !== ts.SyntaxKind.ClassDeclaration) {
return node;
}
const isInjectable: boolean = hasDecorator('Injectable', node);
if (isInjectable) {
injectableClasses.push({
file: tsSourceFile.path,
className: (node as ts.ClassDeclaration).name.text,
dirName: tsSourceFile.path.split(/[\\\/]+/).reverse()[1]
});
}
}, ctx);
}
return tsSourceFile;
}
};
}
export function emitInjectableClasses() {
fs.writeJSONSync(EMIT_PATH, injectableClasses);
}
export function cleanEmittedData() {
fs.unlinkSync(EMIT_PATH);
}
-53
View File
@@ -1,53 +0,0 @@
import * as ts from 'typescript';
import { getMethodsForDecorator } from '../helpers';
function transformImports(file: ts.SourceFile, ctx: ts.TransformationContext, ngcBuild?: boolean) {
// remove angular imports
if (!ngcBuild) {
file.statements = (file.statements as any).filter((s: any) => !(s.kind === ts.SyntaxKind.ImportDeclaration && s.moduleSpecifier.text === '@angular/core'));
}
// find the @ionic-native/core import statement
const importStatement = (file.statements as any).find((s: any) => {
return s.kind === ts.SyntaxKind.ImportDeclaration && s.moduleSpecifier.text === '@ionic-native/core';
});
// we're only interested in files containing @ionic-native/core import statement
if (!importStatement) return file;
let decorators: string[] = [];
const decoratorRegex: RegExp = /@([a-zA-Z]+)\(/g;
const ignored: string [] = ['Plugin', 'Component'];
let m;
while ((m = decoratorRegex.exec(file.text)) !== null) {
if (m.index === decoratorRegex.lastIndex) {
decoratorRegex.lastIndex++;
}
if (m && m[1] && decorators.indexOf(m[1]) === -1 && ignored.indexOf(m[1]) === -1) decorators.push(m[1]);
}
if (decorators.length) {
let methods = [];
decorators.forEach(d => methods = getMethodsForDecorator(d).concat(methods));
importStatement.importClause.namedBindings.elements = [
ts.createIdentifier('IonicNativePlugin'),
...methods.map(m => ts.createIdentifier(m))
];
}
return file;
}
export function importsTransformer(ngcBuild?: boolean) {
return (ctx: ts.TransformationContext) => {
return tsSourceFile => {
return transformImports(tsSourceFile, ctx, ngcBuild);
}
};
}
-37
View File
@@ -1,37 +0,0 @@
import * as ts from 'typescript';
import { transformMethod } from './methods';
import { transformProperty } from './properties';
export function transformMembers(cls: ts.ClassDeclaration) {
const propertyIndices: number[] = [];
let members = cls.members.map((member: any, index: number) => {
// only process decorated members
if (!member.decorators || !member.decorators.length) return member;
switch (member.kind) {
case ts.SyntaxKind.MethodDeclaration:
return transformMethod(member);
case ts.SyntaxKind.PropertyDeclaration:
propertyIndices.push(index);
return member;
case ts.SyntaxKind.Constructor:
return ts.createConstructor(undefined, undefined, member.parameters, member.body);
default:
return member; // in case anything gets here by accident...
}
});
propertyIndices.forEach((i: number) => {
const [getter, setter] = transformProperty(members, i) as any;
members.push(getter, setter);
});
propertyIndices.reverse().forEach(i => members.splice(i, 1));
return members;
}
-49
View File
@@ -1,49 +0,0 @@
import * as ts from 'typescript';
import { Logger } from '../../logger';
import { convertValueToLiteral, getDecorator, getDecoratorArgs, getDecoratorName, getMethodsForDecorator } from '../helpers';
export function transformMethod(method: ts.MethodDeclaration) {
if (!method) return;
const decorator = getDecorator(method),
decoratorName = getDecoratorName(decorator),
decoratorArgs = getDecoratorArgs(decorator);
try {
return ts.createMethod(undefined, undefined, undefined, method.name, undefined, method.typeParameters, method.parameters, method.type, ts.createBlock([
ts.createReturn(
getMethodBlock(method, decoratorName, decoratorArgs)
)
]));
} catch (e) {
Logger.error('Error transforming method: ' + (method.name as any).text);
Logger.error(e.message);
}
}
function getMethodBlock(method: ts.MethodDeclaration, decoratorName: string, decoratorArgs: any): ts.Expression {
const decoratorMethod = getMethodsForDecorator(decoratorName)[0];
switch (decoratorName) {
case 'CordovaCheck':
case 'InstanceCheck':
// TODO remove function wrapper
return ts.createImmediatelyInvokedArrowFunction([ts.createIf(
ts.createBinary(
ts.createCall(ts.createIdentifier(decoratorMethod), undefined, [ts.createThis()]),
ts.SyntaxKind.EqualsEqualsEqualsToken,
ts.createTrue()
),
method.body
)]);
default:
return ts.createCall(ts.createIdentifier(decoratorMethod), undefined, [
ts.createThis(),
ts.createLiteral((method.name as any).text),
convertValueToLiteral(decoratorArgs),
ts.createIdentifier('arguments')
]);
}
}
@@ -1,63 +0,0 @@
import * as ts from 'typescript';
import { Logger } from '../../logger';
import { convertValueToLiteral, getDecorator, getDecoratorArgs, getDecoratorName } from '../helpers';
import { transformMembers } from './members';
function transformClass(cls: any, ngcBuild?: boolean) {
Logger.profile('transformClass: ' + cls.name.text);
const pluginStatics = [];
const dec: any = getDecorator(cls);
if (dec) {
const pluginDecoratorArgs = getDecoratorArgs(dec);
// add plugin decorator args as static properties of the plugin's class
for (let prop in pluginDecoratorArgs) {
pluginStatics.push(ts.createProperty(
undefined,
[ts.createToken(ts.SyntaxKind.StaticKeyword)],
ts.createIdentifier(prop),
undefined,
undefined,
convertValueToLiteral(pluginDecoratorArgs[prop])
));
}
}
cls = ts.createClassDeclaration(
ngcBuild && cls.decorators && cls.decorators.length? cls.decorators.filter(d => getDecoratorName(d) === 'Injectable') : undefined, // remove Plugin and Injectable decorators
[ts.createToken(ts.SyntaxKind.ExportKeyword)],
cls.name,
cls.typeParameters,
cls.heritageClauses,
[
...transformMembers(cls),
...pluginStatics
]
);
Logger.profile('transformClass: ' + cls.name.text, { level: 'verbose' });
return cls;
}
function transformClasses(file: ts.SourceFile, ctx: ts.TransformationContext, ngcBuild?: boolean) {
Logger.silly('Transforming file: ' + file.fileName);
return ts.visitEachChild(file, node => {
if (node.kind !== ts.SyntaxKind.ClassDeclaration) {
return node;
}
return transformClass(node, ngcBuild);
}, ctx);
}
export function pluginClassTransformer(ngcBuild?: boolean): ts.TransformerFactory<ts.SourceFile> {
return (ctx: ts.TransformationContext) => {
return tsSourceFile => {
if (tsSourceFile.fileName.indexOf('src/@ionic-native/plugins') > -1)
return transformClasses(tsSourceFile, ctx, ngcBuild);
return tsSourceFile;
};
};
}
-53
View File
@@ -1,53 +0,0 @@
import * as ts from 'typescript';
import { getDecorator, getDecoratorName } from '../helpers';
export function transformProperty(members: any[], index: number) {
const property = members[index] as ts.PropertyDeclaration,
decorator = getDecorator(property),
decoratorName = getDecoratorName(decorator);
let type: 'cordova' | 'instance';
switch (decoratorName) {
case 'CordovaProperty':
type = 'cordova';
break;
case 'InstanceProperty':
type = 'instance';
break;
default: return property;
}
const getter = ts.createGetAccessor(undefined, undefined, property.name, undefined, property.type, ts.createBlock([
ts.createReturn(
ts.createCall(
ts.createIdentifier(type + 'PropertyGet'),
undefined,
[
ts.createThis(),
ts.createLiteral((property.name as any).text)
]
)
)
]));
const setter = ts.createSetAccessor(undefined, undefined, property.name, [ts.createParameter(undefined, undefined, undefined, 'value', undefined, property.type)], ts.createBlock([
ts.createStatement(
ts.createCall(
ts.createIdentifier(type + 'PropertySet'),
undefined,
[
ts.createThis(),
ts.createLiteral((property.name as any).text),
ts.createIdentifier('value')
]
)
)
]));
return [getter, setter];
}
-51
View File
@@ -1,51 +0,0 @@
import * as ts from 'typescript';
import { pluginClassTransformer } from './transformers/plugin-class';
import { importsTransformer } from './transformers/imports';
import { clone } from 'lodash';
import { emitInjectableClasses, extractInjectables } from './transformers/extract-injectables';
import { COMPILER_OPTIONS, PLUGIN_PATHS, TS_CONFIG } from './helpers';
let host: ts.CompilerHost;
export function getCompilerHost() {
if (!host) host = ts.createCompilerHost(TS_CONFIG);
return host;
}
export function getProgram(declaration: boolean = false, pluginPaths: string[] = PLUGIN_PATHS) {
const compilerOptions: ts.CompilerOptions = clone(COMPILER_OPTIONS);
compilerOptions.declaration = declaration;
compilerOptions.moduleResolution = ts.ModuleResolutionKind.NodeJs;
compilerOptions.target = ts.ScriptTarget.ES5;
compilerOptions.module = ts.ModuleKind.ES2015;
compilerOptions.inlineSourceMap = true;
compilerOptions.inlineSources = true;
compilerOptions.lib = [
'lib.dom.d.ts',
'lib.es5.d.ts',
'lib.es2015.d.ts',
'lib.es2016.d.ts',
'lib.es2017.d.ts'
];
return ts.createProgram(pluginPaths, compilerOptions, getCompilerHost());
}
export function generateDeclarations(sourceFiles?: string[]) {
return getProgram(true, sourceFiles).emit(undefined, getCompilerHost().writeFile, undefined, true);
}
export function transpile() {
const emitResult = getProgram().emit(undefined, getCompilerHost().writeFile, undefined, false, {
before: [
extractInjectables(),
importsTransformer(),
pluginClassTransformer(),
]
});
emitInjectableClasses();
return emitResult;
}
@@ -5,22 +5,21 @@
"stripInternal": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"noImplicitAny": true,
"module": "es2015",
"moduleResolution": "node",
"outDir": "./dist",
"rootDir": "src",
"outDir": "../../dist/",
"rootDir": "../../src/",
"target": "es5",
"skipLibCheck": true,
"lib": ["es2017", "dom"],
"lib": ["es2015", "dom"],
"sourceMap": true,
"inlineSources": true,
"sourceMap": true
"noImplicitAny": true
},
"include": [
"src/@ionic-native/core/**/*.ts"
"files": [
"../../src/@ionic-native/core/index.ts"
],
"exclude": [
"node_modules",
"src/@ionic-native/core/**/*.spec.ts"
]
"angularCompilerOptions": {
"genDir": "../../.tmp/core-aot"
}
}
+23
View File
@@ -0,0 +1,23 @@
{
"compilerOptions": {
"baseUrl": ".",
"declaration": true,
"stripInternal": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"module": "es2015",
"moduleResolution": "node",
"outDir": "../../../dist/@ionic-native/",
"paths": {
"@ionic-native/core": ["../../../dist/@ionic-native/core"]
},
"rootDir": "../../../src/@ionic-native/plugins/",
"target": "es5",
"skipLibCheck": true,
"lib": ["es2015", "dom"],
"sourceMap": true,
"inlineSources": true,
"noImplicitAny": true
},
"files": []
}
+65
View File
@@ -0,0 +1,65 @@
const exec = require('child-process-promise').exec;
let diff;
exec(`git branch | grep \\* | cut -d ' ' -f2`)
.then(output => {
if (output.stderr) {
return Promise.reject(output.stderr);
}
const branch = output.stdout.trim();
if (branch !== 'master') {
console.log('Merging master branch in ...');
// not on master branch
// let's test the changes that were made
return exec(`git merge origin master`);
}
})
.then((output) => {
if (output && output.stderr) {
return Promise.reject(output.stderr);
}
console.log('Checking for differences ...');
return exec(`git diff --name-status origin master`)
})
.then((output) => {
if (output && output.stderr) {
return Promise.reject(output.stderr);
}
diff = output.stdout;
diff = diff.replace(/A\s+/g, '');
diff = diff.match(/src\/@ionic-native\/plugins\/([a-zA-Z0-9\-]+)\/index\.ts/g);
if (!diff) process.exit();
console.log(`${ diff.length } plugins were modified. We will now build them to verify they still work.`);
return exec('npm run build:core --silent');
})
.then((output) => {
if (output && output.stderr) {
return Promise.reject(output.stderr);
}
console.log('Built core library successfully ...');
console.log('Building plugins ...');
diff = diff.map(text => text.replace('src/@ionic-native/plugins/', '').replace('/index.ts', ''));
return exec(`npm run build:modules ${diff.join(' ')} --silent`);
})
.then((output) => {
if (output && output.stderr) {
console.log(output.stderr);
process.exit(1);
}
console.log(output.stdout);
process.exit();
})
.catch(e => {
console.log(e.message || e);
process.exit(1);
});
@@ -2,5 +2,5 @@
"sitePath": "../ionic-site",
"v2DocsDir": "docs/native",
"docsDest": "../ionic-site/content/docs/native",
"pluginDir": "dist/@ionic-native/plugins"
"pluginDir": "dist/@ionic-native"
}
@@ -50,9 +50,9 @@ module.exports = currentVersion => {
// Don't run unwanted processors since we are not using the normal file reading processor
readFilesProcessor.$enabled = false;
readFilesProcessor.basePath = path.resolve(__dirname, '../../..');
readFilesProcessor.basePath = path.resolve(__dirname, '../..');
readTypeScriptModules.basePath = path.resolve(__dirname, '../../..');
readTypeScriptModules.basePath = path.resolve(__dirname, '../..');
readTypeScriptModules.sourceFiles = [
'./src/@ionic-native/plugins/**/*.ts'
];
@@ -40,6 +40,7 @@ module.exports = currentVersion => {
computePathsProcessor.pathTemplates = [{
docTypes: ['class'],
getOutputPath: doc => doc.originalModule.replace(config.pluginDir + '/', '')
.replace('/plugins', '')
.replace(/\/index$/, '/README.md')
}];
@@ -49,15 +50,15 @@ module.exports = currentVersion => {
.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, '../../..');
readFilesProcessor.basePath = path.resolve(__dirname, '../..');
readTypeScriptModules.basePath = path.resolve(path.resolve(__dirname, '../../..'));
readTypeScriptModules.basePath = path.resolve(path.resolve(__dirname, '../..'));
readTypeScriptModules.sourceFiles = ['./src/@ionic-native/plugins/**/*.ts'];
})
// Configure file writing
.config(function(writeFilesProcessor) {
writeFilesProcessor.outputFolder = './dist/@ionic-native/';
writeFilesProcessor.outputFolder = './dist/';
})
// Configure rendering
+3 -3
View File
@@ -1,5 +1,5 @@
"use strict";
const config = require('./config.json'),
const config = require('../config.json'),
projectPackage = require('../../package.json'),
path = require('path'),
fs = require('fs-extra-promise').useFs(require('fs-extra')),
@@ -10,7 +10,7 @@ module.exports = gulp => {
try {
const ionicPackage = require('./dgeni/dgeni-config')(projectPackage.version),
const ionicPackage = require('./dgeni-config')(projectPackage.version),
dgeni = new Dgeni([ionicPackage]);
return dgeni.generate().then(docs => console.log(docs.length + ' docs generated'));
@@ -27,7 +27,7 @@ module.exports = gulp => {
try {
const ionicPackage = require('./dgeni/dgeni-readmes-config')(projectPackage.version),
const ionicPackage = require('./dgeni-readmes-config')(projectPackage.version),
dgeni = new Dgeni([ionicPackage]);
return dgeni.generate().then(docs => console.log(docs.length + ' README files generated'));
@@ -10,6 +10,12 @@ module.exports = function jekyll(renderDocsProcessor) {
// pretty up and sort the docs object for menu generation
docs = docs.filter(doc => (!!doc.name && !!doc.outputPath) || doc.docType === 'index-page');
docs.push({
docType: 'class',
URL: 'https://github.com/ionic-team/ionic-native-google-maps/blob/master/documents/README.md',
name: 'Google Maps',
});
docs.sort((a, b) => {
const textA = a.name ? a.name.toUpperCase() : '',
textB = b.name ? b.name.toUpperCase() : '';
@@ -18,14 +24,20 @@ module.exports = function jekyll(renderDocsProcessor) {
});
docs.forEach(doc => {
if (!doc.outputPath) {
return;
}
doc.outputPath = doc.outputPath.toLowerCase().replace(/\s/g, '-');
doc.URL = doc.outputPath.replace('docs//', 'docs/')
.replace('/index.md', '')
.replace('content/', '');
// add trailing slash to plugin pages
if(!doc.URL.endsWith("/") && !doc.URL.endsWith(".html")) {
doc.URL = doc.URL+'/';
doc.URL = doc.URL + '/';
}
doc.URL = '/' + doc.URL;
});
const betaDocs = [];
@@ -10,7 +10,7 @@ module.exports = function readmes(renderDocsProcessor) {
docs = docs.filter(doc => (!!doc.name && !!doc.outputPath) || doc.docType === 'index-page');
docs.forEach(doc => {
doc.outputPath = doc.outputPath.replace('src/@ionic-native/', '');
doc.outputPath = doc.outputPath.replace('src/', '');
});
return docs;
@@ -6,5 +6,5 @@
</li>
<@- for doc in docs @><@ if doc.URL and doc.private != true @>
<li class="capitalize {% if page.id == '<$ doc.name|lower|dashify $>' %}active{% endif %}">
<a href="/<$ doc.URL $>"><$ doc.name $><@ if doc.paid == true @> <span class="paid">Paid</span><@ endif @><@ if doc.beta == true @> <span class="beta">&beta;</span><@ endif @></a>
<a href="<$ doc.URL $>"><$ doc.name $><@ if doc.paid == true @> <span class="paid">Paid</span><@ endif @><@ if doc.beta == true @> <span class="beta">&beta;</span><@ endif @></a>
</li><@ endif @><@ endfor @>
+1 -1
View File
@@ -31,7 +31,7 @@ function run {
# git push origin master || :
echo "-- Updated docs for $VERSION_NAME successfully!"
echo "-- Updated docs for $VERSION_NAME succesfully!"
fi
}
-13
View File
@@ -1,13 +0,0 @@
import { createLogger, transports, format } from 'winston';
const { label, printf, prettyPrint, combine, colorize, simple } = format;
const LOG_LEVEL = 'silly';
export const Logger = createLogger({
level: LOG_LEVEL,
format: combine(
colorize(),
simple(),
),
transports: [new transports.Console({ level: LOG_LEVEL })]
});
-82
View File
@@ -1,82 +0,0 @@
import * as fs from 'fs-extra';
import * as path from 'path';
import * as webpack from 'webpack';
import * as uglifyJsPlugin from 'uglifyjs-webpack-plugin';
import * as unminifiedPlugin from 'unminified-webpack-plugin';
import { cleanEmittedData, EMIT_PATH, InjectableClassEntry } from '../build/transformers/extract-injectables';
import { ROOT } from '../build/helpers';
import { Logger } from '../logger';
const DIST = path.resolve(ROOT, 'dist');
const INDEX_PATH = path.resolve(DIST, 'index.js');
const INJECTABLE_CLASSES = fs.readJSONSync(EMIT_PATH).map((item: InjectableClassEntry) => {
item.file = './' + item.file.split(/[\/\\]+/).slice(-4, -1).join('/');
return item;
});
const webpackConfig: webpack.Configuration = {
entry: INDEX_PATH,
devtool: 'source-map',
target: 'web',
output: {
path: DIST,
filename: 'ionic-native.min.js'
},
resolve: {
modules: ['node_modules'],
extensions: ['.js'],
alias: {
'@ionic-native/core': path.resolve(DIST, '@ionic-native/core/index.js')
}
},
module: {
rules: [{
test: /\.js$/,
use: path.resolve(ROOT, 'scripts/build/remove-tslib-helpers.js')
}]
},
plugins: [
new webpack.ProvidePlugin({
'__extends': ['tslib', '__extends']
}),
new webpack.optimize.OccurrenceOrderPlugin(true),
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('production')
}),
new uglifyJsPlugin({
sourceMap: true
}),
new unminifiedPlugin()
]
};
function getPluginImport(entry: InjectableClassEntry) {
return `import { ${ entry.className } } from '${ entry.file }';`;
}
function createIndexFile() {
let fileContent = '';
fileContent += INJECTABLE_CLASSES.map(getPluginImport).join('\n');
fileContent += `\nwindow.IonicNative = {\n`;
fileContent += INJECTABLE_CLASSES.map(e => e.className).join(',\n');
fileContent += '\n};\n';
fileContent += `require('./@ionic-native/core/bootstrap').checkReady();\n`;
fileContent += `require('./@ionic-native/core/ng1').initAngular1(window.IonicNative);`;
fs.writeFileSync(INDEX_PATH, fileContent, { encoding: 'utf-8' });
}
function compile() {
Logger.profile('build-es5');
webpack(webpackConfig, (err, stats) => {
Logger.profile('build-es5', { level: 'verbose' });
if (err) Logger.error('Error occurred while compiling with Webpack', err);
else {
Logger.info('Compiled ES5 file with Webpack successfully.');
}
cleanEmittedData();
});
}
createIndexFile();
compile();
-29
View File
@@ -1,29 +0,0 @@
import { generateDeclarations, transpile } from '../build/transpile';
import { EMIT_PATH } from '../build/transformers/extract-injectables';
import { PLUGIN_PATHS } from '../build/helpers';
import * as fs from 'fs-extra';
import * as path from 'path';
generateDeclarations();
transpile();
const outDirs = PLUGIN_PATHS.map(p => p.replace('src', 'dist').replace(/[\\/]index.ts/, ''));
const injectableClasses = fs.readJSONSync(EMIT_PATH);
outDirs.forEach(dir => {
const classes = injectableClasses.filter(entry => entry.dirName === dir.split(/[\\/]+/).pop());
let jsFile: string = fs.readFileSync(path.join(dir, 'index.js'), 'utf-8'),
dtsFile: string = fs.readFileSync(path.join(dir, 'index.d.ts'), 'utf-8');
classes.forEach(entry => {
dtsFile = dtsFile.replace(`class ${ entry.className } `, 'class ' + entry.className + 'Original ');
dtsFile += `\nexport declare const ${ entry.className }: ${ entry.className }Original;`;
jsFile = jsFile.replace(new RegExp(`([\\s\\(])${ entry.className }([\\s\\.;\\(,])`, 'g'), '$1' + entry.className + 'Original$2');
jsFile = jsFile.replace(`export { ${ entry.className }Original }`, `var ${ entry.className } = new ${ entry.className }Original();\nexport { ${ entry.className } }`);
});
fs.writeFileSync(path.join(dir, 'index.js'), jsFile, 'utf-8');
fs.writeFileSync(path.join(dir, 'index.d.ts'), dtsFile, 'utf-8');
});
-7
View File
@@ -1,7 +0,0 @@
import { generateDeclarationFiles, transpileNgx, transpileNgxCore, modifyMetadata, cleanupNgx } from '../build/ngx';
transpileNgxCore();
transpileNgx();
generateDeclarationFiles();
modifyMetadata();
cleanupNgx();
-103
View File
@@ -1,103 +0,0 @@
import * as fs from 'fs-extra';
import * as path from 'path';
import { merge } from 'lodash';
import { exec } from 'child_process';
import { PLUGIN_PATHS, ROOT } from '../build/helpers';
import { cpus } from 'os';
import * as Queue from 'async-promise-queue';
import { Logger } from '../logger';
const MAIN_PACKAGE_JSON = require('../../package.json');
const VERSION = MAIN_PACKAGE_JSON.version;
const FLAGS = '--access public --tag beta';
const PACKAGE_JSON_BASE = {
'description': 'Ionic Native - Native plugins for ionic apps',
'module': 'index.js',
'typings': 'index.d.ts',
'author': 'ionic',
'license': 'MIT',
'repository': {
'type': 'git',
'url': 'https://github.com/ionic-team/ionic-native.git'
}
};
const DIST = path.resolve(ROOT, 'dist/@ionic-native');
const PACKAGES = [];
const RXJS_VEERSION = '^5.0.1';
const CORE_VERSION = '^5.0.0';
const PLUGIN_PEER_DEPENDENCIES = {
'@ionic-native/core': VERSION, // TODO change this in production
'rxjs': RXJS_VEERSION
};
function getPackageJsonContent(name, peerDependencies = {}) {
return merge(PACKAGE_JSON_BASE, {
name: '@ionic-native/' + name,
peerDependencies,
version: VERSION
});
}
function writePackageJson(data: any, dir: string) {
const filePath = path.resolve(dir, 'package.json');
fs.writeJSONSync(filePath, data);
PACKAGES.push(dir);
}
function prepare() {
// write @ionic-native/core package.json
writePackageJson(
getPackageJsonContent('core', { 'rxjs': RXJS_VEERSION }),
path.resolve(DIST, 'core')
);
// write plugin package.json files
PLUGIN_PATHS.forEach((pluginPath: string) => {
const pluginName = pluginPath.split(/[\/\\]+/).slice(-2)[0];
const packageJsonContents = getPackageJsonContent(pluginName, PLUGIN_PEER_DEPENDENCIES);
const dir = path.resolve(DIST, 'plugins', pluginName);
writePackageJson(packageJsonContents, dir);
});
}
async function publish(ignoreErrors: boolean = false) {
Logger.profile('Publishing');
// upload 1 package per CPU thread at a time
const worker = Queue.async.asyncify((pkg: any) => {
new Promise<any>((resolve, reject) => {
exec(`npm publish ${ pkg } ${ FLAGS }`, (err, stdout) => {
if (stdout) {
Logger.log(stdout.trim());
resolve(stdout);
}
if (err) {
if (!ignoreErrors) {
if (err.message.includes('You cannot publish over the previously published version')) {
Logger.verbose('Ignoring duplicate version error.');
return resolve();
}
reject(err);
}
}
});
});
});
try {
await Queue(worker, PACKAGES, cpus().length);
Logger.info('Done publishing!');
} catch (e) {
Logger.error('Error publishing!');
Logger.error(e);
}
Logger.profile('Publishing', { level: 'verbose' });
}
prepare();
publish();
-1
View File
@@ -5,7 +5,6 @@
* - Add/Change information below
* - 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 and any other docs you added
* - Remove this note
*
-1
View File
@@ -5,7 +5,6 @@
* - Add/Change information below
* - 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 and any other docs you added
* - Remove this note
*
-12
View File
@@ -1,12 +0,0 @@
{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"moduleResolution": "node",
"noImplicitAny": false,
"lib": ["es6"]
},
"exclude": [
"node_modules"
]
}
+244 -244
View File
@@ -1,244 +1,244 @@
# bash utils from angularjs
# This file provides:
# - a default control flow
# * initializes the environment
# * call a function in your script based on the arguments
# - named argument parsing and automatic generation of the "usage" for your script
# - utility functions
#
# Usage:
# - define the variable ARGS_DEF (see below) with the arguments for your script
# - include this file using `source utils.inc` at the end of your script.
#
# Default control flow:
# 0. Set the current directory to the directory of the script. By this
# the script can be called from anywhere.
# 1. Parse the named arguments
# 2. [Redacted]
# 3. If the parameter "verbose" is set, the `-x` flag will be set in bash.
# 4. The function "init" will be called if it exists
# 5. If the parameter "action" is set, it will call the function with the name of that parameter.
# Otherwise the function "run" will be called.
#
# Named Argument Parsing:
# - The variable ARGS_DEF defines the valid command arguments
# * Required args syntax: --paramName=paramRegex
# * Optional args syntax: [--paramName=paramRegex]
# * e.g. ARG_DEFS=("--required_param=(.+)" "[--optional_param=(.+)]")
# - Checks that:
# * all arguments match to an entry in ARGS_DEF
# * all required arguments are present
# * all arguments match their regex
# - Afterwards, every paramter value will be stored in a variable
# with the name of the parameter in upper case (with dash converted to underscore).
#
# Special arguments that are always available:
# - "--action=.*": This parameter will be used to dispatch to a function with that name when the
# script is started
# - "--verbose=true": This will set the `-x` flag in bash so that all calls will be logged
#
# Utility functions:
# - readJsonProp
# - replaceJsonProp
# - resolveDir
# - getVar
# - serVar
# - isFunction
# always stop on errors
set -e
function usage {
echo "Usage: ${0} ${ARG_DEFS[@]}"
exit 1
}
function parseArgs {
local REQUIRED_ARG_NAMES=()
# -- helper functions
function varName {
# everything to upper case and dash to underscore
echo ${1//-/_} | tr '[:lower:]' '[:upper:]'
}
function readArgDefs {
local ARG_DEF
local AD_OPTIONAL
local AD_NAME
local AD_RE
# -- helper functions
function parseArgDef {
local ARG_DEF_REGEX="(\[?)--([^=]+)=(.*)"
if [[ ! $1 =~ $ARG_DEF_REGEX ]]; then
echo "Internal error: arg def has wrong format: $ARG_DEF"
exit 1
fi
AD_OPTIONAL="${BASH_REMATCH[1]}"
AD_NAME="${BASH_REMATCH[2]}"
AD_RE="${BASH_REMATCH[3]}"
if [[ $AD_OPTIONAL ]]; then
# Remove last bracket for optional args.
# Can't put this into the ARG_DEF_REGEX somehow...
AD_RE=${AD_RE%?}
fi
}
# -- run
for ARG_DEF in "${ARG_DEFS[@]}"
do
parseArgDef $ARG_DEF
local AD_NAME_UPPER=$(varName $AD_NAME)
setVar "${AD_NAME_UPPER}_OPTIONAL" "$AD_OPTIONAL"
setVar "${AD_NAME_UPPER}_RE" "$AD_RE"
if [[ ! $AD_OPTIONAL ]]; then
REQUIRED_ARG_NAMES+=($AD_NAME)
fi
done
}
function readAndValidateArgs {
local ARG_NAME
local ARG_VALUE
local ARG_NAME_UPPER
# -- helper functions
function parseArg {
local ARG_REGEX="--([^=]+)=?(.*)"
if [[ ! $1 =~ $ARG_REGEX ]]; then
echo "Can't parse argument $i"
usage
fi
ARG_NAME="${BASH_REMATCH[1]}"
ARG_VALUE="${BASH_REMATCH[2]}"
ARG_NAME_UPPER=$(varName $ARG_NAME)
}
function validateArg {
local AD_RE=$(getVar ${ARG_NAME_UPPER}_RE)
if [[ ! $AD_RE ]]; then
echo "Unknown option: $ARG_NAME"
usage
fi
if [[ ! $ARG_VALUE =~ ^${AD_RE}$ ]]; then
echo "Wrong format: $ARG_NAME"
usage;
fi
# validate that the "action" option points to a valid function
if [[ $ARG_NAME == "action" ]] && ! isFunction $ARG_VALUE; then
echo "No action $ARG_VALUE defined in this script"
usage;
fi
}
# -- run
for i in "$@"
do
parseArg $i
validateArg
setVar "${ARG_NAME_UPPER}" "$ARG_VALUE"
done
}
function checkMissingArgs {
local ARG_NAME
for ARG_NAME in "${REQUIRED_ARG_NAMES[@]}"
do
ARG_VALUE=$(getVar $(varName $ARG_NAME))
if [[ ! $ARG_VALUE ]]; then
echo "Missing: $ARG_NAME"
usage;
fi
done
}
# -- run
readArgDefs
readAndValidateArgs "$@"
checkMissingArgs
}
# getVar(varName)
function getVar {
echo ${!1}
}
# setVar(varName, varValue)
function setVar {
eval "$1=\"$2\""
}
# isFunction(name)
# - to be used in an if, so return 0 if successful and 1 if not!
function isFunction {
if [[ $(type -t $1) == "function" ]]; then
return 0
else
return 1
fi
}
# readJsonProp(jsonFile, property)
# - restriction: property needs to be on an own line!
function readJsonProp {
echo $(sed -En 's/.*"'$2'"[ ]*:[ ]*"(.*)".*/\1/p' $1)
}
# replaceJsonProp(jsonFile, property, newValue)
# - note: propertyRegex will be automatically placed into a
# capturing group! -> all other groups start at index 2!
function replaceJsonProp {
replaceInFile $1 "\"$2\": \".*?\"" "\"$2\": \"$3\""
}
# replaceInFile(file, findPattern, replacePattern)
function replaceInFile {
perl -pi -e "s/$2/$3/g;" $1
}
# resolveDir(relativeDir)
# - resolves a directory relative to the current script
function resolveDir {
echo $(cd $SCRIPT_DIR; cd $1; pwd)
}
function main {
# normalize the working dir to the directory of the script
cd $(dirname $0);SCRIPT_DIR=$(pwd)
ARG_DEFS+=("[--verbose=(true|false)]")
parseArgs "$@"
# --verbose argument
if [[ $VERBOSE == "true" ]]; then
set -x
fi
if isFunction init; then
init "$@"
fi
# jump to the function denoted by the --action argument,
# otherwise call the "run" function
if [[ $ACTION ]]; then
$ACTION "$@"
else
run "$@"
fi
}
main "$@"
# bash utils from angularjs
# This file provides:
# - a default control flow
# * initializes the environment
# * call a function in your script based on the arguments
# - named argument parsing and automatic generation of the "usage" for your script
# - utility functions
#
# Usage:
# - define the variable ARGS_DEF (see below) with the arguments for your script
# - include this file using `source utils.inc` at the end of your script.
#
# Default control flow:
# 0. Set the current directory to the directory of the script. By this
# the script can be called from anywhere.
# 1. Parse the named arguments
# 2. [Redacted]
# 3. If the parameter "verbose" is set, the `-x` flag will be set in bash.
# 4. The function "init" will be called if it exists
# 5. If the parameter "action" is set, it will call the function with the name of that parameter.
# Otherwise the function "run" will be called.
#
# Named Argument Parsing:
# - The variable ARGS_DEF defines the valid command arguments
# * Required args syntax: --paramName=paramRegex
# * Optional args syntax: [--paramName=paramRegex]
# * e.g. ARG_DEFS=("--required_param=(.+)" "[--optional_param=(.+)]")
# - Checks that:
# * all arguments match to an entry in ARGS_DEF
# * all required arguments are present
# * all arguments match their regex
# - Afterwards, every paramter value will be stored in a variable
# with the name of the parameter in upper case (with dash converted to underscore).
#
# Special arguments that are always available:
# - "--action=.*": This parameter will be used to dispatch to a function with that name when the
# script is started
# - "--verbose=true": This will set the `-x` flag in bash so that all calls will be logged
#
# Utility functions:
# - readJsonProp
# - replaceJsonProp
# - resolveDir
# - getVar
# - serVar
# - isFunction
# always stop on errors
set -e
function usage {
echo "Usage: ${0} ${ARG_DEFS[@]}"
exit 1
}
function parseArgs {
local REQUIRED_ARG_NAMES=()
# -- helper functions
function varName {
# everything to upper case and dash to underscore
echo ${1//-/_} | tr '[:lower:]' '[:upper:]'
}
function readArgDefs {
local ARG_DEF
local AD_OPTIONAL
local AD_NAME
local AD_RE
# -- helper functions
function parseArgDef {
local ARG_DEF_REGEX="(\[?)--([^=]+)=(.*)"
if [[ ! $1 =~ $ARG_DEF_REGEX ]]; then
echo "Internal error: arg def has wrong format: $ARG_DEF"
exit 1
fi
AD_OPTIONAL="${BASH_REMATCH[1]}"
AD_NAME="${BASH_REMATCH[2]}"
AD_RE="${BASH_REMATCH[3]}"
if [[ $AD_OPTIONAL ]]; then
# Remove last bracket for optional args.
# Can't put this into the ARG_DEF_REGEX somehow...
AD_RE=${AD_RE%?}
fi
}
# -- run
for ARG_DEF in "${ARG_DEFS[@]}"
do
parseArgDef $ARG_DEF
local AD_NAME_UPPER=$(varName $AD_NAME)
setVar "${AD_NAME_UPPER}_OPTIONAL" "$AD_OPTIONAL"
setVar "${AD_NAME_UPPER}_RE" "$AD_RE"
if [[ ! $AD_OPTIONAL ]]; then
REQUIRED_ARG_NAMES+=($AD_NAME)
fi
done
}
function readAndValidateArgs {
local ARG_NAME
local ARG_VALUE
local ARG_NAME_UPPER
# -- helper functions
function parseArg {
local ARG_REGEX="--([^=]+)=?(.*)"
if [[ ! $1 =~ $ARG_REGEX ]]; then
echo "Can't parse argument $i"
usage
fi
ARG_NAME="${BASH_REMATCH[1]}"
ARG_VALUE="${BASH_REMATCH[2]}"
ARG_NAME_UPPER=$(varName $ARG_NAME)
}
function validateArg {
local AD_RE=$(getVar ${ARG_NAME_UPPER}_RE)
if [[ ! $AD_RE ]]; then
echo "Unknown option: $ARG_NAME"
usage
fi
if [[ ! $ARG_VALUE =~ ^${AD_RE}$ ]]; then
echo "Wrong format: $ARG_NAME"
usage;
fi
# validate that the "action" option points to a valid function
if [[ $ARG_NAME == "action" ]] && ! isFunction $ARG_VALUE; then
echo "No action $ARG_VALUE defined in this script"
usage;
fi
}
# -- run
for i in "$@"
do
parseArg $i
validateArg
setVar "${ARG_NAME_UPPER}" "$ARG_VALUE"
done
}
function checkMissingArgs {
local ARG_NAME
for ARG_NAME in "${REQUIRED_ARG_NAMES[@]}"
do
ARG_VALUE=$(getVar $(varName $ARG_NAME))
if [[ ! $ARG_VALUE ]]; then
echo "Missing: $ARG_NAME"
usage;
fi
done
}
# -- run
readArgDefs
readAndValidateArgs "$@"
checkMissingArgs
}
# getVar(varName)
function getVar {
echo ${!1}
}
# setVar(varName, varValue)
function setVar {
eval "$1=\"$2\""
}
# isFunction(name)
# - to be used in an if, so return 0 if successful and 1 if not!
function isFunction {
if [[ $(type -t $1) == "function" ]]; then
return 0
else
return 1
fi
}
# readJsonProp(jsonFile, property)
# - restriction: property needs to be on an own line!
function readJsonProp {
echo $(sed -En 's/.*"'$2'"[ ]*:[ ]*"(.*)".*/\1/p' $1)
}
# replaceJsonProp(jsonFile, property, newValue)
# - note: propertyRegex will be automatically placed into a
# capturing group! -> all other groups start at index 2!
function replaceJsonProp {
replaceInFile $1 "\"$2\": \".*?\"" "\"$2\": \"$3\""
}
# replaceInFile(file, findPattern, replacePattern)
function replaceInFile {
perl -pi -e "s/$2/$3/g;" $1
}
# resolveDir(relativeDir)
# - resolves a directory relative to the current script
function resolveDir {
echo $(cd $SCRIPT_DIR; cd $1; pwd)
}
function main {
# normalize the working dir to the directory of the script
cd $(dirname $0);SCRIPT_DIR=$(pwd)
ARG_DEFS+=("[--verbose=(true|false)]")
parseArgs "$@"
# --verbose argument
if [[ $VERBOSE == "true" ]]; then
set -x
fi
if isFunction init; then
init "$@"
fi
# jump to the function denoted by the --action argument,
# otherwise call the "run" function
if [[ $ACTION ]]; then
$ACTION "$@"
else
run "$@"
fi
}
main "$@"
+6 -2
View File
@@ -9,13 +9,17 @@ export function checkReady() {
let didFireReady = false;
document.addEventListener('deviceready', () => {
console.log(`Ionic Native: deviceready event fired after ${(Date.now() - before)} ms`);
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.`);
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);
}
+258
View File
@@ -0,0 +1,258 @@
import 'core-js';
import { Observable } from 'rxjs/Observable';
import {
Cordova,
CordovaCheck,
CordovaInstance,
CordovaProperty,
InstanceProperty,
Plugin
} from './decorators';
import { IonicNativePlugin } from './ionic-native-plugin';
import { ERR_CORDOVA_NOT_AVAILABLE, ERR_PLUGIN_NOT_INSTALLED } from './plugin';
declare const window: any;
class TestObject {
constructor(public _objectInstance: any) {}
@InstanceProperty name: string;
@CordovaInstance({ sync: true })
pingSync(): string {
return;
}
@CordovaInstance()
ping(): Promise<any> {
return;
}
}
@Plugin({
pluginName: 'TestPlugin',
pluginRef: 'testPlugin',
repo: '',
plugin: 'cordova-plugin-my-plugin',
platforms: ['Android', 'iOS']
})
class TestPlugin extends IonicNativePlugin {
@CordovaProperty name: string;
@Cordova({ sync: true })
pingSync(): string {
return;
}
@Cordova()
ping(): Promise<string> {
return;
}
@CordovaCheck()
customPing(): Promise<string> {
return Promise.resolve('pong');
}
create(): TestObject {
return new TestObject(TestPlugin.getPlugin().create());
}
@Cordova({
destruct: true
})
destructPromise(): Promise<any> {
return;
}
@Cordova({
destruct: true,
observable: true
})
destructObservable(): Observable<any> {
return;
}
}
function definePlugin() {
(window as any).testPlugin = {
name: 'John Smith',
ping: (success: Function, error: Function) => success('pong'),
pingSync: () => 'pong',
create: function TestObject() {
this.pingSync = () => 'pong';
this.ping = (success: Function, error: Function) => success('pong');
this.name = 'John Smith';
return this;
},
destructPromise: (success: Function) => success('hello', 'world'),
destructObservable: (success: Function) => success('hello', 'world')
};
}
describe('Regular Decorators', () => {
let plugin: TestPlugin;
beforeEach(() => {
plugin = new TestPlugin();
definePlugin();
});
describe('Plugin', () => {
it('should set pluginName', () => {
expect(TestPlugin.getPluginName()).toEqual('TestPlugin');
});
it('should set pluginRef', () => {
expect(TestPlugin.getPluginRef()).toEqual('testPlugin');
});
it('should return original plugin object', () => {
expect(TestPlugin.getPlugin()).toEqual(window.testPlugin);
});
it('should return supported platforms', () => {
expect(TestPlugin.getSupportedPlatforms()).toEqual(['Android', 'iOS']);
});
});
describe('Cordova', () => {
it('should do a sync function', () => {
expect(plugin.pingSync()).toEqual('pong');
});
it('should do an async function', (done: Function) => {
plugin
.ping()
.then(res => {
expect(res).toEqual('pong');
done();
})
.catch(e => {
expect(e).toBeUndefined();
done('Method should have resolved');
});
});
it('should throw plugin_not_installed error', (done: Function) => {
delete window.testPlugin;
window.cordova = true;
expect(<any>plugin.pingSync()).toEqual(ERR_PLUGIN_NOT_INSTALLED);
plugin.ping().catch(e => {
expect(e).toEqual(ERR_PLUGIN_NOT_INSTALLED.error);
delete window.cordova;
done();
});
});
it('should throw cordova_not_available error', (done: Function) => {
delete window.testPlugin;
expect(<any>plugin.pingSync()).toEqual(ERR_CORDOVA_NOT_AVAILABLE);
plugin.ping().catch(e => {
expect(e).toEqual(ERR_CORDOVA_NOT_AVAILABLE.error);
done();
});
});
});
describe('CordovaProperty', () => {
it('should return property value', () => {
expect(plugin.name).toEqual('John Smith');
});
it('should set property value', () => {
plugin.name = 'value2';
expect(plugin.name).toEqual('value2');
});
});
describe('CordovaCheck', () => {
it('should run the method when plugin exists', done => {
plugin.customPing().then(res => {
expect(res).toEqual('pong');
done();
});
});
it('shouldnt run the method when plugin doesnt exist', done => {
delete window.testPlugin;
window.cordova = true;
plugin.customPing().catch(e => {
expect(e).toEqual(ERR_PLUGIN_NOT_INSTALLED.error);
done();
});
});
});
describe('CordovaOptions', () => {
describe('destruct', () => {
it('should destruct values returned by a Promise', done => {
plugin.destructPromise().then((args: any[]) => {
expect(args).toEqual(['hello', 'world']);
done();
});
});
it('should destruct values returned by an Observable', done => {
plugin.destructObservable().subscribe((args: any[]) => {
expect(args).toEqual(['hello', 'world']);
done();
});
});
});
});
});
describe('Instance Decorators', () => {
let instance: TestObject, plugin: TestPlugin;
beforeEach(() => {
definePlugin();
plugin = new TestPlugin();
instance = plugin.create();
});
describe('Instance plugin', () => {});
describe('CordovaInstance', () => {
it('should call instance async method', done => {
instance.ping().then(r => {
expect(r).toEqual('pong');
done();
});
});
it('should call instance sync method', () => {
expect(instance.pingSync()).toEqual('pong');
});
it('shouldnt call instance method when _objectInstance is undefined', () => {
delete instance._objectInstance;
instance
.ping()
.then(r => {
expect(r).toBeUndefined();
})
.catch(e => {
expect(e).toBeUndefined();
});
});
});
describe('InstanceProperty', () => {
it('should return property value', () => {
expect(instance.name).toEqual('John Smith');
});
it('should set property value', () => {
instance.name = 'John Cena';
expect(instance.name).toEqual('John Cena');
});
});
});
+333
View File
@@ -0,0 +1,333 @@
import { _throw } from 'rxjs/observable/throw';
import { Observable } from 'rxjs/Observable';
import {
checkAvailability,
instanceAvailability,
overrideFunction,
wrap,
wrapInstance
} from './plugin';
import { getPlugin, getPromise } from './util';
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[];
[key: string]: any;
}
export interface CordovaOptions {
destruct?: boolean;
/**
* 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;
}
/**
* @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(() => {});
}
},
enumerable: true
};
};
}
/**
* 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 {
const check = checkAvailability(pluginObj);
if (check === true) {
return descriptor.value.apply(this, args);
} else {
if (opts.sync) {
return null;
} else if (opts.observable) {
return _throw(new Error(check && check.error));
}
return Promise.reject(check && check.error);
}
},
enumerable: true
};
};
}
/**
* @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): ClassDecorator {
return function(cls: any) {
// Add these fields to the class
for (let prop in config) {
cls[prop] = config[prop];
}
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);
},
enumerable: true
};
};
}
/**
* @private
*
* Wrap an instance method
*/
export function CordovaInstance(opts: CordovaOptions = {}) {
return (target: Object, methodName: string) => {
return {
value: function(...args: any[]) {
return wrapInstance(this, methodName, opts).apply(this, args);
},
enumerable: true
};
};
}
/**
* @private
*
*
* Before calling the original method, ensure Cordova and the plugin are installed.
*/
export function CordovaProperty(target: any, key: string) {
Object.defineProperty(target, key, {
enumerable: true,
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, {
enumerable: true,
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);
},
enumerable: true
};
};
}
@@ -1,108 +0,0 @@
import { callCordovaPlugin, wrapInstance, wrapPromise } from './common';
import 'rxjs/add/observable/of';
declare const window: any;
class MockPlugin {
static getPluginRef(): string {
return 'mockPlugin';
}
static getPluginName(): string {
return 'MockPlugin';
}
static getPluginInstallName(): string {
return '';
}
create(): MockInstancePluginObject {
return new MockInstancePluginObject();
}
}
class MockInstancePluginObject {
_pluginInstance: MockCordovaPlugin;
constructor() {
this._pluginInstance = new MockCordovaPlugin();
}
}
class MockCordovaPlugin {
static ping = jest.fn((arg: string) => 'pong');
ping = jest.fn((arg: string) => 'pong');
static pingAsync = jest.fn((arg: string, success: Function, error: Function) => success('pong'));
pingAsync = jest.fn((arg: string, success: Function, error: Function) => success('pong'));
}
describe('Common decorator functions', () => {
let plugin: MockPlugin,
instancePluginObject: MockInstancePluginObject;
beforeAll(() => {
window.mockPlugin = MockCordovaPlugin;
plugin = new MockPlugin();
instancePluginObject = plugin.create();
});
describe('callCordovaPlugin', () => {
test('should return value from cordova plugin', () => {
expect(callCordovaPlugin(plugin, 'ping', ['pingpong'])).toBe('pong');
});
test('original method should have been called', () => {
expect(MockCordovaPlugin.ping.mock.calls.length).toBe(1);
});
test('original method should have received args', () => {
expect(MockCordovaPlugin.ping.mock.calls[0][0]).toBe('pingpong');
});
});
describe('wrapPromise', () => {
test('should return a promise that resolves with a value', async () => {
expect(await wrapPromise(plugin, 'pingAsync', ['pingpong'])).toBe('pong');
});
test('original method should have been called', () => {
expect(MockCordovaPlugin.pingAsync.mock.calls.length).toBe(1);
});
test('original method should have received args', () => {
expect(MockCordovaPlugin.pingAsync.mock.calls[0][0]).toBe('pingpong');
expect(typeof MockCordovaPlugin.pingAsync.mock.calls[0][1]).toBe('function');
expect(typeof MockCordovaPlugin.pingAsync.mock.calls[0][2]).toBe('function');
});
});
describe('wrapObservable', () => {
test('should return an observable that emits a value', async () => {
});
test('original method should have been called', () => {});
test('original method should have received args', () => {});
});
describe('wrapEventObservable', () => {
test('should return an observable that wraps an event listener', async () => {});
});
describe('callInstance', () => {
test('should call an instance method', async () => {
});
test('original method should have been called', () => {
// expect(instancePluginObject._pluginInstance.ping.mock.calls.length).toBe(1);
});
test('original method should have received args', () => {
// expect(instancePluginObject._pluginInstance.ping.mock.calls[0][0]).toBe('pingpong');
});
});
});
@@ -1,23 +0,0 @@
import { checkAvailability, getPlugin } from './common';
import { Observable } from 'rxjs/Observable';
function overrideFunction(pluginObj: any, methodName: string): 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();
}
});
}
export function cordovaFunctionOverride(pluginObj: any, methodName: string, args: IArguments | Array<any> = []) {
return overrideFunction(pluginObj, methodName);
}
@@ -1,7 +0,0 @@
import { CordovaOptions } from './interfaces';
import { wrapInstance } from './common';
export function cordovaInstance(pluginObj: any, methodName: string, config: CordovaOptions, args: IArguments | Array<any>) {
args = Array.from(args);
return wrapInstance(pluginObj, methodName, config).apply(this, args);
}
@@ -1,14 +0,0 @@
import { checkAvailability, getPlugin } from './common';
export function cordovaPropertyGet(pluginObj: any, key: string) {
if (checkAvailability(pluginObj, key) === true) {
return getPlugin(pluginObj.constructor.getPluginRef())[key];
}
return null;
}
export function cordovaPropertySet(pluginObj: any, key: string, value: any) {
if (checkAvailability(pluginObj, key) === true) {
getPlugin(pluginObj.constructor.getPluginRef())[key] = value;
}
}
@@ -1,6 +0,0 @@
import { CordovaOptions } from './interfaces';
import { wrap } from './common';
export function cordova(pluginObj: any, methodName: string, config: CordovaOptions, args: IArguments | Array<any>) {
return wrap(pluginObj, methodName, config).apply(this, args);
}
@@ -1,12 +0,0 @@
export function instancePropertyGet(pluginObj: any, key: string) {
if (!!pluginObj._objectInstance && !!pluginObj._objectInstance[key]) {
return pluginObj._objectInstance[key];
}
return null;
}
export function instancePropertySet(pluginObj: any, key: string, value: any) {
if (!!pluginObj._objectInstance && !!pluginObj._objectInstance[key]) {
pluginObj._objectInstance[key] = value;
}
}
@@ -1,105 +0,0 @@
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[];
[key: string]: any;
}
export interface CordovaOptions {
destruct?: boolean;
/**
* 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 declare const Plugin: (config: PluginConfig) => ClassDecorator;
export declare const Cordova: (config?: CordovaOptions) => MethodDecorator;
export declare const CordovaProperty: () => PropertyDecorator;
export declare const CordovaInstance: (config?: CordovaOptions) => MethodDecorator;
export declare const InstanceProperty: () => PropertyDecorator;
export declare const CordovaCheck: (config?: CordovaOptions) => MethodDecorator;
export declare const InstanceCheck: (config?: CordovaOptions) => MethodDecorator;
export declare const CordovaFunctionOverride: () => MethodDecorator;
+4 -14
View File
@@ -1,14 +1,4 @@
import { checkReady } from './bootstrap';
export { IonicNativePlugin } from './ionic-native-plugin';
// Decorators
export { checkAvailability, instanceAvailability, wrap, getPromise } from './decorators/common';
export * from './decorators/cordova';
export * from './decorators/cordova-function-override';
export * from './decorators/cordova-instance';
export * from './decorators/cordova-property';
export * from './decorators/instance-property';
export * from './decorators/interfaces';
checkReady();
export * from './plugin';
export * from './decorators';
export * from './util';
export * from './ionic-native-plugin';
@@ -0,0 +1,74 @@
// This is to verify that new (FileTransfer.getPlugin)() works
import { CordovaInstance, Plugin } from './decorators';
import { IonicNativePlugin } from './ionic-native-plugin';
import { checkAvailability } from './plugin';
class FT {
hello(): string {
return 'world';
}
}
(window as any).FileTransfer = () => new FT();
@Plugin({
plugin: 'cordova-plugin-file-transfer',
pluginRef: 'FileTransfer',
repo: '',
pluginName: 'FileTransfer'
})
export class FileTransfer extends IonicNativePlugin {
create(): FileTransferObject {
let instance: any;
if (
checkAvailability(
FileTransfer.getPluginRef(),
null,
FileTransfer.getPluginName()
) === true
) {
instance = new (FileTransfer.getPlugin())();
}
return new FileTransferObject(instance);
}
}
export class FileTransferObject {
constructor(public _objectInstance: any) {
console.info(
'Creating a new FileTransferObject with instance: ',
_objectInstance
);
}
@CordovaInstance({ sync: true })
hello(): string {
return;
}
}
describe('Mock FileTransfer Plugin', () => {
let plugin: FileTransfer, instance: FileTransferObject;
beforeAll(() => {
plugin = new FileTransfer();
instance = plugin.create();
});
it('should create a new FileTransfer plugin instance', () => {
expect(plugin instanceof FileTransfer).toBeTruthy();
});
it('should create new FileTransferObject instance', () => {
expect(instance instanceof FileTransferObject).toBeTruthy();
});
it('FileTransferObject instance should have _objectInstance property', () => {
expect(instance._objectInstance).toBeDefined();
});
it('FileTransferObject.hello should return world', () => {
console.info('instance hello is', instance.hello());
expect(instance.hello()).toEqual('world');
});
});
+16 -11
View File
@@ -1,8 +1,4 @@
import { checkAvailability } from './decorators/common';
import { get } from './util';
export class IonicNativePlugin {
static pluginName: string;
static pluginRef: string;
@@ -19,31 +15,40 @@ export class IonicNativePlugin {
* Returns a boolean that indicates whether the plugin is installed
* @return {boolean}
*/
static installed(): boolean { return checkAvailability(this.pluginRef) === true; }
static installed(): boolean {
return false;
}
/**
* Returns the original plugin object
*/
static getPlugin(): any { return get(window, this.pluginRef); }
static getPlugin(): any {}
/**
* Returns the plugin's name
*/
static getPluginName(): string { return this.pluginName; }
static getPluginName(): string {
return;
}
/**
* Returns the plugin's reference
*/
static getPluginRef(): string { return this.pluginRef; }
static getPluginRef(): string {
return;
}
/**
* Returns the plugin's install name
*/
static getPluginInstallName(): string { return this.plugin; }
static getPluginInstallName(): string {
return;
}
/**
* Returns the plugin's supported platforms
*/
static getSupportedPlatforms(): string[] { return this.platforms || []; }
static getSupportedPlatforms(): string[] {
return;
}
}
-25
View File
@@ -1,25 +0,0 @@
declare const window: any;
/**
* Initialize the ionic.native Angular module if we're running in ng1.
* This iterates through the list of registered plugins and dynamically
* creates Angular 1 services of the form $cordovaSERVICE, ex: $cordovaStatusBar.
*/
export function initAngular1(plugins: any) {
if (window.angular) {
const ngModule = window.angular.module('ionic.native', []);
for (const name in plugins) {
let serviceName = '$cordova' + name;
let cls = plugins[name];
(function(serviceName, cls, name) {
ngModule.service(serviceName, [function() {
const funcs = window.angular.copy(cls);
funcs.__proto__['name'] = name;
return funcs;
}]);
})(serviceName, cls, name);
}
}
}
@@ -1,128 +1,38 @@
import { CordovaOptions } from './interfaces';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/fromEvent';
import { fromEvent } from 'rxjs/observable/fromEvent';
declare const window: any;
import { checkReady } from './bootstrap';
import { CordovaOptions } from './decorators';
import { cordovaWarn, getPlugin, getPromise, pluginWarn } from './util';
checkReady();
// declare const window;
// declare var Promise;
export const ERR_CORDOVA_NOT_AVAILABLE = { error: 'cordova_not_available' };
export const ERR_PLUGIN_NOT_INSTALLED = { error: 'plugin_not_installed' };
export function getPromise<T>(callback: (resolve: Function, reject?: Function) => any): Promise<T> {
const tryNativePromise = () => {
if (Promise) {
return new Promise<T>((resolve, reject) => {
callback(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 or on a recent browser.');
}
};
if (window.angular) {
const injector = window.angular.element(document.querySelector('[ng-app]') || document.body).injector();
if (injector) {
let $q = injector.get('$q');
return $q((resolve: Function, reject: Function) => {
callback(resolve, reject);
});
}
console.warn('Angular 1 was detected but $q couldn\'t be retrieved. This is usually when the app is not bootstrapped on the html or body tag. Falling back to native promises which won\'t trigger an automatic digest when promises resolve.');
}
return tryNativePromise();
}
export function wrapPromise(pluginObj: any, methodName: string, args: any[], opts: CordovaOptions = {}) {
let pluginResult: any, rej: Function;
const p = getPromise((resolve: Function, reject: Function) => {
if (opts.destruct) {
pluginResult = callCordovaPlugin(pluginObj, methodName, args, opts, (...args: any[]) => resolve(args), (...args: any[]) => reject(args));
} else {
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(() => { });
typeof rej === 'function' && rej(pluginResult.error);
}
return p;
}
function wrapOtherPromise(pluginObj: any, methodName: string, args: any[], opts: any = {}) {
return getPromise((resolve: Function, reject: Function) => {
const pluginResult = callCordovaPlugin(pluginObj, methodName, args, opts);
if (pluginResult) {
if (pluginResult.error) {
reject(pluginResult.error);
} else if (pluginResult.then) {
pluginResult.then(resolve).catch(reject);
}
} else {
reject({ error: 'unexpected_error' });
}
});
}
function wrapObservable(pluginObj: any, methodName: string, args: any[], opts: any = {}) {
return new Observable(observer => {
let pluginResult;
if (opts.destruct) {
pluginResult = callCordovaPlugin(pluginObj, methodName, args, opts, (...args: any[]) => observer.next(args), (...args: any[]) => observer.error(args));
} else {
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 callCordovaPlugin(pluginObj, opts.clearFunction, []);
}
} catch (e) {
console.warn('Unable to clear the previous observable watch for', pluginObj.constructor.getPluginName(), methodName);
console.warn(e);
}
};
});
}
/**
* Wrap the event with an observable
* @private
* @param event even name
* @param element The element to attach the event listener to
* @returns {Observable}
*/
function wrapEventObservable(event: string, element: any): Observable<any> {
if (element) {
get(window, element);
} else {
element = window;
}
return Observable.fromEvent(element, event);
}
/**
* Checks if plugin/cordova is available
* @return {boolean | { error: string } }
* @private
*/
export function checkAvailability(pluginRef: string, methodName?: string, pluginName?: string): boolean | { error: string };
export function checkAvailability(pluginObj: any, methodName?: string, pluginName?: string): boolean | { error: string };
export function checkAvailability(plugin: any, methodName?: string, pluginName?: string): boolean | { error: string } {
export function checkAvailability(
pluginRef: string,
methodName?: string,
pluginName?: string
): boolean | { error: string };
export function checkAvailability(
pluginObj: any,
methodName?: string,
pluginName?: string
): boolean | { error: string };
export function checkAvailability(
plugin: any,
methodName?: string,
pluginName?: string
): boolean | { error: string } {
let pluginRef, pluginInstance, pluginPackage;
if (typeof plugin === 'string') {
@@ -135,7 +45,10 @@ export function checkAvailability(plugin: any, methodName?: string, pluginName?:
pluginInstance = getPlugin(pluginRef);
if (!pluginInstance || (!!methodName && typeof pluginInstance[methodName] === 'undefined')) {
if (
!pluginInstance ||
(!!methodName && typeof pluginInstance[methodName] === 'undefined')
) {
if (!window.cordova) {
cordovaWarn(pluginName, methodName);
return ERR_CORDOVA_NOT_AVAILABLE;
@@ -152,11 +65,23 @@ export function checkAvailability(plugin: any, methodName?: string, pluginName?:
* Checks if _objectInstance exists and has the method/property
* @private
*/
export function instanceAvailability(pluginObj: any, methodName?: string): boolean {
return pluginObj._objectInstance && (!methodName || typeof pluginObj._objectInstance[methodName] !== 'undefined');
export function instanceAvailability(
pluginObj: any,
methodName?: string
): boolean {
return (
pluginObj._objectInstance &&
(!methodName ||
typeof pluginObj._objectInstance[methodName] !== 'undefined')
);
}
export function setIndex(args: any[], opts: any = {}, resolve?: Function, reject?: Function): any {
function setIndex(
args: any[],
opts: any = {},
resolve?: Function,
reject?: Function
): any {
// ignore resolve and reject in case sync
if (opts.sync) {
return args;
@@ -175,12 +100,19 @@ export function setIndex(args: any[], opts: any = {}, resolve?: Function, reject
resolve(result);
}
});
} else if (opts.callbackStyle === 'object' && opts.successName && opts.errorName) {
} 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') {
} 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) {
@@ -206,8 +138,6 @@ export function setIndex(args: any[], opts: any = {}, resolve?: Function, reject
setSuccessIndex();
setErrorIndex();
}
} else {
// Otherwise, let's tack them on to the end of the argument list
// which is 90% of cases
@@ -217,7 +147,14 @@ export function setIndex(args: any[], opts: any = {}, resolve?: Function, reject
return args;
}
export function callCordovaPlugin(pluginObj: any, methodName: string, args: any[], opts: any = {}, resolve?: Function, reject?: Function) {
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);
@@ -230,61 +167,199 @@ export function callCordovaPlugin(pluginObj: any, methodName: string, args: any[
} else {
return availabilityCheck;
}
}
export function callInstance(pluginObj: any, methodName: string, args: any[], opts: any = {}, resolve?: Function, reject?: Function) {
function wrapPromise(
pluginObj: any,
methodName: string,
args: any[],
opts: any = {}
) {
let pluginResult: any, rej: Function;
const p = getPromise((resolve: Function, reject: Function) => {
if (opts.destruct) {
pluginResult = callCordovaPlugin(
pluginObj,
methodName,
args,
opts,
(...args: any[]) => resolve(args),
(...args: any[]) => reject(args)
);
} else {
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(() => {});
typeof rej === 'function' && rej(pluginResult.error);
}
return p;
}
function wrapOtherPromise(
pluginObj: any,
methodName: string,
args: any[],
opts: any = {}
) {
return getPromise((resolve: Function, reject: Function) => {
const pluginResult = callCordovaPlugin(pluginObj, methodName, args, opts);
if (pluginResult) {
if (pluginResult.error) {
reject(pluginResult.error);
} else if (pluginResult.then) {
pluginResult.then(resolve).catch(reject);
}
} else {
reject({ error: 'unexpected_error' });
}
});
}
function wrapObservable(
pluginObj: any,
methodName: string,
args: any[],
opts: any = {}
) {
return new Observable(observer => {
let pluginResult;
if (opts.destruct) {
pluginResult = callCordovaPlugin(
pluginObj,
methodName,
args,
opts,
(...args: any[]) => observer.next(args),
(...args: any[]) => observer.error(args)
);
} else {
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 callCordovaPlugin(pluginObj, opts.clearFunction, []);
}
} catch (e) {
console.warn(
'Unable to clear the previous observable watch for',
pluginObj.constructor.getPluginName(),
methodName
);
console.warn(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);
}
}
export function getPlugin(pluginRef: string): any {
return get(window, pluginRef);
}
export function get(element: Element | Window, path: string) {
const paths: string[] = path.split('.');
let obj: any = element;
for (let i: number = 0; i < paths.length; i++) {
if (!obj) { return null; }
obj = obj[paths[i]];
}
return obj;
}
export function pluginWarn(pluginName: string, plugin?: string, method?: string): void {
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 cordova plugin add ' + plugin + '\'');
return pluginObj._objectInstance[methodName].apply(
pluginObj._objectInstance,
args
);
}
}
/**
* Wrap the event with an observable
* @private
* @param pluginName
* @param method
* @param event even name
* @param element The element to attach the event listener to
* @returns {Observable}
*/
export function cordovaWarn(pluginName: string, method?: string): void {
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');
}
export function wrapEventObservable(
event: string,
element: any = window
): Observable<any> {
return 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,
null,
pluginObj.constructor.getPluginName()
);
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 = {}) {
export const wrap = function(
pluginObj: any,
methodName: string,
opts: CordovaOptions = {}
) {
return (...args: any[]) => {
if (opts.sync) {
// Sync doesn't wrap the plugin with a promise or observable, it returns the result as-is
@@ -304,48 +379,87 @@ export const wrap = function(pluginObj: any, methodName: string, opts: CordovaOp
/**
* @private
*/
export function wrapInstance(pluginObj: any, methodName: string, opts: any = {}) {
export function wrapInstance(
pluginObj: any,
methodName: string,
opts: any = {}
) {
return (...args: any[]) => {
if (opts.sync) {
return callInstance(pluginObj, methodName, args, opts);
} else if (opts.observable) {
return new Observable(observer => {
let pluginResult;
if (opts.destruct) {
pluginResult = callInstance(pluginObj, methodName, args, opts, (...args: any[]) => observer.next(args), (...args: any[]) => observer.error(args));
pluginResult = callInstance(
pluginObj,
methodName,
args,
opts,
(...args: any[]) => observer.next(args),
(...args: any[]) => observer.error(args)
);
} else {
pluginResult = callInstance(pluginObj, methodName, args, opts, observer.next.bind(observer), observer.error.bind(observer));
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 callInstance(pluginObj, opts.clearFunction, args, opts, observer.next.bind(observer), observer.error.bind(observer));
return callInstance(
pluginObj,
opts.clearFunction,
args,
opts,
observer.next.bind(observer),
observer.error.bind(observer)
);
}
return callInstance(pluginObj, opts.clearFunction, []);
} catch (e) {
console.warn('Unable to clear the previous observable watch for', pluginObj.constructor.getPluginName(), methodName);
console.warn(
'Unable to clear the previous observable watch for',
pluginObj.constructor.getPluginName(),
methodName
);
console.warn(e);
}
};
});
} else if (opts.otherPromise) {
return getPromise((resolve: Function, reject: Function) => {
let result;
if (opts.destruct) {
result = callInstance(pluginObj, methodName, args, opts, (...args: any[]) => resolve(args), (...args: any[]) => reject(args));
result = callInstance(
pluginObj,
methodName,
args,
opts,
(...args: any[]) => resolve(args),
(...args: any[]) => reject(args)
);
} else {
result = callInstance(pluginObj, methodName, args, opts, resolve, reject);
result = callInstance(
pluginObj,
methodName,
args,
opts,
resolve,
reject
);
}
if (result && !!result.then) {
result.then(resolve, reject);
@@ -353,14 +467,27 @@ export function wrapInstance(pluginObj: any, methodName: string, opts: any = {})
reject();
}
});
} else {
let pluginResult: any, rej: Function;
const p = getPromise((resolve: Function, reject: Function) => {
if (opts.destruct) {
pluginResult = callInstance(pluginObj, methodName, args, opts, (...args: any[]) => resolve(args), (...args: any[]) => reject(args));
pluginResult = callInstance(
pluginObj,
methodName,
args,
opts,
(...args: any[]) => resolve(args),
(...args: any[]) => reject(args)
);
} else {
pluginResult = callInstance(pluginObj, methodName, args, opts, resolve, reject);
pluginResult = callInstance(
pluginObj,
methodName,
args,
opts,
resolve,
reject
);
}
rej = reject;
});
@@ -368,12 +495,10 @@ export function wrapInstance(pluginObj: any, methodName: string, opts: any = {})
// a warning that Cordova is undefined or the plugin is uninstalled, so there is no reason
// to error
if (pluginResult && pluginResult.error) {
p.catch(() => { });
p.catch(() => {});
typeof rej === 'function' && rej(pluginResult.error);
}
return p;
}
};
}
+73 -9
View File
@@ -3,31 +3,95 @@ declare const window: any;
/**
* @private
*/
export function get(element: Element | Window, path: string) {
export const get = (element: Element | Window, path: string): any => {
const paths: string[] = path.split('.');
let obj: any = element;
for (let i: number = 0; i < paths.length; i++) {
if (!obj) { return null; }
if (!obj) {
return null;
}
obj = obj[paths[i]];
}
return obj;
}
};
/**
* @private
*/
export function getPromise(callback: Function = () => {}): Promise<any> {
export const getPromise = (callback: Function): Promise<any> => {
const tryNativePromise = () => {
if (window.Promise) {
return new Promise<any>((resolve, reject) => {
return new Promise((resolve, reject) => {
callback(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 or on a recent browser.');
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 or on a recent browser.'
);
}
};
return tryNativePromise();
}
};
/**
* @private
* @param pluginRef
* @returns {null|*}
*/
export const getPlugin = (pluginRef: string): any => {
return get(window, pluginRef);
};
/**
* @private
*/
export const pluginWarn = (
pluginName: string,
plugin?: string,
method?: string
): void => {
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 cordova plugin add ${plugin}'`
);
}
};
/**
* @private
* @param pluginName
* @param method
*/
export const cordovaWarn = (pluginName: string, method?: string): void => {
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'
);
}
};
@@ -2,7 +2,6 @@ import { Injectable } from '@angular/core';
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
export interface ActionSheetOptions {
/**
* The labels for the buttons. Uses the index x
*/
@@ -21,7 +20,7 @@ export interface ActionSheetOptions {
/**
* Theme to be used on Android
*/
androidTheme?: number;
androidTheme?: 1 | 2 | 3 | 4 | 5;
/**
* Enable a cancel on Android
@@ -46,7 +45,7 @@ export interface ActionSheetOptions {
/**
* On an iPad, set the X,Y position
*/
position?: number[];
position?: [number, number];
/**
* Choose if destructive button will be the last
@@ -80,7 +79,7 @@ export interface ActionSheetOptions {
* addDestructiveButtonWithLabel: 'Delete',
* androidTheme: this.actionSheet.ANDROID_THEMES.THEME_HOLO_DARK,
* destructiveButtonLast: true
* }
* };
*
* this.actionSheet.show(options).then((buttonIndex: number) => {
* console.log('Button pressed: ' + buttonIndex);
@@ -98,7 +97,6 @@ export interface ActionSheetOptions {
})
@Injectable()
export class ActionSheet extends IonicNativePlugin {
/**
* Convenience property to select an Android theme value
*/
@@ -118,22 +116,22 @@ export class ActionSheet extends IonicNativePlugin {
/**
* Show a native ActionSheet component. See below for options.
* @param options {ActionSheetOptions} Options See table below
* @param {ActionSheetOptions} [options] Options See table below
* @returns {Promise<any>} Returns a Promise that resolves with the index of the
* button pressed (1 based, so 1, 2, 3, etc.)
*/
@Cordova()
show(options?: ActionSheetOptions): Promise<any> {
show(options?: ActionSheetOptions): Promise<number> {
return;
}
/**
* Progamtically hide the native ActionSheet
* Programmatically hide the native ActionSheet
* @param {ActionSheetOptions} [options] Options See table below
* @returns {Promise<any>} Returns a Promise that resolves when the actionsheet is closed
*/
@Cordova()
hide(options?: any): Promise<any> {
hide(options?: ActionSheetOptions): Promise<any> {
return;
}
}
+123 -125
View File
@@ -1,7 +1,7 @@
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
import { Injectable } from '@angular/core';
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/fromEvent';
import { fromEvent } from 'rxjs/observable/fromEvent';
export interface AdMobFreeBannerConfig {
/**
@@ -64,18 +64,124 @@ export interface AdMobFreeRewardVideoConfig {
autoShow?: boolean;
}
/**
* @name AdMob Free
* @description
* A free, no ad-sharing version of Google AdMob plugin for Cordova.
*
* Requires Cordova plugin: `cordova-plugin-admob-free`. For more info, please see the [AdMob Free plugin docs](https://github.com/ratson/cordova-plugin-admob-free).
*
* @usage
* ```typescript
* import { AdMobFree, AdMobFreeBannerConfig } from '@ionic-native/admob-free';
*
*
* constructor(private admobFree: AdMobFree) { }
*
*
* ...
*
*
* const bannerConfig: AdMobFreeBannerConfig = {
* // add your config here
* // for the sake of this example we will just use the test config
* isTesting: true,
* autoShow: true
* };
* this.admobFree.banner.config(bannerConfig);
*
* this.admobFree.banner.prepare()
* .then(() => {
* // banner Ad is ready
* // if we set autoShow to false, then we will need to call the show method here
* })
* .catch(e => console.log(e));
*
*
* ```
* @interfaces
* AdMobFreeBannerConfig
* AdMobFreeInterstitialConfig
* AdMobFreeRewardVideoConfig
* @classes
* AdMobFreeBanner
* AdMobFreeInterstitial
* AdMobFreeRewardVideo
*/
@Plugin({
pluginName: 'AdMobFree',
plugin: 'cordova-plugin-admob-free',
pluginRef: 'admob',
repo: 'https://github.com/ratson/cordova-plugin-admob-free',
platforms: ['Android', 'iOS']
})
@Injectable()
export class AdMobFree extends IonicNativePlugin {
/**
* Convenience object to get event names
* @type {Object}
*/
events = {
BANNER_LOAD: 'admob.banner.events.LOAD',
BANNER_LOAD_FAIL: 'admob.banner.events.LOAD_FAIL',
BANNER_OPEN: 'admob.banner.events.OPEN',
BANNER_CLOSE: 'admob.banner.events.CLOSE',
BANNER_EXIT_APP: 'admob.banner.events.EXIT_APP',
INTERSTITIAL_LOAD: 'admob.interstitial.events.LOAD',
INTERSTITIAL_LOAD_FAIL: 'admob.interstitial.events.LOAD_FAIL',
INTERSTITIAL_OPEN: 'admob.interstitial.events.OPEN',
INTERSTITIAL_CLOSE: 'admob.interstitial.events.CLOSE',
INTERSTITIAL_EXIT_APP: 'admob.interstitial.events.EXIT_APP',
REWARD_VIDEO_LOAD: 'admob.rewardvideo.events.LOAD',
REWARD_VIDEO_LOAD_FAIL: 'admob.rewardvideo.events.LOAD_FAIL',
REWARD_VIDEO_OPEN: 'admob.rewardvideo.events.OPEN',
REWARD_VIDEO_CLOSE: 'admob.rewardvideo.events.CLOSE',
REWARD_VIDEO_EXIT_APP: 'admob.rewardvideo.events.EXIT_APP',
REWARD_VIDEO_START: 'admob.rewardvideo.events.START',
REWARD_VIDEO_REWARD: 'admob.rewardvideo.events.REWARD'
};
/**
* Watch an event
* @param event {string} event name
* @return {Observable<any>}
*/
on(event: string): Observable<any> {
return fromEvent(document, event);
}
/**
* Returns the AdMobFreeBanner object
* @type {AdMobFreeBanner}
*/
banner: AdMobFreeBanner = new AdMobFreeBanner();
/**
* Returns the AdMobFreeInterstitial object
* @type {AdMobFreeInterstitial}
*/
interstitial: AdMobFreeInterstitial = new AdMobFreeInterstitial();
/**
* Returns the AdMobFreeRewardVideo object
* @type {AdMobFreeRewardVideo}
*/
rewardVideo: AdMobFreeRewardVideo = new AdMobFreeRewardVideo();
}
/**
* @hidden
*/
@Plugin({
pluginName: 'AdMobFree',
plugin: 'cordova-plugin-admob-free',
pluginRef: 'admob.banner',
pluginRef: 'admob.banner'
})
export class AdMobFreeBanner extends IonicNativePlugin {
export class AdMobFreeBanner {
/**
* Update config.
* Update config
* @param options
* @return {AdMobFreeBannerConfig}
*/
@@ -85,7 +191,7 @@ export class AdMobFreeBanner extends IonicNativePlugin {
}
/**
* Hide the banner.
* Hide the banner
* @return {Promise<any>}
*/
@Cordova({ otherPromise: true })
@@ -94,7 +200,7 @@ export class AdMobFreeBanner extends IonicNativePlugin {
}
/**
* Create banner.
* Create banner
* @return {Promise<any>}
*/
@Cordova({ otherPromise: true })
@@ -103,7 +209,7 @@ export class AdMobFreeBanner extends IonicNativePlugin {
}
/**
* Remove the banner.
* Remove the banner
* @return {Promise<any>}
*/
@Cordova({ otherPromise: true })
@@ -112,14 +218,13 @@ export class AdMobFreeBanner extends IonicNativePlugin {
}
/**
* Show the banner.
* Show the banner
* @return {Promise<any>}
*/
@Cordova({ otherPromise: true })
show(): Promise<any> {
return;
}
}
/**
@@ -128,12 +233,11 @@ export class AdMobFreeBanner extends IonicNativePlugin {
@Plugin({
pluginName: 'AdMobFree',
plugin: 'cordova-plugin-admob-free',
pluginRef: 'admob.interstitial',
pluginRef: 'admob.interstitial'
})
export class AdMobFreeInterstitial extends IonicNativePlugin {
export class AdMobFreeInterstitial {
/**
* Update config.
* Update config
* @param options
* @return {AdMobFreeInterstitialConfig}
*/
@@ -168,7 +272,6 @@ export class AdMobFreeInterstitial extends IonicNativePlugin {
show(): Promise<any> {
return;
}
}
/**
@@ -177,13 +280,12 @@ export class AdMobFreeInterstitial extends IonicNativePlugin {
@Plugin({
pluginName: 'AdMobFree',
plugin: 'cordova-plugin-admob-free',
pluginRef: 'admob.rewardvideo',
pluginRef: 'admob.rewardvideo'
})
export class AdMobFreeRewardVideo extends IonicNativePlugin {
export class AdMobFreeRewardVideo {
/**
* Update config.
* @param options
* Update config
* @param {AdMobFreeRewardVideoConfig} options Admob reward config
* @return {AdMobFreeRewardVideoConfig}
*/
@Cordova({ sync: true })
@@ -217,108 +319,4 @@ export class AdMobFreeRewardVideo extends IonicNativePlugin {
show(): Promise<any> {
return;
}
}
/**
* @name AdMob Free
* @description
*
* @usage
* ```typescript
* import { AdMobFree, AdMobFreeBannerConfig } from '@ionic-native/admob-free';
*
*
* constructor(private admobFree: AdMobFree) { }
*
*
* ...
*
*
* const bannerConfig: AdMobFreeBannerConfig = {
* // add your config here
* // for the sake of this example we will just use the test config
* isTesting: true,
* autoShow: true
* }
* this.admobFree.banner.config(bannerConfig);
*
* this.admobFree.banner.prepare()
* .then(() => {
* // banner Ad is ready
* // if we set autoShow to false, then we will need to call the show method here
* })
* .catch(e => console.log(e));
*
*
* ```
* @interfaces
* AdMobFreeBannerConfig
* AdMobFreeInterstitialConfig
* AdMobFreeRewardVideoConfig
* @classes
* AdMobFreeBanner
* AdMobFreeInterstitial
* AdMobFreeRewardVideo
*/
@Plugin({
pluginName: 'AdMobFree',
plugin: 'cordova-plugin-admob-free',
pluginRef: 'admob',
repo: 'https://github.com/ratson/cordova-plugin-admob-free',
platforms: ['Android', 'iOS']
})
@Injectable()
export class AdMobFree extends IonicNativePlugin {
/**
* Convenience object to get event names
* @type {Object}
*/
events: any = {
BANNER_LOAD: 'admob.banner.events.LOAD',
BANNER_LOAD_FAIL: 'admob.banner.events.LOAD_FAIL',
BANNER_OPEN: 'admob.banner.events.OPEN',
BANNER_CLOSE: 'admob.banner.events.CLOSE',
BANNER_EXIT_APP: 'admob.banner.events.EXIT_APP',
INTERSTITIAL_LOAD: 'admob.interstitial.events.LOAD',
INTERSTITIAL_LOAD_FAIL: 'admob.interstitial.events.LOAD_FAIL',
INTERSTITIAL_OPEN: 'admob.interstitial.events.OPEN',
INTERSTITIAL_CLOSE: 'admob.interstitial.events.CLOSE',
INTERSTITIAL_EXIT_APP: 'admob.interstitial.events.EXIT_APP',
REWARD_VIDEO_LOAD: 'admob.rewardvideo.events.LOAD',
REWARD_VIDEO_LOAD_FAIL: 'admob.rewardvideo.events.LOAD_FAIL',
REWARD_VIDEO_OPEN: 'admob.rewardvideo.events.OPEN',
REWARD_VIDEO_CLOSE: 'admob.rewardvideo.events.CLOSE',
REWARD_VIDEO_EXIT_APP: 'admob.rewardvideo.events.EXIT_APP',
REWARD_VIDEO_START: 'admob.rewardvideo.events.START',
REWARD_VIDEO_REWARD: 'admob.rewardvideo.events.REWARD'
};
/**
* Returns the AdMobFreeBanner object
* @type {AdMobFreeBanner}
*/
banner: AdMobFreeBanner = new AdMobFreeBanner();
/**
* Returns the AdMobFreeInterstitial object
* @type {AdMobFreeInterstitial}
*/
interstitial: AdMobFreeInterstitial = new AdMobFreeInterstitial();
/**
* Returns the AdMobFreeRewardVideo object
* @type {AdMobFreeRewardVideo}
*/
rewardVideo: AdMobFreeRewardVideo = new AdMobFreeRewardVideo();
/**
* Watch an event
* @param event {string} event name
* @return {Observable<any>}
*/
on(event: string): Observable<any> {
return Observable.fromEvent(document, event);
}
}
+23 -30
View File
@@ -3,7 +3,7 @@ import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
export type AdSize =
'SMART_BANNER'
| 'SMART_BANNER'
| 'BANNER'
| 'MEDIUM_RECTANGLE'
| 'FULL_BANNER'
@@ -12,7 +12,6 @@ export type AdSize =
| 'CUSTOM';
export interface AdMobOptions {
/**
* Banner ad ID
*/
@@ -78,10 +77,13 @@ export interface AdMobOptions {
*/
license?: any;
/**
* Set offset
*/
offsetTopBar?: boolean;
}
export interface AdExtras {
color_bg: string;
color_bg_top: string;
@@ -93,7 +95,6 @@ export interface AdExtras {
color_text: string;
color_url: string;
}
/**
@@ -141,7 +142,6 @@ export interface AdExtras {
})
@Injectable()
export class AdMobPro extends IonicNativePlugin {
AD_POSITION: {
NO_CHANGE: number;
TOP_LEFT: number;
@@ -170,7 +170,7 @@ export class AdMobPro extends IonicNativePlugin {
/**
* Create a banner
* @param adIdOrOptions {string | AdMobOptions} Ad ID or Options
* @param {string | AdMobOptions} adIdOrOptions Ad ID or Options
* @returns {Promise<any>} Returns a Promise that resolves when the banner is created
*/
@Cordova()
@@ -184,29 +184,26 @@ export class AdMobPro extends IonicNativePlugin {
@Cordova({
sync: true
})
removeBanner(): void {
}
removeBanner(): void {}
/**
* Show banner at position
* @param position {number} Position. Use `AdMobPro.AD_POSITION` to set values.
* @param {number} position Position. Use `AdMobPro.AD_POSITION` to set values.
*/
@Cordova({
sync: true
})
showBanner(position: number): void {
}
showBanner(position: number): void {}
/**
* Show banner at custom position
* @param x {number} Offset from screen left.
* @param y {number} Offset from screen top.
* @param {number} x Offset from screen left.
* @param {number} y Offset from screen top.
*/
@Cordova({
sync: true
})
showBannerAtXY(x: number, y: number): void {
}
showBannerAtXY(x: number, y: number): void {}
/**
* Hide the banner, remove it from screen, but can show it later
@@ -214,12 +211,11 @@ export class AdMobPro extends IonicNativePlugin {
@Cordova({
sync: true
})
hideBanner(): void {
}
hideBanner(): void {}
/**
* Prepare interstitial banner
* @param adIdOrOptions {string | AdMobOptions} Ad ID or Options
* @param {string | AdMobOptions} adIdOrOptions Ad ID or Options
* @returns {Promise<any>} Returns a Promise that resolves when interstitial is prepared
*/
@Cordova()
@@ -233,12 +229,11 @@ export class AdMobPro extends IonicNativePlugin {
@Cordova({
sync: true
})
showInterstitial(): void {
}
showInterstitial(): void {}
/**
* Prepare a reward video ad
* @param adIdOrOptions {string | AdMobOptions} Ad ID or Options
* @param {string | AdMobOptions} adIdOrOptions Ad ID or Options
* @returns {Promise<any>} Returns a Promise that resolves when the ad is prepared
*/
@Cordova()
@@ -252,12 +247,11 @@ export class AdMobPro extends IonicNativePlugin {
@Cordova({
sync: true
})
showRewardVideoAd(): void {
}
showRewardVideoAd(): void {}
/**
* Sets the values for configuration and targeting
* @param options {AdMobOptions} Options
* @param {AdMobOptions} options Options
* @returns {Promise<any>} Returns a Promise that resolves when the options have been set
*/
@Cordova()
@@ -281,7 +275,7 @@ export class AdMobPro extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onAdFailLoad',
element: 'document'
element: document
})
onAdFailLoad(): Observable<any> {
return;
@@ -294,7 +288,7 @@ export class AdMobPro extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onAdLoaded',
element: 'document'
element: document
})
onAdLoaded(): Observable<any> {
return;
@@ -307,7 +301,7 @@ export class AdMobPro extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onAdPresent',
element: 'document'
element: document
})
onAdPresent(): Observable<any> {
return;
@@ -320,7 +314,7 @@ export class AdMobPro extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onAdLeaveApp',
element: 'document'
element: document
})
onAdLeaveApp(): Observable<any> {
return;
@@ -333,10 +327,9 @@ export class AdMobPro extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onAdDismiss',
element: 'document'
element: document
})
onAdDismiss(): Observable<any> {
return;
}
}
@@ -0,0 +1,66 @@
import { Injectable } from '@angular/core';
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
/**
* @name AES256
* @description
* This cordova ionic plugin allows you to perform AES 256 encryption and decryption on the plain text.
* It's a cross-platform plugin which supports both Android and iOS.
* The encryption and decryption are performed on the device native layer so that the performance is much faster.
*
* @usage
* ```typescript
* import { AES256 } from '@ionic-native/aes-256';
*
*
* constructor(private aES256: AES256) { }
*
* ...
*
*
* this.aES256.encrypt('12345678123456781234567812345678', '1234567812345678', 'testdata')
* .then(res => console.log('Encrypted Data: ',res))
* .catch((error: any) => console.error(error));
*
* this.aES256.decrypt('12345678123456781234567812345678', '1234567812345678', 'encryptedData')
* .then(res => console.log('Decrypted Data : ',res))
* .catch((error: any) => console.error(error));
*
* ```
*/
@Plugin({
pluginName: 'AES256',
plugin: 'cordova-plugin-aes256-encryption',
pluginRef: 'cordova.plugins.AES256',
repo: 'https://github.com/Ideas2IT/cordova-aes256',
platforms: ['Android', 'iOS'],
install: 'ionic cordova plugin add cordova-plugin-aes256-encryption'
})
@Injectable()
export class AES256 extends IonicNativePlugin {
/**
* This function used to perform the aes256 encryption
* @param {string} secureKey A 32 bytes string, which will used as input key for AES256 encryption.
* @param {string} secureIV A 16 bytes string, which will used as initial vector for AES256 encryption.
* @param {string} data A string which will be encrypted
* @return {Promise<string>} Returns a promise that resolves when encryption happens. The success response will returns encrypted data.
*/
@Cordova()
encrypt(secureKey: string, secureIV: string, data: string): Promise<string> {
return;
}
/**
* This function used to perform the aes256 decryption
* @param {string} secureKey A 32 bytes string, which will used as input key for AES256 decryption.
* @param {string} secureIV A 16 bytes string, which will used as initial vector for AES256 decryption.
* @param {string} data An AES256 encrypted data which will be decrypted.
* @return {Promise<string>} Returns a promise that resolves when decryption happens. The success response will returns decrypted data.
*/
@Cordova()
decrypt(secureKey: string, secureIV: string, data: string): Promise<string> {
return;
}
}
+5 -5
View File
@@ -1,6 +1,5 @@
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
import { Injectable } from '@angular/core';
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
export interface AlipayOrder {
/**
@@ -76,7 +75,7 @@ export interface AlipayOrder {
* // Should get from server side with sign.
* const alipayOrder: AlipayOrder = {
* ...
* }
* };
*
*
* this.alipay.pay(alipayOrder)
@@ -100,7 +99,8 @@ export interface AlipayOrder {
plugin: 'cordova-alipay-base',
pluginRef: 'Alipay.Base',
repo: 'https://github.com/xueron/cordova-alipay-base',
install: 'ionic cordova plugin add cordova-alipay-base --variable ALI_PID=your_app_id',
install:
'ionic cordova plugin add cordova-alipay-base --variable ALI_PID=your_app_id',
installVariables: ['ALI_PID'],
platforms: ['Android', 'iOS']
})
@@ -108,7 +108,7 @@ export interface AlipayOrder {
export class Alipay extends IonicNativePlugin {
/**
* Open Alipay to perform App pay
* @param order { AlipayOrder | string } alipay options
* @param { AlipayOrder | string } order alipay options
* @returns {Promise<any>} Returns a Promise that resolves with the success return, or rejects with an error.
*/
@Cordova()
@@ -138,7 +138,7 @@ export interface AndroidExoPlayerControllerConfig {
exo_play: string;
/**
* Payse button icon.
* Pause button icon.
*/
exo_pause: string;
@@ -184,7 +184,7 @@ export interface AndroidExoPlayerControllerConfig {
export class AndroidExoplayer extends IonicNativePlugin {
/**
* Show the player.
* @param parameters {AndroidExoPlayerParams} Parameters
* @param {AndroidExoPlayerParams} parameters Parameters
* @return {Observable<AndroidExoplayerState>}
*/
@Cordova({
@@ -200,12 +200,15 @@ export class AndroidExoplayer extends IonicNativePlugin {
/**
* Switch stream without disposing of the player.
* @param url {string} The url of the new stream.
* @param controller {AndroidExoPlayerControllerConfig} Configuration of the controller.
* @param {string} url The url of the new stream.
* @param {AndroidExoPlayerControllerConfig} controller Configuration of the controller.
* @return {Promise<void>}
*/
@Cordova()
setStream(url: string, controller: AndroidExoPlayerControllerConfig): Promise<void> {
setStream(
url: string,
controller: AndroidExoPlayerControllerConfig
): Promise<void> {
return;
}
@@ -229,7 +232,7 @@ export class AndroidExoplayer extends IonicNativePlugin {
/**
* Jump to a particular position.
* @param milliseconds {number} Position in stream in milliseconds
* @param {number} milliseconds Position in stream in milliseconds
* @return {Promise<void>}
*/
@Cordova()
@@ -239,7 +242,7 @@ export class AndroidExoplayer extends IonicNativePlugin {
/**
* Jump to a particular time relative to the current position.
* @param milliseconds {number} Time in milliseconds
* @param {number} milliseconds Time in milliseconds
* @return {Promise<void>}
*/
@Cordova()
@@ -276,7 +279,7 @@ export class AndroidExoplayer extends IonicNativePlugin {
/**
* Update the controller configuration.
* @param controller {AndroidExoPlayerControllerConfig} Configuration of the controller.
* @param {AndroidExoPlayerControllerConfig} controller Configuration of the controller.
* @return {Promise<void>}
*/
@Cordova()
@@ -1,9 +1,7 @@
import { Injectable } from '@angular/core';
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
export interface AFAAuthOptions {
/**
* Required
* Used as the alias for your key in the Android Key Store.
@@ -62,7 +60,6 @@ export interface AFAAuthOptions {
* Set the hint displayed by the fingerprint icon on the fingerprint authentication dialog.
*/
dialogHint?: string;
}
export interface AFADecryptOptions {
@@ -96,6 +93,17 @@ export interface AFAEncryptResponse {
token: string;
}
export interface AFAAvailableResponse {
isAvailable: boolean;
isHardwareDetected: boolean;
hasEnrolledFingerprints: boolean;
}
export interface AFADeleteOptions {
clientId: string;
username: string;
}
/**
* @name Android Fingerprint Auth
* @description
@@ -139,6 +147,8 @@ export interface AFAEncryptResponse {
* AFAAuthOptions
* AFAEncryptResponse
* AFADecryptOptions
* AFAAvailableResponse
* AFADeleteOptions
*/
@Plugin({
pluginName: 'AndroidFingerprintAuth',
@@ -149,8 +159,29 @@ export interface AFAEncryptResponse {
})
@Injectable()
export class AndroidFingerprintAuth extends IonicNativePlugin {
/**
* Convenience property containing all possible errors
*/
ERRORS: {
BAD_PADDING_EXCEPTION: string;
CERTIFICATE_EXCEPTION: string;
FINGERPRINT_CANCELLED: string;
FINGERPRINT_DATA_NOT_DELETED: string;
FINGERPRINT_ERROR: string;
FINGERPRINT_NOT_AVAILABLE: string;
FINGERPRINT_PERMISSION_DENIED: string;
FINGERPRINT_PERMISSION_DENIED_SHOW_REQUEST: string;
ILLEGAL_BLOCK_SIZE_EXCEPTION: string;
INIT_CIPHER_FAILED: string;
INVALID_ALGORITHM_PARAMETER_EXCEPTION: string;
IO_EXCEPTION: string;
JSON_EXCEPTION: string;
MINIMUM_SDK: string;
MISSING_ACTION_PARAMETERS: string;
MISSING_PARAMETERS: string;
NO_SUCH_ALGORITHM_EXCEPTION: string;
SECURITY_EXCEPTION: string;
} = {
BAD_PADDING_EXCEPTION: 'BAD_PADDING_EXCEPTION',
CERTIFICATE_EXCEPTION: 'CERTIFICATE_EXCEPTION',
FINGERPRINT_CANCELLED: 'FINGERPRINT_CANCELLED',
@@ -173,8 +204,8 @@ export class AndroidFingerprintAuth extends IonicNativePlugin {
/**
* Opens a native dialog fragment to use the device hardware fingerprint scanner to authenticate against fingerprints registered for the device.
* @param options {AFAAuthOptions} Options
* @returns {Promise<any>}
* @param {AFAAuthOptions} options Options
* @returns {Promise<AFAEncryptResponse>}
*/
@Cordova()
encrypt(options: AFAAuthOptions): Promise<AFAEncryptResponse> {
@@ -183,8 +214,8 @@ export class AndroidFingerprintAuth extends IonicNativePlugin {
/**
* Opens a native dialog fragment to use the device hardware fingerprint scanner to authenticate against fingerprints registered for the device.
* @param options {AFAAuthOptions} Options
* @returns {Promise<any>}
* @param {AFAAuthOptions} options Options
* @returns {Promise<AFADecryptOptions>}
*/
@Cordova()
decrypt(options: AFAAuthOptions): Promise<AFADecryptOptions> {
@@ -193,19 +224,20 @@ export class AndroidFingerprintAuth extends IonicNativePlugin {
/**
* Check if service is available
* @returns {Promise<any>} Returns a Promise that resolves if fingerprint auth is available on the device
* @returns {Promise<AFAAvailableResponse>} Returns a Promise that resolves if fingerprint auth is available on the device
*/
@Cordova()
isAvailable(): Promise<{ isAvailable: boolean, isHardwareDetected: boolean, hasEnrolledFingerprints: boolean }> {
isAvailable(): Promise<AFAAvailableResponse> {
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
* @param {AFADeleteOptions} options Options
* @returns {Promise<{ deleted: boolean }>} Returns a Promise that resolves if the cipher was successfully deleted
*/
@Cordova()
delete(options: { clientId: string; username: string; }): Promise<{ deleted: boolean }> {
delete(options: AFADeleteOptions): Promise<{ deleted: boolean }> {
return;
}
}
@@ -1,9 +1,9 @@
import { Injectable } from '@angular/core';
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
import { Cordova, Plugin, IonicNativePlugin } from '@ionic-native/core';
/**
* Bit flag values for setSystemUiVisibility()
* @see https://developer.android.com/reference/android/view/View.html#setSystemUiVisibility(int)
* @see https://developer.android.com/reference/android/view/View.html#setSystemUiVisibility(int)
*/
export enum AndroidSystemUiFlags {
/** View has requested the system UI (status bar) to be visible (the default). SYSTEM_UI_FLAG_VISIBLE */
@@ -14,8 +14,6 @@ export enum AndroidSystemUiFlags {
HideNavigation = 2,
/** View has requested to go into the normal fullscreen mode so that its content can take over the screen while still allowing the user to interact with the application. SYSTEM_UI_FLAG_FULLSCREEN */
Fullscreen = 4,
/** Requests the navigation bar to draw in a mode that is compatible with light navigation bar backgrounds. SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR */
LightNavigationBar = 16,
/** When using other layout flags, we would like a stable view of the content insets given to fitSystemWindows(Rect). SYSTEM_UI_FLAG_LAYOUT_STABLE */
LayoutStable = 256,
/** View would like its window to be laid out as if it has requested SYSTEM_UI_FLAG_HIDE_NAVIGATION, even if it currently hasn't. SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION */
@@ -45,8 +43,8 @@ export enum AndroidSystemUiFlags {
* ...
*
* this.androidFullScreen.isImmersiveModeSupported()
* .then(() => this.androidFullScreen.immersiveMode())
* .catch((error: any) => console.log(error));
* .then(() => console.log('Immersive mode supported'))
* .catch(err => console.log(err));
*
* ```
*/
@@ -64,81 +62,63 @@ export class AndroidFullScreen extends IonicNativePlugin {
* @return {Promise<void>}
*/
@Cordova()
isSupported(): Promise<void> {
return;
}
isSupported(): Promise<void> { return; }
/**
* Is immersive mode supported?
* @return {Promise<void>}
*/
@Cordova()
isImmersiveModeSupported(): Promise<void> {
return;
}
isImmersiveModeSupported(): Promise<void> { return; }
/**
* The width of the screen in immersive mode.
* @return {Promise<number>}
*/
@Cordova()
immersiveWidth(): Promise<number> {
return;
}
immersiveWidth(): Promise<number> { return; }
/**
* The height of the screen in immersive mode.
* @return {Promise<number>}
*/
@Cordova()
immersiveHeight(): Promise<number> {
return;
}
immersiveHeight(): Promise<number> { return; }
/**
* Hide system UI until user interacts.
* @return {Promise<void>}
*/
@Cordova()
leanMode(): Promise<void> {
return;
}
leanMode(): Promise<void> { return; }
/**
* Show system UI.
* @return {Promise<void>}
*/
@Cordova()
showSystemUI(): Promise<void> {
return;
}
showSystemUI(): Promise<void> { return; }
/**
* Extend your app underneath the status bar (Android 4.4+ only).
* @return {Promise<void>}
*/
@Cordova()
showUnderStatusBar(): Promise<void> {
return;
}
showUnderStatusBar(): Promise<void> { return; }
/**
* Extend your app underneath the system UI (Android 4.4+ only).
* @return {Promise<void>}
*/
@Cordova()
showUnderSystemUI(): Promise<void> {
return;
}
showUnderSystemUI(): Promise<void> { return; }
/**
* Hide system UI and keep it hidden (Android 4.4+ only).
* @return {Promise<void>}
*/
@Cordova()
immersiveMode(): Promise<void> {
return;
}
immersiveMode(): Promise<void> { return; }
/**
* Manually set the the system UI to a custom mode. This mirrors the Android method of the same name. (Android 4.4+ only).
@@ -147,7 +127,5 @@ export class AndroidFullScreen extends IonicNativePlugin {
* @return {Promise<void>}
*/
@Cordova()
setSystemUiVisibility(visibility: AndroidSystemUiFlags): Promise<void> {
return;
}
setSystemUiVisibility(visibility: AndroidSystemUiFlags): Promise<void> { return; }
}
@@ -1,5 +1,5 @@
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
import { Injectable } from '@angular/core';
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
/**
* @name Android Permissions
@@ -37,12 +37,12 @@ import { Injectable } from '@angular/core';
})
@Injectable()
export class AndroidPermissions extends IonicNativePlugin {
PERMISSION: any = {
ACCESS_CHECKIN_PROPERTIES: 'android.permission.ACCESS_CHECKIN_PROPERTIES',
ACCESS_COARSE_LOCATION: 'android.permission.ACCESS_COARSE_LOCATION',
ACCESS_FINE_LOCATION: 'android.permission.ACCESS_FINE_LOCATION',
ACCESS_LOCATION_EXTRA_COMMANDS: 'android.permission.ACCESS_LOCATION_EXTRA_COMMANDS',
ACCESS_LOCATION_EXTRA_COMMANDS:
'android.permission.ACCESS_LOCATION_EXTRA_COMMANDS',
ACCESS_MOCK_LOCATION: 'android.permission.ACCESS_MOCK_LOCATION',
ACCESS_NETWORK_STATE: 'android.permission.ACCESS_NETWORK_STATE',
ACCESS_SURFACE_FLINGER: 'android.permission.ACCESS_SURFACE_FLINGER',
@@ -53,12 +53,14 @@ export class AndroidPermissions extends IonicNativePlugin {
BATTERY_STATS: 'android.permission.BATTERY_STATS',
BIND_ACCESSIBILITY_SERVICE: 'android.permission.BIND_ACCESSIBILITY_SERVICE',
BIND_APPWIDGET: 'android.permission.BIND_APPWIDGET',
BIND_CARRIER_MESSAGING_SERVICE: 'android.permission.BIND_CARRIER_MESSAGING_SERVICE',
BIND_CARRIER_MESSAGING_SERVICE:
'android.permission.BIND_CARRIER_MESSAGING_SERVICE',
BIND_DEVICE_ADMIN: 'android.permission.BIND_DEVICE_ADMIN',
BIND_DREAM_SERVICE: 'android.permission.BIND_DREAM_SERVICE',
BIND_INPUT_METHOD: 'android.permission.BIND_INPUT_METHOD',
BIND_NFC_SERVICE: 'android.permission.BIND_NFC_SERVICE',
BIND_NOTIFICATION_LISTENER_SERVICE: 'android.permission.BIND_NOTIFICATION_LISTENER_SERVICE',
BIND_NOTIFICATION_LISTENER_SERVICE:
'android.permission.BIND_NOTIFICATION_LISTENER_SERVICE',
BIND_PRINT_SERVICE: 'android.permission.BIND_PRINT_SERVICE',
BIND_REMOTEVIEWS: 'android.permission.BIND_REMOTEVIEWS',
BIND_TEXT_SERVICE: 'android.permission.BIND_TEXT_SERVICE',
@@ -79,12 +81,15 @@ export class AndroidPermissions extends IonicNativePlugin {
CALL_PRIVILEGED: 'android.permission.CALL_PRIVILEGED',
CAMERA: 'android.permission.CAMERA',
CAPTURE_AUDIO_OUTPUT: 'android.permission.CAPTURE_AUDIO_OUTPUT',
CAPTURE_SECURE_VIDEO_OUTPUT: 'android.permission.CAPTURE_SECURE_VIDEO_OUTPUT',
CAPTURE_SECURE_VIDEO_OUTPUT:
'android.permission.CAPTURE_SECURE_VIDEO_OUTPUT',
CAPTURE_VIDEO_OUTPUT: 'android.permission.CAPTURE_VIDEO_OUTPUT',
CHANGE_COMPONENT_ENABLED_STATE: 'android.permission.CHANGE_COMPONENT_ENABLED_STATE',
CHANGE_COMPONENT_ENABLED_STATE:
'android.permission.CHANGE_COMPONENT_ENABLED_STATE',
CHANGE_CONFIGURATION: 'android.permission.CHANGE_CONFIGURATION',
CHANGE_NETWORK_STATE: 'android.permission.CHANGE_NETWORK_STATE',
CHANGE_WIFI_MULTICAST_STATE: 'android.permission.CHANGE_WIFI_MULTICAST_STATE',
CHANGE_WIFI_MULTICAST_STATE:
'android.permission.CHANGE_WIFI_MULTICAST_STATE',
CHANGE_WIFI_STATE: 'android.permission.CHANGE_WIFI_STATE',
CLEAR_APP_CACHE: 'android.permission.CLEAR_APP_CACHE',
CLEAR_APP_USER_DATA: 'android.permission.CLEAR_APP_USER_DATA',
@@ -130,7 +135,8 @@ export class AndroidPermissions extends IonicNativePlugin {
READ_CONTACTS: 'android.permission.READ_CONTACTS',
READ_EXTERNAL_STORAGE: 'android.permission.READ_EXTERNAL_STORAGE',
READ_FRAME_BUFFER: 'android.permission.READ_FRAME_BUFFER',
READ_HISTORY_BOOKMARKS: 'com.android.browser.permission.READ_HISTORY_BOOKMARKS',
READ_HISTORY_BOOKMARKS:
'com.android.browser.permission.READ_HISTORY_BOOKMARKS',
READ_INPUT_STATE: 'android.permission.READ_INPUT_STATE',
READ_LOGS: 'android.permission.READ_LOGS',
READ_PHONE_STATE: 'android.permission.READ_PHONE_STATE',
@@ -164,7 +170,8 @@ export class AndroidPermissions extends IonicNativePlugin {
SET_TIME_ZONE: 'android.permission.SET_TIME_ZONE',
SET_WALLPAPER: 'android.permission.SET_WALLPAPER',
SET_WALLPAPER_HINTS: 'android.permission.SET_WALLPAPER_HINTS',
SIGNAL_PERSISTENT_PROCESSES: 'android.permission.SIGNAL_PERSISTENT_PROCESSES',
SIGNAL_PERSISTENT_PROCESSES:
'android.permission.SIGNAL_PERSISTENT_PROCESSES',
STATUS_BAR: 'android.permission.STATUS_BAR',
SUBSCRIBED_FEEDS_READ: 'android.permission.SUBSCRIBED_FEEDS_READ',
SUBSCRIBED_FEEDS_WRITE: 'android.permission.SUBSCRIBED_FEEDS_WRITE',
@@ -182,7 +189,8 @@ export class AndroidPermissions extends IonicNativePlugin {
WRITE_CONTACTS: 'android.permission.WRITE_CONTACTS',
WRITE_EXTERNAL_STORAGE: 'android.permission.WRITE_EXTERNAL_STORAGE',
WRITE_GSERVICES: 'android.permission.WRITE_GSERVICES',
WRITE_HISTORY_BOOKMARKS: 'com.android.browser.permission.WRITE_HISTORY_BOOKMARKS',
WRITE_HISTORY_BOOKMARKS:
'com.android.browser.permission.WRITE_HISTORY_BOOKMARKS',
WRITE_PROFILE: 'android.permission.WRITE_PROFILE',
WRITE_SECURE_SETTINGS: 'android.permission.WRITE_SECURE_SETTINGS',
WRITE_SETTINGS: 'android.permission.WRITE_SETTINGS',
@@ -190,12 +198,12 @@ export class AndroidPermissions extends IonicNativePlugin {
WRITE_SOCIAL_STREAM: 'android.permission.WRITE_SOCIAL_STREAM',
WRITE_SYNC_SETTINGS: 'android.permission.WRITE_SYNC_SETTINGS',
WRITE_USER_DICTIONARY: 'android.permission.WRITE_USER_DICTIONARY',
WRITE_VOICEMAIL: 'com.android.voicemail.permission.WRITE_VOICEMAIL',
WRITE_VOICEMAIL: 'com.android.voicemail.permission.WRITE_VOICEMAIL'
};
/**
* Check permission
* @param permission {string} The name of the permission
* @param {string} permission The name of the permission
* @return {Promise<any>} Returns a promise
*/
@Cordova()
@@ -205,7 +213,7 @@ export class AndroidPermissions extends IonicNativePlugin {
/**
* Request permission
* @param permission {string} The name of the permission to request
* @param {string} permission The name of the permission to request
* @return {Promise<any>}
*/
@Cordova()
@@ -215,7 +223,7 @@ export class AndroidPermissions extends IonicNativePlugin {
/**
* Request permissions
* @param permissions {Array<string>} An array with permissions
* @param {Array<string>} permissions An array with permissions
* @return {Promise<any>} Returns a promise
*/
@Cordova()
@@ -225,12 +233,11 @@ export class AndroidPermissions extends IonicNativePlugin {
/**
* This function still works now, will not support in the future.
* @param permission {string} The name of the permission
* @param {string} permission The name of the permission
* @return {Promise<any>} Returns a promise
*/
@Cordova()
hasPermission(permission: string): Promise<any> {
return;
}
}
@@ -1,5 +1,5 @@
import { Injectable } from '@angular/core';
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
import { Cordova, Plugin, IonicNativePlugin } from '@ionic-native/core';
/**
* @name App Availability
@@ -27,8 +27,8 @@ import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
*
* this.appAvailability.check(app)
* .then(
* (yes: string) => console.log(app + ' is available'),
* (no: string) => console.log(app + ' is NOT available')
* (yes: boolean) => console.log(app + ' is available'),
* (no: boolean) => console.log(app + ' is NOT available')
* );
* ```
*/
@@ -48,8 +48,6 @@ export class AppAvailability extends IonicNativePlugin {
* @returns {Promise<boolean>}
*/
@Cordova()
check(app: string): Promise<boolean> {
return;
}
check(app: string): Promise<boolean> { return; }
}
@@ -0,0 +1,78 @@
import { Injectable } from '@angular/core';
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
export interface StringMap {
[s: string]: string;
}
/**
* @name App Center Analytics
* @description
* App Center Analytics helps you understand user behavior and customer engagement to improve your app.
* The SDK automatically captures session count and device properties like model, OS version, etc.
* You can define your own custom events to measure things that matter to you.
* All the information captured is available in the App Center portal for you to analyze the data.
*
* For more info, please see https://docs.microsoft.com/en-us/appcenter/sdk/analytics/cordova
*
* @usage
* ```typescript
* import { AppCenterAnalytics } from '@ionic-native/app-center-analytics';
*
*
* constructor(private appCenterAnalytics: AppCenterAnalytics) { }
*
* ...
*
* this.appCenterAnalytics.setEnabled(true).then(() => {
* this.appCenterAnalytics.trackEvent('My Event', { TEST: 'HELLO_WORLD' }).then(() => {
* console.log('Custom event tracked');
* });
* });
*
* ```
* @interfaces
* StringMap
*/
@Plugin({
pluginName: 'AppCenterAnalytics',
plugin: 'cordova-plugin-appcenter-analytics',
pluginRef: 'AppCenter.Analytics',
repo:
'https://github.com/Microsoft/appcenter-sdk-cordova/tree/master/cordova-plugin-appcenter-analytics',
platforms: ['Android', 'iOS']
})
@Injectable()
export class AppCenterAnalytics extends IonicNativePlugin {
/**
* Tracks an custom event.
* You can send up to 200 distinct event names. Also, there is a maximum limit of 256 characters per event name
* and 64 characters per event property name and event property value.
* @param {string} eventName Event name
* @param {StringMap} properties Event properties
* @returns {Promise<void>}
*/
@Cordova()
trackEvent(eventName: string, properties: StringMap): Promise<void> {
return;
}
/**
* Check if App Center Analytics is enabled
* @returns {Promise<boolean>}
*/
@Cordova()
isEnabled(): Promise<boolean> {
return;
}
/**
* Enable or disable App Center Analytics at runtime
* @param {boolean} shouldEnable Set value
* @returns {Promise<void>}
*/
@Cordova()
setEnabled(shouldEnable: boolean): Promise<void> {
return;
}
}
@@ -0,0 +1,115 @@
import { Injectable } from '@angular/core';
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
export interface AppCenterCrashReport {
id: string;
device: AppCenterCrashReportDevice;
appStartTime: number;
appErrorTime: number;
signal: string;
appProcessIdentifier: number;
}
export interface AppCenterCrashReportDevice {
oem_name: string;
os_name: string;
app_version: string;
time_zone_offset: number;
carrier_name: string;
screen_size: string;
locale: string;
sdk_version: string;
carrier_country: string;
os_build: string;
app_namespace: string;
os_version: string;
sdk_name: string;
model: string;
app_build: string;
}
/**
* @name App Center Crashes
* @description
* App Center Analytics helps you understand user behavior and customer engagement to improve your app.
* The SDK automatically captures session count and device properties like model, OS version, etc.
* You can define your own custom events to measure things that matter to you.
* All the information captured is available in the App Center portal for you to analyze the data.
*
* For more info, please see https://docs.microsoft.com/en-us/appcenter/sdk/crashes/cordova
*
* @usage
* ```typescript
* import { AppCenterCrashes } from '@ionic-native/app-center-crashes';
*
*
* constructor(private AppCenterCrashes: AppCenterCrashes) { }
*
* ...
*
* this.AppCenterCrashes.setEnabled(true).then(() => {
* this.AppCenterCrashes.lastSessionCrashReport().then(report => {
* console.log('Crash report', report);
* });
* });
*
* ```
* @interfaces
* AppCenterCrashReport
* AppCenterCrashReportDevice
*/
@Plugin({
pluginName: 'AppCenterCrashes',
plugin: 'cordova-plugin-appcenter-crashes',
pluginRef: 'AppCenter.Crashes',
repo:
'https://github.com/Microsoft/appcenter-sdk-cordova/tree/master/cordova-plugin-appcenter-crashes',
platforms: ['Android', 'iOS']
})
@Injectable()
export class AppCenterCrashes extends IonicNativePlugin {
/**
* App Center Crashes provides you with an API to generate a test crash for easy testing of the SDK.
* This API can only be used in test/beta apps and won't do anything in production apps.
* @returns void
*/
@Cordova()
generateTestCrash(): void {}
/**
* At any time after starting the SDK, you can check if the app crashed in the previous launch
* @returns {Promise<boolean>}
*/
@Cordova()
hasCrashedInLastSession(): Promise<boolean> {
return;
}
/**
* Details about the last crash
* @returns {Promise<AppCenterCrashReport>}
*/
@Cordova()
lastSessionCrashReport(): Promise<AppCenterCrashReport> {
return;
}
/**
* Check if App Center Crashes is enabled
* @returns {Promise<boolean>}
*/
@Cordova()
isEnabled(): Promise<boolean> {
return;
}
/**
* Enable or disable App Center Crashes at runtime
* @param {boolean} shouldEnable Set value
* @returns {Promise<void>}
*/
@Cordova()
setEnabled(shouldEnable: boolean): Promise<void> {
return;
}
}
@@ -0,0 +1,68 @@
import { Injectable } from '@angular/core';
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
/**
* @name App Center Push
* @description
*
* For more info, please see https://docs.microsoft.com/en-us/appcenter/sdk/push/cordova
*
* @usage
* ```typescript
* import { AppCenterPush } from '@ionic-native/app-center-push';
*
*
* constructor(private appCenterPush: AppCenterPush) { }
*
* ...
*
* this.appCenterPush.setEnabled(true).then(() => {
* this.appCenterPush.addEventListener('My Event').subscribe(pushNotification => {
* console.log('Recived push notification', pushNotification);
* });
* });
*
* ```
*/
@Plugin({
pluginName: 'AppCenterPush',
plugin: 'cordova-plugin-appcenter-push',
pluginRef: 'AppCenter.Push',
repo:
'https://github.com/Microsoft/appcenter-sdk-cordova/tree/master/cordova-plugin-appcenter-push',
platforms: ['Android', 'iOS']
})
@Injectable()
export class AppCenterPush extends IonicNativePlugin {
/**
* Subscribe to an event
* @param {string} eventName Event name
* @returns {Observable<any>}
*/
@Cordova({
observable: true,
clearFunction: 'removeEventListener'
})
addEventListener(eventName: string): Observable<any> {
return;
}
/**
* Check if App Center Push is enabled
* @returns {Promise<boolean>}
*/
@Cordova()
isEnabled(): Promise<boolean> {
return;
}
/**
* Enable or disable App Center Push at runtime
* @param {boolean} shouldEnable Set value
* @returns {Promise<void>}
*/
@Cordova()
setEnabled(shouldEnable: boolean): Promise<void> {
return;
}
}
@@ -1,4 +1,4 @@
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
import { Plugin, Cordova, IonicNativePlugin } from '@ionic-native/core';
import { Injectable } from '@angular/core';
/**
@@ -37,8 +37,6 @@ export class AppMinimize extends IonicNativePlugin {
* @return {Promise<any>}
*/
@Cordova()
minimize(): Promise<any> {
return;
}
minimize(): Promise<any> { return; }
}
@@ -1,4 +1,4 @@
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
import { Cordova, Plugin, IonicNativePlugin } from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
import { Injectable } from '@angular/core';
@@ -40,9 +40,7 @@ export class AppPreferences extends IonicNativePlugin {
@Cordova({
callbackOrder: 'reverse'
})
fetch(dict: string, key?: string): Promise<any> {
return;
}
fetch(dict: string, key?: string): Promise<any> { return; }
/**
* Set a preference value
@@ -69,9 +67,7 @@ export class AppPreferences extends IonicNativePlugin {
@Cordova({
callbackOrder: 'reverse'
})
remove(dict: string, key?: string): Promise<any> {
return;
}
remove(dict: string, key?: string): Promise<any> { return; }
/**
* Clear preferences
@@ -81,9 +77,7 @@ export class AppPreferences extends IonicNativePlugin {
@Cordova({
callbackOrder: 'reverse'
})
clearAll(): Promise<any> {
return;
}
clearAll(): Promise<any> { return; }
/**
* Show native preferences interface
@@ -93,9 +87,7 @@ export class AppPreferences extends IonicNativePlugin {
@Cordova({
callbackOrder: 'reverse'
})
show(): Promise<any> {
return;
}
show(): Promise<any> { return; }
/**
* Show native preferences interface
@@ -106,9 +98,7 @@ export class AppPreferences extends IonicNativePlugin {
@Cordova({
observable: true
})
watch(subscribe: boolean): Observable<any> {
return;
}
watch(subscribe: boolean): Observable<any> { return; }
/**
* Return named configuration context
@@ -121,17 +111,13 @@ export class AppPreferences extends IonicNativePlugin {
platforms: ['Android'],
sync: true
})
suite(suiteName: string): any {
return;
}
suite(suiteName: string): any { return; }
@Cordova({
platforms: ['iOS'],
sync: true
})
iosSuite(suiteName: string): any {
return;
}
iosSuite(suiteName: string): any { return; }
/**
* Return cloud synchronized configuration context
@@ -141,9 +127,7 @@ export class AppPreferences extends IonicNativePlugin {
@Cordova({
platforms: ['iOS', 'Windows', 'Windows Phone 8']
})
cloudSync(): Object {
return;
}
cloudSync(): Object { return; }
/**
* Return default configuration context
@@ -153,8 +137,6 @@ export class AppPreferences extends IonicNativePlugin {
@Cordova({
platforms: ['iOS', 'Windows', 'Windows Phone 8']
})
defaults(): Object {
return;
}
defaults(): Object { return; }
}
+35 -16
View File
@@ -2,7 +2,6 @@ import { Injectable } from '@angular/core';
import { Cordova, CordovaProperty, IonicNativePlugin, Plugin } from '@ionic-native/core';
export interface AppRatePreferences {
/**
* Custom BCP 47 language tag
*/
@@ -41,7 +40,7 @@ export interface AppRatePreferences {
/**
* Custom locale object
*/
customLocale?: any;
customLocale?: AppRateCustomLocale;
/**
* Callbacks for events
@@ -52,11 +51,38 @@ export interface AppRatePreferences {
* App Store URLS
*/
storeAppURL?: AppUrls;
}
export interface AppRateCustomLocale {
/** Title */
title?: string;
/** Message */
message?: string;
/** Cancel button label */
cancelButtonLabel?: string;
/** Later button label */
laterButtonLabel?: string;
/** Rate button label */
rateButtonLabel?: string;
/** Yes button label */
yesButtonLabel?: string;
/** No button label */
noButtonLabel?: string;
/** App rate promt title */
appRatePromptTitle?: string;
/** Feedback prompt title */
feedbackPromptTitle?: string;
}
export interface AppRateCallbacks {
/**
* call back function. called when user clicked on rate-dialog buttons
*/
@@ -70,11 +96,9 @@ export interface AppRateCallbacks {
* call back function. called when user clicked on negative feedback
*/
handleNegativeFeedback?: Function;
}
export interface AppUrls {
/**
* application id in AppStore
*/
@@ -99,7 +123,6 @@ export interface AppUrls {
* application URL in WindowsStore
*/
windows8?: string;
}
/**
@@ -121,7 +144,7 @@ export interface AppUrls {
* ios: '<app_id>',
* android: 'market://details?id=<package_name>',
* windows: 'ms-windows-store://review/?ProductId=<store_id>'
* }
* };
*
* this.appRate.promptForRating(true);
*
@@ -133,7 +156,7 @@ export interface AppUrls {
* android: 'market://details?id=<package_name>',
* windows: 'ms-windows-store://review/?ProductId=<store_id>'
* }
* }
* };
*
* this.appRate.promptForRating(false);
* ```
@@ -142,6 +165,7 @@ export interface AppUrls {
* AppRatePreferences
* AppUrls
* AppRateCallbacks
* AppRateCustomLocal
*
*/
@Plugin({
@@ -153,27 +177,22 @@ export interface AppUrls {
})
@Injectable()
export class AppRate extends IonicNativePlugin {
/**
* Configure various settings for the Rating View.
* See table below for options
*/
@CordovaProperty()
preferences: AppRatePreferences;
@CordovaProperty preferences: AppRatePreferences;
/**
* Prompts the user for rating
* @param {boolean} immediately Show the rating prompt immediately.
*/
@Cordova()
promptForRating(immediately: boolean): void {
}
promptForRating(immediately: boolean): void {}
/**
* Immediately send the user to the app store rating page
*/
@Cordova()
navigateToAppStore(): void {
}
navigateToAppStore(): void {}
}
+14 -5
View File
@@ -1,5 +1,11 @@
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
import { Injectable } from '@angular/core';
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
export interface AppUpdateOptions {
authType: string;
username?: string;
password?: string;
}
/**
* @name App Update
@@ -24,13 +30,15 @@ import { Injectable } from '@angular/core';
*
* constructor(private appUpdate: AppUpdate) {
*
* const updateUrl = 'http://your-remote-api.com/update.xml';
* this.appUpdate.checkAppUpdate(updateUrl);
* const updateUrl = 'https://your-remote-api.com/update.xml';
* this.appUpdate.checkAppUpdate(updateUrl).then(() => { console.log('Update available') });
*
* }
* ```
*
* The plugin will compare the app version and update it automatically if the API has a newer version to install.
* @interfaces
* AppUpdateOptions
*/
@Plugin({
pluginName: 'AppUpdate',
@@ -43,13 +51,14 @@ import { Injectable } from '@angular/core';
export class AppUpdate extends IonicNativePlugin {
/**
* Check and update
* @param updateUrl {string} update api url
* @param {string} updateUrl update api url
* @param {AppUpdateOptions} [options] options
* @return {Promise<any>} Returns a promise that resolves when something happens
*/
@Cordova({
callbackOrder: 'reverse'
})
checkAppUpdate(updateUrl: string): Promise<any> {
checkAppUpdate(updateUrl: string, options?: AppUpdateOptions): Promise<any> {
return;
}
}
+10 -17
View File
@@ -1,5 +1,6 @@
import { Injectable } from '@angular/core';
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
import { Cordova, Plugin, IonicNativePlugin } from '@ionic-native/core';
/**
@@ -37,38 +38,30 @@ export class AppVersion extends IonicNativePlugin {
/**
* Returns the name of the app
* @returns {Promise<any>}
* @returns {Promise<string>}
*/
@Cordova()
getAppName(): Promise<any> {
return;
}
getAppName(): Promise<string> { return; }
/**
* Returns the package name of the app
* @returns {Promise<any>}
* @returns {Promise<string>}
*/
@Cordova()
getPackageName(): Promise<any> {
return;
}
getPackageName(): Promise<string> { return; }
/**
* Returns the build identifier of the app
* @returns {Promise<any>}
* @returns {Promise<string>}
*/
@Cordova()
getVersionCode(): Promise<any> {
return;
}
getVersionCode(): Promise<string> { return; }
/**
* Returns the version of the app
* @returns {Promise<any>}
* @returns {Promise<string>}
*/
@Cordova()
getVersionNumber(): Promise<any> {
return;
}
getVersionNumber(): Promise<string> { return; }
}
+31 -20
View File
@@ -1,15 +1,21 @@
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
import { Plugin, Cordova, IonicNativePlugin } from '@ionic-native/core';
export type IMakePayments =
'This device can make payments and has a supported card'
| 'This device can make payments and has a supported card'
| 'This device cannot make payments.'
| 'This device can make payments but has no supported cards';
export type IShippingType = 'shipping' | 'delivery' | 'store' | 'service';
export type IBillingRequirement = 'none' | 'all' | 'postcode' | 'name' | 'email' | 'phone';
export type IBillingRequirement =
| 'none'
| 'all'
| 'postcode'
| 'name'
| 'email'
| 'phone';
export type ITransactionStatus =
'success'
| 'success'
| 'failure'
| 'invalid-billing-address'
| 'invalid-shipping-address'
@@ -18,7 +24,9 @@ export type ITransactionStatus =
| 'incorrect-pin'
| 'locked-pin';
export type ICompleteTransaction = 'Payment status applied.';
export type IUpdateItemsAndShippingStatus = 'Updated List Info' | 'Did you make a payment request?';
export type IUpdateItemsAndShippingStatus =
| 'Updated List Info'
| 'Did you make a payment request?';
export interface IPaymentResponse {
billingNameFirst?: string;
@@ -57,14 +65,12 @@ export interface IOrderItem {
label: string;
amount: number;
}
export interface IShippingMethod {
identifier: string;
label: string;
detail: string;
amount: number;
}
export interface IOrderItemsAndShippingMethods {
items: IOrderItem[];
shippingMethods?: IShippingMethod[];
@@ -144,11 +150,10 @@ export interface ISelectedShippingContact {
plugin: 'cordova-plugin-applepay',
pluginRef: 'ApplePay',
repo: 'https://github.com/samkelleher/cordova-plugin-applepay',
platforms: ['iOS'],
platforms: ['iOS']
})
@Injectable()
export class ApplePay extends IonicNativePlugin {
/**
* Detects if the current device supports Apple Pay and has any capable cards registered.
* @return {Promise<IMakePayments>} Returns a promise
@@ -183,7 +188,9 @@ export class ApplePay extends IonicNativePlugin {
observable: true,
clearFunction: 'stopListeningForShippingContactSelection'
})
startListeningForShippingContactSelection(): Observable<ISelectedShippingContact> {
startListeningForShippingContactSelection(): Observable<
ISelectedShippingContact
> {
return;
}
@@ -205,9 +212,9 @@ export class ApplePay extends IonicNativePlugin {
* any shipping contact selection event or else the user will not be able
* to complete a transaction on the pay sheet. Do not call without
* subscribing to shipping contact selection events first
* @returns {Promise}
*
* @param {Object} including `items` and `shippingMethods` properties.
* @param {IOrderItemsAndShippingMethods} list `items` and `shippingMethods` properties.
* @returns {Promise<IUpdateItemsAndShippingStatus>}
*
* @usage
* this.applePay.startListeningForShippingContactSelection().pluck('shippingAddressState').subscribe(shippingAddressState => {
@@ -230,22 +237,24 @@ export class ApplePay extends IonicNativePlugin {
* this.paySheetItems.shippingCost = {
* label: 'Shipping Cost',
* amount: shippingMethod[0].amount
* }
* };
* this.applePay.updateItemsAndShippingMethods(this.paySheetItems, shippingMethods);
* });
*/
@Cordova({
otherPromise: true
})
updateItemsAndShippingMethods(list: IOrderItemsAndShippingMethods): Promise<IUpdateItemsAndShippingStatus> {
updateItemsAndShippingMethods(
list: IOrderItemsAndShippingMethods
): Promise<IUpdateItemsAndShippingStatus> {
return;
}
/**
* Request a payment with Apple Pay
* @return {Promise<IPaymentResponse>} Returns a promise that resolves when something happens
*
* @param order {IOrder}
* @param {IOrder} order
* @return {Promise<IPaymentResponse>} Returns a promise that resolves when something happens
*
* @usage
* try {
@@ -320,17 +329,19 @@ export class ApplePay extends IonicNativePlugin {
/**
* Once the makePaymentRequest has been resolved successfully, the device will be waiting for a completion event.
* This means, that the application must proceed with the token authorisation and return a success, failure,
* This means, that the application must proceed with the token authorization and return a success, failure,
* or other validation error. Once this has been passed back, the Apple Pay sheet will be dismissed via an animation.
* @return {Promise<ICompleteTransaction>} Returns a promise that resolves after confirmation of payment authorization completion
*
* @param complete {ITransactionStatus}
* @param {ITransactionStatus} complete
* @return {Promise<ICompleteTransaction>} Returns a promise that resolves after confirmation of payment authorization completion
*
*/
@Cordova({
otherPromise: true
})
completeLastTransaction(complete: ITransactionStatus): Promise<ICompleteTransaction> {
completeLastTransaction(
complete: ITransactionStatus
): Promise<ICompleteTransaction> {
return;
}
}
+95 -99
View File
@@ -1,6 +1,6 @@
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
import { Observable } from 'rxjs';
import { Injectable } from '@angular/core';
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
/**
* @name Appodeal
@@ -46,8 +46,7 @@ export class Appodeal extends IonicNativePlugin {
* @param {number} adType
*/
@Cordova()
initialize(appKey: string, adType: number): void {
}
initialize(appKey: string, adType: number): void {}
/**
* check if SDK has been initialized
@@ -75,8 +74,7 @@ export class Appodeal extends IonicNativePlugin {
* @returns {Promise<boolean>}
*/
@Cordova()
showWithPlacement(adType: number,
placement: any): Promise<any> {
showWithPlacement(adType: number, placement: any): Promise<any> {
return;
}
@@ -85,15 +83,16 @@ export class Appodeal extends IonicNativePlugin {
* @param {number} adType
*/
@Cordova()
hide(adType: number): void {
}
hide(adType: number): void {}
/**
* confirm use of ads of specified type
* @param {number} adType
* @returns {Promise<any>}
*/
@Cordova()
confirm(adType: number): void {
canShow(adType: number): Promise<any> {
return;
}
/**
@@ -122,79 +121,69 @@ export class Appodeal extends IonicNativePlugin {
* @param autoCache
*/
@Cordova()
setAutoCache(adType: number, autoCache: any): void {
}
setAutoCache(adType: number, autoCache: any): void {}
/**
* forcefully cache an ad by type
* @param {number} adType
*/
@Cordova()
cache(adType: number): void {
}
cache(adType: number): void {}
/**
*
* @param {boolean} set
*/
@Cordova()
setOnLoadedTriggerBoth(set: boolean): void {
}
setTriggerOnLoadedOnPrecache(set: boolean): void {}
/**
* enable or disable Smart Banners
* @param {boolean} enabled
*/
@Cordova()
setSmartBanners(enabled: boolean): void {
}
setSmartBanners(enabled: boolean): void {}
/**
* enable or disable banner backgrounds
* @param {boolean} enabled
*/
@Cordova()
setBannerBackground(enabled: boolean): void {
}
setBannerBackground(enabled: boolean): void {}
/**
* enable or disable banner animations
* @param {boolean} enabled
*/
@Cordova()
setBannerAnimation(enabled: boolean): void {
}
setBannerAnimation(enabled: boolean): void {}
/**
*
* @param value
*/
@Cordova()
set728x90Banners(value: any): void {
}
set728x90Banners(value: any): void {}
/**
* enable or disable logging
* @param {boolean} logging
*/
@Cordova()
setLogging(logging: boolean): void {
}
setLogLevel(logging: boolean): void {}
/**
* enable or disable testing mode
* @param {boolean} testing
*/
@Cordova()
setTesting(testing: boolean): void {
}
setTesting(testing: boolean): void {}
/**
* reset device ID
*/
@Cordova()
resetUUID(): void {
}
resetUUID(): void {}
/**
* get version of Appdeal SDK
@@ -210,8 +199,7 @@ export class Appodeal extends IonicNativePlugin {
* @param {number} adType
*/
@Cordova()
disableNetwork(network?: string, adType?: number): void {
}
disableNetwork(network?: string, adType?: number): void {}
/**
*
@@ -219,62 +207,54 @@ export class Appodeal extends IonicNativePlugin {
* @param {number} adType
*/
@Cordova()
disableNetworkType(network?: string, adType?: number): void {
}
disableNetworkType(network?: string, adType?: number): void {}
/**
* disable Location permissions for Appodeal SDK
*/
@Cordova()
disableLocationPermissionCheck(): void {
}
disableLocationPermissionCheck(): void {}
/**
* disable Storage permissions for Appodeal SDK
*/
@Cordova()
disableWriteExternalStoragePermissionCheck(): void {
}
disableWriteExternalStoragePermissionCheck(): void {}
/**
* enable event listeners
* @param {boolean} enabled
*/
@Cordova()
enableInterstitialCallbacks(enabled: boolean): void {
}
enableInterstitialCallbacks(enabled: boolean): void {}
/**
* enable event listeners
* @param {boolean} enabled
*/
@Cordova()
enableSkippableVideoCallbacks(enabled: boolean): void {
}
enableSkippableVideoCallbacks(enabled: boolean): void {}
/**
* enable event listeners
* @param {boolean} enabled
*/
@Cordova()
enableNonSkippableVideoCallbacks(enabled: boolean): void {
}
enableNonSkippableVideoCallbacks(enabled: boolean): void {}
/**
* enable event listeners
* @param {boolean} enabled
*/
@Cordova()
enableBannerCallbacks(enabled: boolean): void {
}
enableBannerCallbacks(enabled: boolean): void {}
/**
* enable event listeners
* @param {boolean} enabled
*/
@Cordova()
enableRewardedVideoCallbacks(enabled: boolean): void {
}
enableRewardedVideoCallbacks(enabled: boolean): void {}
/**
*
@@ -282,8 +262,7 @@ export class Appodeal extends IonicNativePlugin {
* @param {boolean} value
*/
@Cordova()
setCustomBooleanRule(name: string, value: boolean): void {
}
setCustomBooleanRule(name: string, value: boolean): void {}
/**
*
@@ -291,8 +270,7 @@ export class Appodeal extends IonicNativePlugin {
* @param {number} value
*/
@Cordova()
setCustomIntegerRule(name: string, value: number): void {
}
setCustomIntegerRule(name: string, value: number): void {}
/**
* set rule with float value
@@ -300,8 +278,7 @@ export class Appodeal extends IonicNativePlugin {
* @param {number} value
*/
@Cordova()
setCustomDoubleRule(name: string, value: number): void {
}
setCustomDoubleRule(name: string, value: number): void {}
/**
* set rule with string value
@@ -309,93 +286,82 @@ export class Appodeal extends IonicNativePlugin {
* @param {string} value
*/
@Cordova()
setCustomStringRule(name: string, value: string): void {
}
setCustomStringRule(name: string, value: string): void {}
/**
* set ID preference in Appodeal for current user
* @param id
*/
@Cordova()
setUserId(id: any): void {
}
setUserId(id: any): void {}
/**
* set Email preference in Appodeal for current user
* @param email
*/
@Cordova()
setEmail(email: any): void {
}
setEmail(email: any): void {}
/**
* set Birthday preference in Appodeal for current user
* @param birthday
*/
@Cordova()
setBirthday(birthday: any): void {
}
setBirthday(birthday: any): void {}
/**
* et Age preference in Appodeal for current user
* @param age
*/
@Cordova()
setAge(age: any): void {
}
setAge(age: any): void {}
/**
* set Gender preference in Appodeal for current user
* @param gender
*/
@Cordova()
setGender(gender: any): void {
}
setGender(gender: any): void {}
/**
* set Occupation preference in Appodeal for current user
* @param occupation
*/
@Cordova()
setOccupation(occupation: any): void {
}
setOccupation(occupation: any): void {}
/**
* set Relation preference in Appodeal for current user
* @param relation
*/
@Cordova()
setRelation(relation: any): void {
}
setRelation(relation: any): void {}
/**
* set Smoking preference in Appodeal for current user
* @param smoking
*/
@Cordova()
setSmoking(smoking: any): void {
}
setSmoking(smoking: any): void {}
/**
* set Alcohol preference in Appodeal for current user
* @param alcohol
*/
@Cordova()
setAlcohol(alcohol: any): void {
}
setAlcohol(alcohol: any): void {}
/**
* set Interests preference in Appodeal for current user
* @param interests
*/
@Cordova()
setInterests(interests: any): void {
}
setInterests(interests: any): void {}
@Cordova({
eventObservable: true,
event: 'onInterstitialLoaded',
element: 'document'
element: document
})
onInterstitialLoaded(): Observable<any> {
return;
@@ -404,7 +370,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onInterstitialFailedToLoad',
element: 'document'
element: document
})
onInterstitialFailedToLoad(): Observable<any> {
return;
@@ -413,7 +379,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onInterstitialShown',
element: 'document'
element: document
})
onInterstitialShown(): Observable<any> {
return;
@@ -422,7 +388,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onInterstitialClicked',
element: 'document'
element: document
})
onInterstitialClicked(): Observable<any> {
return;
@@ -431,7 +397,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onInterstitialClosed',
element: 'document'
element: document
})
onInterstitialClosed(): Observable<any> {
return;
@@ -440,7 +406,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onSkippableVideoLoaded',
element: 'document'
element: document
})
onSkippableVideoLoaded(): Observable<any> {
return;
@@ -449,7 +415,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onSkippableVideoFailedToLoad',
element: 'document'
element: document
})
onSkippableVideoFailedToLoad(): Observable<any> {
return;
@@ -458,7 +424,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onSkippableVideoShown',
element: 'document'
element: document
})
onSkippableVideoShown(): Observable<any> {
return;
@@ -467,7 +433,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onSkippableVideoFinished',
element: 'document'
element: document
})
onSkippableVideoFinished(): Observable<any> {
return;
@@ -476,7 +442,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onSkippableVideoClosed',
element: 'document'
element: document
})
onSkippableVideoClosed(): Observable<any> {
return;
@@ -485,7 +451,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onRewardedVideoLoaded',
element: 'document'
element: document
})
onRewardedVideoLoaded(): Observable<any> {
return;
@@ -494,7 +460,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onRewardedVideoFailedToLoad',
element: 'document'
element: document
})
onRewardedVideoFailedToLoad(): Observable<any> {
return;
@@ -503,7 +469,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onRewardedVideoShown',
element: 'document'
element: document
})
onRewardedVideoShown(): Observable<any> {
return;
@@ -512,7 +478,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onRewardedVideoFinished',
element: 'document'
element: document
})
onRewardedVideoFinished(): Observable<any> {
return;
@@ -521,7 +487,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onRewardedVideoClosed',
element: 'document'
element: document
})
onRewardedVideoClosed(): Observable<any> {
return;
@@ -530,7 +496,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onNonSkippableVideoLoaded',
element: 'document'
element: document
})
onNonSkippableVideoLoaded(): Observable<any> {
return;
@@ -539,7 +505,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onNonSkippableVideoFailedToLoad',
element: 'document'
element: document
})
onNonSkippableVideoFailedToLoad(): Observable<any> {
return;
@@ -548,7 +514,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onNonSkippableVideoShown',
element: 'document'
element: document
})
onNonSkippableVideoShown(): Observable<any> {
return;
@@ -557,7 +523,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onNonSkippableVideoFinished',
element: 'document'
element: document
})
onNonSkippableVideoFinished(): Observable<any> {
return;
@@ -566,7 +532,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onNonSkippableVideoClosed',
element: 'document'
element: document
})
onNonSkippableVideoClosed(): Observable<any> {
return;
@@ -575,7 +541,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onBannerClicked',
element: 'document'
element: document
})
onBannerClicked(): Observable<any> {
return;
@@ -584,7 +550,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onBannerFailedToLoad',
element: 'document'
element: document
})
onBannerFailedToLoad(): Observable<any> {
return;
@@ -593,7 +559,7 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onBannerLoaded',
element: 'document'
element: document
})
onBannerLoaded(): Observable<any> {
return;
@@ -602,9 +568,39 @@ export class Appodeal extends IonicNativePlugin {
@Cordova({
eventObservable: true,
event: 'onBannerShown',
element: 'document'
element: document
})
onBannerShown(): Observable<any> {
return;
}
@Cordova()
getRewardParametersForPlacement(placement: string): Promise<any> {
return;
}
@Cordova()
getRewardParameters(): Promise<any> {
return;
}
@Cordova()
canShowWithPlacement(adType: string, placement: string): Promise<any> {
return;
}
@Cordova({
platforms: ['Android']
})
showTestScreen(value: any): void {}
@Cordova()
muteVideosIfCallsMuted(value: any): Promise<any> {
return;
}
@Cordova()
setChildDirectedTreatment(value: boolean): Promise<any> {
return;
}
}
+4 -6
View File
@@ -1,10 +1,10 @@
import { Cordova, IonicNativePlugin, Plugin } from '@ionic-native/core';
import { Plugin, Cordova, IonicNativePlugin } from '@ionic-native/core';
import { Injectable } from '@angular/core';
/**
* @name Autostart
* @description
* This plugin will start automatically your Android app after the every boot or the auto-update of your application.
* This plugin automatically starts your Android app after every boot or auto-update.
* You can enable or disable the autostart function in your app.
*
* @usage
@@ -36,14 +36,12 @@ export class Autostart extends IonicNativePlugin {
* Enable the automatic startup after the boot
*/
@Cordova({ sync: true })
enable(): void {
}
enable(): void { }
/**
* Disable the automatic startup after the boot
*/
@Cordova({ sync: true })
disable(): void {
}
disable(): void { }
}

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