mirror of
https://github.com/danielsogl/awesome-cordova-plugins.git
synced 2026-04-13 00:00:10 +08:00
Compare commits
591 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1536e98ba4 | |||
| baee422090 | |||
| 07de25c90f | |||
| 027b10a6dd | |||
| bb4308e7d8 | |||
| eb31e9b2a1 | |||
| 7af7715f90 | |||
| 934e63d34a | |||
| baff7b3d7c | |||
| acbb3382fe | |||
| 4bb44f1a18 | |||
| edf4c75bbd | |||
| fdffb055be | |||
| d0c680fe3a | |||
| 5cd719d272 | |||
| 9c88cfb577 | |||
| fa047d2171 | |||
| 3154fea2b9 | |||
| 7b069a3e58 | |||
| 602f14771c | |||
| 396bce1710 | |||
| 82d2ae8c4d | |||
| 0c9eb8e1dd | |||
| 3830de5d69 | |||
| ec0e1ff3a1 | |||
| 5d35434866 | |||
| 016f174b53 | |||
| 997f7a03aa | |||
| 5bf1cbeba3 | |||
| 7e174b6e3a | |||
| b52328c07b | |||
| cb0a3664fd | |||
| 5be6a155e6 | |||
| 2e93c50b7d | |||
| f122a14445 | |||
| 53f4ae8e6b | |||
| 073535102b | |||
| 5001b9bd25 | |||
| 3d5b9e71a5 | |||
| fe3e31d580 | |||
| da109514ae | |||
| 566cc08b1e | |||
| 62f658b722 | |||
| 49da235eb3 | |||
| ad8589b5f2 | |||
| 096e284b56 | |||
| d577b6f061 | |||
| cd88c0aa0a | |||
| 648fc7e062 | |||
| 5da4732787 | |||
| 2f2d55f1d5 | |||
| 8cd648db5c | |||
| f3407e5582 | |||
| d845519361 | |||
| 26db2cfcf9 | |||
| d0c0413140 | |||
| 234165c294 | |||
| 9bf4ee3fac | |||
| f8df8769c9 | |||
| 510cea67b7 | |||
| 55d6d11721 | |||
| 97ba9b4fe1 | |||
| 96369db3a9 | |||
| 961cff185d | |||
| 9a733c3b4a | |||
| 95ac7e1855 | |||
| 6683aa450c | |||
| d0cb3049e5 | |||
| 8036d6392d | |||
| 8602fde936 | |||
| 0f8c3ce376 | |||
| 5880491c0e | |||
| 62c7a60aee | |||
| 6fdeeaf6f2 | |||
| 16ff420bfa | |||
| 0009cbf3a0 | |||
| 74971feb98 | |||
| 683b808f27 | |||
| f11be169b0 | |||
| 3a4dc73229 | |||
| b851de9cc8 | |||
| b8c8a1aa8d | |||
| 8f1e729f0e | |||
| b4583271b8 | |||
| 50c03b2a49 | |||
| 27fdce7af2 | |||
| 3500d80b9c | |||
| f599b0418d | |||
| 384dfc263d | |||
| 12280dda2b | |||
| 5d091d21fb | |||
| b83c1bf767 | |||
| 6ebd2703ee | |||
| 3dfea7d02d | |||
| 44b7e301b5 | |||
| 906401b236 | |||
| ffdbab7b26 | |||
| 5144345c9e | |||
| 47f48bae8d | |||
| 754c5ecbcb | |||
| 86097b0ce6 | |||
| d46067764b | |||
| 7f368b61be | |||
| af4d5e8968 | |||
| 0378b1d7fd | |||
| 57e2691889 | |||
| 09a7dcf594 | |||
| fd8107b79a | |||
| 4f86320696 | |||
| 39f1971471 | |||
| 60db10c1d3 | |||
| 2a32624d9d | |||
| 2fba915b88 | |||
| 318ad3f4e0 | |||
| c1748bbc28 | |||
| 06fa7452dd | |||
| 2eea3df2c4 | |||
| 13484f9843 | |||
| 91ee5bde5f | |||
| 21d40888d8 | |||
| f0e219570e | |||
| 104532e1d7 | |||
| 97cf22eedb | |||
| 9c5b593d6b | |||
| 26394865fc | |||
| 07c867d98e | |||
| fc879926b2 | |||
| 281e37ee04 | |||
| 8de37939fb | |||
| 448ec7a72b | |||
| da72500c4b | |||
| 0c466d9739 | |||
| 8e0027b974 | |||
| 234ed6e9e7 | |||
| 4426e59176 | |||
| f22874342a | |||
| 6bcd5d3183 | |||
| 407659a3ef | |||
| 5ef669ae91 | |||
| 4a39ebd873 | |||
| 23b97f6b4a | |||
| 093c8a8231 | |||
| 85a3a40795 | |||
| b4b7cfa473 | |||
| 884ce54181 | |||
| 70847d1b2b | |||
| ff26f2a019 | |||
| f4b8236c8d | |||
| 03ff0a58cf | |||
| c7a888e2de | |||
| 439cceea23 | |||
| 83f57b9820 | |||
| 78fcdc8d80 | |||
| 53f7056b16 | |||
| b7701cdb16 | |||
| 94a4519f2b | |||
| 6fe52b610b | |||
| 434a6c8ad3 | |||
| 97489ba573 | |||
| f525a25b49 | |||
| add49e8b4d | |||
| 4ab87d8abb | |||
| 69ff7afb48 | |||
| 62a30c7d8f | |||
| dc37d8f71c | |||
| 8864d1360a | |||
| 613141998a | |||
| c2fbb4fb64 | |||
| f0cf86076c | |||
| a03afcf0fa | |||
| 3abe0bb97d | |||
| a5b4632ceb | |||
| 1c78f77c0f | |||
| cb7d3ef3e0 | |||
| 5e83a09056 | |||
| b85393de89 | |||
| 68c535fd79 | |||
| 1c09ee1fbc | |||
| 8b921165bb | |||
| 0c837de499 | |||
| a44500d206 | |||
| e063613c8c | |||
| 416071a5a1 | |||
| 93fdb7eabb | |||
| 466437a683 | |||
| a34723b53c | |||
| b9bd5100a2 | |||
| 51bafccf38 | |||
| c3127d35bb | |||
| 1322c1b089 | |||
| 9bf7895386 | |||
| 538dcb98eb | |||
| 3da0efe38e | |||
| b983de2145 | |||
| 9f98f8ef46 | |||
| 3e2964b385 | |||
| 77ab2c21da | |||
| 94025a7fd2 | |||
| 8c021bcaa0 | |||
| da7a3707fa | |||
| cb293639bc | |||
| 16f0712462 | |||
| e9b2b93486 | |||
| a8258ec998 | |||
| 09747cd746 | |||
| 2f89ae0e84 | |||
| ac748abf78 | |||
| 1279114b73 | |||
| 7c30718369 | |||
| 9c75a06131 | |||
| 1e38a6c005 | |||
| 23639ee859 | |||
| be20c51996 | |||
| 1615b74065 | |||
| 5638f90783 | |||
| 47b6164e99 | |||
| 229f5509e9 | |||
| 70c15c31ca | |||
| a98ccc726f | |||
| 538ebfe9fe | |||
| 8e98481609 | |||
| 0ec46b03b5 | |||
| f10f152d2c | |||
| d746a98ef4 | |||
| dbf95ea4bd | |||
| 911537b61b | |||
| db55342329 | |||
| d54ce83c8f | |||
| 2e926f4a94 | |||
| 292a9f08e9 | |||
| b2cd106aae | |||
| ab681cccbe | |||
| 9008aa264b | |||
| 33ca56a151 | |||
| d8892e195b | |||
| 0ab14a085e | |||
| a88cf7034b | |||
| c44071d117 | |||
| fb275e0d9f | |||
| 5c7d7ac527 | |||
| 1134ac96b6 | |||
| e902856089 | |||
| 67adb23a14 | |||
| 028a568515 | |||
| 7a8d30f4e1 | |||
| 9541009742 | |||
| 9dee2fbc0c | |||
| 60b9c69763 | |||
| b98fa28b4b | |||
| 603aa9f6d2 | |||
| f4fa8c31f0 | |||
| 8e787fdd5f | |||
| c5ec7c33b5 | |||
| c6dbf343fb | |||
| fa311e6a7c | |||
| 04347c3df8 | |||
| 8adb36e2a0 | |||
| c700c31127 | |||
| 5981622f3a | |||
| 77d6308bca | |||
| 92e0bb55c3 | |||
| 452aa5d8c9 | |||
| 2ddb8be775 | |||
| ebf07161b6 | |||
| 6ddd2aa184 | |||
| 9974a1fbd8 | |||
| 67edb835f2 | |||
| 5b6cb6e19f | |||
| 9a5a62bc3a | |||
| d192dee1ee | |||
| 0d6997cbdd | |||
| 49325e8b93 | |||
| de07df6f20 | |||
| ca60c5b912 | |||
| 54d1a9891b | |||
| 2c57bc965c | |||
| d62779a2a6 | |||
| 009a20608e | |||
| ca14bf6a75 | |||
| 49fe24dee2 | |||
| d9d89341d2 | |||
| bbf75bcbd7 | |||
| 9441928884 | |||
| 8eb656cce8 | |||
| bf0486cb8b | |||
| e681761f56 | |||
| 84ec3fa8d2 | |||
| c618ceb693 | |||
| 46a9b6d50d | |||
| 44fe04bbbd | |||
| 3385c1b6dc | |||
| a1b0f885a7 | |||
| 56e8eaeb5d | |||
| ba77fd70c3 | |||
| 1841220359 | |||
| c44fb75adc | |||
| ad6badef1f | |||
| 7bcf1bfc74 | |||
| 0c36988544 | |||
| 71e49da8ad | |||
| c28df732d5 | |||
| d5dfdf83f3 | |||
| e42f4d0079 | |||
| cabe327e9b | |||
| 98d22a3079 | |||
| 3fffab6d6c | |||
| 60defd3e50 | |||
| c79ffc4434 | |||
| ec5e27be4b | |||
| cf347cd369 | |||
| 28f316e408 | |||
| 9986e0d0b3 | |||
| 8b809de568 | |||
| fa1f718412 | |||
| 3fabc4d72c | |||
| 3a11d290e5 | |||
| 700fb47b73 | |||
| 61dc8aa18e | |||
| c3f92e92c2 | |||
| 54d2c46742 | |||
| 114a74d3ba | |||
| b2d29dbde5 | |||
| 36bfe38a4c | |||
| d4e2c10006 | |||
| ae6a3cda7a | |||
| d5ac89996f | |||
| a4216fd8ca | |||
| a38adf53c3 | |||
| bd7ebaee3b | |||
| d92fb1da8b | |||
| acb7cd862d | |||
| 1976c38dc7 | |||
| e522a25968 | |||
| ad84e758be | |||
| 427527a129 | |||
| 3ba72e9f15 | |||
| a693740f1a | |||
| 2a98be594a | |||
| 0787f69884 | |||
| dadaf5831e | |||
| 2f9c5e6674 | |||
| d02688971d | |||
| 95ca373e10 | |||
| 4abb6ec78e | |||
| 59a382d6df | |||
| 80d9fe2211 | |||
| 8b48d6c275 | |||
| 585d4ff37b | |||
| 6ba1d4908b | |||
| 3a8e958684 | |||
| 1358411b80 | |||
| e26783b8c6 | |||
| fff1dc45e2 | |||
| 4aec187e8c | |||
| d9188446a0 | |||
| 7ae6e10375 | |||
| ea53a1923a | |||
| f45f34442a | |||
| 49de11e761 | |||
| c29aaca857 | |||
| 9241339b2c | |||
| 9c8b0ceda6 | |||
| 78c226e83d | |||
| ef148d2a68 | |||
| 7fa2f7f364 | |||
| 5ef96d4558 | |||
| e39810b7d0 | |||
| f211da7280 | |||
| c1398eb54b | |||
| 1e1aaad7aa | |||
| 54ef50178b | |||
| 6f7171d26b | |||
| cf75a53438 | |||
| 8ab1d13fb3 | |||
| dd250a6d17 | |||
| 9082c5efbf | |||
| b19f6d1ccd | |||
| abc90f2e6a | |||
| 717c1438c4 | |||
| 67e0713f18 | |||
| 693d344dea | |||
| 914d1442b6 | |||
| c4acbfe095 | |||
| a26b8879f3 | |||
| 2e82320b4c | |||
| e6700a360e | |||
| 3fdc4a8acd | |||
| 82e7bd65a6 | |||
| 9ab73602af | |||
| 9f557bee8a | |||
| 9c8259f659 | |||
| db99482157 | |||
| bb321057d2 | |||
| 853f425383 | |||
| 7cb3bc7542 | |||
| 3da2831779 | |||
| 1072ab115b | |||
| efb2ee7880 | |||
| 5b98a80828 | |||
| 785646800b | |||
| 8d6c2dfb9a | |||
| b7a562053a | |||
| d76ad8803e | |||
| 13216d1f04 | |||
| 00e68ca990 | |||
| c987a06f91 | |||
| 87049e9582 | |||
| bab2971c58 | |||
| fd0ac37ffc | |||
| b64d61828a | |||
| 08d66ead9b | |||
| 9bd8997a31 | |||
| 156328c9de | |||
| 93696d53f7 | |||
| 78b3ec5b1f | |||
| f07431a14c | |||
| 8439faf6b8 | |||
| 51ab03d097 | |||
| abd910de67 | |||
| 24184a5a6a | |||
| 0b39ff8b7d | |||
| 6ad54ecf86 | |||
| 3dd863cb49 | |||
| b719a0372b | |||
| bdef1daba5 | |||
| 695099b2b0 | |||
| 28f4680575 | |||
| 40a7b138e2 | |||
| fa624df1da | |||
| 5577c51dbc | |||
| 1ab76ae693 | |||
| 98bd5cee38 | |||
| f6903cdcdf | |||
| b5cc14c546 | |||
| 8988fad713 | |||
| 7b8b2d7136 | |||
| dd2ccef0c7 | |||
| e46f10878e | |||
| 2dacec0cb5 | |||
| 0c5fadee86 | |||
| 01b30c68e1 | |||
| e5b0365d0c | |||
| 867400d1ac | |||
| 88f6ecf250 | |||
| e6beaa49a4 | |||
| fa03fa544f | |||
| c22747fa2e | |||
| fd8f80e92b | |||
| 17f2fcb829 | |||
| 6a412155a3 | |||
| 489d860264 | |||
| ca43394185 | |||
| b3eed47cbb | |||
| 71916a85dd | |||
| 0669ba5222 | |||
| bec0eac122 | |||
| 00e63d9fc8 | |||
| ac181c5439 | |||
| 8fbf1f2b34 | |||
| 685ac5c7a0 | |||
| 634843e1b2 | |||
| d5310b0f73 | |||
| a72cd59b99 | |||
| 6f4737190b | |||
| c98b4f4c85 | |||
| 8f5532eb74 | |||
| 4340597fc9 | |||
| 7324246e6a | |||
| 55b6ab9c54 | |||
| a5e591cfa6 | |||
| 48e5d46f1e | |||
| 62d8645468 | |||
| 0388ac3f6b | |||
| 24752652b7 | |||
| eb03de96ba | |||
| 0317d4455f | |||
| 757d0961b9 | |||
| 693ba01137 | |||
| fa0175d248 | |||
| 04d01ac1b3 | |||
| 77c7b9d00a | |||
| ee4cfadff1 | |||
| 49d8348db3 | |||
| 6e445b1beb | |||
| 970eb755b6 | |||
| 1a803e70be | |||
| 6982a2d35f | |||
| 0660a3bc67 | |||
| 96776567eb | |||
| d09018d2d4 | |||
| 0649d8ca8c | |||
| 41abaeb7c9 | |||
| 4dc82383a0 | |||
| 799e2f0b2e | |||
| b95f88c165 | |||
| bbda6e22a2 | |||
| 3edfafb6f9 | |||
| 99c1d499f7 | |||
| 37ed9a097a | |||
| db3d5b63c6 | |||
| 6521e1833c | |||
| debe6834ef | |||
| 292c8801ea | |||
| b031ceed99 | |||
| 82d4ec2738 | |||
| 9c55358620 | |||
| 51bc5ef542 | |||
| 74a252b324 | |||
| 43c8592b40 | |||
| babfb0dca3 | |||
| ceb4217415 | |||
| 798625698d | |||
| 5cfb3b033b | |||
| 95d666c348 | |||
| 276d61bf3a | |||
| 397a209ad2 | |||
| d2f42ef33a | |||
| fe46907aaa | |||
| 5c92455ee9 | |||
| 046cbe7fca | |||
| 32f09275aa | |||
| 542ff4cf95 | |||
| 5710eb78a8 | |||
| 842a80d493 | |||
| c2d4f1c0da | |||
| e28e5b0f5f | |||
| bff4862979 | |||
| 6bcef44d42 | |||
| 69c9b6f555 | |||
| 7f38cb5a16 | |||
| cf7abe110d | |||
| 5b060345d2 | |||
| 1784036ef7 | |||
| 7a8577007c | |||
| 7c6e6d8b6b | |||
| c5fd83ddb6 | |||
| 7b2fe69c7c | |||
| f0961c7b23 | |||
| 35c8bbd49e | |||
| 1a343c1ea5 | |||
| 4fef8ff326 | |||
| 13681756ae | |||
| 4a798281e4 | |||
| 79670b7878 | |||
| 720084578d | |||
| 3dd6a92ccf | |||
| 7d1686ef93 | |||
| b40b0fff98 | |||
| 4dba0580ac | |||
| 11653ce752 | |||
| d3e6f3ba41 | |||
| 2c6cc37a5f | |||
| 4c7defb2ec | |||
| 2da02e6d46 | |||
| 7a91c87a72 | |||
| 598f8a9e7c | |||
| 6f0f02bb66 | |||
| e4bde77bd4 | |||
| c24b331866 | |||
| 4ac348bd0f | |||
| f0026572e7 | |||
| e30ccabf7b | |||
| 6b286db51a | |||
| d79d62bfa0 | |||
| 2bdd3a3868 | |||
| 09d481e1d6 | |||
| 6f23bef5d1 | |||
| 84f54d64aa | |||
| c9ddec3bb5 | |||
| f62e1081e1 | |||
| 7dba41cbe1 | |||
| 77b0277290 | |||
| 40325cad9f | |||
| ab5bbae2f6 | |||
| 5da746d2fc | |||
| 72a694a5e1 | |||
| 1ab0d2f915 | |||
| 083118aff4 | |||
| ad373c93ae | |||
| ac301c284f | |||
| 1e0509da98 | |||
| ad3bef2e5a | |||
| bbbbb3e8d0 | |||
| 0bc73e525d | |||
| 7ababc4d67 | |||
| 6ff8f03ef0 | |||
| 010a6ea304 | |||
| 973c80b264 | |||
| b5f9ba588a | |||
| c5724fdc4e | |||
| dde011c8f6 |
@@ -1,18 +1,19 @@
|
|||||||
# Contributing to Ionic Native
|
# Contributing to Ionic Native
|
||||||
|
|
||||||
|
|
||||||
## Feature request?
|
|
||||||
Have a plugin you'd like to see supported? Since Ionic Native is a thin wrapper around existing Cordova plugins, adding support for new plugins is as easy as creating a new wrapper for whatever plugin you'd like to add.
|
|
||||||
|
|
||||||
Take a look at our [Developer Guide](https://github.com/driftyco/ionic-native/blob/master/DEVELOPER.md) for more info on adding new plugins.
|
|
||||||
|
|
||||||
## Have an issue?
|
## Have an issue?
|
||||||
#### There are no rules, but here are a few things to consider:
|
#### There are no rules, but here are a few things to consider:
|
||||||
###### Before you submit an issue:
|
###### Before you submit an issue:
|
||||||
* Do a quick search to see if there are similar issues
|
* Do a quick search to see if there are similar issues
|
||||||
* **Check that you are using the latest version of** `ionic-native`
|
* Make sure that you are waiting for `deviceready` to fire before interacting with any plugin. If you are using Ionic 2, this can be done using [the `Platform.ready()` function](http://ionicframework.com/docs/v2/api/platform/Platform/#ready).
|
||||||
|
* **Check that you are using the latest version of** `ionic-native`, you can install the latest version by running `npm i --save ionic-native@latest`
|
||||||
|
|
||||||
###### Still having problems? submit an issue with the following details:
|
###### Still having problems? submit an issue with the following details:
|
||||||
* Short description of the issue
|
* Short description of the issue
|
||||||
* Steps to reproduce
|
* Steps to reproduce
|
||||||
* Stack trace (if available)
|
* Stack trace (if available)
|
||||||
|
|
||||||
|
|
||||||
|
## Feature request?
|
||||||
|
Have a plugin you'd like to see supported? Since Ionic Native is a thin wrapper around existing Cordova plugins, adding support for new plugins is as easy as creating a new wrapper for whatever plugin you'd like to add.
|
||||||
|
|
||||||
|
Take a look at our [Developer Guide](https://github.com/driftyco/ionic-native/blob/master/DEVELOPER.md) for more info on adding new plugins.
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
node_modules/
|
node_modules/
|
||||||
.idea
|
.idea
|
||||||
|
.tmp
|
||||||
|
aot/
|
||||||
dist/
|
dist/
|
||||||
scripts/ionic-native-bower
|
scripts/ionic-native-bower
|
||||||
|
|||||||
+779
-92
File diff suppressed because it is too large
Load Diff
+11
-57
@@ -12,6 +12,9 @@ First, let's start by creating a new plugin wrapper from template.
|
|||||||
// Make sure to capitalize the first letter, or use CamelCase if necessary.
|
// Make sure to capitalize the first letter, or use CamelCase if necessary.
|
||||||
|
|
||||||
gulp plugin:create -n PluginName
|
gulp plugin:create -n PluginName
|
||||||
|
|
||||||
|
// add -m flag to get a minimal template to start with
|
||||||
|
gulp plugin:create -m -n PluginName
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@@ -22,17 +25,18 @@ Let's take a look at the existing plugin wrapper for Geolocation to see what goe
|
|||||||
plugin: 'cordova-plugin-geolocation',
|
plugin: 'cordova-plugin-geolocation',
|
||||||
pluginRef: 'navigator.geolocation'
|
pluginRef: 'navigator.geolocation'
|
||||||
})
|
})
|
||||||
|
@Injectable()
|
||||||
export class Geolocation {
|
export class Geolocation {
|
||||||
|
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static getCurrentPosition(options?: GeolocationOptions): Promise<Geoposition> { return }
|
getCurrentPosition(options?: GeolocationOptions): Promise<Geoposition> { return; }
|
||||||
|
|
||||||
@Cordova({
|
@Cordova({
|
||||||
callbackOrder: 'reverse',
|
callbackOrder: 'reverse',
|
||||||
observable: true,
|
observable: true,
|
||||||
clearFunction: 'clearWatch'
|
clearFunction: 'clearWatch'
|
||||||
})
|
})
|
||||||
static watchPosition(options?: GeolocationOptions): Observable<Geoposition> { return }
|
watchPosition(options?: GeolocationOptions): Observable<Geoposition> { return; }
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -41,6 +45,7 @@ export class Geolocation {
|
|||||||
First and foremost, we want to create a class representing our plugin, in this case Geolocation.
|
First and foremost, we want to create a class representing our plugin, in this case Geolocation.
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@Injectable()
|
||||||
class Geolocation {
|
class Geolocation {
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -57,6 +62,7 @@ For example, the `@Plugin` decorator adds information about the plugin to our Ge
|
|||||||
plugin: 'cordova-plugin-geolocation',
|
plugin: 'cordova-plugin-geolocation',
|
||||||
pluginRef: 'navigator.geolocation'
|
pluginRef: 'navigator.geolocation'
|
||||||
})
|
})
|
||||||
|
@Injectable()
|
||||||
export class Geolocation {
|
export class Geolocation {
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -74,7 +80,7 @@ Let's take a look at `getCurrentPosition` first.
|
|||||||
|
|
||||||
```
|
```
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static getCurrentPosition(options?: GeolocationOptions): Promise<Geoposition> { return }
|
getCurrentPosition(options?: GeolocationOptions): Promise<Geoposition> { return }
|
||||||
```
|
```
|
||||||
|
|
||||||
It's just a stub. The `return` is only there to keep the TypeScript type-checker from complaining since we indicate that `getCurrentPosition` returns a `Promise<Geoposition>`.
|
It's just a stub. The `return` is only there to keep the TypeScript type-checker from complaining since we indicate that `getCurrentPosition` returns a `Promise<Geoposition>`.
|
||||||
@@ -91,7 +97,7 @@ Next, let's look at the `watchPosition` method.
|
|||||||
observable: true,
|
observable: true,
|
||||||
clearFunction: 'clearWatch'
|
clearFunction: 'clearWatch'
|
||||||
})
|
})
|
||||||
static watchPosition(options?: GeolocationOptions): Observable<Geoposition> { return }
|
watchPosition(options?: GeolocationOptions): Observable<Geoposition> { return }
|
||||||
```
|
```
|
||||||
|
|
||||||
The `@Cordova` decorator has a few more options now.
|
The `@Cordova` decorator has a few more options now.
|
||||||
@@ -102,58 +108,6 @@ The `@Cordova` decorator has a few more options now.
|
|||||||
|
|
||||||
`clearFunction` is used in conjunction with the `observable` option and indicates the function to be called when the Observable is disposed.
|
`clearFunction` is used in conjunction with the `observable` option and indicates the function to be called when the Observable is disposed.
|
||||||
|
|
||||||
### Updating index.ts
|
|
||||||
|
|
||||||
For new plugins, you will need to update `/src/index.ts` to properly export your plugin and make it available for use.
|
|
||||||
|
|
||||||
1. Import the plugin class into `index.ts`:
|
|
||||||
|
|
||||||
`import {PluginClassName} from ./plugins/filenameForPlugin`
|
|
||||||
|
|
||||||
No need to put the `.ts` extension on the filename.
|
|
||||||
|
|
||||||
2. Add the plugin class name to the list in the `export` object:
|
|
||||||
|
|
||||||
```
|
|
||||||
export {
|
|
||||||
ActionSheet,
|
|
||||||
AdMob,
|
|
||||||
AndroidFingerprintAuth,
|
|
||||||
YourPluginClassName,
|
|
||||||
...
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Add the plugin class name to the `window['IonicNative']` object:
|
|
||||||
|
|
||||||
```
|
|
||||||
window['IonicNative'] = {
|
|
||||||
ActionSheet: ActionSheet,
|
|
||||||
AdMob: AdMob,
|
|
||||||
AndroidFingerprintAuth: AndroidFingerprintAuth,
|
|
||||||
YourPluginClassName: YourPluginClassName,
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
4. If your plugin exports any other objects outside of the plugin class, add an export statement for the file:
|
|
||||||
|
|
||||||
`export * from './plugins/filenameForPlugin';`
|
|
||||||
|
|
||||||
No need to put the `.ts` extension on the filename.
|
|
||||||
|
|
||||||
For example, `googlemaps.ts` exports a const outside of the plugin's main `GoogleMap` class:
|
|
||||||
|
|
||||||
```
|
|
||||||
export const GoogleMapsAnimation = {
|
|
||||||
BOUNCE: 'BOUNCE',
|
|
||||||
DROP: 'DROP'
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
To properly export `GoogleMapsAnimation`, `index.ts` is updated with:
|
|
||||||
|
|
||||||
`export * from './plugins/googlemaps';`
|
|
||||||
|
|
||||||
### Testing your changes
|
### Testing your changes
|
||||||
|
|
||||||
You need to run `npm run build` in the `ionic-native` project, this will create a `dist` directory. Then, you must go to your ionic application folder and replace your current `node_modules/ionic-native/dist/` with the newly generated one.
|
You need to run `npm run build` in the `ionic-native` project, this will create a `dist` directory. Then, you must go to your ionic application folder and replace your current `node_modules/ionic-native/dist/` with the newly generated one.
|
||||||
@@ -164,7 +118,7 @@ You need to run `npm run lint` to analyze the code and ensure it's consistency w
|
|||||||
|
|
||||||
### 'Wrapping' Up
|
### 'Wrapping' Up
|
||||||
|
|
||||||
That's it! The only thing left to do is rigorously document the plugin and it's usage. Take a look at some of the other plugins for good documentation styles.
|
That's it! The only thing left to do is rigorously document the plugin and it's usage. Take a look at some of the other plugins for good documentation styles.
|
||||||
|
|
||||||
## Commit Message Format
|
## Commit Message Format
|
||||||
|
|
||||||
|
|||||||
@@ -1,95 +1,186 @@
|
|||||||
[](https://circleci.com/gh/driftyco/ionic-native) [](http://commitizen.github.io/cz-cli/)
|
[](https://circleci.com/gh/driftyco/ionic-native) [](http://commitizen.github.io/cz-cli/) 
|
||||||
[](https://www.npmjs.com/package/ionic-native)
|
|
||||||
|
|
||||||
[](https://nodei.co/npm/ionic-native/)
|
|
||||||
[](https://nodei.co/npm/ionic-native/)
|
|
||||||
|
|
||||||
# Ionic Native
|
# Ionic Native
|
||||||
|
|
||||||
Ionic Native is a curated set of wrappers for Cordova plugins that make adding any native functionality you need to your [Ionic](http://ionicframework.com/), Cordova, or Web View mobile app easy.
|
Ionic Native is a curated set of wrappers for Cordova plugins that make adding any native functionality you need to your [Ionic 2](http://ionicframework.com/) mobile app easy.
|
||||||
|
|
||||||
### Documentation
|
Ionic Native wraps plugin callbacks in a Promise or Observable, providing a common interface for all plugins and making it easy to use plugins with Angular change detection.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Run following command to install Ionic Native in your project.
|
||||||
|
```
|
||||||
|
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](http://ionicframework.com/docs/v2/native/) for complete instructions on how to add and use the plugins.
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
For the full Ionic Native documentation, please visit [http://ionicframework.com/docs/v2/native/](http://ionicframework.com/docs/v2/native/).
|
For the full Ionic Native documentation, please visit [http://ionicframework.com/docs/v2/native/](http://ionicframework.com/docs/v2/native/).
|
||||||
|
|
||||||
### Promises and Observables
|
### Basic Usage
|
||||||
|
|
||||||
Ionic Native wraps plugin callbacks in a Promise or [Observable](https://gist.github.com/staltz/868e7e9bc2a7b8c1f754), providing a common interface for all plugins and ensuring that native events trigger change detection in Angular 2.
|
To use a plugin, import and add the plugin provider to your `@NgModule`, and then inject it where you wish to use it.
|
||||||
|
|
||||||
```
|
```typescript
|
||||||
import { Geolocation } from 'ionic-native';
|
// app.module.ts
|
||||||
|
import { Camera } from '@ionic-native/camera';
|
||||||
|
|
||||||
Geolocation.getCurrentPosition().then(pos => {
|
...
|
||||||
console.log('lat: ' + pos.coords.latitude + ', lon: ' + pos.coords.longitude);
|
|
||||||
});
|
|
||||||
|
|
||||||
let watch = Geolocation.watchPosition().subscribe(pos => {
|
@NgModule({
|
||||||
console.log('lat: ' + pos.coords.latitude + ', lon: ' + pos.coords.longitude);
|
...
|
||||||
});
|
|
||||||
|
|
||||||
// to stop watching
|
providers: [
|
||||||
watch.unsubscribe();
|
...
|
||||||
|
Camera
|
||||||
|
...
|
||||||
|
]
|
||||||
|
...
|
||||||
|
})
|
||||||
|
export class AppModule { }
|
||||||
```
|
```
|
||||||
|
|
||||||
### Angular 1
|
```typescript
|
||||||
|
import { Geolocation } from '@ionic-native/geolocation';
|
||||||
|
import { Platform } from 'ionic-angular';
|
||||||
|
|
||||||
Ionic Native works as a stand-in for [ngCordova](http://ngcordova.com/). In many cases, the usage is identical, but we import `ionic.native` instead of `ngCordova` as our module.
|
import { NgZone } from '@angular/core';
|
||||||
|
|
||||||
As a rule of thumb: take the ES6 class name of the plugin and add `$cordova` to get the service name. For example, `Geolocation` would be `$cordovaGeolocation`, and `Camera` will be `$cordovaCamera`:
|
@Component({ ... })
|
||||||
|
export class MyComponent {
|
||||||
|
|
||||||
```javascript
|
constructor(private geolocation: Geolocation, private platform: Platform, private ngZone: NgZone) {
|
||||||
angular.module('myApp', ['ionic', 'ionic.native'])
|
|
||||||
|
|
||||||
.controller('MyCtrl', function($scope, $cordovaCamera) {
|
platform.ready().then(() => {
|
||||||
$scope.takePicture = function() {
|
|
||||||
$cordovaCamera.getPicture(opts).then(function(p) {
|
|
||||||
}, function(err) {
|
|
||||||
});
|
|
||||||
};
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
For services that return observables, the Angular 1 digest cycle must be done manually (currently):
|
// get position
|
||||||
|
geolocation.getCurrentPosition().then(pos => {
|
||||||
|
|
||||||
```javascript
|
console.log(`lat: ${pos.coords.latitude}, lon: ${pos.coords.longitude}`)
|
||||||
angular.module('myApp', ['ionic', 'ionic.native'])
|
|
||||||
|
|
||||||
.controller('MyCtrl', function($scope, $cordovaGeolocation) {
|
|
||||||
$scope.takePicture = function() {
|
|
||||||
$cordovaGeolocation.watchPosition(opts).subscribe(function(p) {
|
|
||||||
$scope.$apply(function() {
|
|
||||||
$scope.position = p.coords;
|
|
||||||
});
|
});
|
||||||
}, function(err) {
|
|
||||||
|
|
||||||
|
// watch position
|
||||||
|
const watch = geolocation.watchPosition().subscribe(pos => {
|
||||||
|
|
||||||
|
console.log(`lat: ${pos.coords.latitude}, lon: ${pos.coords.longitude}`)
|
||||||
|
|
||||||
|
// Currently, observables from Ionic Native plugins
|
||||||
|
// need to run inside of zone to trigger change detection
|
||||||
|
ngZone.run(() => {
|
||||||
|
this.position = pos;
|
||||||
|
})
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// to stop watching
|
||||||
|
watch.unsubscribe();
|
||||||
|
|
||||||
});
|
});
|
||||||
};
|
|
||||||
});
|
}
|
||||||
|
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Mocking and Browser Development
|
||||||
|
|
||||||
|
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:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
import { Camera } from '@ionic-native/camera';
|
||||||
|
```
|
||||||
|
|
||||||
|
Then create a new class that extends the `Camera` class with a mock implementation:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
class CameraMock extends Camera {
|
||||||
|
getPicture(options) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
resolve("BASE_64_ENCODED_DATA_GOES_HERE");
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Finally, override the previous `Camera` class in your `providers` for this module:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
providers: [
|
||||||
|
{ provide: Camera, useClass: CameraMock }
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
Here's the full example:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
import { NgModule, ErrorHandler } from '@angular/core';
|
||||||
|
import { IonicApp, IonicModule, IonicErrorHandler } from 'ionic-angular';
|
||||||
|
import { MyApp } from './app.component';
|
||||||
|
import { HomePage } from '../pages/home/home';
|
||||||
|
|
||||||
|
import { Camera } from '@ionic-native/camera';
|
||||||
|
|
||||||
|
class CameraMock extends Camera {
|
||||||
|
getPicture(options) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
resolve("BASE_64_ENCODED_DATA_GOES_HERE");
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
declarations: [
|
||||||
|
MyApp,
|
||||||
|
HomePage
|
||||||
|
],
|
||||||
|
imports: [
|
||||||
|
IonicModule.forRoot(MyApp)
|
||||||
|
],
|
||||||
|
bootstrap: [IonicApp],
|
||||||
|
entryComponents: [
|
||||||
|
MyApp,
|
||||||
|
HomePage
|
||||||
|
],
|
||||||
|
providers: [
|
||||||
|
{provide: ErrorHandler, useClass: IonicErrorHandler},
|
||||||
|
{ provide: Camera, useClass: CameraMock }
|
||||||
|
]
|
||||||
|
})
|
||||||
|
export class AppModule {}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
### Runtime Diagnostics
|
### Runtime Diagnostics
|
||||||
|
|
||||||
Spent way too long diagnosing an issue only to realize a plugin wasn't firing or installed? Ionic Native lets you know what the issue is and how you can resolve it.
|
Spent way too long diagnosing an issue only to realize a plugin wasn't firing or installed? Ionic Native lets you know what the issue is and how you can resolve it.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
Run following commmand to install ionic-native in your project.
|
|
||||||
```
|
|
||||||
npm install ionic-native --save
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## Plugin Missing?
|
## Plugin Missing?
|
||||||
Let us know or submit a PR! Take a look at [the Developer Guide](https://github.com/driftyco/ionic-native/blob/master/DEVELOPER.md) for more on how to contribute. :heart:
|
Let us know or submit a PR! Take a look at [the Developer Guide](https://github.com/driftyco/ionic-native/blob/master/DEVELOPER.md) for more on how to contribute. :heart:
|
||||||
|
|
||||||
|
## Ionic 1/Angular 1 support
|
||||||
|
|
||||||
|
Ionic Native 3.x supports Ionic 2.x and above. For Ionic/Angular 1 support, please use version 2 of Ionic Native. See the [2.x README](https://github.com/driftyco/ionic-native/blob/8cd648db5cddd7bdbe2bd78839b19c620cc8c04c/README.md) for usage information.
|
||||||
|
|
||||||
# Credits
|
# Credits
|
||||||
|
|
||||||
Ibrahim Hadeed - [@ihadeed](http://github.com/ihadeed)
|
Ibby Hadeed - [@ihadeed](http://github.com/ihadeed)
|
||||||
|
|
||||||
Tim Lancina - [@timlancina](http://twitter.com/timlancina)
|
Tim Lancina - [@timlancina](http://twitter.com/timlancina)
|
||||||
|
|
||||||
|
Mike Hartington - [@mhartington](https://twitter.com/mhartington)
|
||||||
|
|
||||||
Max Lynch - [@maxlynch](http://twitter.com/maxlynch)
|
Max Lynch - [@maxlynch](http://twitter.com/maxlynch)
|
||||||
|
|
||||||
Rob Wormald - [@robwormald](https://twitter.com/robwormald)
|
Rob Wormald - [@robwormald](https://twitter.com/robwormald)
|
||||||
|
|||||||
+2
-3
@@ -1,6 +1,6 @@
|
|||||||
machine:
|
machine:
|
||||||
node:
|
node:
|
||||||
version: 4.1.0
|
version: 5.5.0
|
||||||
ruby:
|
ruby:
|
||||||
version: 2.1.2
|
version: 2.1.2
|
||||||
|
|
||||||
@@ -17,8 +17,7 @@ dependencies:
|
|||||||
|
|
||||||
test:
|
test:
|
||||||
override:
|
override:
|
||||||
- npm test
|
- echo "No tests to run"
|
||||||
- npm run build
|
|
||||||
|
|
||||||
deployment:
|
deployment:
|
||||||
staging:
|
staging:
|
||||||
|
|||||||
+20
-17
@@ -1,8 +1,7 @@
|
|||||||
var gulp = require('gulp');
|
var gulp = require('gulp');
|
||||||
var minimist = require('minimist');
|
var minimist = require('minimist');
|
||||||
var uglify = require('gulp-uglify');
|
|
||||||
var rename = require("gulp-rename");
|
var rename = require("gulp-rename");
|
||||||
var tslint = require('ionic-gulp-tslint');
|
var tslint = require('gulp-tslint');
|
||||||
var decamelize = require('decamelize');
|
var decamelize = require('decamelize');
|
||||||
var replace = require('gulp-replace');
|
var replace = require('gulp-replace');
|
||||||
|
|
||||||
@@ -17,28 +16,32 @@ var flags = minimist(process.argv.slice(2), flagConfig);
|
|||||||
/* Docs tasks */
|
/* Docs tasks */
|
||||||
require('./scripts/docs/gulp-tasks')(gulp, flags);
|
require('./scripts/docs/gulp-tasks')(gulp, flags);
|
||||||
|
|
||||||
|
|
||||||
gulp.task("minify:dist", function(){
|
|
||||||
gulp.src('./dist/ionic.native.js')
|
|
||||||
.pipe(uglify())
|
|
||||||
.pipe(rename({
|
|
||||||
suffix: '.min'
|
|
||||||
}))
|
|
||||||
.pipe(gulp.dest('./dist'));
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('lint', function() {
|
gulp.task('lint', function() {
|
||||||
tslint({src: 'src/**/*.ts'});
|
gulp.src('src/**/*.ts')
|
||||||
|
.pipe(tslint({
|
||||||
|
formatter: "verbose",
|
||||||
|
configuration: 'tslint.json'
|
||||||
|
}))
|
||||||
|
.pipe(tslint.report())
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('plugin:create', function(){
|
gulp.task('plugin:create', function(){
|
||||||
if(flags.n && flags.n !== ''){
|
if(flags.n && flags.n !== ''){
|
||||||
var src = flags.m?'./scripts/templates/wrap-min.tmpl':'./scripts/templates/wrap.tmpl';
|
|
||||||
|
const src = flags.m?'./scripts/templates/wrap-min.tmpl':'./scripts/templates/wrap.tmpl',
|
||||||
|
pluginName = flags.n,
|
||||||
|
pluginPackageName = decamelize(pluginName, '-'),
|
||||||
|
pluginNameSpaced = pluginName.replace(/(?!^)([A-Z])/g, ' $1');
|
||||||
|
|
||||||
return gulp.src(src)
|
return gulp.src(src)
|
||||||
.pipe(replace('PluginName', flags.n))
|
.pipe(replace('PluginName', pluginName))
|
||||||
.pipe(rename(decamelize(flags.n, '-') + '.ts'))
|
.pipe(replace('Plugin Name', pluginNameSpaced))
|
||||||
.pipe(gulp.dest('./src/plugins/'));
|
.pipe(rename('index.ts'))
|
||||||
|
.pipe(gulp.dest('./src/@ionic-native/plugins/' + pluginPackageName));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
console.log("Usage is: gulp plugin:create -n PluginName");
|
console.log("Usage is: gulp plugin:create -n PluginName");
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,60 +0,0 @@
|
|||||||
const WATCH = process.argv.indexOf('--watch') > -1;
|
|
||||||
|
|
||||||
module.exports = config => {
|
|
||||||
config.set({
|
|
||||||
|
|
||||||
// base path that will be used to resolve all patterns (eg. files, exclude)
|
|
||||||
basePath: './',
|
|
||||||
|
|
||||||
// frameworks to use
|
|
||||||
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
|
|
||||||
frameworks: ['jasmine', 'browserify'],
|
|
||||||
|
|
||||||
// list of files / patterns to load in the browser
|
|
||||||
files: [
|
|
||||||
'test/**/*.spec.ts'
|
|
||||||
],
|
|
||||||
|
|
||||||
// preprocess matching files before serving them to the browser
|
|
||||||
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
|
|
||||||
preprocessors: {
|
|
||||||
'test/**/*.spec.ts': ['browserify']
|
|
||||||
},
|
|
||||||
|
|
||||||
browserify: {
|
|
||||||
plugin: [ 'tsify' ],
|
|
||||||
extensions: ['.js', '.ts']
|
|
||||||
},
|
|
||||||
|
|
||||||
phantomjsLauncher: {
|
|
||||||
// Have phantomjs exit if a ResourceError is encountered (useful if karma exits without killing phantom)
|
|
||||||
exitOnResourceError: true
|
|
||||||
},
|
|
||||||
|
|
||||||
// test results reporter to use
|
|
||||||
// possible values: 'dots', 'progress'
|
|
||||||
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
|
|
||||||
reporters: ['dots'],
|
|
||||||
|
|
||||||
// web server port
|
|
||||||
port: 9876,
|
|
||||||
|
|
||||||
// enable / disable colors in the output (reporters and logs)
|
|
||||||
colors: true,
|
|
||||||
|
|
||||||
// level of logging
|
|
||||||
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
|
|
||||||
logLevel: config.LOG_INFO,
|
|
||||||
|
|
||||||
// enable / disable watching file and executing tests whenever any file changes
|
|
||||||
autoWatch: WATCH,
|
|
||||||
|
|
||||||
// start these browsers
|
|
||||||
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
|
|
||||||
browsers: ['PhantomJS'],
|
|
||||||
|
|
||||||
// Continuous Integration mode
|
|
||||||
// if true, Karma captures browsers, runs the tests and exits
|
|
||||||
singleRun: !WATCH
|
|
||||||
});
|
|
||||||
};
|
|
||||||
+35
-59
@@ -1,74 +1,50 @@
|
|||||||
{
|
{
|
||||||
"name": "ionic-native",
|
"name": "ionic-native",
|
||||||
"version": "2.1.0",
|
"version": "3.2.2",
|
||||||
"description": "Native plugin wrappers for Cordova and Ionic with TypeScript, ES6+, Promise and Observable support",
|
"description": "Native plugin wrappers for Cordova and Ionic with TypeScript, ES6+, Promise and Observable support",
|
||||||
"main": "dist/es5/index.js",
|
"license": "MIT",
|
||||||
"typings": "dist/es5/index.d.ts",
|
|
||||||
"module": "dist/esm/index.js",
|
|
||||||
"files": [
|
|
||||||
"dist"
|
|
||||||
],
|
|
||||||
"dependencies": {
|
|
||||||
"rxjs": "^5.0.0-beta.6"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"browserify": "^13.0.1",
|
"@angular/compiler": "2.4.8",
|
||||||
|
"@angular/compiler-cli": "2.4.8",
|
||||||
|
"@angular/core": "2.4.8",
|
||||||
"canonical-path": "0.0.2",
|
"canonical-path": "0.0.2",
|
||||||
"conventional-changelog-cli": "^1.2.0",
|
"child-process-promise": "2.2.0",
|
||||||
"conventional-github-releaser": "^1.1.3",
|
"conventional-changelog-cli": "1.2.0",
|
||||||
"cpr": "^1.0.0",
|
"cpr": "2.0.2",
|
||||||
"cz-conventional-changelog": "^1.1.6",
|
"cz-conventional-changelog": "1.2.0",
|
||||||
"decamelize": "^1.2.0",
|
"decamelize": "1.2.0",
|
||||||
"dgeni": "^0.4.2",
|
"dgeni": "0.4.7",
|
||||||
"dgeni-packages": "^0.10.18",
|
"dgeni-packages": "0.16.10",
|
||||||
"es6-shim": "~0.35.1",
|
"fs-extra": "2.0.0",
|
||||||
"glob": "^6.0.4",
|
"fs-extra-promise": "0.4.1",
|
||||||
"gulp": "^3.9.1",
|
"gulp": "3.9.1",
|
||||||
"gulp-rename": "^1.2.2",
|
"gulp-rename": "1.2.2",
|
||||||
"gulp-replace": "^0.5.4",
|
"gulp-replace": "0.5.4",
|
||||||
"gulp-tslint": "^5.0.0",
|
"gulp-tslint": "6.1.2",
|
||||||
"gulp-uglify": "^1.5.4",
|
"lodash": "4.17.4",
|
||||||
"ionic-gulp-tslint": "^1.0.0",
|
"minimist": "1.1.3",
|
||||||
"jasmine-core": "~2.5.0",
|
|
||||||
"karma": "~1.2.0",
|
|
||||||
"karma-browserify": "~5.1.0",
|
|
||||||
"karma-jasmine": "~1.0.2",
|
|
||||||
"karma-phantomjs-launcher": "~1.0.2",
|
|
||||||
"lodash": "3.10.1",
|
|
||||||
"minimist": "^1.1.3",
|
|
||||||
"mkdirp": "^0.5.1",
|
|
||||||
"node-html-encoder": "0.0.2",
|
"node-html-encoder": "0.0.2",
|
||||||
"q": "1.4.1",
|
"q": "1.4.1",
|
||||||
"semver": "^5.0.1",
|
"queue": "4.2.1",
|
||||||
"tsify": "~1.0.4",
|
"rimraf": "2.5.4",
|
||||||
"tslint": "^3.8.1",
|
"rxjs": "5.0.1",
|
||||||
"tslint-ionic-rules": "0.0.5",
|
"semver": "5.3.0",
|
||||||
"typescript": "^2.0.1",
|
"tslint": "3.15.1",
|
||||||
"watchify": "~3.7.0"
|
"tslint-ionic-rules": "0.0.7",
|
||||||
|
"typescript": "2.0.09",
|
||||||
|
"zone.js": "0.7.2"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "karma start",
|
|
||||||
"test:watch": "npm test -- --watch",
|
|
||||||
"start": "npm run test:watch",
|
"start": "npm run test:watch",
|
||||||
"lint": "gulp lint",
|
"lint": "gulp lint",
|
||||||
"watch": "tsc -w",
|
"build": "npm run clean && npm run lint && npm run build:core && npm run build:modules",
|
||||||
"build": "npm run lint && npm run build:js && npm run build:bundle && npm run build:minify",
|
"build:core": "ngc -p scripts/build/tsconfig-core.json",
|
||||||
"build:js": "tsc",
|
"build:modules": "node scripts/build/build.js",
|
||||||
"build:bundle": "browserify dist/index.js > dist/ionic.native.js",
|
"clean": "rimraf dist .tmp",
|
||||||
"build:minify": "gulp minify:dist",
|
"shipit": "npm run build && gulp readmes && npm run npmpub",
|
||||||
"shipit": "npm run build && npm publish && bash ./scripts/bower.sh",
|
"npmpub": "node scripts/build/publish.js",
|
||||||
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0",
|
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0"
|
||||||
"plugin:create": "gulp plugin:create"
|
|
||||||
},
|
},
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/driftyco/ionic-native.git"
|
|
||||||
},
|
|
||||||
"license": "MIT",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/driftyco/ionic-native/issues"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/driftyco/ionic-native",
|
|
||||||
"config": {
|
"config": {
|
||||||
"commitizen": {
|
"commitizen": {
|
||||||
"path": "./node_modules/cz-conventional-changelog"
|
"path": "./node_modules/cz-conventional-changelog"
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "ionic-native",
|
|
||||||
"description": "Native plugin wrappers for Cordova and Ionic with TypeScript, ES6+, Promise and Observable support",
|
|
||||||
"main": [
|
|
||||||
"ionic.native.js"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
"Max Lynch <max@ionic.io>"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"keywords": [
|
|
||||||
"ionic",
|
|
||||||
"native",
|
|
||||||
"html5",
|
|
||||||
"hybrid",
|
|
||||||
"mobile"
|
|
||||||
],
|
|
||||||
"homepage": "https://github.com/driftyco/ionic-native-bower",
|
|
||||||
"ignore": [
|
|
||||||
"**/.*",
|
|
||||||
"node_modules",
|
|
||||||
"bower_components",
|
|
||||||
"test",
|
|
||||||
"tests"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
|
|
||||||
# readJsonProp(jsonFile, property)
|
|
||||||
# - restriction: property needs to be on an own line!
|
|
||||||
function readJsonProp {
|
|
||||||
echo $(sed -En 's/.*"'$2'"[ ]*:[ ]*"(.*)".*/\1/p' $1)
|
|
||||||
}
|
|
||||||
|
|
||||||
VERSION=$(readJsonProp "package.json" "version")
|
|
||||||
|
|
||||||
echo "BOWERING IONIC-NATIVE VERSION $VERSION. FOR GREAT JUSTICE..."
|
|
||||||
|
|
||||||
DIR="scripts/ionic-native-bower"
|
|
||||||
rm -rf $DIR
|
|
||||||
mkdir $DIR
|
|
||||||
cp dist/ionic.native.js dist/ionic.native.min.js $DIR
|
|
||||||
cd $DIR
|
|
||||||
git init
|
|
||||||
git remote add origin git@github.com:driftyco/ionic-native-bower.git
|
|
||||||
cp ../bower.json .
|
|
||||||
git add .
|
|
||||||
git commit -m "Bower release"
|
|
||||||
git tag -f -m v$VERSION v$VERSION
|
|
||||||
git push -f --tags origin master
|
|
||||||
|
|
||||||
echo "BOWERING COMPLETED SOMEWHAT SUCCESSFULLY"
|
|
||||||
@@ -0,0 +1,129 @@
|
|||||||
|
"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 = '^3.1.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);
|
||||||
|
|
||||||
|
|
||||||
|
// 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) {
|
||||||
|
// oops! something went wrong.
|
||||||
|
callback(`\n\nBuilding ${pluginName} failed.`);
|
||||||
|
console.log(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// we're done with this plugin!
|
||||||
|
callback();
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
})
|
||||||
|
.catch(callback);
|
||||||
|
|
||||||
|
}); // QUEUE.push end
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
PLUGINS.forEach(addPluginToQueue);
|
||||||
|
|
||||||
|
QUEUE.start((err) => {
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
console.log('Error building plugins. ', err);
|
||||||
|
} else {
|
||||||
|
console.log('Done processing plugins!');
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "@ionic-native/core",
|
||||||
|
"version": "{{VERSION}}",
|
||||||
|
"description": "Ionic Native - Native plugins for ionic apps",
|
||||||
|
"module": "index.js",
|
||||||
|
"typings": "index.d.ts",
|
||||||
|
"author": "ionic",
|
||||||
|
"license": "MIT",
|
||||||
|
"peerDependencies": {},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/driftyco/ionic-native.git"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "@ionic-native/{{PLUGIN}}",
|
||||||
|
"version": "{{VERSION}}",
|
||||||
|
"description": "Ionic Native - Native plugins for ionic apps",
|
||||||
|
"module": "index.js",
|
||||||
|
"typings": "index.d.ts",
|
||||||
|
"author": "ionic",
|
||||||
|
"license": "MIT",
|
||||||
|
"peerDependencies": {},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/driftyco/ionic-native.git"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
"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 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(done);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
QUEUE.start((err) => {
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
console.log('Error publishing ionic-native. ', err);
|
||||||
|
} else {
|
||||||
|
console.log('Done publishing ionic-native!');
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"baseUrl": ".",
|
||||||
|
"declaration": true,
|
||||||
|
"stripInternal": true,
|
||||||
|
"experimentalDecorators": true,
|
||||||
|
"emitDecoratorMetadata": true,
|
||||||
|
"module": "es2015",
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"outDir": "../../dist/",
|
||||||
|
"rootDir": "../../src/",
|
||||||
|
"target": "es5",
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"lib": ["es2015", "dom"]
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"../../src/@ionic-native/core/index.ts"
|
||||||
|
],
|
||||||
|
"angularCompilerOptions": {
|
||||||
|
"genDir": "../../.tmp/core-aot"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"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"]
|
||||||
|
},
|
||||||
|
"files": []
|
||||||
|
}
|
||||||
+2
-1
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"sitePath": "../ionic-site",
|
"sitePath": "../ionic-site",
|
||||||
"v2DocsDir": "docs/v2/native",
|
"v2DocsDir": "docs/v2/native",
|
||||||
"docsDest": "../ionic-site/docs/v2/native"
|
"docsDest": "../ionic-site/content/docs/v2/native",
|
||||||
|
"pluginDir": "dist/@ionic-native"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
var Package = require('dgeni').Package;
|
var Package = require('dgeni').Package;
|
||||||
var jsdocPackage = require('dgeni-packages/jsdoc');
|
var jsdocPackage = require('dgeni-packages/jsdoc');
|
||||||
var nunjucksPackage = require('dgeni-packages/nunjucks');
|
var nunjucksPackage = require('dgeni-packages/nunjucks');
|
||||||
var typescriptPackage = require('./typescript-package');
|
var typescriptPackage = require('dgeni-packages/typescript');
|
||||||
var linksPackage = require('./links-package');
|
var linksPackage = require('dgeni-packages/links');
|
||||||
var gitPackage = require('dgeni-packages/git');
|
|
||||||
var path = require('path');
|
var path = require('path');
|
||||||
var semver = require('semver');
|
var semver = require('semver');
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
@@ -14,15 +13,14 @@ var projectPackage = require('../../package.json');
|
|||||||
// Define the dgeni package for generating the docs
|
// Define the dgeni package for generating the docs
|
||||||
module.exports = function(currentVersion) {
|
module.exports = function(currentVersion) {
|
||||||
|
|
||||||
return new Package('ionic-v2-docs',
|
return new Package('ionic-v2-docs', [jsdocPackage, nunjucksPackage, typescriptPackage, linksPackage])
|
||||||
[jsdocPackage, nunjucksPackage, typescriptPackage,
|
|
||||||
linksPackage, gitPackage])
|
|
||||||
|
|
||||||
// .processor(require('./processors/latest-version'))
|
// .processor(require('./processors/latest-version'))
|
||||||
.processor(require('./processors/jekyll'))
|
.processor(require('./processors/jekyll'))
|
||||||
.processor(require('./processors/remove-private-members'))
|
.processor(require('./processors/remove-private-members'))
|
||||||
.processor(require('./processors/hide-private-api'))
|
.processor(require('./processors/hide-private-api'))
|
||||||
.processor(require('./processors/collect-inputs-outputs'))
|
.processor(require('./processors/collect-inputs-outputs'))
|
||||||
|
.processor(require('./processors/npm-id'))
|
||||||
|
|
||||||
// for debugging docs
|
// for debugging docs
|
||||||
// .processor(function test(){
|
// .processor(function test(){
|
||||||
@@ -31,12 +29,37 @@ module.exports = function(currentVersion) {
|
|||||||
// $runBefore: ['rendering-docs'],
|
// $runBefore: ['rendering-docs'],
|
||||||
// $process: function(docs){
|
// $process: function(docs){
|
||||||
// docs.forEach(function(doc){
|
// docs.forEach(function(doc){
|
||||||
// if (doc.members && doc.name == "IonicApp"){
|
// if (doc.name == "Camera"){
|
||||||
// doc.members.forEach(function(method){
|
//
|
||||||
// if (method.name === "load") {
|
// // console.log(doc.tags);
|
||||||
// console.log(method);
|
// // doc.tags.forEach(function(tag){
|
||||||
// }
|
// // if(tag.tagName == 'classes'){
|
||||||
// })
|
// //
|
||||||
|
// // }
|
||||||
|
// // });
|
||||||
|
//
|
||||||
|
// // doc.moduleDoc.exports.forEach(function(d,i){
|
||||||
|
// // if(d.name === 'CameraOptions') {
|
||||||
|
// // console.log('Name: ' + d.name);
|
||||||
|
// // console.log('Type: ' + d.docType);
|
||||||
|
// // console.log('First member: ', d.members[0]);
|
||||||
|
// // }
|
||||||
|
// // });
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// // var exports = doc.exportSymbol.parent.exports;
|
||||||
|
// // for(var p in exports) {
|
||||||
|
// // if(p == 'CameraOptions')
|
||||||
|
// // {
|
||||||
|
// // var x = exports[p];
|
||||||
|
// // console.log(x.members.quality);
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
// // doc.members.forEach(function(method){
|
||||||
|
// // if (method.name === "getPicture") {
|
||||||
|
// // console.log(method);
|
||||||
|
// // }
|
||||||
|
// // })
|
||||||
// }
|
// }
|
||||||
// })
|
// })
|
||||||
// }
|
// }
|
||||||
@@ -47,11 +70,11 @@ module.exports = function(currentVersion) {
|
|||||||
log.level = 'error'; //'silly', 'debug', 'info', 'warn', 'error'
|
log.level = 'error'; //'silly', 'debug', 'info', 'warn', 'error'
|
||||||
})
|
})
|
||||||
|
|
||||||
.config(function(renderDocsProcessor, computePathsProcessor, versionInfo) {
|
.config(function(renderDocsProcessor, computePathsProcessor) {
|
||||||
|
|
||||||
versions = [];
|
versions = [];
|
||||||
// new version, add it to the versions list
|
// new version, add it to the versions list
|
||||||
if (currentVersion != 'nightly' && !_.contains(versions, currentVersion)) {
|
if (currentVersion != 'nightly' && !_.includes(versions, currentVersion)) {
|
||||||
versions.unshift(currentVersion);
|
versions.unshift(currentVersion);
|
||||||
}
|
}
|
||||||
//First semver valid version is latest
|
//First semver valid version is latest
|
||||||
@@ -60,7 +83,7 @@ module.exports = function(currentVersion) {
|
|||||||
// We don't separate by versions so always put the docs in the root
|
// We don't separate by versions so always put the docs in the root
|
||||||
var folder = '';
|
var folder = '';
|
||||||
return {
|
return {
|
||||||
href: path.join('/' + config.v2DocsDir, folder),
|
href: '/' + config.v2DocsDir.replace('content/',''),
|
||||||
folder: folder,
|
folder: folder,
|
||||||
name: version
|
name: version
|
||||||
};
|
};
|
||||||
@@ -73,13 +96,11 @@ module.exports = function(currentVersion) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
renderDocsProcessor.extraData.version = versionData;
|
renderDocsProcessor.extraData.version = versionData;
|
||||||
renderDocsProcessor.extraData.versionInfo = versionInfo;
|
|
||||||
|
|
||||||
computePathsProcessor.pathTemplates = [{
|
computePathsProcessor.pathTemplates = [{
|
||||||
docTypes: ['class', 'var', 'function', 'let'],
|
docTypes: ['class', 'var', 'function', 'let'],
|
||||||
getOutputPath: function(doc) {
|
getOutputPath: function(doc) {
|
||||||
var docPath = doc.name + '/index.md';
|
var docPath = doc.name + '/index.md';
|
||||||
var path = config.v2DocsDir + '/' + docPath;
|
var path = 'content/' + config.v2DocsDir + '/' + docPath;
|
||||||
|
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
@@ -93,10 +114,9 @@ module.exports = function(currentVersion) {
|
|||||||
readFilesProcessor.$enabled = false;
|
readFilesProcessor.$enabled = false;
|
||||||
readFilesProcessor.basePath = path.resolve(__dirname, '../..');
|
readFilesProcessor.basePath = path.resolve(__dirname, '../..');
|
||||||
|
|
||||||
readTypeScriptModules.basePath = path.resolve(path.resolve(__dirname,
|
readTypeScriptModules.basePath = path.resolve(__dirname, '../..');
|
||||||
'../..'));
|
|
||||||
readTypeScriptModules.sourceFiles = [
|
readTypeScriptModules.sourceFiles = [
|
||||||
'src/index.ts'
|
'./src/@ionic-native/plugins/**/*.ts'
|
||||||
];
|
];
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -124,7 +144,7 @@ module.exports = function(currentVersion) {
|
|||||||
|
|
||||||
// Configure file writing
|
// Configure file writing
|
||||||
.config(function(writeFilesProcessor) {
|
.config(function(writeFilesProcessor) {
|
||||||
writeFilesProcessor.outputFolder = config.sitePath;
|
writeFilesProcessor.outputFolder = '../ionic-site/';
|
||||||
})
|
})
|
||||||
|
|
||||||
// Configure rendering
|
// Configure rendering
|
||||||
@@ -145,7 +165,8 @@ module.exports = function(currentVersion) {
|
|||||||
templateEngine.filters.push(
|
templateEngine.filters.push(
|
||||||
require('./filters/capital'),
|
require('./filters/capital'),
|
||||||
require('./filters/code'),
|
require('./filters/code'),
|
||||||
require('./filters/dump')
|
require('./filters/dump'),
|
||||||
|
require('./filters/dashify')
|
||||||
);
|
);
|
||||||
|
|
||||||
templateFinder.templateFolders.unshift(path.resolve(__dirname, 'templates'));
|
templateFinder.templateFolders.unshift(path.resolve(__dirname, 'templates'));
|
||||||
|
|||||||
@@ -0,0 +1,179 @@
|
|||||||
|
var Package = require('dgeni').Package;
|
||||||
|
var jsdocPackage = require('dgeni-packages/jsdoc');
|
||||||
|
var nunjucksPackage = require('dgeni-packages/nunjucks');
|
||||||
|
var typescriptPackage = require('dgeni-packages/typescript');
|
||||||
|
var linksPackage = require('dgeni-packages/links');
|
||||||
|
var path = require('path');
|
||||||
|
var semver = require('semver');
|
||||||
|
var fs = require('fs');
|
||||||
|
var _ = require('lodash');
|
||||||
|
var config = require('../config.json');
|
||||||
|
var projectPackage = require('../../package.json');
|
||||||
|
|
||||||
|
// jscs:disable validateIndentation
|
||||||
|
|
||||||
|
// Define the dgeni package for generating the docs
|
||||||
|
module.exports = function(currentVersion) {
|
||||||
|
|
||||||
|
return new Package('ionic-v2-docs', [jsdocPackage, nunjucksPackage, typescriptPackage, linksPackage])
|
||||||
|
|
||||||
|
// .processor(require('./processors/latest-version'))
|
||||||
|
.processor(require('./processors/readmes'))
|
||||||
|
.processor(require('./processors/npm-id'))
|
||||||
|
.processor(require('./processors/remove-private-members'))
|
||||||
|
.processor(require('./processors/hide-private-api'))
|
||||||
|
// .processor(require('./processors/collect-inputs-outputs'))
|
||||||
|
|
||||||
|
// for debugging docs
|
||||||
|
// .processor(function test(){
|
||||||
|
// return {
|
||||||
|
//
|
||||||
|
// $runBefore: ['rendering-docs'],
|
||||||
|
// $process: function(docs){
|
||||||
|
// docs.forEach(function(doc){
|
||||||
|
// if (doc.name == "Camera"){
|
||||||
|
//
|
||||||
|
// // console.log(doc.tags);
|
||||||
|
// // doc.tags.forEach(function(tag){
|
||||||
|
// // if(tag.tagName == 'classes'){
|
||||||
|
// //
|
||||||
|
// // }
|
||||||
|
// // });
|
||||||
|
//
|
||||||
|
// // doc.moduleDoc.exports.forEach(function(d,i){
|
||||||
|
// // if(d.name === 'CameraOptions') {
|
||||||
|
// // console.log('Name: ' + d.name);
|
||||||
|
// // console.log('Type: ' + d.docType);
|
||||||
|
// // console.log('First member: ', d.members[0]);
|
||||||
|
// // }
|
||||||
|
// // });
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// // var exports = doc.exportSymbol.parent.exports;
|
||||||
|
// // for(var p in exports) {
|
||||||
|
// // if(p == 'CameraOptions')
|
||||||
|
// // {
|
||||||
|
// // var x = exports[p];
|
||||||
|
// // console.log(x.members.quality);
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
// // doc.members.forEach(function(method){
|
||||||
|
// // if (method.name === "getPicture") {
|
||||||
|
// // console.log(method);
|
||||||
|
// // }
|
||||||
|
// // })
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
.config(function(log) {
|
||||||
|
log.level = 'error'; //'silly', 'debug', 'info', 'warn', 'error'
|
||||||
|
})
|
||||||
|
|
||||||
|
.config(function(renderDocsProcessor, computePathsProcessor) {
|
||||||
|
|
||||||
|
versions = [];
|
||||||
|
// new version, add it to the versions list
|
||||||
|
if (currentVersion != 'nightly' && !_.includes(versions, currentVersion)) {
|
||||||
|
versions.unshift(currentVersion);
|
||||||
|
}
|
||||||
|
//First semver valid version is latest
|
||||||
|
var latestVersion = _.find(versions, semver.valid);
|
||||||
|
versions = versions.map(function(version) {
|
||||||
|
// We don't separate by versions so always put the docs in the root
|
||||||
|
var folder = '';
|
||||||
|
return {
|
||||||
|
href: '/' + config.v2DocsDir.replace('content/', ''),
|
||||||
|
folder: folder,
|
||||||
|
name: version
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
var versionData = {
|
||||||
|
list: versions,
|
||||||
|
current: _.find(versions, {name: currentVersion}),
|
||||||
|
latest: _.find(versions, {name: latestVersion}) || _.first(versions)
|
||||||
|
};
|
||||||
|
|
||||||
|
renderDocsProcessor.extraData.version = versionData;
|
||||||
|
computePathsProcessor.pathTemplates = [{
|
||||||
|
docTypes: ['class'],
|
||||||
|
getOutputPath: function(doc) {
|
||||||
|
return doc.originalModule.replace(config.pluginDir + '/', '')
|
||||||
|
.replace('/plugins', '')
|
||||||
|
.replace('/index', '') + '/README.md';
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
})
|
||||||
|
|
||||||
|
//configure file reading
|
||||||
|
.config(function(readFilesProcessor, readTypeScriptModules) {
|
||||||
|
|
||||||
|
// Don't run unwanted processors since we are not using the normal file reading processor
|
||||||
|
readFilesProcessor.$enabled = false;
|
||||||
|
readFilesProcessor.basePath = path.resolve(__dirname, '../..');
|
||||||
|
|
||||||
|
readTypeScriptModules.basePath = path.resolve(path.resolve(__dirname, '../..'));
|
||||||
|
readTypeScriptModules.sourceFiles = ['./src/@ionic-native/plugins/**/*.ts'];
|
||||||
|
})
|
||||||
|
|
||||||
|
.config(function(parseTagsProcessor) {
|
||||||
|
parseTagsProcessor.tagDefinitions = parseTagsProcessor.tagDefinitions
|
||||||
|
.concat(require('./tag-defs/tag-defs'));
|
||||||
|
})
|
||||||
|
|
||||||
|
// .config(function(parseTagsProcessor) {
|
||||||
|
// // We actually don't want to parse param docs in this package as we are
|
||||||
|
// // getting the data out using TS
|
||||||
|
// parseTagsProcessor.tagDefinitions.forEach(function(tagDef) {
|
||||||
|
// console.log(tagDef);
|
||||||
|
// if (tagDef.name === 'param') {
|
||||||
|
// tagDef.docProperty = 'paramData';
|
||||||
|
// tagDef.transforms = [];
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// })
|
||||||
|
|
||||||
|
// Configure links
|
||||||
|
.config(function(getLinkInfo) {
|
||||||
|
getLinkInfo.useFirstAmbiguousLink = false;
|
||||||
|
})
|
||||||
|
|
||||||
|
// Configure file writing
|
||||||
|
.config(function(writeFilesProcessor) {
|
||||||
|
writeFilesProcessor.outputFolder = './dist/';
|
||||||
|
})
|
||||||
|
|
||||||
|
// Configure rendering
|
||||||
|
.config(function(templateFinder, templateEngine) {
|
||||||
|
|
||||||
|
// Nunjucks and Angular conflict in their template bindings so change the Nunjucks
|
||||||
|
// Also conflict with Jekyll
|
||||||
|
templateEngine.config.tags = {
|
||||||
|
variableStart: '<$',
|
||||||
|
variableEnd: '$>',
|
||||||
|
blockStart: '<@',
|
||||||
|
blockEnd: '@>',
|
||||||
|
commentStart: '<#',
|
||||||
|
commentEnd: '#>'
|
||||||
|
};
|
||||||
|
|
||||||
|
// add custom filters to nunjucks
|
||||||
|
templateEngine.filters.push(
|
||||||
|
require('./filters/capital'),
|
||||||
|
require('./filters/code'),
|
||||||
|
require('./filters/dump')
|
||||||
|
);
|
||||||
|
|
||||||
|
templateFinder.templateFolders.unshift(path.resolve(__dirname, 'templates'));
|
||||||
|
|
||||||
|
// Specify how to match docs to templates.
|
||||||
|
templateFinder.templatePatterns = [
|
||||||
|
'${ doc.template }',
|
||||||
|
'${ doc.docType }.template.md',
|
||||||
|
'readme.template.md'
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
module.exports = {
|
||||||
|
name: 'dashify',
|
||||||
|
process: function(str) {
|
||||||
|
str || (str = '');
|
||||||
|
return str.replace(/\s/g, '-');
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -1,5 +1,8 @@
|
|||||||
var config = require('../config.json');
|
var config = require('../config.json');
|
||||||
var projectPackage = require('../../package.json');
|
var projectPackage = require('../../package.json');
|
||||||
|
var path = require('path');
|
||||||
|
var fs = require('fs-extra-promise').useFs(require('fs-extra'));
|
||||||
|
|
||||||
module.exports = function(gulp) {
|
module.exports = function(gulp) {
|
||||||
gulp.task('docs', [], function() {
|
gulp.task('docs', [], function() {
|
||||||
var Dgeni = require('dgeni');
|
var Dgeni = require('dgeni');
|
||||||
@@ -7,7 +10,26 @@ module.exports = function(gulp) {
|
|||||||
try {
|
try {
|
||||||
var ionicPackage = require('./dgeni-config')(projectPackage.version);
|
var ionicPackage = require('./dgeni-config')(projectPackage.version);
|
||||||
var dgeni = new Dgeni([ionicPackage]);
|
var dgeni = new Dgeni([ionicPackage]);
|
||||||
return dgeni.generate();
|
return dgeni.generate().then(function(docs) {
|
||||||
|
console.log(docs.length + ' docs generated');
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err.stack);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task('readmes', [], function() {
|
||||||
|
var Dgeni = require('dgeni');
|
||||||
|
var semver = require('semver');
|
||||||
|
|
||||||
|
fs.copySync(path.resolve(__dirname, '..', '..', 'README.md'), path.resolve(__dirname, '..', '..', config.pluginDir, 'core', 'README.md'));
|
||||||
|
|
||||||
|
try {
|
||||||
|
var ionicPackage = require('./dgeni-readmes-config')(projectPackage.version);
|
||||||
|
var dgeni = new Dgeni([ionicPackage]);
|
||||||
|
return dgeni.generate().then(function(docs) {
|
||||||
|
console.log(docs.length + ' README files generated');
|
||||||
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log(err.stack);
|
console.log(err.stack);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
var Package = require('dgeni').Package;
|
|
||||||
|
|
||||||
module.exports = new Package('links', [])
|
|
||||||
|
|
||||||
.factory(require('./inline-tag-defs/link'))
|
|
||||||
.factory(require('dgeni-packages/ngdoc/services/getAliases'))
|
|
||||||
.factory(require('dgeni-packages/ngdoc/services/getDocFromAlias'))
|
|
||||||
.factory(require('./services/getLinkInfo'))
|
|
||||||
|
|
||||||
.config(function(inlineTagProcessor, linkInlineTagDef) {
|
|
||||||
inlineTagProcessor.inlineTagDefinitions.push(linkInlineTagDef);
|
|
||||||
});
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
var INLINE_LINK = /(\S+)(?:\s+([\s\S]+))?/;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dgService linkInlineTagDef
|
|
||||||
* @description
|
|
||||||
* Process inline link tags (of the form {@link some/uri Some Title}), replacing them with HTML anchors
|
|
||||||
* @kind function
|
|
||||||
* @param {Object} url The url to match
|
|
||||||
* @param {Function} docs error message
|
|
||||||
* @return {String} The html link information
|
|
||||||
*
|
|
||||||
* @property {boolean} relativeLinks Whether we expect the links to be relative to the originating doc
|
|
||||||
*/
|
|
||||||
module.exports = function linkInlineTagDef(getLinkInfo, createDocMessage, log) {
|
|
||||||
return {
|
|
||||||
name: 'link',
|
|
||||||
description: 'Process inline link tags (of the form {@link some/uri Some Title}), replacing them with HTML anchors',
|
|
||||||
handler: function(doc, tagName, tagDescription) {
|
|
||||||
|
|
||||||
// Parse out the uri and title
|
|
||||||
return tagDescription.replace(INLINE_LINK, function(match, uri, title) {
|
|
||||||
|
|
||||||
var linkInfo = getLinkInfo(uri, title, doc);
|
|
||||||
|
|
||||||
if ( !linkInfo.valid ) {
|
|
||||||
log.warn(createDocMessage(linkInfo.error, doc));
|
|
||||||
}
|
|
||||||
|
|
||||||
return "<a href='" + linkInfo.url + "'>" + linkInfo.title + "</a>";
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
var _ = require('lodash');
|
|
||||||
var path = require('canonical-path');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dgService getLinkInfo
|
|
||||||
* @description
|
|
||||||
* Get link information to a document that matches the given url
|
|
||||||
* @kind function
|
|
||||||
* @param {String} url The url to match
|
|
||||||
* @param {String} title An optional title to return in the link information
|
|
||||||
* @return {Object} The link information
|
|
||||||
*
|
|
||||||
* @property {boolean} relativeLinks Whether we expect the links to be relative to the originating doc
|
|
||||||
*/
|
|
||||||
module.exports = function getLinkInfo(getDocFromAlias, encodeCodeBlock, log) {
|
|
||||||
|
|
||||||
return function getLinkInfoImpl(url, title, currentDoc) {
|
|
||||||
var linkInfo = {
|
|
||||||
url: url,
|
|
||||||
type: 'url',
|
|
||||||
valid: true,
|
|
||||||
title: title || url
|
|
||||||
};
|
|
||||||
|
|
||||||
if ( !url ) {
|
|
||||||
throw new Error('Invalid url');
|
|
||||||
}
|
|
||||||
|
|
||||||
var docs = getDocFromAlias(url, currentDoc);
|
|
||||||
|
|
||||||
if ( !getLinkInfoImpl.useFirstAmbiguousLink && docs.length > 1 ) {
|
|
||||||
|
|
||||||
linkInfo.valid = false;
|
|
||||||
linkInfo.errorType = 'ambiguous';
|
|
||||||
linkInfo.error = 'Ambiguous link: "' + url + '".\n' +
|
|
||||||
docs.reduce(function(msg, doc) { return msg + '\n "' + doc.id + '" ('+ doc.docType + ') : (' + doc.path + ' / ' + doc.fileInfo.relativePath + ')'; }, 'Matching docs: ');
|
|
||||||
|
|
||||||
} else if ( docs.length >= 1 ) {
|
|
||||||
|
|
||||||
linkInfo.url = docs[0].path;
|
|
||||||
linkInfo.title = title || encodeCodeBlock(docs[0].name, true);
|
|
||||||
linkInfo.type = 'doc';
|
|
||||||
|
|
||||||
if ( getLinkInfoImpl.relativeLinks && currentDoc && currentDoc.path ) {
|
|
||||||
var currentFolder = path.dirname(currentDoc.path);
|
|
||||||
var docFolder = path.dirname(linkInfo.url);
|
|
||||||
var relativeFolder = path.relative(path.join('/', currentFolder), path.join('/', docFolder));
|
|
||||||
linkInfo.url = path.join(relativeFolder, path.basename(linkInfo.url));
|
|
||||||
log.debug(currentDoc.path, docs[0].path, linkInfo.url);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if ( url.indexOf('#') > 0 ) {
|
|
||||||
var pathAndHash = url.split('#');
|
|
||||||
linkInfo = getLinkInfoImpl(pathAndHash[0], title, currentDoc);
|
|
||||||
linkInfo.url = linkInfo.url + '#' + pathAndHash[1];
|
|
||||||
return linkInfo;
|
|
||||||
|
|
||||||
} else if ( url.indexOf('/') === -1 && url.indexOf('#') !== 0 ) {
|
|
||||||
|
|
||||||
linkInfo.valid = false;
|
|
||||||
linkInfo.errorType = 'missing';
|
|
||||||
linkInfo.error = 'Invalid link (does not match any doc): "' + url + '"';
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
linkInfo.title = title || (( url.indexOf('#') === 0 ) ? url.substring(1) : path.basename(url, '.html'));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return linkInfo;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@@ -21,13 +21,17 @@ function run {
|
|||||||
./git/clone.sh --repository="ionic-site" \
|
./git/clone.sh --repository="ionic-site" \
|
||||||
--directory="$SITE_DIR" \
|
--directory="$SITE_DIR" \
|
||||||
--branch="master"
|
--branch="master"
|
||||||
ls -al $SITE_DIR
|
cd $SITE_DIR
|
||||||
|
ls -al
|
||||||
else
|
else
|
||||||
echo "using existing"
|
echo "using existing"
|
||||||
cd $SITE_DIR
|
cd $SITE_DIR
|
||||||
git reset --hard
|
git reset --hard
|
||||||
git pull origin master
|
git pull origin master
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
git rm -rf content/docs/v2/native/*/ || true
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
source $(dirname $0)/../utils.inc.sh
|
source $(dirname $0)/../utils.inc.sh
|
||||||
|
|||||||
@@ -5,6 +5,15 @@ module.exports = function collectInputsOutputs() {
|
|||||||
$process: function(docs) {
|
$process: function(docs) {
|
||||||
docs.forEach(function(doc) {
|
docs.forEach(function(doc) {
|
||||||
|
|
||||||
|
if (doc.statics && doc.statics.length) {
|
||||||
|
for (var i in doc.statics) {
|
||||||
|
// identify properties to differentiate from methods
|
||||||
|
if (typeof doc.statics[i].parameters == 'undefined') {
|
||||||
|
doc.statics[i].isProperty = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (doc.members && doc.members.length) {
|
if (doc.members && doc.members.length) {
|
||||||
var members = [];
|
var members = [];
|
||||||
var inputs = [];
|
var inputs = [];
|
||||||
|
|||||||
@@ -5,14 +5,14 @@ module.exports = function removePrivateApi() {
|
|||||||
$runBefore: ['rendering-docs'],
|
$runBefore: ['rendering-docs'],
|
||||||
$process: function(docs) {
|
$process: function(docs) {
|
||||||
var publicDocs = [];
|
var publicDocs = [];
|
||||||
docs.forEach(function(doc){
|
docs.forEach(function(doc){
|
||||||
if(!doc.private){
|
if (!doc.private && (!doc.tags || !doc.tags.tagsByName.get('hidden'))){
|
||||||
publicDocs.push(doc);
|
publicDocs.push(doc);
|
||||||
return doc
|
return doc
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
docs = publicDocs;
|
docs = publicDocs;
|
||||||
return docs;
|
return docs;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -17,16 +17,19 @@ module.exports = function jekyll(renderDocsProcessor) {
|
|||||||
return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
|
return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
|
||||||
});
|
});
|
||||||
docs.forEach(function(doc, i) {
|
docs.forEach(function(doc, i) {
|
||||||
doc.outputPath = doc.outputPath.toLowerCase().replace(' ', '-');
|
doc.outputPath = doc.outputPath.toLowerCase().replace(/\s/g, '-');
|
||||||
docs[i].URL = doc.outputPath.replace('docs/v2//', 'docs/v2/')
|
docs[i].URL = doc.outputPath.replace('docs/v2//', 'docs/v2/')
|
||||||
.replace('/index.md', '');
|
.replace('/index.md', '')
|
||||||
|
.replace('content/', '');
|
||||||
|
|
||||||
|
docs[i].demo = !!docs[i].demo;
|
||||||
});
|
});
|
||||||
|
|
||||||
docs.push({
|
docs.push({
|
||||||
docType: 'native_menu-menu',
|
docType: 'native_menu-menu',
|
||||||
id: 'native_menu-menu',
|
id: 'native_menu-menu',
|
||||||
template: 'native_menu.template.html',
|
template: 'native_menu.template.html',
|
||||||
outputPath: '_includes/v2_fluid/native_menu.html'
|
outputPath: 'content/_includes/v2_fluid/native_menu.html'
|
||||||
});
|
});
|
||||||
|
|
||||||
// returning docs will replace docs object in the next process
|
// returning docs will replace docs object in the next process
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ module.exports = function latestVersion(renderDocsProcessor) {
|
|||||||
$process: function(docs) {
|
$process: function(docs) {
|
||||||
var versionData = renderDocsProcessor.extraData.version;
|
var versionData = renderDocsProcessor.extraData.version;
|
||||||
|
|
||||||
var docsBase = 'dist/ionic-site/docs/v2/';
|
var docsBase = 'dist/ionic-site/content/docs/v2/';
|
||||||
var versionDir = path.resolve(docsBase, versionData.latest.name);
|
var versionDir = path.resolve(docsBase, versionData.latest.name);
|
||||||
var latestDir = path.resolve(docsBase, 'api');
|
var latestDir = path.resolve(docsBase, 'api');
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
module.exports = function npmId(renderDocsProcessor) {
|
||||||
|
return {
|
||||||
|
name: 'npm-id',
|
||||||
|
$runAfter: ['paths-computed'],
|
||||||
|
$runBefore: ['rendering-docs'],
|
||||||
|
$process: function(docs) {
|
||||||
|
var currentVersion = renderDocsProcessor.extraData.version.current.name;
|
||||||
|
|
||||||
|
// pretty up and sort the docs object for menu generation
|
||||||
|
docs = docs.filter(function(doc) {
|
||||||
|
return (!!doc.name && !!doc.outputPath) || doc.docType === 'index-page';
|
||||||
|
});
|
||||||
|
|
||||||
|
docs.forEach(function(doc, i) {
|
||||||
|
doc.npmId = doc.outputPath.replace('/README.md', '') // for readmes
|
||||||
|
.replace('@ionic-native/plugins/','') // for readmes
|
||||||
|
.replace('content/docs/v2/native/', '') // for docs
|
||||||
|
.replace('/index.md', ''); // for docs
|
||||||
|
});
|
||||||
|
|
||||||
|
// returning docs will replace docs object in the next process
|
||||||
|
return docs;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
module.exports = function readmes(renderDocsProcessor) {
|
||||||
|
return {
|
||||||
|
name: 'readmes',
|
||||||
|
description: 'Create jekyll includes',
|
||||||
|
$runAfter: ['paths-computed'],
|
||||||
|
$runBefore: ['rendering-docs'],
|
||||||
|
$process: function(docs) {
|
||||||
|
var currentVersion = renderDocsProcessor.extraData.version.current.name;
|
||||||
|
|
||||||
|
// pretty up and sort the docs object for menu generation
|
||||||
|
docs = docs.filter(function(doc) {
|
||||||
|
return (!!doc.name && !!doc.outputPath) || doc.docType === 'index-page';
|
||||||
|
});
|
||||||
|
|
||||||
|
docs.forEach(function(doc, i) {
|
||||||
|
doc.outputPath = doc.outputPath.replace('src/', '');
|
||||||
|
});
|
||||||
|
|
||||||
|
// returning docs will replace docs object in the next process
|
||||||
|
return docs;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -6,16 +6,19 @@ module.exports = function removePrivateMembers() {
|
|||||||
$runBefore: ['rendering-docs'],
|
$runBefore: ['rendering-docs'],
|
||||||
$process: function(docs) {
|
$process: function(docs) {
|
||||||
docs.forEach(function(doc) {
|
docs.forEach(function(doc) {
|
||||||
|
|
||||||
if (doc.members) {
|
if (doc.members) {
|
||||||
doc.members = doc.members.filter(function(member) {
|
doc.members = doc.members.filter(function(member) {
|
||||||
return !member.tags.tagsByName.get('private');
|
return !member.tags.tagsByName.get('hidden');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (doc.statics) {
|
if (doc.statics) {
|
||||||
doc.statics = doc.statics.filter(function(staticMethod) {
|
doc.statics = doc.statics.filter(function(staticMethod) {
|
||||||
return !staticMethod.tags.tagsByName.get('private');
|
return !staticMethod.tags.tagsByName.get('hidden');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return docs;
|
return docs;
|
||||||
|
|||||||
@@ -1,5 +1,12 @@
|
|||||||
module.exports = [
|
module.exports = [
|
||||||
{'name': 'advanced'},
|
{'name': 'advanced'},
|
||||||
{'name': 'demo'},
|
{'name': 'demo'},
|
||||||
{'name': 'usage'}
|
{'name': 'beta', transforms: function(doc, tag, value) {
|
||||||
|
// make the value true or undefined instead of '' or undefined
|
||||||
|
return typeof value !== 'undefined';
|
||||||
|
}},
|
||||||
|
{'name': 'usage'},
|
||||||
|
{'name': 'hidden'}, // hide from docs
|
||||||
|
{'name': 'classes'}, // related classes
|
||||||
|
{'name': 'interfaces'} // related interfaces
|
||||||
];
|
];
|
||||||
|
|||||||
+163
-96
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
layout: "v2_fluid/docs_base"
|
layout: "v2_fluid/docs_base"
|
||||||
version: "<$ version.current.name $>"
|
version: "<$ version.current.name $>"
|
||||||
versionHref: "<$ version.current.href $>"
|
versionHref: "<$ version.current.href.replace('content/','') $>"
|
||||||
path: "<$ doc.path $>"
|
path: "<$ doc.path $>"
|
||||||
category: native
|
category: native
|
||||||
id: "<$ doc.name|lower|replace(' ','-') $>"
|
id: "<$ doc.name|lower|replace(' ','-') $>"
|
||||||
@@ -11,6 +11,39 @@ doc: "<$ doc.name $>"
|
|||||||
docType: "<$ doc.docType $>"
|
docType: "<$ doc.docType $>"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
<@ macro interfaceTable(interface) @>
|
||||||
|
<@ for export in doc.moduleDoc.exports -@>
|
||||||
|
<@ if export.name == interface @>
|
||||||
|
<table class="table param-table" style="margin:0;">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Param</th>
|
||||||
|
<th>Type</th>
|
||||||
|
<th>Details</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<@ for param in export.members @>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<$ param.name $>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<code><$ param.returnType | escape $></code>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<$ param.description | marked $>
|
||||||
|
<@ if param.optional @><strong class="tag">Optional</strong><@ endif @>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<@ endfor @>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<@ endif @>
|
||||||
|
<@- endfor @>
|
||||||
|
<@ endmacro @>
|
||||||
|
|
||||||
<@ macro paramList(paramData) -@>
|
<@ macro paramList(paramData) -@>
|
||||||
<@- if paramData -@><span class="params">(
|
<@- if paramData -@><span class="params">(
|
||||||
<@- for param in paramData -@>
|
<@- for param in paramData -@>
|
||||||
@@ -20,7 +53,7 @@ docType: "<$ doc.docType $>"
|
|||||||
<@- endmacro -@>
|
<@- endmacro -@>
|
||||||
|
|
||||||
<@ macro githubViewLink(doc) -@>
|
<@ macro githubViewLink(doc) -@>
|
||||||
<a href="https://github.com/<$ versionInfo.gitRepoInfo.owner $>/<$ versionInfo.gitRepoInfo.repo $>/tree/master/<$ doc.fileInfo.relativePath $>#L<$ doc.location.start.line+1 $>-L<$ doc.location.end.line+1 $>"><$ doc.fileInfo.relativePath $> (line <$ doc.location.start.line+1 $>)</a>
|
<a href="https://github.com/driftyco/ionic-native/tree/master/<$ doc.fileInfo.relativePath $>#L<$ doc.location.start.line+1 $>-L<$ doc.location.end.line+1 $>"><$ doc.fileInfo.relativePath $> (line <$ doc.location.start.line+1 $>)</a>
|
||||||
<@- endmacro -@>
|
<@- endmacro -@>
|
||||||
|
|
||||||
<@ macro paramTable(params, isDirective) -@>
|
<@ macro paramTable(params, isDirective) -@>
|
||||||
@@ -38,14 +71,14 @@ docType: "<$ doc.docType $>"
|
|||||||
<td>
|
<td>
|
||||||
<$ param.name $>
|
<$ param.name $>
|
||||||
<@ if param.alias @>| <$ param.alias $><@ endif @>
|
<@ if param.alias @>| <$ param.alias $><@ endif @>
|
||||||
<@ if param.type.optional @><div><em>(optional)</em></div><@ endif @>
|
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<$ typeList(param.typeList) $>
|
<$ typeList(param.typeList) $>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<$ param.description | marked $>
|
<$ param.description | marked $>
|
||||||
<@ if param.default @><p><em>(default: <$ param.default $>)</em></p><@ endif @>
|
<@ if param.optional @><strong class="tag">Optional</strong><@ endif @>
|
||||||
|
<@ if param.defaultValue @><p><em>(default: <$ param.defaultValue $>)</em></p><@ endif @>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<@ endfor @>
|
<@ endfor @>
|
||||||
@@ -73,15 +106,81 @@ docType: "<$ doc.docType $>"
|
|||||||
<$ typeList(fn.typeList) $> <$ fn.description $>
|
<$ typeList(fn.typeList) $> <$ fn.description $>
|
||||||
<@- endmacro -@>
|
<@- endmacro -@>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<@ macro documentClass(doc) @>
|
||||||
|
<@- if doc.statics.length -@>
|
||||||
|
<h2>Static Members</h2>
|
||||||
|
<@ for method in doc.statics -@>
|
||||||
|
<@ if not method.internal @>
|
||||||
|
<div id="<$ method.name $>"></div>
|
||||||
|
<h3><$ functionSyntax(method) $></h3>
|
||||||
|
<@- if method.decorators @>
|
||||||
|
<@ for prop in method.decorators[0].argumentInfo @>
|
||||||
|
<@ if prop.platforms @>
|
||||||
|
<p>
|
||||||
|
<b>Platforms:</b>
|
||||||
|
<@- for platform in prop.platforms @>
|
||||||
|
<code><$ platform $></code>
|
||||||
|
<@ endfor -@>
|
||||||
|
</p>
|
||||||
|
<@ endif @>
|
||||||
|
<@ endfor @>
|
||||||
|
<@- endif @>
|
||||||
|
|
||||||
|
<$ method.description $>
|
||||||
|
|
||||||
|
<@ if method.params @>
|
||||||
|
<$ paramTable(method.params) $>
|
||||||
|
<@ endif @>
|
||||||
|
|
||||||
|
<@ if method.this -@>
|
||||||
|
<h4> Method's `this`
|
||||||
|
<$ method.this $>
|
||||||
|
</h4>
|
||||||
|
<@- endif @>
|
||||||
|
|
||||||
|
<@ if method.returns @>
|
||||||
|
<div class="return-value" markdown="1">
|
||||||
|
<i class="icon ion-arrow-return-left"></i>
|
||||||
|
<b>Returns:</b> <$ typeInfo(method.returns) $>
|
||||||
|
</div>
|
||||||
|
<@ endif @>
|
||||||
|
<@ endif @>
|
||||||
|
<@ endfor -@>
|
||||||
|
<@ endif @>
|
||||||
|
|
||||||
|
<!-- methods on the class -->
|
||||||
|
<@- if doc.members and doc.members.length @>
|
||||||
|
|
||||||
|
<h2>Instance Members</h2>
|
||||||
|
<@ for method in doc.members -@>
|
||||||
|
<div id="<$ method.name $>"></div>
|
||||||
|
<h3>
|
||||||
|
<$ functionSyntax(method) $>
|
||||||
|
</h3>
|
||||||
|
<$ method.description $>
|
||||||
|
<@ if method.params -@>
|
||||||
|
<$ paramTable(method.params) $>
|
||||||
|
<@- endif @>
|
||||||
|
<@ if method.this -@>
|
||||||
|
<h4> Method's `this`
|
||||||
|
<$ method.this $>
|
||||||
|
</h4>
|
||||||
|
<@- endif @>
|
||||||
|
<@ if method.returns -@>
|
||||||
|
<div class="return-value" markdown="1">
|
||||||
|
<i class="icon ion-arrow-return-left"></i>
|
||||||
|
<b>Returns:</b> <$ typeInfo(method.returns) $>
|
||||||
|
</div>
|
||||||
|
<@- endif @>
|
||||||
|
<@- endfor @>
|
||||||
|
<@- endif -@>
|
||||||
|
<@ endmacro @>
|
||||||
<@ block body @>
|
<@ block body @>
|
||||||
|
|
||||||
|
|
||||||
<@ block content @>
|
<@ block content @>
|
||||||
|
|
||||||
<@ block header @>
|
<@ block header @>
|
||||||
|
|
||||||
<h1 class="api-title">
|
<h1 class="api-title">
|
||||||
|
|
||||||
<@ if doc.docType == "directive" @>
|
<@ if doc.docType == "directive" @>
|
||||||
<$ doc.name | dashCase $>
|
<$ doc.name | dashCase $>
|
||||||
<@ else @>
|
<@ else @>
|
||||||
@@ -101,24 +200,33 @@ docType: "<$ doc.docType $>"
|
|||||||
Delegate: <$ doc.delegate $>
|
Delegate: <$ doc.delegate $>
|
||||||
</small>
|
</small>
|
||||||
<@ endif @>
|
<@ endif @>
|
||||||
|
<@- if doc.beta == true -@>
|
||||||
|
<span class="beta" title="beta">β</span>
|
||||||
|
<@- endif -@>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<a class="improve-v2-docs" href="http://github.com/driftyco/ionic-native/edit/master/<$ doc.fileInfo.relativePath|replace('/home/ubuntu/ionic-native/', '')|replace('//','/') $>#L<$ doc.location.start.line $>">
|
<a class="improve-v2-docs" href="http://github.com/driftyco/ionic-native/edit/master/<$ doc.fileInfo.relativePath|replace('/home/ubuntu/ionic-native/', '')|replace('//','/') $>#L<$ doc.location.start.line $>">
|
||||||
Improve this doc
|
Improve this doc
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<@ if doc.codepen @>
|
|
||||||
{% include codepen.html id="<$ doc.codepen $>" %}
|
|
||||||
<@ endif @>
|
|
||||||
|
|
||||||
<@ endblock @>
|
<@ endblock @>
|
||||||
|
|
||||||
<!-- decorators -->
|
<!-- decorators -->
|
||||||
<@- if doc.decorators @>
|
<@- if doc.decorators @>
|
||||||
|
|
||||||
<@ for prop in doc.decorators[0].argumentInfo @>
|
<@ for prop in doc.decorators[0].argumentInfo @>
|
||||||
<pre><code>$ <@ if prop.install @><$ prop.install $><@ else @>ionic plugin add <$ prop.plugin $><@ endif -@></code></pre>
|
|
||||||
|
<@ if doc.beta == true @>
|
||||||
|
<p class="beta-notice">
|
||||||
|
This plugin is still in beta stage and may not work as expected. Please
|
||||||
|
submit any issues to the <a target="_blank"
|
||||||
|
href="<$ prop.repo $>/issues">plugin repo</a>.
|
||||||
|
</p>
|
||||||
|
<@ endif @>
|
||||||
|
|
||||||
|
<pre><code>$ <@ if prop.install @><$ prop.install $><@ else @>ionic plugin add <$ prop.plugin $><@ endif @>
|
||||||
|
$ npm install --save @ionic-native/<$ doc.npmId $>
|
||||||
|
</code></pre>
|
||||||
<p>Repo:
|
<p>Repo:
|
||||||
<a href="<$ prop.repo $>">
|
<a href="<$ prop.repo $>">
|
||||||
<$ prop.repo $>
|
<$ prop.repo $>
|
||||||
@@ -141,15 +249,15 @@ docType: "<$ doc.docType $>"
|
|||||||
<h2>Supported platforms</h2>
|
<h2>Supported platforms</h2>
|
||||||
<@ block platforms @>
|
<@ block platforms @>
|
||||||
<ul>
|
<ul>
|
||||||
<@- for platform in prop.platforms @>
|
<@ for platform in prop.platforms -@>
|
||||||
<li><$ platform $></li>
|
<li><$ platform $></li>
|
||||||
<@ endfor -@>
|
<@- endfor @>
|
||||||
</ul>
|
</ul>
|
||||||
<@ endblock @>
|
<@ endblock @>
|
||||||
<!-- @platforms tag end -->
|
<!-- @platforms tag end -->
|
||||||
<@ endif @>
|
<@ endif @>
|
||||||
<@ endfor @>
|
<@ endfor @>
|
||||||
<@ endif -@>
|
<@ endif -@><!-- if doc.decorators -->
|
||||||
|
|
||||||
<!-- @usage tag -->
|
<!-- @usage tag -->
|
||||||
<@ if doc.usage @>
|
<@ if doc.usage @>
|
||||||
@@ -181,12 +289,11 @@ docType: "<$ doc.docType $>"
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<@ for prop in doc.properties @>
|
<@ for prop in doc.properties -@>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<$ prop.name $>
|
<$ prop.name $>
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<@ if hasTypes @>
|
<@ if hasTypes @>
|
||||||
<td>
|
<td>
|
||||||
<$ prop.type.name $>
|
<$ prop.type.name $>
|
||||||
@@ -197,86 +304,12 @@ docType: "<$ doc.docType $>"
|
|||||||
<$ prop.description $>
|
<$ prop.description $>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<@ endfor @>
|
<@- endfor @>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<@ endif @>
|
<@ endif @>
|
||||||
|
|
||||||
<@- if doc.statics.length -@>
|
<$ documentClass(doc) $>
|
||||||
<h2>Static Members</h2>
|
|
||||||
<@- for method in doc.statics @><@ if not method.internal @>
|
|
||||||
<div id="<$ method.name $>"></div>
|
|
||||||
<h3><$ functionSyntax(method) $></h3>
|
|
||||||
|
|
||||||
<@- if method.decorators @>
|
|
||||||
<@ for prop in method.decorators[0].argumentInfo @>
|
|
||||||
<@ if prop.platforms @>
|
|
||||||
<p>
|
|
||||||
<b>Platforms:</b>
|
|
||||||
<@- for platform in prop.platforms @>
|
|
||||||
<code><$ platform $></code>
|
|
||||||
<@ endfor -@>
|
|
||||||
</p>
|
|
||||||
<@ endif @>
|
|
||||||
<@ endfor @>
|
|
||||||
<@ endif -@>
|
|
||||||
|
|
||||||
<$ method.description $>
|
|
||||||
|
|
||||||
<@ if method.params @>
|
|
||||||
<$ paramTable(method.params) $>
|
|
||||||
<@ endif @>
|
|
||||||
|
|
||||||
<@ if method.this @>
|
|
||||||
<h4> Method's `this`
|
|
||||||
<$ method.this $>
|
|
||||||
</h4>
|
|
||||||
<@ endif @>
|
|
||||||
|
|
||||||
<@ if method.returns @>
|
|
||||||
<div class="return-value" markdown="1">
|
|
||||||
<i class="icon ion-arrow-return-left"></i>
|
|
||||||
<b>Returns:</b> <$ typeInfo(method.returns) $>
|
|
||||||
</div>
|
|
||||||
<@ endif @>
|
|
||||||
<@ endif @>
|
|
||||||
<@ endfor -@>
|
|
||||||
<@ endif @>
|
|
||||||
|
|
||||||
<!-- methods on the class -->
|
|
||||||
<@- if doc.members and doc.members.length @>
|
|
||||||
|
|
||||||
<h2>Instance Members</h2>
|
|
||||||
<@- for method in doc.members @>
|
|
||||||
|
|
||||||
<div id="<$ method.name $>"></div>
|
|
||||||
|
|
||||||
<h3>
|
|
||||||
<$ functionSyntax(method) $>
|
|
||||||
</h3>
|
|
||||||
|
|
||||||
<$ method.description $>
|
|
||||||
|
|
||||||
<@ if method.params @>
|
|
||||||
<$ paramTable(method.params) $>
|
|
||||||
<@ endif @>
|
|
||||||
|
|
||||||
<@ if method.this @>
|
|
||||||
<h4> Method's `this`
|
|
||||||
<$ method.this $>
|
|
||||||
</h4>
|
|
||||||
<@ endif @>
|
|
||||||
|
|
||||||
<@ if method.returns @>
|
|
||||||
<div class="return-value" markdown="1">
|
|
||||||
<i class="icon ion-arrow-return-left"></i>
|
|
||||||
<b>Returns:</b> <$ typeInfo(method.returns) $>
|
|
||||||
</div>
|
|
||||||
<@ endif @>
|
|
||||||
|
|
||||||
<@ endfor -@>
|
|
||||||
|
|
||||||
<@- endif -@>
|
|
||||||
|
|
||||||
<@ block advanced @>
|
<@ block advanced @>
|
||||||
<@- if doc.advanced -@>
|
<@- if doc.advanced -@>
|
||||||
@@ -285,6 +318,40 @@ docType: "<$ doc.docType $>"
|
|||||||
<@- endif -@>
|
<@- endif -@>
|
||||||
<@ endblock @>
|
<@ endblock @>
|
||||||
|
|
||||||
|
<!-- other classes -->
|
||||||
|
<@ for tag in doc.tags.tags -@>
|
||||||
|
<@ if tag.tagName == 'classes' -@>
|
||||||
|
<!--<h2><a class="anchor" name="related-classes" href="#related-classes"></a>Related Classes</h2>-->
|
||||||
|
<@ set classes = tag.description.split('\n') @>
|
||||||
|
<@ for item in classes -@>
|
||||||
|
<@ if item.length > 1 @>
|
||||||
|
<@ for export in doc.moduleDoc.exports -@>
|
||||||
|
<@ if export.name == item @>
|
||||||
|
<h2><a class="anchor" name="<$ item $>" href="#<$ item $>"></a><$ item $></h2>
|
||||||
|
<$ documentClass(export) $>
|
||||||
|
<@ endif @>
|
||||||
|
<@- endfor @>
|
||||||
|
<@ endif @>
|
||||||
|
<@- endfor @>
|
||||||
|
<@- endif @>
|
||||||
|
<@- endfor @>
|
||||||
|
<!-- end other classes -->
|
||||||
|
|
||||||
|
<!-- interfaces -->
|
||||||
|
<@ for tag in doc.tags.tags -@>
|
||||||
|
<@ if tag.tagName == 'interfaces' @>
|
||||||
|
<!--<h2><a class="anchor" name="interfaces" href="#interfaces"></a>Interfaces</h2>-->
|
||||||
|
<@ set interfaces = tag.description.split('\n') @>
|
||||||
|
<@ for item in interfaces -@>
|
||||||
|
<@ if item.length > 1 @>
|
||||||
|
<h2><a class="anchor" name="<$ item $>" href="#<$ item $>"></a><$ item $></h2>
|
||||||
|
<$ interfaceTable(item) $>
|
||||||
|
<@ endif @>
|
||||||
|
<@- endfor @>
|
||||||
|
<@ endif @>
|
||||||
|
<@- endfor @>
|
||||||
|
<!-- end interfaces -->
|
||||||
|
|
||||||
<!-- related link -->
|
<!-- related link -->
|
||||||
<@- if doc.see @>
|
<@- if doc.see @>
|
||||||
|
|
||||||
|
|||||||
+7
-2
@@ -1,4 +1,9 @@
|
|||||||
<@ for doc in docs @><@ if doc.URL and doc.private != true @>
|
<@ for doc in docs @><@ if doc.URL and doc.private != true and doc.beta != true @>
|
||||||
<li class="capitalize {% if page.id == '<$ doc.name|lower|replace(' ','-') $>' %}active{% endif %}">
|
<li class="capitalize {% if page.id == '<$ doc.name|lower|dashify $>' %}active{% endif %}">
|
||||||
<a href="/<$ doc.URL $>"><$ doc.name $></a>
|
<a href="/<$ doc.URL $>"><$ doc.name $></a>
|
||||||
</li><@ endif @><@ endfor @>
|
</li><@ endif @><@ endfor @>
|
||||||
|
|
||||||
|
<@ for doc in docs @><@ if doc.URL and doc.private != true and doc.beta == true @>
|
||||||
|
<li class="capitalize {% if page.id == '<$ doc.name|lower|dashify $>' %}active{% endif %}">
|
||||||
|
<a href="/<$ doc.URL $>"><$ doc.name $> <span class="beta">β</span></a>
|
||||||
|
</li><@ endif @><@ endfor @>
|
||||||
|
|||||||
+38
@@ -0,0 +1,38 @@
|
|||||||
|
<a style="float:right;font-size:12px;" href="http://github.com/driftyco/ionic-native/edit/master/<$ doc.fileInfo.relativePath|replace('/home/ubuntu/ionic-native/', '')|replace('//','/') $>#L<$ doc.location.start.line $>">
|
||||||
|
Improve this doc
|
||||||
|
</a>
|
||||||
|
|
||||||
|
# <$ doc.name $>
|
||||||
|
|
||||||
|
<@- if doc.beta == true @>
|
||||||
|
<p style="color:orange">
|
||||||
|
This plugin is still in beta stage and may not work as expected. Please
|
||||||
|
submit any issues to the <a target="_blank"
|
||||||
|
href="<$ prop.repo $>/issues">plugin repo</a>.
|
||||||
|
</p>
|
||||||
|
<@ endif -@>
|
||||||
|
|
||||||
|
|
||||||
|
<@ for prop in doc.decorators[0].argumentInfo @>
|
||||||
|
|
||||||
|
```
|
||||||
|
$ <@ if prop.install @><$ prop.install $><@ else @>ionic plugin add <$ prop.plugin $><@ endif @>
|
||||||
|
$ npm install --save @ionic-native/<$ doc.npmId $>
|
||||||
|
```
|
||||||
|
|
||||||
|
## [Usage Documentation](https://ionicframework.com/docs/v2/native/<$ doc.fileInfo.relativePath|replace('/home/ubuntu/ionic-native/', '')|replace('//','/')|replace('index.ts','')|replace('src/@ionic-native/plugins/','') $>)
|
||||||
|
|
||||||
|
Plugin Repo: [<$ prop.repo $>](<$ prop.repo $>)
|
||||||
|
|
||||||
|
<$ doc.description $>
|
||||||
|
|
||||||
|
<@- if prop.platforms @>
|
||||||
|
|
||||||
|
## Supported platforms
|
||||||
|
<@ for platform in prop.platforms -@>
|
||||||
|
- <$ platform $>
|
||||||
|
<@ endfor @>
|
||||||
|
|
||||||
|
<@ endif -@>
|
||||||
|
|
||||||
|
<@ endfor @>
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
var Package = require('dgeni').Package;
|
|
||||||
var jsdocPackage = require('dgeni-packages/jsdoc');
|
|
||||||
var nunjucksPackage = require('dgeni-packages/nunjucks');
|
|
||||||
var typescriptPackage = require('../typescript-package');
|
|
||||||
var gitPackage = require('dgeni-packages/git');
|
|
||||||
var path = require('canonical-path');
|
|
||||||
|
|
||||||
// Define the dgeni package for generating the docs
|
|
||||||
module.exports = new Package('angular-v2-docs', [jsdocPackage, nunjucksPackage, typescriptPackage, gitPackage])
|
|
||||||
|
|
||||||
// Register the processors
|
|
||||||
.processor(require('./processors/createTypeDefinitionFile'))
|
|
||||||
|
|
||||||
.config(function(readFilesProcessor, inlineTagProcessor) {
|
|
||||||
readFilesProcessor.basePath = path.resolve(__dirname, '../..');
|
|
||||||
// Don't run unwanted processors
|
|
||||||
readFilesProcessor.$enabled = false;
|
|
||||||
inlineTagProcessor.$enabled = false;
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
// Configure the log service
|
|
||||||
.config(function(log) {
|
|
||||||
log.level = 'info';
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
.config(function(renderDocsProcessor, versionInfo) {
|
|
||||||
renderDocsProcessor.extraData.versionInfo = versionInfo;
|
|
||||||
})
|
|
||||||
|
|
||||||
.config(function(readFilesProcessor, inlineTagProcessor, readTypeScriptModules, createTypeDefinitionFile) {
|
|
||||||
|
|
||||||
// Don't run unwanted processors
|
|
||||||
readFilesProcessor.$enabled = false; // We are not using the normal file reading processor
|
|
||||||
inlineTagProcessor.$enabled = false; // We are not actually processing the inline link tags
|
|
||||||
|
|
||||||
// Configure file reading
|
|
||||||
readFilesProcessor.basePath = path.resolve(__dirname, '../..');
|
|
||||||
readTypeScriptModules.sourceFiles = [
|
|
||||||
'angular2/angular2.ts',
|
|
||||||
'angular2/router.ts'
|
|
||||||
];
|
|
||||||
readTypeScriptModules.basePath = path.resolve(path.resolve(__dirname, '../../modules'));
|
|
||||||
|
|
||||||
createTypeDefinitionFile.typeDefinitions = [
|
|
||||||
{
|
|
||||||
id: 'angular2/angular2',
|
|
||||||
modules: {
|
|
||||||
'angular2/angular2': 'angular2/angular2',
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'angular2/router',
|
|
||||||
modules: {
|
|
||||||
'angular2/router': 'angular2/router'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
];
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
.config(function(parseTagsProcessor, getInjectables) {
|
|
||||||
// We actually don't want to parse param docs in this package as we are getting the data out using TS
|
|
||||||
parseTagsProcessor.tagDefinitions.forEach(function(tagDef) {
|
|
||||||
if (tagDef.name === 'param') {
|
|
||||||
tagDef.docProperty = 'paramData';
|
|
||||||
tagDef.transforms = [];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
// Configure file writing
|
|
||||||
.config(function(writeFilesProcessor) {
|
|
||||||
writeFilesProcessor.outputFolder = 'dist/docs';
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
// Configure rendering
|
|
||||||
.config(function(templateFinder, templateEngine) {
|
|
||||||
|
|
||||||
// Nunjucks and Angular conflict in their template bindings so change Nunjucks
|
|
||||||
templateEngine.config.tags = {
|
|
||||||
variableStart: '{$',
|
|
||||||
variableEnd: '$}'
|
|
||||||
};
|
|
||||||
|
|
||||||
templateFinder.templateFolders
|
|
||||||
.unshift(path.resolve(__dirname, 'templates'));
|
|
||||||
|
|
||||||
templateFinder.templatePatterns = [
|
|
||||||
'${ doc.template }',
|
|
||||||
'${ doc.id }.${ doc.docType }.template.html',
|
|
||||||
'${ doc.id }.template.html',
|
|
||||||
'${ doc.docType }.template.html',
|
|
||||||
'common.template.html'
|
|
||||||
];
|
|
||||||
});
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
var Package = require('dgeni').Package;
|
|
||||||
|
|
||||||
module.exports = function mockPackage() {
|
|
||||||
|
|
||||||
return new Package('mockPackage', [require('../')])
|
|
||||||
|
|
||||||
// provide a mock log service
|
|
||||||
.factory('log', function() { return require('dgeni/lib/mocks/log')(false); })
|
|
||||||
// .factory('templateEngine', function() { return {}; });
|
|
||||||
|
|
||||||
};
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
var _ = require('lodash');
|
|
||||||
var path = require('canonical-path');
|
|
||||||
|
|
||||||
module.exports = function createTypeDefinitionFile(log) {
|
|
||||||
|
|
||||||
return {
|
|
||||||
$runAfter: ['processing-docs'],
|
|
||||||
$runBefore: ['docs-processed'],
|
|
||||||
$validate: {
|
|
||||||
dtsPath: { presence: true },
|
|
||||||
dtsExtension: { presence: true },
|
|
||||||
typeDefinitions: { presence: true }
|
|
||||||
},
|
|
||||||
dtsPath: 'typings',
|
|
||||||
dtsExtension: '.d.ts',
|
|
||||||
typeDefinitions: [],
|
|
||||||
$process: function(docs) {
|
|
||||||
var dtsPath = this.dtsPath;
|
|
||||||
var dtsExtension = this.dtsExtension;
|
|
||||||
|
|
||||||
// For each type definition that we wish to create we define a dgeni "doc" for it
|
|
||||||
var typeDefDocs = _.map(this.typeDefinitions, function(def) {
|
|
||||||
|
|
||||||
var id = def.id + dtsExtension;
|
|
||||||
var docPath = path.join(dtsPath, id);
|
|
||||||
|
|
||||||
return {
|
|
||||||
docType: 'type-definition',
|
|
||||||
id: id,
|
|
||||||
aliases: [id],
|
|
||||||
path: docPath,
|
|
||||||
outputPath: docPath,
|
|
||||||
// A type definition may include a number of top level modules
|
|
||||||
// And those modules could be aliased (such as 'angular2/angular2.api' -> 'angular2/angular2')
|
|
||||||
moduleDocs: _.transform(def.modules, function(moduleDocs, id, alias) {
|
|
||||||
moduleDocs[id] = { id: alias, doc: null };
|
|
||||||
})
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
// Now add all the module docs to their corresponding type definition doc
|
|
||||||
_.forEach(docs, function(doc) {
|
|
||||||
_.forEach(typeDefDocs, function(typeDefDoc) {
|
|
||||||
if(typeDefDoc.moduleDocs[doc.id]) {
|
|
||||||
// Add a copy, because we are going to modify it
|
|
||||||
typeDefDoc.moduleDocs[doc.id].doc = doc;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
return _.filter(typeDefDocs, function(doc) {
|
|
||||||
_.forEach(doc.moduleDocs, function(modDoc, alias) {
|
|
||||||
if (!doc || !modDoc.doc) {
|
|
||||||
log.error('createTypeDefinitionFile processor: no such module "' + alias + '" (Did you forget to add it to the modules to load?)');
|
|
||||||
doc = null;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
_.forEach(modDoc.doc.exports, function(exportDoc) {
|
|
||||||
|
|
||||||
// Search for classes with a constructor marked as `@private`
|
|
||||||
if (exportDoc.docType === 'class' && exportDoc.constructorDoc && exportDoc.constructorDoc.private) {
|
|
||||||
|
|
||||||
// Convert this class to an interface with no constructor
|
|
||||||
exportDoc.docType = 'interface';
|
|
||||||
exportDoc.constructorDoc = null;
|
|
||||||
|
|
||||||
if (exportDoc.heritage) {
|
|
||||||
// convert the heritage since interfaces use `extends` not `implements`
|
|
||||||
exportDoc.heritage = exportDoc.heritage.replace('implements', 'extends');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the `declare var SomeClass extends InjectableReference` construct
|
|
||||||
modDoc.doc.exports.push({
|
|
||||||
docType: 'var',
|
|
||||||
name: exportDoc.name,
|
|
||||||
id: exportDoc.id,
|
|
||||||
heritage: ': InjectableReference'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return !!doc;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
-48
@@ -1,48 +0,0 @@
|
|||||||
var mockPackage = require('../mocks/mockPackage');
|
|
||||||
var Dgeni = require('dgeni');
|
|
||||||
var path = require('canonical-path');
|
|
||||||
var _ = require('lodash');
|
|
||||||
|
|
||||||
describe('createTypeDefinitionFile processor', function() {
|
|
||||||
var dgeni, injector, processor;
|
|
||||||
|
|
||||||
beforeEach(function() {
|
|
||||||
dgeni = new Dgeni([mockPackage()]);
|
|
||||||
injector = dgeni.configureInjector();
|
|
||||||
processor = injector.get('createTypeDefinitionFile');
|
|
||||||
|
|
||||||
// Initialize the processor
|
|
||||||
processor.typeDefinitions = [{
|
|
||||||
id: 'angular2/angular2',
|
|
||||||
modules: { 'angular2/angular2': 'angular2/angular2' }
|
|
||||||
}];
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
describe('classes with private constructors', function() {
|
|
||||||
|
|
||||||
it('should convert heritage from `implements` into `extends`', function() {
|
|
||||||
|
|
||||||
// Create some mock docs for testing
|
|
||||||
var docs = [
|
|
||||||
{
|
|
||||||
id: 'angular2/angular2',
|
|
||||||
exports: [
|
|
||||||
{ docType: 'class', heritage: 'implements Xyz', constructorDoc: { private: true } }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
docs = processor.$process(docs);
|
|
||||||
|
|
||||||
expect(docs.length).toEqual(1);
|
|
||||||
expect(docs[0].docType).toEqual('type-definition');
|
|
||||||
|
|
||||||
var moduleDoc = docs[0].moduleDocs['angular2/angular2'].doc;
|
|
||||||
expect(moduleDoc.exports.length).toEqual(2);
|
|
||||||
expect(moduleDoc.exports[0].heritage).toEqual('extends Xyz');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
-17
@@ -1,17 +0,0 @@
|
|||||||
{% extends '../type-definition.template.html' %}
|
|
||||||
{% block staticDeclarations %}
|
|
||||||
|
|
||||||
interface List<T> extends Array<T> {}
|
|
||||||
interface Map<K,V> {}
|
|
||||||
interface StringMap<K,V> extends Map<K,V> {}
|
|
||||||
|
|
||||||
declare module ng {
|
|
||||||
// See https://github.com/Microsoft/TypeScript/issues/1168
|
|
||||||
class BaseException /* extends Error */ {
|
|
||||||
message: string;
|
|
||||||
stack: string;
|
|
||||||
toString(): string;
|
|
||||||
}
|
|
||||||
interface InjectableReference {}
|
|
||||||
}
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
|
|
||||||
{%- macro commentBlock(doc, level) -%}
|
|
||||||
{%- if doc.content | trim %}
|
|
||||||
|
|
||||||
{% if level > 1 %}{$ '/**' | indent(level-1, true) | replace(r/\n$/, "") $}{% else %}/**{% endif %}
|
|
||||||
{$ doc.content | trim | replace(r/^/gm, "* ") | indent(level, true) | replace(r/\n$/, "") $}
|
|
||||||
{$ '*/' | indent(level, true) | replace(r/\n$/, "") $}{% endif -%}
|
|
||||||
{%- endmacro -%}
|
|
||||||
|
|
||||||
|
|
||||||
{%- macro memberInfo(member) -%}
|
|
||||||
{$ commentBlock(member, 5) $}
|
|
||||||
{$ member.name $}{% if member.optional %}?{% endif -%}
|
|
||||||
{% if member.typeParameters %}<{% for typeParam in member.typeParameters %}{$ typeParam $}{% if not loop.last %}, {% endif %}{% endfor %}>{% endif -%}
|
|
||||||
{%- if member.parameters -%}({% for param in member.parameters %}{$ param $}{% if not loop.last %}, {% endif %}{% endfor %}){%- endif -%}
|
|
||||||
{%- if member.returnType == 'Directive' %}: DirectiveAnnotation{%- elif member.returnType -%}: {$ member.returnType $}{%- else -%}: void
|
|
||||||
{%- endif -%};
|
|
||||||
{%- endmacro -%}
|
|
||||||
|
|
||||||
|
|
||||||
// Type definitions for Angular v{$ versionInfo.currentVersion.full | replace(r/\+/, "_") $}
|
|
||||||
// Project: http://angular.io/
|
|
||||||
// Definitions by: angular team <https://github.com/angular/>
|
|
||||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
|
||||||
|
|
||||||
// ***********************************************************
|
|
||||||
// This file is generated by the Angular build process.
|
|
||||||
// Please do not create manual edits or send pull requests
|
|
||||||
// modifying this file.
|
|
||||||
// ***********************************************************
|
|
||||||
{% block staticDeclarations %}{% endblock %}
|
|
||||||
{% for alias, module in doc.moduleDocs %}
|
|
||||||
{$ commentBlock(module.doc, 1) $}
|
|
||||||
declare module ng {
|
|
||||||
|
|
||||||
{%- for export in module.doc.exports -%}
|
|
||||||
{%- if export.content -%}
|
|
||||||
{$ commentBlock(export, 3) $}
|
|
||||||
{%- endif %}
|
|
||||||
{$ export.docType $} {$ export.name $}{$ export.typeParams $}{%- if export.heritage == ' extends Directive' %} extends DirectiveAnnotation{% else %}{$ export.heritage $}{% endif %}
|
|
||||||
{%- if export.docType == 'class' or export.docType == 'interface' %} {
|
|
||||||
{%- if export.newMember %}
|
|
||||||
{$ memberInfo(export.newMember) $}
|
|
||||||
{% endif %}
|
|
||||||
{%- if export.callMember %}
|
|
||||||
{$ memberInfo(export.callMember) $}
|
|
||||||
{% endif -%}
|
|
||||||
{%- for member in export.members %}
|
|
||||||
{$ memberInfo(member) $}
|
|
||||||
{%- endfor %}
|
|
||||||
}
|
|
||||||
|
|
||||||
{%- elif export.docType == 'enum' %} {
|
|
||||||
{%- for member in export.members %}
|
|
||||||
{$ member $}{% if not loop.last %},
|
|
||||||
{%- endif -%}
|
|
||||||
{%- endfor %}
|
|
||||||
}
|
|
||||||
|
|
||||||
{%- else -%}
|
|
||||||
{% if export.parameters %}({% for param in export.parameters %}{$ param $}{% if not loop.last %}, {% endif %}{% endfor %}){%- endif %}
|
|
||||||
{%- if export.returnType %} : {$ export.returnType $} {% endif -%}
|
|
||||||
;
|
|
||||||
{%- endif %}
|
|
||||||
{% endfor %}
|
|
||||||
}
|
|
||||||
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
declare module "angular2/angular2" {
|
|
||||||
export = ng;
|
|
||||||
}
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
var basePackage = require('dgeni-packages/base');
|
|
||||||
var Package = require('dgeni').Package;
|
|
||||||
var path = require('canonical-path');
|
|
||||||
|
|
||||||
// Define the dgeni package for generating the docs
|
|
||||||
module.exports = new Package('typescript-parsing', [basePackage])
|
|
||||||
|
|
||||||
// Register the services and file readers
|
|
||||||
.factory(require('./services/modules'))
|
|
||||||
.factory(require('./services/tsParser'))
|
|
||||||
.factory(require('./services/tsParser/createCompilerHost'))
|
|
||||||
.factory(require('./services/tsParser/getFileInfo'))
|
|
||||||
.factory(require('./services/tsParser/getExportDocType'))
|
|
||||||
.factory(require('./services/tsParser/getContent'))
|
|
||||||
.factory(require('./services/tsParser/getDirectiveInfo'))
|
|
||||||
|
|
||||||
.factory(require('./services/convertPrivateClassesToInterfaces'))
|
|
||||||
|
|
||||||
.factory('EXPORT_DOC_TYPES', function() {
|
|
||||||
return [
|
|
||||||
'class',
|
|
||||||
'interface',
|
|
||||||
'function',
|
|
||||||
'var',
|
|
||||||
'const',
|
|
||||||
'let',
|
|
||||||
'enum',
|
|
||||||
'type-alias'
|
|
||||||
];
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
// Register the processors
|
|
||||||
.processor(require('./processors/readTypeScriptModules'))
|
|
||||||
|
|
||||||
|
|
||||||
// Configure the log service
|
|
||||||
.config(function(log) {
|
|
||||||
log.level = 'warn';
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
// Configure ids and paths
|
|
||||||
.config(function(computeIdsProcessor, computePathsProcessor, EXPORT_DOC_TYPES) {
|
|
||||||
|
|
||||||
computeIdsProcessor.idTemplates.push({
|
|
||||||
docTypes: ['member'],
|
|
||||||
idTemplate: '${classDoc.id}.${name}',
|
|
||||||
getAliases: function(doc) {
|
|
||||||
return doc.classDoc.aliases.map(function(alias) { return alias + '.' + doc.name; });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
computePathsProcessor.pathTemplates.push({
|
|
||||||
docTypes: ['member'],
|
|
||||||
pathTemplate: '${classDoc.path}#${name}',
|
|
||||||
getOutputPath: function() {} // These docs are not written to their own file, instead they are part of their class doc
|
|
||||||
});
|
|
||||||
|
|
||||||
var MODULES_DOCS_PATH = 'partials/modules';
|
|
||||||
|
|
||||||
computePathsProcessor.pathTemplates.push({
|
|
||||||
docTypes: ['module'],
|
|
||||||
pathTemplate: '/${id}',
|
|
||||||
outputPathTemplate: MODULES_DOCS_PATH + '/${id}/index.html'
|
|
||||||
});
|
|
||||||
|
|
||||||
computePathsProcessor.pathTemplates.push({
|
|
||||||
docTypes: EXPORT_DOC_TYPES,
|
|
||||||
pathTemplate: '${moduleDoc.path}/${name}',
|
|
||||||
outputPathTemplate: MODULES_DOCS_PATH + '/${path}/index.html'
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
var Package = require('dgeni').Package;
|
|
||||||
|
|
||||||
module.exports = function mockPackage() {
|
|
||||||
|
|
||||||
return new Package('mockPackage', [require('../')])
|
|
||||||
|
|
||||||
// provide a mock log service
|
|
||||||
.factory('log', function() { return require('dgeni/lib/mocks/log')(false); })
|
|
||||||
.factory('templateEngine', function() { return {}; });
|
|
||||||
|
|
||||||
};
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
export var __esModule = true;
|
|
||||||
export class OKToExport {}
|
|
||||||
export function _thisIsPrivate() {}
|
|
||||||
export var thisIsOK = '!';
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
export interface MyInterface {
|
|
||||||
optionalProperty? : string
|
|
||||||
<T, U extends Findable<T>>(param: T) : U
|
|
||||||
new (param: number) : MyInterface
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
export class Test {
|
|
||||||
firstItem;
|
|
||||||
constructor() { this.doStuff(); }
|
|
||||||
otherMethod() {}
|
|
||||||
doStuff() {}
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
export var x = 10;
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
export { x as y} from './privateModule';
|
|
||||||
|
|
||||||
export abstract class AbstractClass {}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
export var x = 100;
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
/**
|
|
||||||
* @module
|
|
||||||
* @description
|
|
||||||
* This is the module description
|
|
||||||
*/
|
|
||||||
|
|
||||||
export * from 'importedSrc';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is some random other comment
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is MyClass
|
|
||||||
*/
|
|
||||||
export class MyClass {
|
|
||||||
message: String;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new MyClass
|
|
||||||
* @param {String} name The name to say hello to
|
|
||||||
*/
|
|
||||||
constructor(name) { this.message = 'hello ' + name; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return a greeting message
|
|
||||||
*/
|
|
||||||
greet() { return this.message; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An exported function
|
|
||||||
*/
|
|
||||||
export var myFn = (val: number) => return val * 2;
|
|
||||||
@@ -1,454 +0,0 @@
|
|||||||
var glob = require('glob');
|
|
||||||
var path = require('canonical-path');
|
|
||||||
var _ = require('lodash');
|
|
||||||
var ts = require('typescript');
|
|
||||||
|
|
||||||
module.exports = function readTypeScriptModules(tsParser, modules, getFileInfo,
|
|
||||||
getDirectiveInfo,
|
|
||||||
getExportDocType, getContent,
|
|
||||||
createDocMessage, log) {
|
|
||||||
|
|
||||||
return {
|
|
||||||
$runAfter: ['files-read'],
|
|
||||||
$runBefore: ['parsing-tags'],
|
|
||||||
|
|
||||||
$validate: {
|
|
||||||
sourceFiles: {presence: true},
|
|
||||||
basePath: {presence: true},
|
|
||||||
hidePrivateMembers: {inclusion: [true, false]},
|
|
||||||
sortClassMembers: {inclusion: [true, false]},
|
|
||||||
ignoreExportsMatching: {}
|
|
||||||
},
|
|
||||||
|
|
||||||
// A collection of globs that identify those modules for which we should create docs
|
|
||||||
sourceFiles: [],
|
|
||||||
// The base path from which to load the source files
|
|
||||||
basePath: '.',
|
|
||||||
// We can ignore members of classes that are private
|
|
||||||
hidePrivateMembers: true,
|
|
||||||
// We leave class members sorted in order of declaration
|
|
||||||
sortClassMembers: false,
|
|
||||||
// We can provide a collection of strings or regexes to ignore exports whose export names match
|
|
||||||
ignoreExportsMatching: ['___esModule'],
|
|
||||||
|
|
||||||
$process: function(docs) {
|
|
||||||
|
|
||||||
// Convert ignoreExportsMatching to an array of regexes
|
|
||||||
var ignoreExportsMatching = convertToRegexCollection(this.ignoreExportsMatching);
|
|
||||||
|
|
||||||
var hidePrivateMembers = this.hidePrivateMembers;
|
|
||||||
var sortClassMembers = this.sortClassMembers;
|
|
||||||
|
|
||||||
var basePath = path.resolve(this.basePath);
|
|
||||||
var filesPaths = expandSourceFiles(this.sourceFiles, basePath);
|
|
||||||
var parseInfo = tsParser.parse(filesPaths, this.basePath);
|
|
||||||
var moduleSymbols = parseInfo.moduleSymbols;
|
|
||||||
|
|
||||||
// Iterate through each of the modules that were parsed and generate a module doc
|
|
||||||
// as well as docs for each module's exports.
|
|
||||||
moduleSymbols.forEach(function(moduleSymbol) {
|
|
||||||
|
|
||||||
var moduleDoc = createModuleDoc(moduleSymbol, basePath);
|
|
||||||
|
|
||||||
// Add this module doc to the module lookup collection and the docs collection
|
|
||||||
modules[moduleDoc.id] = moduleDoc;
|
|
||||||
docs.push(moduleDoc);
|
|
||||||
|
|
||||||
// Iterate through this module's exports and generate a doc for each
|
|
||||||
moduleSymbol.exportArray.forEach(function(exportSymbol) {
|
|
||||||
|
|
||||||
// Ignore exports starting with an underscore
|
|
||||||
if (anyMatches(ignoreExportsMatching, exportSymbol.name)) return;
|
|
||||||
|
|
||||||
// If the symbol is an Alias then for most things we want the original resolved symbol
|
|
||||||
var resolvedExport = exportSymbol.resolvedSymbol || exportSymbol;
|
|
||||||
|
|
||||||
// If the resolved symbol contains no declarations then it is invalid
|
|
||||||
// (probably an abstract class)
|
|
||||||
// For the moment we are just going to ignore such exports
|
|
||||||
// TODO: find a way of generating docs for them
|
|
||||||
if (!resolvedExport.declarations) return;
|
|
||||||
|
|
||||||
var exportDoc = createExportDoc(exportSymbol.name, resolvedExport, moduleDoc, basePath, parseInfo.typeChecker);
|
|
||||||
log.debug('>>>> EXPORT: ' + exportDoc.name + ' (' + exportDoc.docType + ') from ' + moduleDoc.id);
|
|
||||||
|
|
||||||
// Add this export doc to its module doc
|
|
||||||
moduleDoc.exports.push(exportDoc);
|
|
||||||
docs.push(exportDoc);
|
|
||||||
|
|
||||||
exportDoc.members = [];
|
|
||||||
exportDoc.statics = [];
|
|
||||||
|
|
||||||
// Generate docs for each of the export's members
|
|
||||||
if (resolvedExport.flags & ts.SymbolFlags.HasMembers) {
|
|
||||||
|
|
||||||
for(var memberName in resolvedExport.members) {
|
|
||||||
// FIXME(alexeagle): why do generic type params appear in members?
|
|
||||||
if (memberName === 'T') {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
log.silly('>>>>>> member: ' + memberName + ' from ' + exportDoc.id + ' in ' + moduleDoc.id);
|
|
||||||
var memberSymbol = resolvedExport.members[memberName];
|
|
||||||
var memberDoc = createMemberDoc(memberSymbol, exportDoc, basePath, parseInfo.typeChecker);
|
|
||||||
|
|
||||||
// We special case the constructor and sort the other members alphabetically
|
|
||||||
if (memberSymbol.flags & ts.SymbolFlags.Constructor) {
|
|
||||||
exportDoc.constructorDoc = memberDoc;
|
|
||||||
docs.push(memberDoc);
|
|
||||||
} else if (!hidePrivateMembers || memberSymbol.name.charAt(0) !== '_') {
|
|
||||||
docs.push(memberDoc);
|
|
||||||
exportDoc.members.push(memberDoc);
|
|
||||||
} else if (memberSymbol.name === '__call' && memberSymbol.flags & ts.SymbolFlags.Signature) {
|
|
||||||
docs.push(memberDoc);
|
|
||||||
exportDoc.callMember = memberDoc;
|
|
||||||
} else if (memberSymbol.name === '__new' && memberSymbol.flags & ts.SymbolFlags.Signature) {
|
|
||||||
docs.push(memberDoc);
|
|
||||||
exportDoc.newMember = memberDoc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (exportDoc.docType === 'enum') {
|
|
||||||
for(var memberName in resolvedExport.exports) {
|
|
||||||
log.silly('>>>>>> member: ' + memberName + ' from ' + exportDoc.id + ' in ' + moduleDoc.id);
|
|
||||||
var memberSymbol = resolvedExport.exports[memberName];
|
|
||||||
var memberDoc = createMemberDoc(memberSymbol, exportDoc, basePath, parseInfo.typeChecker);
|
|
||||||
docs.push(memberDoc);
|
|
||||||
exportDoc.members.push(memberDoc);
|
|
||||||
}
|
|
||||||
} else if (resolvedExport.flags & ts.SymbolFlags.HasExports) {
|
|
||||||
for (var exported in resolvedExport.exports) {
|
|
||||||
if (exported === 'prototype') continue;
|
|
||||||
if (hidePrivateMembers && exported.charAt(0) === '_') continue;
|
|
||||||
var memberSymbol = resolvedExport.exports[exported];
|
|
||||||
var memberDoc = createMemberDoc(memberSymbol, exportDoc, basePath, parseInfo.typeChecker);
|
|
||||||
memberDoc.isStatic = true;
|
|
||||||
docs.push(memberDoc);
|
|
||||||
exportDoc.statics.push(memberDoc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sortClassMembers) {
|
|
||||||
exportDoc.members.sort(function(a, b) {
|
|
||||||
if (a.name > b.name) return 1;
|
|
||||||
if (a.name < b.name) return -1;
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
exportDoc.statics.sort(function(a, b) {
|
|
||||||
if (a.name > b.name) return 1;
|
|
||||||
if (a.name < b.name) return -1;
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
function createModuleDoc(moduleSymbol, basePath) {
|
|
||||||
var id = moduleSymbol.name.replace(/^"|"$/g, '');
|
|
||||||
var name = id.split('/').pop();
|
|
||||||
var moduleDoc = {
|
|
||||||
docType: 'module',
|
|
||||||
name: name,
|
|
||||||
id: id,
|
|
||||||
aliases: [id, name],
|
|
||||||
moduleTree: moduleSymbol,
|
|
||||||
content: getContent(moduleSymbol),
|
|
||||||
exports: [],
|
|
||||||
fileInfo: getFileInfo(moduleSymbol, basePath),
|
|
||||||
location: getLocation(moduleSymbol)
|
|
||||||
};
|
|
||||||
return moduleDoc;
|
|
||||||
}
|
|
||||||
|
|
||||||
function createExportDoc(name, exportSymbol, moduleDoc, basePath, typeChecker) {
|
|
||||||
var typeParamString = '';
|
|
||||||
var heritageString = '';
|
|
||||||
var typeDefinition = '';
|
|
||||||
|
|
||||||
exportSymbol.declarations.forEach(function(decl) {
|
|
||||||
var sourceFile = ts.getSourceFileOfNode(decl);
|
|
||||||
|
|
||||||
if (decl.typeParameters) {
|
|
||||||
typeParamString = '<' + getText(sourceFile, decl.typeParameters) + '>';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (decl.symbol.flags & ts.SymbolFlags.TypeAlias) {
|
|
||||||
typeDefinition = getText(sourceFile, decl.type);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (decl.heritageClauses) {
|
|
||||||
decl.heritageClauses.forEach(function(heritage) {
|
|
||||||
|
|
||||||
if (heritage.token == ts.SyntaxKind.ExtendsKeyword) {
|
|
||||||
heritageString += " extends";
|
|
||||||
heritage.types.forEach(function(typ, idx) {
|
|
||||||
heritageString += (idx > 0 ? ',' : '') + typ.getFullText();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (heritage.token == ts.SyntaxKind.ImplementsKeyword) {
|
|
||||||
heritageString += " implements";
|
|
||||||
heritage.types.forEach(function(typ, idx) {
|
|
||||||
heritageString += (idx > 0 ? ', ' : '') + typ.getFullText();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
//Make sure duplicate aliases aren't created, so "Ambiguous link" warnings are prevented
|
|
||||||
var aliasNames = [name, moduleDoc.id + '/' + name];
|
|
||||||
if (typeParamString) {
|
|
||||||
aliasNames.push(name + typeParamString);
|
|
||||||
aliasNames.push(moduleDoc.id + '/' + name + typeParamString);
|
|
||||||
}
|
|
||||||
|
|
||||||
var exportDoc = {
|
|
||||||
docType: getExportDocType(exportSymbol),
|
|
||||||
exportSymbol: exportSymbol,
|
|
||||||
name: name,
|
|
||||||
id: moduleDoc.id + '/' + name,
|
|
||||||
typeParams: typeParamString,
|
|
||||||
heritage: heritageString,
|
|
||||||
decorators: getDecorators(exportSymbol),
|
|
||||||
aliases: aliasNames,
|
|
||||||
moduleDoc: moduleDoc,
|
|
||||||
content: getContent(exportSymbol),
|
|
||||||
fileInfo: getFileInfo(exportSymbol, basePath),
|
|
||||||
location: getLocation(exportSymbol),
|
|
||||||
directiveInfo: getDirectiveInfo(exportSymbol)
|
|
||||||
};
|
|
||||||
|
|
||||||
if (exportDoc.docType === 'var' || exportDoc.docType === 'const' || exportDoc.docType === 'let') {
|
|
||||||
exportDoc.symbolTypeName = exportSymbol.valueDeclaration.type &&
|
|
||||||
exportSymbol.valueDeclaration.type.typeName &&
|
|
||||||
exportSymbol.valueDeclaration.type.typeName.text;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (exportDoc.docType === 'type-alias') {
|
|
||||||
exportDoc.returnType = getReturnType(typeChecker, exportSymbol);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(exportSymbol.flags & ts.SymbolFlags.Function) {
|
|
||||||
exportDoc.parameters = getParameters(typeChecker, exportSymbol);
|
|
||||||
}
|
|
||||||
if(exportSymbol.flags & ts.SymbolFlags.Value) {
|
|
||||||
exportDoc.returnType = getReturnType(typeChecker, exportSymbol);
|
|
||||||
}
|
|
||||||
if (exportSymbol.flags & ts.SymbolFlags.TypeAlias) {
|
|
||||||
exportDoc.typeDefinition = typeDefinition;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compute the original module name from the relative file path
|
|
||||||
exportDoc.originalModule = exportDoc.fileInfo.relativePath
|
|
||||||
.replace(new RegExp('\.' + exportDoc.fileInfo.extension + '$'), '');
|
|
||||||
|
|
||||||
return exportDoc;
|
|
||||||
}
|
|
||||||
|
|
||||||
function createMemberDoc(memberSymbol, classDoc, basePath, typeChecker) {
|
|
||||||
var memberDoc = {
|
|
||||||
docType: 'member',
|
|
||||||
classDoc: classDoc,
|
|
||||||
name: memberSymbol.name,
|
|
||||||
decorators: getDecorators(memberSymbol),
|
|
||||||
content: getContent(memberSymbol),
|
|
||||||
fileInfo: getFileInfo(memberSymbol, basePath),
|
|
||||||
location: getLocation(memberSymbol)
|
|
||||||
};
|
|
||||||
|
|
||||||
memberDoc.typeParameters = getTypeParameters(typeChecker, memberSymbol);
|
|
||||||
|
|
||||||
if(memberSymbol.flags & (ts.SymbolFlags.Signature) ) {
|
|
||||||
memberDoc.parameters = getParameters(typeChecker, memberSymbol);
|
|
||||||
memberDoc.returnType = getReturnType(typeChecker, memberSymbol);
|
|
||||||
switch(memberDoc.name) {
|
|
||||||
case '__call':
|
|
||||||
memberDoc.name = '';
|
|
||||||
break;
|
|
||||||
case '__new':
|
|
||||||
memberDoc.name = 'new';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (memberSymbol.flags & ts.SymbolFlags.Method) {
|
|
||||||
// NOTE: we use the property name `parameters` here so we don't conflict
|
|
||||||
// with the `params` property that will be updated by dgeni reading the
|
|
||||||
// `@param` tags from the docs
|
|
||||||
memberDoc.parameters = getParameters(typeChecker, memberSymbol);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (memberSymbol.flags & ts.SymbolFlags.Constructor) {
|
|
||||||
memberDoc.parameters = getParameters(typeChecker, memberSymbol);
|
|
||||||
memberDoc.name = 'constructor';
|
|
||||||
}
|
|
||||||
|
|
||||||
if(memberSymbol.flags & ts.SymbolFlags.Value) {
|
|
||||||
memberDoc.returnType = getReturnType(typeChecker, memberSymbol);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(memberSymbol.flags & ts.SymbolFlags.Optional) {
|
|
||||||
memberDoc.optional = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return memberDoc;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function getDecorators(symbol) {
|
|
||||||
|
|
||||||
var declaration = symbol.valueDeclaration || symbol.declarations[0];
|
|
||||||
var sourceFile = ts.getSourceFileOfNode(declaration);
|
|
||||||
|
|
||||||
var decorators = declaration.decorators && declaration.decorators.map(function(decorator) {
|
|
||||||
decorator = decorator.expression;
|
|
||||||
return {
|
|
||||||
name: decorator.expression ? decorator.expression.text : decorator.text,
|
|
||||||
arguments: decorator.arguments && decorator.arguments.map(function(argument) {
|
|
||||||
return getText(sourceFile, argument).trim();
|
|
||||||
}),
|
|
||||||
argumentInfo: decorator.arguments && decorator.arguments.map(function(argument) {
|
|
||||||
return parseArgument(argument);
|
|
||||||
}),
|
|
||||||
expression: decorator
|
|
||||||
};
|
|
||||||
});
|
|
||||||
return decorators;
|
|
||||||
}
|
|
||||||
|
|
||||||
function parseProperties(properties) {
|
|
||||||
var result = {};
|
|
||||||
_.forEach(properties, function(property) {
|
|
||||||
result[property.name.text] = parseArgument(property.initializer);
|
|
||||||
});
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function parseArgument(argument) {
|
|
||||||
if (argument.text) return argument.text;
|
|
||||||
if (argument.properties) return parseProperties(argument.properties);
|
|
||||||
if (argument.elements) return argument.elements.map(function(element) { return element.text; });
|
|
||||||
var sourceFile = ts.getSourceFileOfNode(argument);
|
|
||||||
var text = getText(sourceFile, argument).trim();
|
|
||||||
return text;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getParameters(typeChecker, symbol) {
|
|
||||||
var declaration = symbol.valueDeclaration || symbol.declarations[0];
|
|
||||||
var sourceFile = ts.getSourceFileOfNode(declaration);
|
|
||||||
if (!declaration.parameters) {
|
|
||||||
var location = getLocation(symbol);
|
|
||||||
throw new Error('missing declaration parameters for "' + symbol.name +
|
|
||||||
'" in ' + sourceFile.fileName +
|
|
||||||
' at line ' + location.start.line);
|
|
||||||
}
|
|
||||||
return declaration.parameters.map(function(parameter) {
|
|
||||||
var paramText = '';
|
|
||||||
if (parameter.dotDotDotToken) {
|
|
||||||
paramText += '...';
|
|
||||||
}
|
|
||||||
paramText += getText(sourceFile, parameter.name);
|
|
||||||
if (parameter.questionToken || parameter.initializer) {
|
|
||||||
paramText += '?';
|
|
||||||
}
|
|
||||||
if (parameter.type) {
|
|
||||||
paramText += ':' + getType(sourceFile, parameter.type);
|
|
||||||
} else {
|
|
||||||
paramText += ': any';
|
|
||||||
if (parameter.dotDotDotToken) {
|
|
||||||
paramText += '[]';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return paramText.trim();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function getTypeParameters(typeChecker, symbol) {
|
|
||||||
var declaration = symbol.valueDeclaration || symbol.declarations[0];
|
|
||||||
var sourceFile = ts.getSourceFileOfNode(declaration);
|
|
||||||
if (!declaration.typeParameters) return;
|
|
||||||
var typeParams = declaration.typeParameters.map(function(type) {
|
|
||||||
return getText(sourceFile, type).trim();
|
|
||||||
});
|
|
||||||
return typeParams;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getReturnType(typeChecker, symbol) {
|
|
||||||
var declaration = symbol.valueDeclaration || symbol.declarations[0];
|
|
||||||
var sourceFile = ts.getSourceFileOfNode(declaration);
|
|
||||||
if (declaration.type) {
|
|
||||||
return getType(sourceFile, declaration.type).trim();
|
|
||||||
} else if (declaration.initializer) {
|
|
||||||
// The symbol does not have a "type" but it is being initialized
|
|
||||||
// so we can deduce the type of from the initializer (mostly).
|
|
||||||
if (declaration.initializer.expression) {
|
|
||||||
return declaration.initializer.expression.text.trim();
|
|
||||||
} else {
|
|
||||||
return getType(sourceFile, declaration.initializer).trim();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function expandSourceFiles(sourceFiles, basePath) {
|
|
||||||
var filePaths = [];
|
|
||||||
sourceFiles.forEach(function(sourcePattern) {
|
|
||||||
filePaths = filePaths.concat(glob.sync(sourcePattern, { cwd: basePath }));
|
|
||||||
});
|
|
||||||
return filePaths;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function getText(sourceFile, node) {
|
|
||||||
return sourceFile.text.substring(node.pos, node.end);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Strip any local renamed imports from the front of types
|
|
||||||
function getType(sourceFile, type) {
|
|
||||||
var text = getText(sourceFile, type);
|
|
||||||
while (text.indexOf(".") >= 0) {
|
|
||||||
// Keep namespaced symbols in RxNext
|
|
||||||
if (text.match(/^\s*RxNext\./)) break;
|
|
||||||
// handle the case List<thing.stuff> -> List<stuff>
|
|
||||||
text = text.replace(/([^.<]*)\.([^>]*)/, "$2");
|
|
||||||
}
|
|
||||||
return text;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getLocation(symbol) {
|
|
||||||
var node = symbol.valueDeclaration || symbol.declarations[0];
|
|
||||||
var sourceFile = ts.getSourceFileOfNode(node);
|
|
||||||
var location = {
|
|
||||||
start: ts.getLineAndCharacterOfPosition(sourceFile, node.pos),
|
|
||||||
end: ts.getLineAndCharacterOfPosition(sourceFile, node.end)
|
|
||||||
};
|
|
||||||
return location;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
function convertToRegexCollection(items) {
|
|
||||||
if (!items) return [];
|
|
||||||
|
|
||||||
// Must be an array
|
|
||||||
if (!_.isArray(items)) {
|
|
||||||
items = [items];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert string to exact matching regexes
|
|
||||||
return items.map(function(item) {
|
|
||||||
return _.isString(item) ? new RegExp('^' + item + '$') : item;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function anyMatches(regexes, item) {
|
|
||||||
for(var i=0; i<regexes.length; ++i) {
|
|
||||||
if ( item.match(regexes[i]) ) return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
@@ -1,136 +0,0 @@
|
|||||||
var mockPackage = require('../mocks/mockPackage');
|
|
||||||
var Dgeni = require('dgeni');
|
|
||||||
var path = require('canonical-path');
|
|
||||||
var _ = require('lodash');
|
|
||||||
|
|
||||||
describe('readTypeScriptModules', function() {
|
|
||||||
var dgeni, injector, processor;
|
|
||||||
|
|
||||||
beforeEach(function() {
|
|
||||||
dgeni = new Dgeni([mockPackage()]);
|
|
||||||
injector = dgeni.configureInjector();
|
|
||||||
processor = injector.get('readTypeScriptModules');
|
|
||||||
processor.basePath = path.resolve(__dirname, '../mocks/readTypeScriptModules');
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('exportDocs', function() {
|
|
||||||
it('should provide the original module if the export is re-exported', function() {
|
|
||||||
processor.sourceFiles = [ 'publicModule.ts' ];
|
|
||||||
var docs = [];
|
|
||||||
processor.$process(docs);
|
|
||||||
|
|
||||||
var exportedDoc = docs[1];
|
|
||||||
expect(exportedDoc.originalModule).toEqual('privateModule');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should include exported abstract classes', function() {
|
|
||||||
processor.sourceFiles = [ 'publicModule.ts' ];
|
|
||||||
var docs = [];
|
|
||||||
processor.$process(docs);
|
|
||||||
|
|
||||||
var exportedDoc = docs[2];
|
|
||||||
expect(exportedDoc.name).toEqual('AbstractClass');
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
describe('ignoreExportsMatching', function() {
|
|
||||||
it('should ignore exports that match items in the `ignoreExportsMatching` property', function() {
|
|
||||||
processor.sourceFiles = [ 'ignoreExportsMatching.ts'];
|
|
||||||
processor.ignoreExportsMatching = [/^_/];
|
|
||||||
var docs = [];
|
|
||||||
processor.$process(docs);
|
|
||||||
|
|
||||||
var moduleDoc = docs[0];
|
|
||||||
expect(moduleDoc.docType).toEqual('module');
|
|
||||||
expect(moduleDoc.exports).toEqual([
|
|
||||||
jasmine.objectContaining({ name: 'OKToExport' }),
|
|
||||||
jasmine.objectContaining({ name: 'thisIsOK' })
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should only ignore `___esModule` exports by default', function() {
|
|
||||||
processor.sourceFiles = [ 'ignoreExportsMatching.ts'];
|
|
||||||
var docs = [];
|
|
||||||
processor.$process(docs);
|
|
||||||
|
|
||||||
var moduleDoc = docs[0];
|
|
||||||
expect(moduleDoc.docType).toEqual('module');
|
|
||||||
expect(getNames(moduleDoc.exports)).toEqual([
|
|
||||||
'OKToExport',
|
|
||||||
'_thisIsPrivate',
|
|
||||||
'thisIsOK'
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
describe('interfaces', function() {
|
|
||||||
|
|
||||||
it('should mark optional properties', function() {
|
|
||||||
processor.sourceFiles = [ 'interfaces.ts'];
|
|
||||||
var docs = [];
|
|
||||||
processor.$process(docs);
|
|
||||||
|
|
||||||
var moduleDoc = docs[0];
|
|
||||||
var exportedInterface = moduleDoc.exports[0];
|
|
||||||
var member = exportedInterface.members[0];
|
|
||||||
expect(member.name).toEqual('optionalProperty');
|
|
||||||
expect(member.optional).toEqual(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
it('should handle "call" type interfaces', function() {
|
|
||||||
processor.sourceFiles = [ 'interfaces.ts'];
|
|
||||||
var docs = [];
|
|
||||||
processor.$process(docs);
|
|
||||||
|
|
||||||
var moduleDoc = docs[0];
|
|
||||||
var exportedInterface = moduleDoc.exports[0];
|
|
||||||
|
|
||||||
expect(exportedInterface.callMember).toBeDefined();
|
|
||||||
expect(exportedInterface.callMember.parameters).toEqual(['param: T']);
|
|
||||||
expect(exportedInterface.callMember.returnType).toEqual('U');
|
|
||||||
expect(exportedInterface.callMember.typeParameters).toEqual(['T', 'U extends Findable<T>']);
|
|
||||||
expect(exportedInterface.newMember).toBeDefined();
|
|
||||||
expect(exportedInterface.newMember.parameters).toEqual(['param: number']);
|
|
||||||
expect(exportedInterface.newMember.returnType).toEqual('MyInterface');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
describe('ordering of members', function() {
|
|
||||||
it('should order class members in order of appearance (by default)', function() {
|
|
||||||
processor.sourceFiles = ['orderingOfMembers.ts'];
|
|
||||||
var docs = [];
|
|
||||||
processor.$process(docs);
|
|
||||||
var classDoc = _.find(docs, { docType: 'class' });
|
|
||||||
expect(classDoc.docType).toEqual('class');
|
|
||||||
expect(getNames(classDoc.members)).toEqual([
|
|
||||||
'firstItem',
|
|
||||||
'otherMethod',
|
|
||||||
'doStuff',
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
it('should not order class members if not sortClassMembers is false', function() {
|
|
||||||
processor.sourceFiles = ['orderingOfMembers.ts'];
|
|
||||||
processor.sortClassMembers = false;
|
|
||||||
var docs = [];
|
|
||||||
processor.$process(docs);
|
|
||||||
var classDoc = _.find(docs, { docType: 'class' });
|
|
||||||
expect(classDoc.docType).toEqual('class');
|
|
||||||
expect(getNames(classDoc.members)).toEqual([
|
|
||||||
'firstItem',
|
|
||||||
'otherMethod',
|
|
||||||
'doStuff'
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
function getNames(collection) {
|
|
||||||
return collection.map(function(item) { return item.name; });
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
var _ = require('lodash');
|
|
||||||
|
|
||||||
module.exports = function convertPrivateClassesToInterfaces() {
|
|
||||||
return function(exportDocs, addInjectableReference) {
|
|
||||||
_.forEach(exportDocs, function(exportDoc) {
|
|
||||||
|
|
||||||
// Search for classes with a constructor marked as `@internal`
|
|
||||||
if (exportDoc.docType === 'class' && exportDoc.constructorDoc && exportDoc.constructorDoc.internal) {
|
|
||||||
|
|
||||||
// Convert this class to an interface with no constructor
|
|
||||||
exportDoc.docType = 'interface';
|
|
||||||
exportDoc.constructorDoc = null;
|
|
||||||
|
|
||||||
if (exportDoc.heritage) {
|
|
||||||
// convert the heritage since interfaces use `extends` not `implements`
|
|
||||||
exportDoc.heritage = exportDoc.heritage.replace('implements', 'extends');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (addInjectableReference) {
|
|
||||||
// Add the `declare var SomeClass extends InjectableReference` construct
|
|
||||||
exportDocs.push({
|
|
||||||
docType: 'var',
|
|
||||||
name: exportDoc.name,
|
|
||||||
id: exportDoc.id,
|
|
||||||
returnType: 'InjectableReference'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
var mockPackage = require('../mocks/mockPackage');
|
|
||||||
var Dgeni = require('dgeni');
|
|
||||||
var _ = require('lodash');
|
|
||||||
|
|
||||||
describe('readTypeScriptModules', function() {
|
|
||||||
var dgeni, injector, convertPrivateClassesToInterfaces;
|
|
||||||
|
|
||||||
beforeEach(function() {
|
|
||||||
dgeni = new Dgeni([mockPackage()]);
|
|
||||||
injector = dgeni.configureInjector();
|
|
||||||
convertPrivateClassesToInterfaces = injector.get('convertPrivateClassesToInterfaces');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should convert private class docs to interface docs', function() {
|
|
||||||
var docs = [
|
|
||||||
{
|
|
||||||
docType: 'class',
|
|
||||||
name: 'privateClass',
|
|
||||||
id: 'privateClass',
|
|
||||||
constructorDoc: { internal: true }
|
|
||||||
}
|
|
||||||
];
|
|
||||||
convertPrivateClassesToInterfaces(docs, false);
|
|
||||||
expect(docs[0].docType).toEqual('interface');
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
it('should not touch non-private class docs', function() {
|
|
||||||
var docs = [
|
|
||||||
{
|
|
||||||
docType: 'class',
|
|
||||||
name: 'privateClass',
|
|
||||||
id: 'privateClass',
|
|
||||||
constructorDoc: { }
|
|
||||||
}
|
|
||||||
];
|
|
||||||
convertPrivateClassesToInterfaces(docs, false);
|
|
||||||
expect(docs[0].docType).toEqual('class');
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
it('should convert the heritage since interfaces use `extends` not `implements`', function() {
|
|
||||||
var docs = [
|
|
||||||
{
|
|
||||||
docType: 'class',
|
|
||||||
name: 'privateClass',
|
|
||||||
id: 'privateClass',
|
|
||||||
constructorDoc: { internal: true },
|
|
||||||
heritage: 'implements parentInterface'
|
|
||||||
}
|
|
||||||
];
|
|
||||||
convertPrivateClassesToInterfaces(docs, false);
|
|
||||||
expect(docs[0].heritage).toEqual('extends parentInterface');
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
it('should add new injectable reference types, if specified, to the passed in collection', function() {
|
|
||||||
var docs = [
|
|
||||||
{
|
|
||||||
docType: 'class',
|
|
||||||
name: 'privateClass',
|
|
||||||
id: 'privateClass',
|
|
||||||
constructorDoc: { internal: true },
|
|
||||||
heritage: 'implements parentInterface'
|
|
||||||
}
|
|
||||||
];
|
|
||||||
convertPrivateClassesToInterfaces(docs, true);
|
|
||||||
expect(docs[1]).toEqual({
|
|
||||||
docType : 'var',
|
|
||||||
name : 'privateClass',
|
|
||||||
id : 'privateClass',
|
|
||||||
returnType : 'InjectableReference'
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
module.exports = function modules() {
|
|
||||||
return {};
|
|
||||||
};
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
var ts = require('typescript');
|
|
||||||
var fs = require('fs');
|
|
||||||
var path = require('canonical-path');
|
|
||||||
|
|
||||||
// We need to provide our own version of CompilerHost because we want to set the
|
|
||||||
// base directory and specify what extensions to consider when trying to load a source
|
|
||||||
// file
|
|
||||||
module.exports = function createCompilerHost(log) {
|
|
||||||
|
|
||||||
return function createCompilerHost(options, baseDir, extensions) {
|
|
||||||
|
|
||||||
return {
|
|
||||||
getSourceFile: function(fileName, languageVersion, onError) {
|
|
||||||
var text, resolvedPath, resolvedPathWithExt;
|
|
||||||
|
|
||||||
// Strip off the extension and resolve relative to the baseDir
|
|
||||||
baseFilePath = fileName.replace(/\.[^.]+$/, '');
|
|
||||||
resolvedPath = path.resolve(baseDir, baseFilePath);
|
|
||||||
|
|
||||||
// Iterate through each possible extension and return the first source file that is actually found
|
|
||||||
for(var i=0; i<extensions.length; i++) {
|
|
||||||
|
|
||||||
// Try reading the content from files using each of the given extensions
|
|
||||||
try {
|
|
||||||
resolvedPathWithExt = resolvedPath + extensions[i];
|
|
||||||
log.silly('getSourceFile:', resolvedPathWithExt);
|
|
||||||
text = fs.readFileSync(resolvedPathWithExt, { encoding: options.charset });
|
|
||||||
log.debug('found source file:', fileName, resolvedPathWithExt);
|
|
||||||
return ts.createSourceFile(baseFilePath + extensions[i], text, languageVersion);
|
|
||||||
}
|
|
||||||
catch(e) {
|
|
||||||
// Try again if the file simply did not exist, otherwise report the error as a warning
|
|
||||||
if(e.code !== 'ENOENT') {
|
|
||||||
if (onError) onError(e.message);
|
|
||||||
log.warn('Error reading ' + resolvedPathWithExt + ' : ' + e.message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
getDefaultLibFileName: function(options) {
|
|
||||||
return path.resolve(path.dirname(ts.sys.getExecutingFilePath()), ts.getDefaultLibFileName(options));
|
|
||||||
},
|
|
||||||
writeFile: function(fileName, data, writeByteOrderMark, onError) {
|
|
||||||
// no-op
|
|
||||||
},
|
|
||||||
getCurrentDirectory: function() {
|
|
||||||
return baseDir;
|
|
||||||
},
|
|
||||||
useCaseSensitiveFileNames: function() {
|
|
||||||
return ts.sys.useCaseSensitiveFileNames;
|
|
||||||
},
|
|
||||||
getCanonicalFileName: function(fileName) {
|
|
||||||
// if underlying system can distinguish between two files whose names differs only in cases then file name already in canonical form.
|
|
||||||
// otherwise use toLowerCase as a canonical form.
|
|
||||||
return ts.sys.useCaseSensitiveFileNames ? fileName : fileName.toLowerCase();
|
|
||||||
},
|
|
||||||
getNewLine: function() {
|
|
||||||
return ts.sys.newLine;
|
|
||||||
},
|
|
||||||
fileExists: function(fileName) {
|
|
||||||
var text, resolvedPath, resolvedPathWithExt;
|
|
||||||
|
|
||||||
// Strip off the extension and resolve relative to the baseDir
|
|
||||||
baseFilePath = fileName.replace(/\.[^.]+$/, '');
|
|
||||||
resolvedPath = path.resolve(baseDir, baseFilePath);
|
|
||||||
|
|
||||||
// Iterate through each possible extension and return the first source file that is actually found
|
|
||||||
for(var i=0; i<extensions.length; i++) {
|
|
||||||
// Try reading the content from files using each of the given extensions
|
|
||||||
resolvedPathWithExt = resolvedPath + extensions[i];
|
|
||||||
if (fs.existsSync(resolvedPathWithExt)) return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
readFile: function(fileName) {
|
|
||||||
console.log('readFile - NOT IMPLEMENTED', fileName);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
var mockPackage = require('../../mocks/mockPackage');
|
|
||||||
var Dgeni = require('dgeni');
|
|
||||||
var path = require('canonical-path');
|
|
||||||
var ts = require('typescript');
|
|
||||||
|
|
||||||
describe('createCompilerHost', function() {
|
|
||||||
var dgeni, injector, options, host, baseDir, extensions;
|
|
||||||
|
|
||||||
beforeEach(function() {
|
|
||||||
dgeni = new Dgeni([mockPackage()]);
|
|
||||||
injector = dgeni.configureInjector();
|
|
||||||
var createCompilerHost = injector.get('createCompilerHost');
|
|
||||||
|
|
||||||
options = { charset: 'utf8' };
|
|
||||||
baseDir = path.resolve(__dirname, '../../mocks/tsParser');
|
|
||||||
extensions = ['.ts', '.js'];
|
|
||||||
|
|
||||||
host = createCompilerHost(options, baseDir, extensions);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('getSourceFile', function() {
|
|
||||||
it('should return a SourceFile object for a given path, with fileName relative to baseDir', function() {
|
|
||||||
var sourceFile = host.getSourceFile('testSrc.ts');
|
|
||||||
expect(sourceFile.fileName).toEqual('testSrc.ts');
|
|
||||||
expect(sourceFile.pos).toEqual(0);
|
|
||||||
expect(sourceFile.text).toEqual(jasmine.any(String));
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should try each of the configured extensions and update the filename to the correct extension', function() {
|
|
||||||
var sourceFile = host.getSourceFile('testSrc.js');
|
|
||||||
expect(sourceFile.fileName).toEqual('testSrc.ts');
|
|
||||||
|
|
||||||
sourceFile = host.getSourceFile('../mockPackage.ts');
|
|
||||||
expect(sourceFile.fileName).toEqual('../mockPackage.js');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
describe('getDefaultLibFileName', function() {
|
|
||||||
it('should return a path to the default library', function() {
|
|
||||||
expect(host.getDefaultLibFileName(options)).toContain('typescript/lib/lib.d.ts');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
describe('writeFile', function() {
|
|
||||||
it('should do nothing', function() {
|
|
||||||
host.writeFile();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
describe('getCurrentDirectory', function() {
|
|
||||||
it('should return the baseDir', function() {
|
|
||||||
expect(host.getCurrentDirectory()).toEqual(baseDir);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
describe('useCaseSensitiveFileNames', function() {
|
|
||||||
it('should return true if the OS is case sensitive', function() {
|
|
||||||
expect(host.useCaseSensitiveFileNames()).toBe(ts.sys.useCaseSensitiveFileNames);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
describe('getCanonicalFileName', function() {
|
|
||||||
it('should lower case the filename', function() {
|
|
||||||
var expectedFilePath = host.useCaseSensitiveFileNames() ? 'SomeFile.ts' : 'somefile.ts';
|
|
||||||
expect(host.getCanonicalFileName('SomeFile.ts')).toEqual(expectedFilePath);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
describe('getNewLine', function() {
|
|
||||||
it('should return the newline character for the OS', function() {
|
|
||||||
expect(host.getNewLine()).toEqual(require('os').EOL);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
var ts = require('typescript');
|
|
||||||
var LEADING_STAR = /^[^\S\r\n]*\*[^\S\n\r]?/gm;
|
|
||||||
|
|
||||||
module.exports = function getContent() {
|
|
||||||
return function(symbol) {
|
|
||||||
|
|
||||||
var content = "";
|
|
||||||
|
|
||||||
if (!symbol.declarations) return content;
|
|
||||||
|
|
||||||
symbol.declarations.forEach(function(declaration) {
|
|
||||||
|
|
||||||
// If this is left side of dotted module declaration, there is no doc comment associated with this declaration
|
|
||||||
if (declaration.kind === ts.SyntaxKind.ModuleDeclaration && declaration.body.kind === ts.SyntaxKind.ModuleDeclaration) {
|
|
||||||
return content;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If this is dotted module name, get the doc comments from the parent
|
|
||||||
while (declaration.kind === ts.SyntaxKind.ModuleDeclaration && declaration.parent.kind === ts.SyntaxKind.ModuleDeclaration) {
|
|
||||||
declaration = declaration.parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If this is a variable declaration then we get the doc comments from the grand parent
|
|
||||||
if (declaration.kind === ts.SyntaxKind.VariableDeclaration) {
|
|
||||||
declaration = declaration.parent.parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the source file of this declaration
|
|
||||||
var sourceFile = ts.getSourceFileOfNode(declaration);
|
|
||||||
var commentRanges = ts.getJsDocComments(declaration, sourceFile);
|
|
||||||
|
|
||||||
if (commentRanges) {
|
|
||||||
commentRanges.forEach(function(commentRange) {
|
|
||||||
content += sourceFile.text
|
|
||||||
.substring(commentRange.pos+ '/**'.length, commentRange.end - '*/'.length)
|
|
||||||
.replace(LEADING_STAR, '')
|
|
||||||
.trim();
|
|
||||||
if (commentRange.hasTrailingNewLine) {
|
|
||||||
content += '\n';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
content += '\n';
|
|
||||||
});
|
|
||||||
|
|
||||||
return content;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
|
|
||||||
module.exports = function getDirectiveInfo() {
|
|
||||||
|
|
||||||
return function (symbol) {
|
|
||||||
var directiveInfo;
|
|
||||||
if (symbol.valueDeclaration) {
|
|
||||||
var decorators = symbol.valueDeclaration.decorators;
|
|
||||||
decorators && decorators.forEach(function(decorator){
|
|
||||||
try {
|
|
||||||
var expr = decorator.expression;
|
|
||||||
var type = expr.expression.text.match(/Component|Directive/);
|
|
||||||
if (type) {
|
|
||||||
// type is either Component or Directive
|
|
||||||
// properties are selector, inputs and outputs
|
|
||||||
directiveInfo = { type: type[0], properties: [] };
|
|
||||||
|
|
||||||
//Directive only takes one argument
|
|
||||||
expr.arguments[0].properties.forEach(function(prop){
|
|
||||||
var name = prop.name.text;
|
|
||||||
if (name === "selector") {
|
|
||||||
directiveInfo.properties.push({name: name, values: prop.initializer.text.split(",")});
|
|
||||||
}
|
|
||||||
if (name === "inputs" || name === "outputs") {
|
|
||||||
var values = prop.initializer.elements.map(function(e){ return e.text });
|
|
||||||
directiveInfo.properties.push({name: name, values: values });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} catch(e){}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return directiveInfo;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
var ts = require('typescript');
|
|
||||||
|
|
||||||
module.exports = function getExportDocType(log) {
|
|
||||||
|
|
||||||
return function(symbol) {
|
|
||||||
if(symbol.flags & ts.SymbolFlags.Function) {
|
|
||||||
return 'function';
|
|
||||||
}
|
|
||||||
if(symbol.flags & ts.SymbolFlags.Class) {
|
|
||||||
return 'class';
|
|
||||||
}
|
|
||||||
if(symbol.flags & ts.SymbolFlags.Interface) {
|
|
||||||
return 'interface';
|
|
||||||
}
|
|
||||||
if(symbol.flags & ts.SymbolFlags.ConstEnum) {
|
|
||||||
return 'enum';
|
|
||||||
}
|
|
||||||
if(symbol.flags & ts.SymbolFlags.RegularEnum) {
|
|
||||||
return 'enum';
|
|
||||||
}
|
|
||||||
if(symbol.flags & ts.SymbolFlags.Property) {
|
|
||||||
return 'module-property';
|
|
||||||
}
|
|
||||||
if(symbol.flags & ts.SymbolFlags.TypeAlias) {
|
|
||||||
return 'type-alias';
|
|
||||||
}
|
|
||||||
if(symbol.flags & ts.SymbolFlags.FunctionScopedVariable) {
|
|
||||||
return 'var';
|
|
||||||
}
|
|
||||||
if(symbol.flags & ts.SymbolFlags.BlockScopedVariable) {
|
|
||||||
return getBlockScopedVariableDocType(symbol);
|
|
||||||
}
|
|
||||||
|
|
||||||
log.warn('getExportDocType(): Unknown symbol type', {
|
|
||||||
symbolName: symbol.name,
|
|
||||||
symbolType: symbol.flags,
|
|
||||||
symbolTarget: symbol.target,
|
|
||||||
file: ts.getSourceFileOfNode(symbol.declarations[0]).fileName
|
|
||||||
});
|
|
||||||
return 'unknown';
|
|
||||||
};
|
|
||||||
|
|
||||||
function getBlockScopedVariableDocType(symbol) {
|
|
||||||
|
|
||||||
var node = symbol.valueDeclaration;
|
|
||||||
while(node) {
|
|
||||||
if ( node.flags & 0x2000 /* const */) {
|
|
||||||
return 'const';
|
|
||||||
}
|
|
||||||
node = node.parent;
|
|
||||||
}
|
|
||||||
return 'let';
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
var path = require('canonical-path');
|
|
||||||
var ts = require('typescript');
|
|
||||||
|
|
||||||
module.exports = function getFileInfo(log) {
|
|
||||||
|
|
||||||
return function (symbol, basePath) {
|
|
||||||
var fileName = ts.getSourceFileOfNode(symbol.declarations[0]).fileName;
|
|
||||||
|
|
||||||
var file = path.resolve(basePath, fileName);
|
|
||||||
var fileInfo = {
|
|
||||||
filePath: file,
|
|
||||||
baseName: path.basename(file, path.extname(file)),
|
|
||||||
extension: path.extname(file).replace(/^\./, ''),
|
|
||||||
basePath: basePath,
|
|
||||||
relativePath: fileName,
|
|
||||||
projectRelativePath: fileName
|
|
||||||
};
|
|
||||||
return fileInfo;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
var ts = require('typescript');
|
|
||||||
var path = require('canonical-path');
|
|
||||||
|
|
||||||
module.exports = function tsParser(createCompilerHost, log) {
|
|
||||||
|
|
||||||
return {
|
|
||||||
|
|
||||||
// These are the extension that we should consider when trying to load a module
|
|
||||||
// During migration from Traceur, there is a mix of `.ts`, `.es6` and `.js` (atScript)
|
|
||||||
// files in the project and the TypeScript compiler only looks for `.ts` files when trying
|
|
||||||
// to load imports.
|
|
||||||
extensions: ['.ts', '.js'],
|
|
||||||
|
|
||||||
// The options for the TS compiler
|
|
||||||
options: {
|
|
||||||
allowNonTsExtensions: true,
|
|
||||||
charset: 'utf8'
|
|
||||||
},
|
|
||||||
|
|
||||||
parse: function(fileNames, baseDir) {
|
|
||||||
|
|
||||||
// "Compile" a program from the given module filenames, to get hold of a
|
|
||||||
// typeChecker that can be used to interrogate the modules, exports and so on.
|
|
||||||
var host = createCompilerHost(this.options, baseDir, this.extensions);
|
|
||||||
var program = ts.createProgram(fileNames, this.options, host);
|
|
||||||
var typeChecker = program.getTypeChecker();
|
|
||||||
|
|
||||||
// Create an array of module symbols for each file we were given
|
|
||||||
var moduleSymbols = [];
|
|
||||||
fileNames.forEach(function(fileName) {
|
|
||||||
var sourceFile = program.getSourceFile(fileName);
|
|
||||||
|
|
||||||
if (!sourceFile) {
|
|
||||||
throw new Error('Invalid source file: ' + fileName);
|
|
||||||
} else if (!sourceFile.symbol) {
|
|
||||||
// Some files contain only a comment and no actual module code
|
|
||||||
log.warn('No module code found in ' + fileName);
|
|
||||||
} else {
|
|
||||||
moduleSymbols.push(sourceFile.symbol);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
moduleSymbols.forEach(function(tsModule) {
|
|
||||||
|
|
||||||
// The type checker has a nice helper function that returns an array of Symbols
|
|
||||||
// representing the exports for a given module
|
|
||||||
tsModule.exportArray = typeChecker.getExportsOfModule(tsModule);
|
|
||||||
|
|
||||||
// Although 'star' imports (e.g. `export * from 'some/module';) get resolved automatically
|
|
||||||
// by the compiler/binder, it seems that explicit imports (e.g. `export {SomeClass} from 'some/module'`)
|
|
||||||
// do not so we have to do a little work.
|
|
||||||
tsModule.exportArray.forEach(function(moduleExport) {
|
|
||||||
if (moduleExport.flags & ts.SymbolFlags.Alias) {
|
|
||||||
// To maintain the alias information (particularly the alias name)
|
|
||||||
// we just attach the original "resolved" symbol to the alias symbol
|
|
||||||
moduleExport.resolvedSymbol = typeChecker.getAliasedSymbol(moduleExport);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
moduleSymbols.typeChecker = typeChecker;
|
|
||||||
|
|
||||||
return {
|
|
||||||
moduleSymbols: moduleSymbols,
|
|
||||||
typeChecker: typeChecker,
|
|
||||||
program: program,
|
|
||||||
host: host
|
|
||||||
};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
var mockPackage = require('../../mocks/mockPackage');
|
|
||||||
var Dgeni = require('dgeni');
|
|
||||||
var path = require('canonical-path');
|
|
||||||
|
|
||||||
describe('tsParser', function() {
|
|
||||||
var dgeni, injector, parser;
|
|
||||||
|
|
||||||
beforeEach(function() {
|
|
||||||
dgeni = new Dgeni([mockPackage()]);
|
|
||||||
injector = dgeni.configureInjector();
|
|
||||||
parser = injector.get('tsParser');
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should parse a TS file", function() {
|
|
||||||
var parseInfo = parser.parse(['testSrc.ts'], path.resolve(__dirname, '../../mocks/tsParser'));
|
|
||||||
var tsModules = parseInfo.moduleSymbols;
|
|
||||||
expect(tsModules.length).toEqual(1);
|
|
||||||
expect(tsModules[0].exportArray.length).toEqual(3);
|
|
||||||
expect(tsModules[0].exportArray.map(function(i) { return i.name; })).toEqual(['MyClass', 'myFn', 'x']);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
echo "##### "
|
echo "##### "
|
||||||
echo "##### ci/deploy.sh"
|
echo "##### ci/update_docs.sh"
|
||||||
echo "#####"
|
echo "#####"
|
||||||
|
|
||||||
|
|
||||||
@@ -23,23 +23,25 @@ function run {
|
|||||||
# CD in to the site dir to commit updated docs
|
# CD in to the site dir to commit updated docs
|
||||||
cd $SITE_DIR
|
cd $SITE_DIR
|
||||||
|
|
||||||
CHANGES=$(git status --porcelain)
|
# Add all files to git
|
||||||
|
git add .
|
||||||
|
|
||||||
# if no changes, don't commit
|
# if no changes, don't commit
|
||||||
if [[ "$CHANGES" == "" ]]; then
|
CHANGED=$(git diff-index --name-only HEAD 2>/dev/null | wc -l)
|
||||||
|
if [ $CHANGED -eq 0 ];
|
||||||
|
then
|
||||||
echo "-- No changes detected for the following commit, docs not updated."
|
echo "-- No changes detected for the following commit, docs not updated."
|
||||||
echo "https://github.com/driftyco/$CIRCLE_PROJECT_REPONAME/commit/$CIRCLE_SHA1"
|
echo "https://github.com/driftyco/$CIRCLE_PROJECT_REPONAME/commit/$CIRCLE_SHA1"
|
||||||
else
|
else
|
||||||
git config --global user.email "hi@ionicframework.com"
|
git config --global user.email "hi@ionicframework.com"
|
||||||
git config --global user.name "Ionitron"
|
git config --global user.name "Ionitron"
|
||||||
git add -A
|
|
||||||
git commit -am "Automated build of native docs driftyco/$CIRCLE_PROJECT_REPONAME@$CIRCLE_SHA1"
|
git commit -am "Automated build of native docs driftyco/$CIRCLE_PROJECT_REPONAME@$CIRCLE_SHA1"
|
||||||
# in case a different commit was pushed to ionic-site during doc/demo gen,
|
# in case a different commit was pushed to ionic-site during doc/demo gen,
|
||||||
# try to rebase around it before pushing
|
# try to rebase around it before pushing
|
||||||
git fetch
|
git fetch
|
||||||
git rebase
|
git rebase
|
||||||
|
|
||||||
git push origin master
|
git push origin master || :
|
||||||
|
|
||||||
echo "-- Updated docs for $VERSION_NAME succesfully!"
|
echo "-- Updated docs for $VERSION_NAME succesfully!"
|
||||||
fi
|
fi
|
||||||
|
|||||||
Executable
+38
@@ -0,0 +1,38 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "##### "
|
||||||
|
echo "##### ci/update_docs.sh"
|
||||||
|
echo "#####"
|
||||||
|
|
||||||
|
|
||||||
|
function init {
|
||||||
|
cd ../..
|
||||||
|
}
|
||||||
|
|
||||||
|
function run {
|
||||||
|
# process new docs
|
||||||
|
./node_modules/.bin/gulp readmes
|
||||||
|
|
||||||
|
# if no changes, don't commit
|
||||||
|
CHANGED=$(git diff-index --name-only HEAD --)
|
||||||
|
if [ -z "$CHANGED" ];
|
||||||
|
then
|
||||||
|
echo "-- No changes detected for the following commit, docs not updated."
|
||||||
|
echo "https://github.com/driftyco/$CIRCLE_PROJECT_REPONAME/commit/$CIRCLE_SHA1"
|
||||||
|
else
|
||||||
|
git config --global user.email "hi@ionicframework.com"
|
||||||
|
git config --global user.name "Ionitron"
|
||||||
|
git add -A
|
||||||
|
git commit -am "Automated build of native readmes for driftyco/$CIRCLE_PROJECT_REPONAME@$CIRCLE_SHA1"
|
||||||
|
# in case a different commit was pushed to ionic-site during doc/demo gen,
|
||||||
|
# try to rebase around it before pushing
|
||||||
|
git fetch
|
||||||
|
git rebase
|
||||||
|
|
||||||
|
# git push origin master || :
|
||||||
|
|
||||||
|
echo "-- Updated docs for $VERSION_NAME succesfully!"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
source $(dirname $0)/../utils.inc.sh
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
import { Plugin } from './plugin';
|
import { Plugin } from '@ionic-native/core';
|
||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name PluginName
|
* @name Plugin Name
|
||||||
* @description
|
* @description
|
||||||
*
|
*
|
||||||
* @usage
|
* @usage
|
||||||
@@ -11,9 +13,12 @@ import { Plugin } from './plugin';
|
|||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
@Plugin({
|
@Plugin({
|
||||||
|
pluginName: 'PluginName',
|
||||||
plugin: '',
|
plugin: '',
|
||||||
pluginRef: '',
|
pluginRef: '',
|
||||||
repo: ''
|
repo: ''
|
||||||
})
|
})
|
||||||
|
@Injectable()
|
||||||
export class PluginName {
|
export class PluginName {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,15 +6,16 @@
|
|||||||
* - Document usage (importing, executing main functionality)
|
* - Document usage (importing, executing main functionality)
|
||||||
* - Remove any imports that you are not using
|
* - Remove any imports that you are not using
|
||||||
* - Add this file to /src/index.ts (follow style of other plugins)
|
* - Add this file to /src/index.ts (follow style of other plugins)
|
||||||
* - Remove all the comments included in this template, EXCEPT the @Plugin wrapper docs.
|
* - Remove all the comments included in this template, EXCEPT the @Plugin wrapper docs and any other docs you added
|
||||||
* - Remove this note
|
* - Remove this note
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
import { Plugin, Cordova, CordovaProperty, CordovaInstance, InstanceProperty } from './plugin';
|
import { Plugin, Cordova, CordovaProperty, CordovaInstance, InstanceProperty } from '@ionic-native/core';
|
||||||
|
import { Injectable } from '@angular/core';
|
||||||
import { Observable } from 'rxjs/Observable';
|
import { Observable } from 'rxjs/Observable';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name PluginName
|
* @name Plugin Name
|
||||||
* @description
|
* @description
|
||||||
* This plugin does something
|
* This plugin does something
|
||||||
*
|
*
|
||||||
@@ -29,11 +30,13 @@ import { Observable } from 'rxjs/Observable';
|
|||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
@Plugin({
|
@Plugin({
|
||||||
|
pluginName: 'PluginName',
|
||||||
plugin: '', // npm package name, example: cordova-plugin-camera
|
plugin: '', // npm package name, example: cordova-plugin-camera
|
||||||
pluginRef: '', // the variable reference to call the plugin, example: navigator.geolocation
|
pluginRef: '', // the variable reference to call the plugin, example: navigator.geolocation
|
||||||
repo: '', // the github repository URL for the plugin
|
repo: '', // the github repository URL for the plugin
|
||||||
install: '' // OPTIONAL install command, in case the plugin requires variables
|
install: '' // OPTIONAL install command, in case the plugin requires variables
|
||||||
})
|
})
|
||||||
|
@Injectable()
|
||||||
export class PluginName {
|
export class PluginName {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -43,7 +46,7 @@ export class PluginName {
|
|||||||
* @return {Promise<any>} Returns a promise that resolves when something happens
|
* @return {Promise<any>} Returns a promise that resolves when something happens
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static functionName(arg1: string, arg2: number): Promise<any> {
|
functionName(arg1: string, arg2: number): Promise<any> {
|
||||||
return; // We add return; here to avoid any IDE / Compiler errors
|
return; // We add return; here to avoid any IDE / Compiler errors
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
declare var window;
|
||||||
|
|
||||||
|
export function checkReady() {
|
||||||
|
const DEVICE_READY_TIMEOUT = 5000;
|
||||||
|
|
||||||
|
// To help developers using cordova, we listen for the device ready event and
|
||||||
|
// log an error if it didn't fire in a reasonable amount of time. Generally,
|
||||||
|
// when this happens, developers should remove and reinstall plugins, since
|
||||||
|
// an inconsistent plugin is often the culprit.
|
||||||
|
const before = Date.now();
|
||||||
|
|
||||||
|
let didFireReady = false;
|
||||||
|
document.addEventListener('deviceready', () => {
|
||||||
|
console.log(`Ionic Native: deviceready event fired after ${(Date.now() - before)} ms`);
|
||||||
|
didFireReady = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
if (!didFireReady && window.cordova) {
|
||||||
|
console.warn(`Ionic Native: deviceready did not fire within ${DEVICE_READY_TIMEOUT}ms. This can happen when plugins are in an inconsistent state. Try removing plugins from plugins/ and reinstalling them.`);
|
||||||
|
}
|
||||||
|
}, DEVICE_READY_TIMEOUT);
|
||||||
|
}
|
||||||
@@ -0,0 +1,344 @@
|
|||||||
|
import { instanceAvailability, checkAvailability, wrap, wrapInstance, overrideFunction } from './plugin';
|
||||||
|
import { getPlugin, getPromise } from './util';
|
||||||
|
import { Observable } from 'rxjs/Observable';
|
||||||
|
|
||||||
|
export interface PluginConfig {
|
||||||
|
/**
|
||||||
|
* Plugin name, this should match the class name
|
||||||
|
*/
|
||||||
|
pluginName: string;
|
||||||
|
/**
|
||||||
|
* Plugin NPM package name
|
||||||
|
*/
|
||||||
|
plugin: string;
|
||||||
|
/**
|
||||||
|
* Plugin object reference
|
||||||
|
*/
|
||||||
|
pluginRef?: string;
|
||||||
|
/**
|
||||||
|
* Github repository URL
|
||||||
|
*/
|
||||||
|
repo?: string;
|
||||||
|
/**
|
||||||
|
* Custom install command
|
||||||
|
*/
|
||||||
|
install?: string;
|
||||||
|
/**
|
||||||
|
* Available installation variables
|
||||||
|
*/
|
||||||
|
installVariables?: string[];
|
||||||
|
/**
|
||||||
|
* Supported platforms
|
||||||
|
*/
|
||||||
|
platforms?: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CordovaOptions {
|
||||||
|
/**
|
||||||
|
* Set to true if the wrapped method is a sync function
|
||||||
|
*/
|
||||||
|
sync?: boolean;
|
||||||
|
/**
|
||||||
|
* Callback order. Set to reverse if the success/error callbacks are the first 2 arguments that the wrapped method takes.
|
||||||
|
*/
|
||||||
|
callbackOrder?: 'reverse';
|
||||||
|
/**
|
||||||
|
* Callback style
|
||||||
|
*/
|
||||||
|
callbackStyle?: 'node' | 'object';
|
||||||
|
/**
|
||||||
|
* Set a custom index for the success callback function. This doesn't work if callbackOrder or callbackStyle are set.
|
||||||
|
*/
|
||||||
|
successIndex?: number;
|
||||||
|
/**
|
||||||
|
* Set a custom index for the error callback function. This doesn't work if callbackOrder or callbackStyle are set.
|
||||||
|
*/
|
||||||
|
errorIndex?: number;
|
||||||
|
/**
|
||||||
|
* Success function property name. This must be set if callbackStyle is set to object.
|
||||||
|
*/
|
||||||
|
successName?: string;
|
||||||
|
/**
|
||||||
|
* Error function property name. This must be set if callbackStyle is set to object.
|
||||||
|
*/
|
||||||
|
errorName?: string;
|
||||||
|
/**
|
||||||
|
* Set to true to return an observable
|
||||||
|
*/
|
||||||
|
observable?: boolean;
|
||||||
|
/**
|
||||||
|
* If observable is set to true, this can be set to a different function name that will cancel the observable.
|
||||||
|
*/
|
||||||
|
clearFunction?: string;
|
||||||
|
/**
|
||||||
|
* This can be used if clearFunction is set. Set this to true to call the clearFunction with the same arguments used in the initial function.
|
||||||
|
*/
|
||||||
|
clearWithArgs?: boolean;
|
||||||
|
/**
|
||||||
|
* Creates an observable that wraps a global event. Replaces document.addEventListener
|
||||||
|
*/
|
||||||
|
eventObservable?: boolean;
|
||||||
|
/**
|
||||||
|
* Event name, this must be set if eventObservable is set to true
|
||||||
|
*/
|
||||||
|
event?: string;
|
||||||
|
/**
|
||||||
|
* Element to attach the event listener to, this is optional, defaults to `window`
|
||||||
|
*/
|
||||||
|
element?: any;
|
||||||
|
/**
|
||||||
|
* Set to true if the wrapped method returns a promise
|
||||||
|
*/
|
||||||
|
otherPromise?: boolean;
|
||||||
|
/**
|
||||||
|
* Supported platforms
|
||||||
|
*/
|
||||||
|
platforms?: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CordovaCheckOptions {
|
||||||
|
sync?: boolean;
|
||||||
|
observable?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CordovaFiniteObservableOptions extends CordovaOptions {
|
||||||
|
/**
|
||||||
|
* Function that gets a result returned from plugin's success callback, and decides whether it is last value and observable should complete.
|
||||||
|
*/
|
||||||
|
resultFinalPredicate?: (result: any) => boolean;
|
||||||
|
/**
|
||||||
|
* Function that gets called after resultFinalPredicate, and removes service data that indicates end of stream from the result.
|
||||||
|
*/
|
||||||
|
resultTransform?: (result: any) => any;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
export function InstanceCheck(opts: CordovaCheckOptions = {}) {
|
||||||
|
return (pluginObj: Object, methodName: string, descriptor: TypedPropertyDescriptor<any>): TypedPropertyDescriptor<any> => {
|
||||||
|
return {
|
||||||
|
value: function(...args: any[]): any {
|
||||||
|
if (instanceAvailability(this)) {
|
||||||
|
return descriptor.value.apply(this, args);
|
||||||
|
} else {
|
||||||
|
|
||||||
|
if (opts.sync) {
|
||||||
|
return;
|
||||||
|
} else if (opts.observable) {
|
||||||
|
return new Observable<any>(() => {});
|
||||||
|
}
|
||||||
|
|
||||||
|
return getPromise(() => {});
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Executes function only if plugin is available
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
export function CordovaCheck(opts: CordovaCheckOptions = {}) {
|
||||||
|
return (pluginObj: Object, methodName: string, descriptor: TypedPropertyDescriptor<any>): TypedPropertyDescriptor<any> => {
|
||||||
|
return {
|
||||||
|
value: function(...args: any[]): any {
|
||||||
|
if (checkAvailability(pluginObj) === true) {
|
||||||
|
return descriptor.value.apply(this, args);
|
||||||
|
} else {
|
||||||
|
if (opts.sync) {
|
||||||
|
return;
|
||||||
|
} else if (opts.observable) {
|
||||||
|
return new Observable<any>(() => {});
|
||||||
|
}
|
||||||
|
return getPromise(() => {});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*
|
||||||
|
* Class decorator specifying Plugin metadata. Required for all plugins.
|
||||||
|
*
|
||||||
|
* @usage
|
||||||
|
* ```typescript
|
||||||
|
* @Plugin({
|
||||||
|
* pluginName: 'MyPlugin',
|
||||||
|
* plugin: 'cordova-plugin-myplugin',
|
||||||
|
* pluginRef: 'window.myplugin'
|
||||||
|
* })
|
||||||
|
* export class MyPlugin {
|
||||||
|
*
|
||||||
|
* // Plugin wrappers, properties, and functions go here ...
|
||||||
|
*
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
export function Plugin(config: PluginConfig) {
|
||||||
|
return function(cls) {
|
||||||
|
|
||||||
|
// Add these fields to the class
|
||||||
|
for (let k in config) {
|
||||||
|
cls[k] = config[k];
|
||||||
|
}
|
||||||
|
|
||||||
|
cls['installed'] = function(printWarning?: boolean) {
|
||||||
|
return !!getPlugin(config.pluginRef);
|
||||||
|
};
|
||||||
|
|
||||||
|
cls['getPlugin'] = function() {
|
||||||
|
return getPlugin(config.pluginRef);
|
||||||
|
};
|
||||||
|
|
||||||
|
cls['checkInstall'] = function() {
|
||||||
|
return checkAvailability(cls) === true;
|
||||||
|
};
|
||||||
|
|
||||||
|
cls['getPluginName'] = function() {
|
||||||
|
return config.pluginName;
|
||||||
|
};
|
||||||
|
cls['getPluginRef'] = function() {
|
||||||
|
return config.pluginRef;
|
||||||
|
};
|
||||||
|
cls['getPluginInstallName'] = function() {
|
||||||
|
return config.plugin;
|
||||||
|
};
|
||||||
|
cls['getPluginRepo'] = function() {
|
||||||
|
return config.repo;
|
||||||
|
};
|
||||||
|
cls['getSupportedPlatforms'] = function() {
|
||||||
|
return config.platforms;
|
||||||
|
};
|
||||||
|
|
||||||
|
return cls;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*
|
||||||
|
* Wrap a stub function in a call to a Cordova plugin, checking if both Cordova
|
||||||
|
* and the required plugin are installed.
|
||||||
|
*/
|
||||||
|
export function Cordova(opts: CordovaOptions = {}) {
|
||||||
|
return (target: Object, methodName: string, descriptor: TypedPropertyDescriptor<any>) => {
|
||||||
|
return {
|
||||||
|
value: function(...args: any[]) {
|
||||||
|
return wrap(this, methodName, opts).apply(this, args);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*
|
||||||
|
* Wrap an instance method
|
||||||
|
*/
|
||||||
|
export function CordovaInstance(opts: any = {}) {
|
||||||
|
return (target: Object, methodName: string) => {
|
||||||
|
return {
|
||||||
|
value: function(...args: any[]) {
|
||||||
|
return wrapInstance(this, methodName, opts).apply(this, args);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Before calling the original method, ensure Cordova and the plugin are installed.
|
||||||
|
*/
|
||||||
|
export function CordovaProperty(target: any, key: string) {
|
||||||
|
Object.defineProperty(target, key, {
|
||||||
|
get: () => {
|
||||||
|
if (checkAvailability(target, key) === true) {
|
||||||
|
return getPlugin(target.constructor.getPluginRef())[key];
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
set: (value) => {
|
||||||
|
if (checkAvailability(target, key) === true) {
|
||||||
|
getPlugin(target.constructor.getPluginRef())[key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @param target
|
||||||
|
* @param key
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
|
export function InstanceProperty(target: any, key: string) {
|
||||||
|
Object.defineProperty(target, key, {
|
||||||
|
get: function(){
|
||||||
|
return this._objectInstance[key];
|
||||||
|
},
|
||||||
|
set: function(value){
|
||||||
|
this._objectInstance[key] = value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*
|
||||||
|
* Wrap a stub function in a call to a Cordova plugin, checking if both Cordova
|
||||||
|
* and the required plugin are installed.
|
||||||
|
*/
|
||||||
|
export function CordovaFunctionOverride(opts: any = {}) {
|
||||||
|
return (target: Object, methodName: string, descriptor: TypedPropertyDescriptor<any>) => {
|
||||||
|
return {
|
||||||
|
value: function(...args: any[]) {
|
||||||
|
return overrideFunction(this, methodName, opts);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*
|
||||||
|
* Wraps method that returns an observable that can be completed. Provided opts.resultFinalPredicate dictates when the observable completes.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
export function CordovaFiniteObservable(opts: CordovaFiniteObservableOptions = {}) {
|
||||||
|
if (opts.observable === false) {
|
||||||
|
throw new Error('CordovaFiniteObservable decorator can only be used on methods that returns observable. Please provide correct option.');
|
||||||
|
}
|
||||||
|
opts.observable = true;
|
||||||
|
return (target: Object, methodName: string, descriptor: TypedPropertyDescriptor<any>) => {
|
||||||
|
return {
|
||||||
|
value: function(...args: any[]) {
|
||||||
|
let wrappedObservable: Observable<any> = wrap(this, methodName, opts).apply(this, args);
|
||||||
|
return new Observable<any>((observer) => {
|
||||||
|
let wrappedSubscription = wrappedObservable.subscribe({
|
||||||
|
next: (x) => {
|
||||||
|
observer.next(opts.resultTransform ? opts.resultTransform(x) : x);
|
||||||
|
if (opts.resultFinalPredicate && opts.resultFinalPredicate(x)) {
|
||||||
|
observer.complete();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: (err) => { observer.error(err); },
|
||||||
|
complete: () => { observer.complete(); }
|
||||||
|
});
|
||||||
|
return () => {
|
||||||
|
wrappedSubscription.unsubscribe();
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
export * from './plugin';
|
||||||
|
export * from './decorators';
|
||||||
|
export * from './util';
|
||||||
@@ -0,0 +1,309 @@
|
|||||||
|
import { get, getPlugin, getPromise, cordovaWarn, pluginWarn } from './util';
|
||||||
|
import { checkReady } from './bootstrap';
|
||||||
|
import { CordovaOptions } from './decorators';
|
||||||
|
|
||||||
|
import { Observable } from 'rxjs/Observable';
|
||||||
|
import 'rxjs/add/observable/fromEvent';
|
||||||
|
|
||||||
|
checkReady();
|
||||||
|
|
||||||
|
declare var window;
|
||||||
|
declare var Promise;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if plugin/cordova is available
|
||||||
|
* @return {boolean | { error: string } }
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
export function checkAvailability(pluginRef: string, methodName?: string, pluginName?: string);
|
||||||
|
export function checkAvailability(pluginObj: any, methodName?: string, pluginName?: string);
|
||||||
|
export function checkAvailability(plugin: any, methodName?: string, pluginName?: string): boolean | { error: string } {
|
||||||
|
|
||||||
|
let pluginRef, pluginInstance, pluginPackage;
|
||||||
|
|
||||||
|
if (typeof plugin === 'string') {
|
||||||
|
pluginRef = plugin;
|
||||||
|
} else {
|
||||||
|
pluginRef = plugin.constructor.getPluginRef();
|
||||||
|
pluginName = plugin.constructor.getPluginName();
|
||||||
|
pluginPackage = plugin.constructor.getPluginInstallName();
|
||||||
|
}
|
||||||
|
|
||||||
|
pluginInstance = getPlugin(pluginRef);
|
||||||
|
|
||||||
|
if (!pluginInstance || (!!methodName && pluginInstance[methodName] === 'undefined')) {
|
||||||
|
if (!window.cordova) {
|
||||||
|
cordovaWarn(pluginName, methodName);
|
||||||
|
return {
|
||||||
|
error: 'cordova_not_available'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pluginWarn(pluginName, pluginPackage, methodName);
|
||||||
|
return {
|
||||||
|
error: 'plugin_not_installed'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if _objectInstance exists and has the method/property
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
export function instanceAvailability(pluginObj: any, methodName?: string): boolean {
|
||||||
|
return pluginObj._objectInstance && (!methodName || pluginObj._objectInstance[methodName] !== 'undefined');
|
||||||
|
}
|
||||||
|
|
||||||
|
function setIndex(args: any[], opts: any = {}, resolve?: Function, reject?: Function): any {
|
||||||
|
// ignore resolve and reject in case sync
|
||||||
|
if (opts.sync) {
|
||||||
|
return args;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the plugin method expects myMethod(success, err, options)
|
||||||
|
if (opts.callbackOrder === 'reverse') {
|
||||||
|
// Get those arguments in the order [resolve, reject, ...restOfArgs]
|
||||||
|
args.unshift(reject);
|
||||||
|
args.unshift(resolve);
|
||||||
|
} else if (opts.callbackStyle === 'node') {
|
||||||
|
args.push((err, result) => {
|
||||||
|
if (err) {
|
||||||
|
reject(err);
|
||||||
|
} else {
|
||||||
|
resolve(result);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else if (opts.callbackStyle === 'object' && opts.successName && opts.errorName) {
|
||||||
|
let obj: any = {};
|
||||||
|
obj[opts.successName] = resolve;
|
||||||
|
obj[opts.errorName] = reject;
|
||||||
|
args.push(obj);
|
||||||
|
} else if (typeof opts.successIndex !== 'undefined' || typeof opts.errorIndex !== 'undefined') {
|
||||||
|
const setSuccessIndex = () => {
|
||||||
|
// If we've specified a success/error index
|
||||||
|
if (opts.successIndex > args.length) {
|
||||||
|
args[opts.successIndex] = resolve;
|
||||||
|
} else {
|
||||||
|
args.splice(opts.successIndex, 0, resolve);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const setErrorIndex = () => {
|
||||||
|
// We don't want that the reject cb gets spliced into the position of an optional argument that has not been defined and thus causing non expected behaviour.
|
||||||
|
if (opts.errorIndex > args.length) {
|
||||||
|
args[opts.errorIndex] = reject; // insert the reject fn at the correct specific index
|
||||||
|
} else {
|
||||||
|
args.splice(opts.errorIndex, 0, reject); // otherwise just splice it into the array
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (opts.successIndex > opts.errorIndex) {
|
||||||
|
setErrorIndex();
|
||||||
|
setSuccessIndex();
|
||||||
|
} else {
|
||||||
|
setSuccessIndex();
|
||||||
|
setErrorIndex();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Otherwise, let's tack them on to the end of the argument list
|
||||||
|
// which is 90% of cases
|
||||||
|
args.push(resolve);
|
||||||
|
args.push(reject);
|
||||||
|
}
|
||||||
|
return args;
|
||||||
|
}
|
||||||
|
|
||||||
|
function callCordovaPlugin(pluginObj: any, methodName: string, args: any[], opts: any = {}, resolve?: Function, reject?: Function) {
|
||||||
|
// Try to figure out where the success/error callbacks need to be bound
|
||||||
|
// to our promise resolve/reject handlers.
|
||||||
|
args = setIndex(args, opts, resolve, reject);
|
||||||
|
|
||||||
|
const availabilityCheck = checkAvailability(pluginObj, methodName);
|
||||||
|
|
||||||
|
if (availabilityCheck === true) {
|
||||||
|
const pluginInstance = getPlugin(pluginObj.constructor.getPluginRef());
|
||||||
|
return pluginInstance[methodName].apply(pluginInstance, args);
|
||||||
|
} else {
|
||||||
|
return availabilityCheck;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function wrapPromise(pluginObj: any, methodName: string, args: any[], opts: any = {}) {
|
||||||
|
let pluginResult, rej;
|
||||||
|
const p = getPromise((resolve, reject) => {
|
||||||
|
pluginResult = callCordovaPlugin(pluginObj, methodName, args, opts, resolve, reject);
|
||||||
|
rej = reject;
|
||||||
|
});
|
||||||
|
// Angular throws an error on unhandled rejection, but in this case we have already printed
|
||||||
|
// a warning that Cordova is undefined or the plugin is uninstalled, so there is no reason
|
||||||
|
// to error
|
||||||
|
if (pluginResult && pluginResult.error) {
|
||||||
|
p.catch(() => { });
|
||||||
|
rej(pluginResult.error);
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
function wrapOtherPromise(pluginObj: any, methodName: string, args: any[], opts: any= {}) {
|
||||||
|
return getPromise((resolve, reject) => {
|
||||||
|
let pluginResult = callCordovaPlugin(pluginObj, methodName, args, opts);
|
||||||
|
if (pluginResult && pluginResult.error) {
|
||||||
|
reject(pluginResult.error);
|
||||||
|
}
|
||||||
|
pluginResult.then(resolve).catch(reject);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function wrapObservable(pluginObj: any, methodName: string, args: any[], opts: any = {}) {
|
||||||
|
return new Observable(observer => {
|
||||||
|
let pluginResult = callCordovaPlugin(pluginObj, methodName, args, opts, observer.next.bind(observer), observer.error.bind(observer));
|
||||||
|
if (pluginResult && pluginResult.error) {
|
||||||
|
observer.error(pluginResult.error);
|
||||||
|
observer.complete();
|
||||||
|
}
|
||||||
|
return () => {
|
||||||
|
try {
|
||||||
|
if (opts.clearFunction) {
|
||||||
|
if (opts.clearWithArgs) {
|
||||||
|
return callCordovaPlugin(pluginObj, opts.clearFunction, args, opts, observer.next.bind(observer), observer.error.bind(observer));
|
||||||
|
}
|
||||||
|
return get(window, pluginObj.constructor.getPluginRef())[opts.clearFunction].call(pluginObj, pluginResult);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.warn('Unable to clear the previous observable watch for', pluginObj.constructor.getPluginName(), methodName);
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function callInstance(pluginObj: any, methodName: string, args: any[], opts: any = {}, resolve?: Function, reject?: Function) {
|
||||||
|
|
||||||
|
args = setIndex(args, opts, resolve, reject);
|
||||||
|
|
||||||
|
if (instanceAvailability(pluginObj, methodName)) {
|
||||||
|
return pluginObj._objectInstance[methodName].apply(pluginObj._objectInstance, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrap the event with an observable
|
||||||
|
* @private
|
||||||
|
* @param event even name
|
||||||
|
* @param element The element to attach the event listener to
|
||||||
|
* @returns {Observable}
|
||||||
|
*/
|
||||||
|
export function wrapEventObservable(event: string, element: any = window): Observable<any> {
|
||||||
|
return Observable.fromEvent(element, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Certain plugins expect the user to override methods in the plugin. For example,
|
||||||
|
* window.cordova.plugins.backgroundMode.onactivate = function() { ... }.
|
||||||
|
*
|
||||||
|
* Unfortunately, this is brittle and would be better wrapped as an Observable. overrideFunction
|
||||||
|
* does just this.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
export function overrideFunction(pluginObj: any, methodName: string, args: any[], opts: any = {}): Observable<any> {
|
||||||
|
return new Observable(observer => {
|
||||||
|
|
||||||
|
const availabilityCheck = checkAvailability(pluginObj, methodName);
|
||||||
|
|
||||||
|
if (availabilityCheck === true) {
|
||||||
|
const pluginInstance = getPlugin(pluginObj.constructor.getPluginRef());
|
||||||
|
pluginInstance[methodName] = observer.next.bind(observer);
|
||||||
|
return () => pluginInstance[methodName] = () => {};
|
||||||
|
} else {
|
||||||
|
observer.error(availabilityCheck);
|
||||||
|
observer.complete();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
export const wrap = function(pluginObj: any, methodName: string, opts: CordovaOptions = {}) {
|
||||||
|
return (...args) => {
|
||||||
|
if (opts.sync) {
|
||||||
|
// Sync doesn't wrap the plugin with a promise or observable, it returns the result as-is
|
||||||
|
return callCordovaPlugin(pluginObj, methodName, args, opts);
|
||||||
|
} else if (opts.observable) {
|
||||||
|
return wrapObservable(pluginObj, methodName, args, opts);
|
||||||
|
} else if (opts.eventObservable && opts.event) {
|
||||||
|
return wrapEventObservable(opts.event, opts.element);
|
||||||
|
} else if (opts.otherPromise) {
|
||||||
|
return wrapOtherPromise(pluginObj, methodName, args, opts);
|
||||||
|
} else {
|
||||||
|
return wrapPromise(pluginObj, methodName, args, opts);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
export function wrapInstance(pluginObj: any, methodName: string, opts: any = {}) {
|
||||||
|
return (...args) => {
|
||||||
|
if (opts.sync) {
|
||||||
|
|
||||||
|
return callInstance(pluginObj, methodName, args, opts);
|
||||||
|
|
||||||
|
} else if (opts.observable) {
|
||||||
|
|
||||||
|
return new Observable(observer => {
|
||||||
|
let pluginResult = callInstance(pluginObj, methodName, args, opts, observer.next.bind(observer), observer.error.bind(observer));
|
||||||
|
|
||||||
|
if (pluginResult && pluginResult.error) {
|
||||||
|
observer.error(pluginResult.error);
|
||||||
|
observer.complete();
|
||||||
|
}
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
try {
|
||||||
|
if (opts.clearWithArgs) {
|
||||||
|
return pluginObj._objectInstance[opts.clearFunction].apply(pluginObj._objectInstance, args);
|
||||||
|
}
|
||||||
|
return pluginObj._objectInstance[opts.clearFunction].call(pluginObj, pluginResult);
|
||||||
|
} catch (e) {
|
||||||
|
console.warn('Unable to clear the previous observable watch for', pluginObj.constructor.getPluginName(), methodName);
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
} else if (opts.otherPromise) {
|
||||||
|
|
||||||
|
return getPromise((resolve, reject) => {
|
||||||
|
let result = callInstance(pluginObj, methodName, args, opts, resolve, reject);
|
||||||
|
if (result && !result.error) {
|
||||||
|
result.then(resolve, reject);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
let pluginResult, rej;
|
||||||
|
const p = getPromise((resolve, reject) => {
|
||||||
|
pluginResult = callInstance(pluginObj, methodName, args, opts, resolve, reject);
|
||||||
|
rej = reject;
|
||||||
|
});
|
||||||
|
if (pluginResult && pluginResult.error) {
|
||||||
|
p.catch(() => { });
|
||||||
|
rej(pluginResult.error);
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
declare var window: any;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
export function get(obj, path) {
|
||||||
|
path = path.split('.');
|
||||||
|
for (let i = 0; i < path.length; i++) {
|
||||||
|
if (!obj) { return null; }
|
||||||
|
obj = obj[path[i]];
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
export function getPromise(cb) {
|
||||||
|
|
||||||
|
const tryNativePromise = () => {
|
||||||
|
if (window.Promise) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
cb(resolve, reject);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.error('No Promise support or polyfill found. To enable Ionic Native support, please add the es6-promise polyfill before this script, or run with a library like Angular 2 or on a recent browser.');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return tryNativePromise();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @param pluginRef
|
||||||
|
* @returns {null|*}
|
||||||
|
*/
|
||||||
|
export function getPlugin(pluginRef: string): any {
|
||||||
|
return get(window, pluginRef);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
export const pluginWarn = function(pluginName: string, plugin?: string, method?: string) {
|
||||||
|
if (method) {
|
||||||
|
console.warn('Native: tried calling ' + pluginName + '.' + method + ', but the ' + pluginName + ' plugin is not installed.');
|
||||||
|
} else {
|
||||||
|
console.warn('Native: tried accessing the ' + pluginName + ' plugin but it\'s not installed.');
|
||||||
|
}
|
||||||
|
if (plugin) {
|
||||||
|
console.warn('Install the ' + pluginName + ' plugin: \'ionic plugin add ' + plugin + '\'');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @param pluginName
|
||||||
|
* @param method
|
||||||
|
*/
|
||||||
|
export const cordovaWarn = function(pluginName: string, method?: string) {
|
||||||
|
if (method) {
|
||||||
|
console.warn('Native: tried calling ' + pluginName + '.' + method + ', but Cordova is not available. Make sure to include cordova.js or run in a device/simulator');
|
||||||
|
} else {
|
||||||
|
console.warn('Native: tried accessing the ' + pluginName + ' plugin but Cordova is not available. Make sure to include cordova.js or run in a device/simulator');
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Cordova, Plugin, CordovaProperty } from '@ionic-native/core';
|
||||||
|
|
||||||
|
export interface ActionSheetOptions {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The labels for the buttons. Uses the index x
|
||||||
|
*/
|
||||||
|
buttonLabels: string[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The title for the actionsheet
|
||||||
|
*/
|
||||||
|
title?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Theme to be used on Android
|
||||||
|
*/
|
||||||
|
androidTheme?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable a cancel on Android
|
||||||
|
*/
|
||||||
|
androidEnableCancelButton?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable a cancel on Windows Phone
|
||||||
|
*/
|
||||||
|
winphoneEnableCancelButton?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a cancel button with text
|
||||||
|
*/
|
||||||
|
addCancelButtonWithLabel?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a destructive button with text
|
||||||
|
*/
|
||||||
|
addDestructiveButtonWithLabel?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* On an iPad, set the X,Y position
|
||||||
|
*/
|
||||||
|
position?: number[];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Action Sheet
|
||||||
|
* @description
|
||||||
|
* The ActionSheet plugin shows a native list of options the user can choose from.
|
||||||
|
*
|
||||||
|
* Requires Cordova plugin: `cordova-plugin-actionsheet`. For more info, please see the [ActionSheet plugin docs](https://github.com/EddyVerbruggen/cordova-plugin-actionsheet).
|
||||||
|
*
|
||||||
|
* @usage
|
||||||
|
* ```typescript
|
||||||
|
* import { ActionSheet, ActionSheetOptions } from '@ionic-native/action-sheet';
|
||||||
|
*
|
||||||
|
* constructor(private actionSheet: ActionSheet) { }
|
||||||
|
*
|
||||||
|
* ...
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* let buttonLabels = ['Share via Facebook', 'Share via Twitter'];
|
||||||
|
*
|
||||||
|
* const options: ActionSheetOptions = {
|
||||||
|
* title: 'What do you want with this image?',
|
||||||
|
* buttonLabels: buttonLabels,
|
||||||
|
* addCancelButtonWithLabel: 'Cancel',
|
||||||
|
* addDestructiveButtonWithLabel: 'Delete',
|
||||||
|
* androidTheme: this.actionSheet.ANDROID_THEMES.THEME_HOLO_DARK
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
* this.actionSheet.show(options).then((buttonIndex: number) => {
|
||||||
|
* console.log('Button pressed: ' + buttonIndex);
|
||||||
|
* });
|
||||||
|
* ```
|
||||||
|
* @interfaces
|
||||||
|
* ActionSheetOptions
|
||||||
|
*/
|
||||||
|
@Plugin({
|
||||||
|
pluginName: 'ActionSheet',
|
||||||
|
plugin: 'cordova-plugin-actionsheet',
|
||||||
|
pluginRef: 'plugins.actionsheet',
|
||||||
|
repo: 'https://github.com/EddyVerbruggen/cordova-plugin-actionsheet',
|
||||||
|
platforms: ['Android', 'iOS', 'Windows Phone 8']
|
||||||
|
})
|
||||||
|
@Injectable()
|
||||||
|
export class ActionSheet {
|
||||||
|
|
||||||
|
@CordovaProperty
|
||||||
|
ANDROID_THEMES: {
|
||||||
|
THEME_TRADITIONAL: number;
|
||||||
|
THEME_HOLO_DARK: number;
|
||||||
|
THEME_HOLO_LIGHT: number;
|
||||||
|
THEME_DEVICE_DEFAULT_DARK: number;
|
||||||
|
THEME_DEVICE_DEFAULT_LIGHT: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show a native ActionSheet component. See below for options.
|
||||||
|
* @param options {ActionSheetOptions} Options See table below
|
||||||
|
* @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> { return; }
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Progamtically hide the native ActionSheet
|
||||||
|
* @returns {Promise<any>} Returns a Promise that resolves when the actionsheet is closed
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
hide(options?: any): Promise<any> { return; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,289 @@
|
|||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Cordova, Plugin } from '@ionic-native/core';
|
||||||
|
import { Observable } from 'rxjs/Observable';
|
||||||
|
|
||||||
|
export type AdSize = 'SMART_BANNER' | 'BANNER' | 'MEDIUM_RECTANGLE' | 'FULL_BANNER' | 'LEADERBOARD' | 'SKYSCRAPER' | 'CUSTOM';
|
||||||
|
|
||||||
|
export interface AdMobOptions {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Banner ad ID
|
||||||
|
*/
|
||||||
|
adId?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Banner Ad Size, defaults to `SMART_BANNER`. IT can be: `SMART_BANNER`, `BANNER`, `MEDIUM_RECTANGLE`, `FULL_BANNER`, `LEADERBOARD`, `SKYSCRAPER`, or `CUSTOM`
|
||||||
|
*/
|
||||||
|
adSize?: AdSize;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Banner width, valid when `adSize` is set to `CUSTOM`
|
||||||
|
*/
|
||||||
|
width?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Banner height, valid when `adSize` is set to `CUSTOM`
|
||||||
|
*/
|
||||||
|
height?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allow banner to overlap webview, or else it will push webview up or down to avoid overlap. Defaults to false.
|
||||||
|
*/
|
||||||
|
overlap?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Position of banner ad. Defaults to `TOP_CENTER`. You can use the `AdMob.AD_POSITION` property to select other values.
|
||||||
|
*/
|
||||||
|
position?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* X in pixels. Valid when `position` is set to `POS_XY`
|
||||||
|
*/
|
||||||
|
x?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Y in pixels. Valid when `position` is set to `POS_XY`
|
||||||
|
*/
|
||||||
|
y?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set to true to receive test ad for testing purposes
|
||||||
|
*/
|
||||||
|
isTesting?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Auto show interstitial ad when loaded. Set to false if hope to control the show timing with prepareInterstitial/showInterstitial
|
||||||
|
*/
|
||||||
|
autoShow?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Re-create the banner on web view orientation change (not screen orientation), or else just move the banner. Default:true.
|
||||||
|
*/
|
||||||
|
orientationRenew?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set extra color style for Ad
|
||||||
|
*/
|
||||||
|
adExtras?: AdExtras;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AdExtras {
|
||||||
|
|
||||||
|
color_bg: string;
|
||||||
|
|
||||||
|
color_bg_top: string;
|
||||||
|
|
||||||
|
color_border: string;
|
||||||
|
|
||||||
|
color_link: string;
|
||||||
|
|
||||||
|
color_text: string;
|
||||||
|
|
||||||
|
color_url: string;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name AdMob
|
||||||
|
* @description
|
||||||
|
* Plugin for Google Ads, including AdMob / DFP (doubleclick for publisher) and mediations to other Ad networks.
|
||||||
|
* @usage
|
||||||
|
* ```typescript
|
||||||
|
* import { AdMob, AdMobOptions, AdSize, AdExtras } from '@ionic-native/ad-mob';
|
||||||
|
*
|
||||||
|
* constructor(private admob: AdMob){}
|
||||||
|
*
|
||||||
|
* ionViewDidLoad() {
|
||||||
|
* this.admob.onAdDismiss()
|
||||||
|
* .subscribe(() => { console.log('User dismissed ad'); });
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* onClick() {
|
||||||
|
* this.admob.prepareInterstitial('YOUR_ADID')
|
||||||
|
* .then(() => { this.admob.showInterstitial(); });
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @interfaces
|
||||||
|
* AdMobOptions
|
||||||
|
* AdExtras
|
||||||
|
*/
|
||||||
|
@Plugin({
|
||||||
|
pluginName: 'AdMob',
|
||||||
|
plugin: 'cordova-plugin-admobpro',
|
||||||
|
pluginRef: 'AdMob',
|
||||||
|
repo: 'https://github.com/floatinghotpot/cordova-admob-pro',
|
||||||
|
platforms: ['Android', 'iOS', 'Windows Phone 8']
|
||||||
|
})
|
||||||
|
@Injectable()
|
||||||
|
export class AdMob {
|
||||||
|
|
||||||
|
AD_POSITION: {
|
||||||
|
NO_CHANGE: number;
|
||||||
|
TOP_LEFT: number;
|
||||||
|
TOP_CENTER: number;
|
||||||
|
TOP_RIGHT: number;
|
||||||
|
LEFT: number;
|
||||||
|
CENTER: number;
|
||||||
|
RIGHT: number;
|
||||||
|
BOTTOM_LEFT: number;
|
||||||
|
BOTTOM_CENTER: number;
|
||||||
|
BOTTOM_RIGHT: number;
|
||||||
|
POS_XY: number;
|
||||||
|
} = {
|
||||||
|
NO_CHANGE: 0,
|
||||||
|
TOP_LEFT: 1,
|
||||||
|
TOP_CENTER: 2,
|
||||||
|
TOP_RIGHT: 3,
|
||||||
|
LEFT: 4,
|
||||||
|
CENTER: 5,
|
||||||
|
RIGHT: 6,
|
||||||
|
BOTTOM_LEFT: 7,
|
||||||
|
BOTTOM_CENTER: 8,
|
||||||
|
BOTTOM_RIGHT: 9,
|
||||||
|
POS_XY: 10
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a banner
|
||||||
|
* @param adIdOrOptions {string | AdMobOptions} Ad ID or Options
|
||||||
|
* @returns {Promise<any>} Returns a Promise that resolves when the banner is created
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
createBanner(adIdOrOptions: string | AdMobOptions): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy the banner, remove it from screen.
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
sync: true
|
||||||
|
})
|
||||||
|
removeBanner(): void { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show banner at position
|
||||||
|
* @param position {number} Position. Use `AdMob.AD_POSITION` to set values.
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
sync: true
|
||||||
|
})
|
||||||
|
showBanner(position: number): void { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show banner at custom position
|
||||||
|
* @param x {number} Offset from screen left.
|
||||||
|
* @param y {number} Offset from screen top.
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
sync: true
|
||||||
|
})
|
||||||
|
showBannerAtXY(x: number, y: number): void { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hide the banner, remove it from screen, but can show it later
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
sync: true
|
||||||
|
})
|
||||||
|
hideBanner(): void { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepare interstitial banner
|
||||||
|
* @param adIdOrOptions {string | AdMobOptions} Ad ID or Options
|
||||||
|
* @returns {Promise<any>} Returns a Promise that resolves when interstitial is prepared
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
prepareInterstitial(adIdOrOptions: string | AdMobOptions): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show interstitial ad when it's ready
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
sync: true
|
||||||
|
})
|
||||||
|
showInterstitial(): void { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepare a reward video ad
|
||||||
|
* @param adIdOrOptions {string | AdMobOptions} Ad ID or Options
|
||||||
|
* @returns {Promise<any>} Returns a Promise that resolves when the ad is prepared
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
prepareRewardVideoAd(adIdOrOptions: string | AdMobOptions): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show a reward video ad
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
sync: true
|
||||||
|
})
|
||||||
|
showRewardVideoAd(): void { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the values for configuration and targeting
|
||||||
|
* @param options {AdMobOptions} Options
|
||||||
|
* @returns {Promise<any>} Returns a Promise that resolves when the options have been set
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setOptions(options: AdMobOptions): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get user ad settings
|
||||||
|
* @returns {Promise<any>} Returns a promise that resolves with the ad settings
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
getAdSettings(): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Triggered when failed to receive Ad
|
||||||
|
* @returns {Observable<any>}
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onAdFailLoad'
|
||||||
|
})
|
||||||
|
onAdFailLoad(): Observable<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Triggered when Ad received
|
||||||
|
* @returns {Observable<any>}
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onAdLoaded'
|
||||||
|
})
|
||||||
|
onAdLoaded(): Observable<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Triggered when Ad will be showed on screen
|
||||||
|
* @returns {Observable<any>}
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onAdPresent'
|
||||||
|
})
|
||||||
|
onAdPresent(): Observable<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Triggered when user click the Ad, and will jump out of your App
|
||||||
|
* @returns {Observable<any>}
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onAdLeaveApp'
|
||||||
|
})
|
||||||
|
onAdLeaveApp(): Observable<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Triggered when dismiss the Ad and back to your App
|
||||||
|
* @returns {Observable<any>}
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onAdDismiss'
|
||||||
|
})
|
||||||
|
onAdDismiss(): Observable<any> { return; }
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,115 @@
|
|||||||
|
import { Plugin, Cordova } from '@ionic-native/core';
|
||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
|
||||||
|
export interface AlipayOrder {
|
||||||
|
/**
|
||||||
|
* appId assigned by Alipay
|
||||||
|
*/
|
||||||
|
app_id: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Api name.
|
||||||
|
* Should be: alipay.trade.app.pay
|
||||||
|
*/
|
||||||
|
method: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data format
|
||||||
|
* Default: "JSON"
|
||||||
|
*/
|
||||||
|
format?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Charset
|
||||||
|
* Possible values: "UTF-8", "GBK"
|
||||||
|
* Default: "UTF-8"
|
||||||
|
*/
|
||||||
|
charset: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sign method
|
||||||
|
* Default: 'RSA'
|
||||||
|
*/
|
||||||
|
sign_type: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sign value. Should be got from server side.
|
||||||
|
* Default: 'RSA'
|
||||||
|
*/
|
||||||
|
sign: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Timestamp, formated like "yyyy-MM-dd HH:mm:ss", e.g. 2014-07-24 03:07:50
|
||||||
|
*/
|
||||||
|
timestamp: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Api version. Fixed value '1.0'
|
||||||
|
*/
|
||||||
|
version: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notify url.
|
||||||
|
*/
|
||||||
|
notify_url: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* biz content. formated in json. see alipay doc for detail.
|
||||||
|
*/
|
||||||
|
biz_content: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Alipay
|
||||||
|
* @description
|
||||||
|
* This plugin is used for Alipay APP support. Integrated with the latest SDK.
|
||||||
|
*
|
||||||
|
* Requires Cordova plugin: `cordova-alipay-base`. For more info, please see the [Alipay plugin docs](https://github.com/xueron/cordova-alipay-base).
|
||||||
|
*
|
||||||
|
* @usage
|
||||||
|
* ```
|
||||||
|
* import { Alipay, AlipayOrder } from '@ionic-native/alipay';
|
||||||
|
*
|
||||||
|
* constructor(private alipay: Alipay) {
|
||||||
|
*
|
||||||
|
* // Should get from server side with sign.
|
||||||
|
* const alipayOrder: AlipayOrder = {
|
||||||
|
* ...
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* this.alipay.pay(alipayOrder)
|
||||||
|
* .then(result => {
|
||||||
|
* console.log(result); // Success
|
||||||
|
* })
|
||||||
|
* .catch(error => {
|
||||||
|
* console.log(error); // Failed
|
||||||
|
* });
|
||||||
|
*
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @interfaces
|
||||||
|
* AlipayOrder
|
||||||
|
*/
|
||||||
|
@Plugin({
|
||||||
|
pluginName: 'Alipay',
|
||||||
|
plugin: 'cordova-alipay-base',
|
||||||
|
pluginRef: 'Alipay.Base',
|
||||||
|
repo: 'https://github.com/xueron/cordova-alipay-base',
|
||||||
|
platforms: ['Android', 'iOS'],
|
||||||
|
install: 'ionic plugin add https://github.com/xueron/cordova-alipay-base --variable APP_ID=your_app_id'
|
||||||
|
})
|
||||||
|
@Injectable()
|
||||||
|
export class Alipay {
|
||||||
|
/**
|
||||||
|
* Open Alipay to perform App pay
|
||||||
|
* @param order { AlipayOrder } alipay options
|
||||||
|
* @returns {Promise<any>} Returns a Promise that resolves with the success return, or rejects with an error.
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
pay(order: AlipayOrder): Promise<any> { return; }
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,181 @@
|
|||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Cordova, Plugin } from '@ionic-native/core';
|
||||||
|
|
||||||
|
|
||||||
|
export interface AFAAuthOptions {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Required
|
||||||
|
* Used as the alias for your key in the Android Key Store.
|
||||||
|
*/
|
||||||
|
clientId: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to create credential string for encrypted token and as alias to retrieve the cipher.
|
||||||
|
*/
|
||||||
|
username?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to create credential string for encrypted token
|
||||||
|
*/
|
||||||
|
password?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Required for decrypt()
|
||||||
|
* Encrypted user credentials to decrypt upon successful authentication.
|
||||||
|
*/
|
||||||
|
token?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set to true to remove the "USE BACKUP" button
|
||||||
|
*/
|
||||||
|
disableBackup?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change the language. (en_US or es)
|
||||||
|
*/
|
||||||
|
locale?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The device max is 5 attempts. Set this parameter if you want to allow fewer than 5 attempts.
|
||||||
|
*/
|
||||||
|
maxAttempts?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Require the user to authenticate with a fingerprint to authorize every use of the key.
|
||||||
|
* New fingerprint enrollment will invalidate key and require backup authenticate to
|
||||||
|
* re-enable the fingerprint authentication dialog.
|
||||||
|
*/
|
||||||
|
userAuthRequired?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the title of the fingerprint authentication dialog.
|
||||||
|
*/
|
||||||
|
dialogTitle?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the message of the fingerprint authentication dialog.
|
||||||
|
*/
|
||||||
|
dialogMessage?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the hint displayed by the fingerprint icon on the fingerprint authentication dialog.
|
||||||
|
*/
|
||||||
|
dialogHint?: string;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AFADecryptOptions {
|
||||||
|
/**
|
||||||
|
* Biometric authentication
|
||||||
|
*/
|
||||||
|
withFingerprint: boolean;
|
||||||
|
/**
|
||||||
|
* Authentication using backup credential activity
|
||||||
|
*/
|
||||||
|
withBackup: boolean;
|
||||||
|
/**
|
||||||
|
* FingerprintAuth.CipherMode.DECRYPT
|
||||||
|
* Decrypted password
|
||||||
|
*/
|
||||||
|
password: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AFAEncryptResponse {
|
||||||
|
/**
|
||||||
|
* Biometric authentication
|
||||||
|
*/
|
||||||
|
withFingerprint: boolean;
|
||||||
|
/**
|
||||||
|
* Authentication using backup credential activity
|
||||||
|
*/
|
||||||
|
withBackup: boolean;
|
||||||
|
/**
|
||||||
|
* base64encoded string representation of user credentials
|
||||||
|
*/
|
||||||
|
token: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Android Fingerprint Auth
|
||||||
|
* @description
|
||||||
|
* This plugin will open a native dialog fragment prompting the user to authenticate using their fingerprint. If the device has a secure lockscreen (pattern, PIN, or password), the user may opt to authenticate using that method as a backup.
|
||||||
|
* @usage
|
||||||
|
* ```typescript
|
||||||
|
* import { AndroidFingerprintAuth, AFAAuthOptions } from '@ionic-native/android-fingerprint-auth';
|
||||||
|
*
|
||||||
|
* constructor(private androidFingerprintAuth: AndroidFingerprintAuth) { }
|
||||||
|
*
|
||||||
|
* ...
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* this.androidFingerprintAuth.isAvailable()
|
||||||
|
* .then((result)=> {
|
||||||
|
* if(result.isAvailable){
|
||||||
|
* // it is available
|
||||||
|
*
|
||||||
|
* this.androidFingerprintAuth.encrypt({ clientId: "myAppName", username: "myUsername", password: "myPassword" })
|
||||||
|
* .then(result => {
|
||||||
|
* if (result.withFingerprint) {
|
||||||
|
* console.log("Successfully encrypted credentials.");
|
||||||
|
* console.log("Encrypted credentials: " + result.token);
|
||||||
|
* } else if (result.withBackup) {
|
||||||
|
* console.log('Successfully authenticated with backup password!');
|
||||||
|
* } else console.log('Didn\'t authenticate!');
|
||||||
|
* })
|
||||||
|
* .catch(error => {
|
||||||
|
* if (error === "Cancelled") {
|
||||||
|
* console.log("Fingerprint authentication cancelled");
|
||||||
|
* } else console.error(error)
|
||||||
|
* });
|
||||||
|
*
|
||||||
|
* } else {
|
||||||
|
* // fingerprint auth isn't available
|
||||||
|
* }
|
||||||
|
* })
|
||||||
|
* .catch(error => console.error(error));
|
||||||
|
* ```
|
||||||
|
* @interfaces
|
||||||
|
* AFAAuthOptions
|
||||||
|
* AFAEncryptResponse
|
||||||
|
* AFADecryptOptions
|
||||||
|
*/
|
||||||
|
@Plugin({
|
||||||
|
pluginName: 'AndroidFingerprintAuth',
|
||||||
|
plugin: 'cordova-plugin-android-fingerprint-auth',
|
||||||
|
pluginRef: 'FingerprintAuth',
|
||||||
|
repo: 'https://github.com/mjwheatley/cordova-plugin-android-fingerprint-auth'
|
||||||
|
})
|
||||||
|
@Injectable()
|
||||||
|
export class AndroidFingerprintAuth {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens a native dialog fragment to use the device hardware fingerprint scanner to authenticate against fingerprints registered for the device.
|
||||||
|
* @param options {AFAAuthOptions} Options
|
||||||
|
* @returns {Promise<any>}
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
encrypt(options: AFAAuthOptions): Promise<AFAEncryptResponse> {return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens a native dialog fragment to use the device hardware fingerprint scanner to authenticate against fingerprints registered for the device.
|
||||||
|
* @param options {AFAAuthOptions} Options
|
||||||
|
* @returns {Promise<any>}
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
decrypt(options: AFAAuthOptions): Promise<AFADecryptOptions> {return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if service is available
|
||||||
|
* @returns {Promise<any>} Returns a Promise that resolves if fingerprint auth is available on the device
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
isAvailable(): Promise<{isAvailable: boolean}> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete the cipher used for encryption and decryption by username
|
||||||
|
* @returns {Promise<any>} Returns a Promise that resolves if the cipher was successfully deleted
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
delete(options: {clientId: string; username: string; }): Promise<{deleted: boolean}> { return; }
|
||||||
|
}
|
||||||
+13
-6
@@ -1,4 +1,5 @@
|
|||||||
import { Cordova, Plugin } from './plugin';
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Cordova, Plugin } from '@ionic-native/core';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name App Availability
|
* @name App Availability
|
||||||
@@ -9,18 +10,22 @@ import { Cordova, Plugin } from './plugin';
|
|||||||
*
|
*
|
||||||
* @usage
|
* @usage
|
||||||
* ```typescript
|
* ```typescript
|
||||||
* import { AppAvailability } from 'ionic-native';
|
* import { AppAvailability } from '@ionic-native/app-availability';
|
||||||
|
* import { Platform } from 'ionic-angular';
|
||||||
*
|
*
|
||||||
|
* constructor(private appAvailability: AppAvailability, private platform: Platform) { }
|
||||||
|
*
|
||||||
|
* ...
|
||||||
*
|
*
|
||||||
* let app;
|
* let app;
|
||||||
*
|
*
|
||||||
* if (device.platform === 'iOS') {
|
* if (this.platform.is('ios')) {
|
||||||
* app = 'twitter://';
|
* app = 'twitter://';
|
||||||
* } else if (device.platform === 'Android') {
|
* } else if (this.platform.is('android')) {
|
||||||
* app = 'com.twitter.android';
|
* app = 'com.twitter.android';
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
* AppAvailability.check(app)
|
* this.appAvailability.check(app)
|
||||||
* .then(
|
* .then(
|
||||||
* (yes: string) => console.log(app + ' is available'),
|
* (yes: string) => console.log(app + ' is available'),
|
||||||
* (no: string) => console.log(app + ' is NOT available')
|
* (no: string) => console.log(app + ' is NOT available')
|
||||||
@@ -28,11 +33,13 @@ import { Cordova, Plugin } from './plugin';
|
|||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
@Plugin({
|
@Plugin({
|
||||||
|
pluginName: 'AppAvailability',
|
||||||
plugin: 'cordova-plugin-appavailability',
|
plugin: 'cordova-plugin-appavailability',
|
||||||
pluginRef: 'appAvailability',
|
pluginRef: 'appAvailability',
|
||||||
repo: 'https://github.com/ohh2ahh/AppAvailability',
|
repo: 'https://github.com/ohh2ahh/AppAvailability',
|
||||||
platforms: ['Android', 'iOS']
|
platforms: ['Android', 'iOS']
|
||||||
})
|
})
|
||||||
|
@Injectable()
|
||||||
export class AppAvailability {
|
export class AppAvailability {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -41,6 +48,6 @@ export class AppAvailability {
|
|||||||
* @returns {Promise<boolean>}
|
* @returns {Promise<boolean>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static check(app: string): Promise<boolean> { return; }
|
check(app: string): Promise<boolean> { return; }
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,139 @@
|
|||||||
|
import { Cordova, Plugin } from '@ionic-native/core';
|
||||||
|
import { Observable } from 'rxjs/Observable';
|
||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name App Preferences
|
||||||
|
* @description
|
||||||
|
* This plugin allows you to read and write app preferences
|
||||||
|
*
|
||||||
|
* @usage
|
||||||
|
* ```typescript
|
||||||
|
* import { AppPreferences } from '@ionic-native/app-preferences';
|
||||||
|
*
|
||||||
|
* constructor(private appPreferences: AppPreferences) {
|
||||||
|
*
|
||||||
|
* this.appPreferences.fetch('key').then((res) => { console.log(res); });
|
||||||
|
*
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Plugin({
|
||||||
|
pluginName: 'AppPreferences',
|
||||||
|
plugin: 'cordova-plugin-app-preferences', // npm package name, example: cordova-plugin-camera
|
||||||
|
pluginRef: 'plugins.appPreferences', // the variable reference to call the plugin, example: navigator.geolocation
|
||||||
|
repo: 'https://github.com/apla/me.apla.cordova.app-preferences', // the github repository URL for the plugin
|
||||||
|
})
|
||||||
|
@Injectable()
|
||||||
|
export class AppPreferences {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a preference value
|
||||||
|
*
|
||||||
|
* @param {string} dict Dictionary for key (OPTIONAL)
|
||||||
|
* @param {string} key Key
|
||||||
|
* @return {Promise<any>} Returns a promise
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
sync: true,
|
||||||
|
callbackOrder: 'reverse'
|
||||||
|
})
|
||||||
|
fetch(dict: string, key?: string): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a preference value
|
||||||
|
*
|
||||||
|
* @param {string} dict Dictionary for key (OPTIONAL)
|
||||||
|
* @param {string} key Key
|
||||||
|
* @param {string} value Value
|
||||||
|
* @return {Promise<any>} Returns a promise
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
callbackOrder: 'reverse'
|
||||||
|
})
|
||||||
|
store(dict: string, key: string, value?: string): Promise<any> {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove value from preferences
|
||||||
|
*
|
||||||
|
* @param {string} dict Dictionary for key (OPTIONAL)
|
||||||
|
* @param {string} key Key
|
||||||
|
* @return {Promise<any>} Returns a promise
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
callbackOrder: 'reverse'
|
||||||
|
})
|
||||||
|
remove(dict: string, key?: string): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear preferences
|
||||||
|
*
|
||||||
|
* @return {Promise<any>} Returns a promise
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
callbackOrder: 'reverse'
|
||||||
|
})
|
||||||
|
clearAll(): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show native preferences interface
|
||||||
|
*
|
||||||
|
* @return {Promise<any>} Returns a promise
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
callbackOrder: 'reverse'
|
||||||
|
})
|
||||||
|
show(): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show native preferences interface
|
||||||
|
*
|
||||||
|
* @param {boolean} subscribe true value to subscribe, false - unsubscribe
|
||||||
|
* @return {Observable<any>} Returns an observable
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
observable: true
|
||||||
|
})
|
||||||
|
watch(subscribe: boolean): Observable<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return named configuration context
|
||||||
|
* In iOS you'll get a suite configuration, on Android — named file
|
||||||
|
* Supports: Android, iOS
|
||||||
|
* @param {string} suiteName suite name
|
||||||
|
* @returns {Object} Custom object, bound to that suite
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
platforms: ['Android']
|
||||||
|
})
|
||||||
|
suite(suiteName: string): Object { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
platforms: ['iOS']
|
||||||
|
})
|
||||||
|
iosSuite(suiteName: string): Object { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return cloud synchronized configuration context
|
||||||
|
* Currently supports Windows and iOS/macOS
|
||||||
|
* @returns {Object} Custom object, bound to that suite
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
platforms: ['iOS', 'Windows', 'Windows Phone 8']
|
||||||
|
})
|
||||||
|
cloudSync(): Object { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return default configuration context
|
||||||
|
* Currently supports Windows and iOS/macOS
|
||||||
|
* @returns {Object} Custom Object, bound to that suite
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
platforms: ['iOS', 'Windows', 'Windows Phone 8']
|
||||||
|
})
|
||||||
|
defaults(): Object { return; }
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,153 @@
|
|||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Cordova, CordovaProperty, Plugin } from '@ionic-native/core';
|
||||||
|
|
||||||
|
|
||||||
|
declare var window;
|
||||||
|
|
||||||
|
export interface AppRatePreferences {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom BCP 47 language tag
|
||||||
|
*/
|
||||||
|
useLanguage?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom application title
|
||||||
|
*/
|
||||||
|
displayAppName?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show dialog again when application version will be updated. Defaults to `true`
|
||||||
|
*/
|
||||||
|
promptAgainForEachNewVersion?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* count of runs of application before dialog will be displayed. Defaults to `3`
|
||||||
|
*/
|
||||||
|
usesUntilPrompt?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* leave app or no when application page opened in app store (now supported only for iOS). Defaults to `false`
|
||||||
|
*/
|
||||||
|
openStoreInApp?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* use custom view for rate dialog. Defaults to `false`
|
||||||
|
*/
|
||||||
|
useCustomRateDialog?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom locale object
|
||||||
|
*/
|
||||||
|
customLocale?: any;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callbacks for events
|
||||||
|
*/
|
||||||
|
callbacks?: AppRateCallbacks;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* App Store URLS
|
||||||
|
*/
|
||||||
|
storeAppURL?: AppUrls;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AppRateCallbacks {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* call back function. called when user clicked on rate-dialog buttons
|
||||||
|
*/
|
||||||
|
onButtonClicked?: Function;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* call back function. called when rate-dialog showing
|
||||||
|
*/
|
||||||
|
onRateDialogShow?: Function;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AppUrls {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* application id in AppStore
|
||||||
|
*/
|
||||||
|
ios?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* application URL in GooglePlay
|
||||||
|
*/
|
||||||
|
android?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* application URL in Windows Store
|
||||||
|
*/
|
||||||
|
windows?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* application URL in AppWorld
|
||||||
|
*/
|
||||||
|
blackberry?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* application URL in WindowsStore
|
||||||
|
*/
|
||||||
|
windows8?: string;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name App Rate
|
||||||
|
* @description
|
||||||
|
* The AppRate plugin makes it easy to prompt the user to rate your app, either now, later, or never.
|
||||||
|
*
|
||||||
|
* Requires Cordova plugin: cordova-plugin-apprate. For more info, please see the [AppRate plugin docs](https://github.com/pushandplay/cordova-plugin-apprate).
|
||||||
|
*
|
||||||
|
* @usage
|
||||||
|
* ```typescript
|
||||||
|
* import { AppRate } from '@ionic-native/app-rate';
|
||||||
|
*
|
||||||
|
* constructor(private appRate: AppRate) { }
|
||||||
|
*
|
||||||
|
* ...
|
||||||
|
*
|
||||||
|
* this.appRate.preferences.storeAppURL = {
|
||||||
|
* ios: '<my_app_id>',
|
||||||
|
* android: 'market://details?id=<package_name>',
|
||||||
|
* windows: 'ms-windows-store://review/?ProductId=<Store_ID>'
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
* this.appRate.promptForRating(false);
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @interfaces
|
||||||
|
* AppRatePreferences
|
||||||
|
* AppUrls
|
||||||
|
* AppRateCallbacks
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Plugin({
|
||||||
|
pluginName: 'AppRate',
|
||||||
|
plugin: 'cordova-plugin-apprate',
|
||||||
|
pluginRef: 'AppRate',
|
||||||
|
repo: 'https://github.com/pushandplay/cordova-plugin-apprate',
|
||||||
|
platforms: ['Android', 'iOS', 'Windows (experimental)']
|
||||||
|
})
|
||||||
|
@Injectable()
|
||||||
|
export class AppRate {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure various settings for the Rating View.
|
||||||
|
* See table below for options
|
||||||
|
*/
|
||||||
|
@CordovaProperty
|
||||||
|
preferences: AppRatePreferences;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prompts the user for rating
|
||||||
|
* @param {boolean} immediately Show the rating prompt immediately.
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
promptForRating(immediately: boolean): void { };
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
import { Plugin, Cordova } from '@ionic-native/core';
|
||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name App Update
|
||||||
|
* @description
|
||||||
|
* This plugin does self-update for android
|
||||||
|
*
|
||||||
|
* @usage
|
||||||
|
*
|
||||||
|
* You should first host an XML file on your server with the following data in it:
|
||||||
|
* ```xml
|
||||||
|
* <update>
|
||||||
|
* <version>302048</version>
|
||||||
|
* <name>APK Name</name>
|
||||||
|
* <url>https://your-remote-api.com/YourApp.apk</url>
|
||||||
|
* </update>
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* Then use the following code:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* import { AppUpdate } from '@ionic-native/app-update';
|
||||||
|
*
|
||||||
|
* constructor(private appUpdate: AppUpdate) {
|
||||||
|
*
|
||||||
|
* const updateUrl = 'http://your-remote-api.com/update.xml';
|
||||||
|
* this.appUpdate.checkAppUpdate(updateUrl);
|
||||||
|
*
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* The plugin will compare the app version and update it automatically if the API has a newer version to install.
|
||||||
|
*/
|
||||||
|
@Plugin({
|
||||||
|
pluginName: 'AppUpdate',
|
||||||
|
plugin: 'cordova-plugin-app-update',
|
||||||
|
pluginRef: 'AppUpdate',
|
||||||
|
repo: 'https://github.com/vaenow/cordova-plugin-app-update',
|
||||||
|
platforms: ['Android']
|
||||||
|
})
|
||||||
|
@Injectable()
|
||||||
|
export class AppUpdate {
|
||||||
|
/**
|
||||||
|
* Check and update
|
||||||
|
* @param updateUrl {string} update api url
|
||||||
|
* @return {Promise<any>} Returns a promise that resolves when something happens
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
callbackOrder: 'reverse'
|
||||||
|
})
|
||||||
|
checkAppUpdate(updateUrl: string): Promise<any> { return; }
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,4 +1,7 @@
|
|||||||
import { Cordova, Plugin } from './plugin';
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Cordova, Plugin } from '@ionic-native/core';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name App Version
|
* @name App Version
|
||||||
@@ -9,48 +12,56 @@ import { Cordova, Plugin } from './plugin';
|
|||||||
*
|
*
|
||||||
* @usage
|
* @usage
|
||||||
* ```typescript
|
* ```typescript
|
||||||
* import { AppVersion } from 'ionic-native';
|
* import { AppVersion } from '@ionic-native/app-version';
|
||||||
|
*
|
||||||
|
* constructor(private appVersion: AppVersion) { }
|
||||||
|
*
|
||||||
|
* ...
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* AppVersion.getAppName();
|
* this.appVersion.getAppName();
|
||||||
* AppVersion.getPackageName();
|
* this.appVersion.getPackageName();
|
||||||
* AppVersion.getVersionCode();
|
* this.appVersion.getVersionCode();
|
||||||
* AppVersion.getVersionNumber();
|
* this.appVersion.getVersionNumber();
|
||||||
|
*
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
@Plugin({
|
@Plugin({
|
||||||
|
pluginName: 'AppVersion',
|
||||||
plugin: 'cordova-plugin-app-version',
|
plugin: 'cordova-plugin-app-version',
|
||||||
pluginRef: 'cordova.getAppVersion',
|
pluginRef: 'cordova.getAppVersion',
|
||||||
repo: 'https://github.com/whiteoctober/cordova-plugin-app-version',
|
repo: 'https://github.com/whiteoctober/cordova-plugin-app-version',
|
||||||
platforms: ['Android', 'iOS']
|
platforms: ['Android', 'iOS']
|
||||||
})
|
})
|
||||||
|
@Injectable()
|
||||||
export class AppVersion {
|
export class AppVersion {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the name of the app
|
* Returns the name of the app
|
||||||
* @returns {Promise}
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static getAppName(): Promise<any> { return; }
|
getAppName(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the package name of the app
|
* Returns the package name of the app
|
||||||
* @returns {Promise}
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static getPackageName(): Promise<any> { return; }
|
getPackageName(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the build identifier of the app
|
* Returns the build identifier of the app
|
||||||
* @returns {Promise}
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static getVersionCode(): Promise<any> { return; }
|
getVersionCode(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the version of the app
|
* Returns the version of the app
|
||||||
* @returns {Promise}
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static getVersionNumber(): Promise<any> { return; }
|
getVersionNumber(): Promise<any> { return; }
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,519 @@
|
|||||||
|
import { Plugin, Cordova } from '@ionic-native/core';
|
||||||
|
import { Observable } from 'rxjs';
|
||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Appodeal
|
||||||
|
* @description
|
||||||
|
* Plugin to serve ads through native Appodeal SDKs
|
||||||
|
*
|
||||||
|
* @usage
|
||||||
|
* ```
|
||||||
|
* import { Appodeal } from '@ionic-native/appodeal';
|
||||||
|
*
|
||||||
|
* constructor(private appodeal: Appodeal) {
|
||||||
|
*
|
||||||
|
* const appKey = '<your app key>';
|
||||||
|
* appodeal.initialize(appKey, appodeal.AD_TYPES.REWARDED_VIDEO);
|
||||||
|
* appodeal.show(appodeal.AD_TYPES.REWARDED_VIDEO);
|
||||||
|
*
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
@Plugin({
|
||||||
|
pluginName: 'Appodeal',
|
||||||
|
plugin: 'https://github.com/appodeal/appodeal-cordova-plugin',
|
||||||
|
pluginRef: 'Appodeal',
|
||||||
|
repo: 'https://github.com/appodeal/appodeal-cordova-plugin.git',
|
||||||
|
platforms: [ 'ios', 'android' ]
|
||||||
|
})
|
||||||
|
@Injectable()
|
||||||
|
export class Appodeal {
|
||||||
|
// available types of advertisements
|
||||||
|
readonly AD_TYPES = {
|
||||||
|
INTERSTITIAL: 1,
|
||||||
|
SKIPPABLE_VIDEO: 2,
|
||||||
|
BANNER: 4,
|
||||||
|
BANNER_BOTTOM: 8,
|
||||||
|
BANNER_TOP: 16,
|
||||||
|
REWARDED_VIDEO: 128,
|
||||||
|
NON_SKIPPABLE_VIDEO: 256
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* initialize Appodeal SDK
|
||||||
|
* @param {string} appKey
|
||||||
|
* @param {number} adType
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
initialize(appKey: string, adType: number): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check if SDK has been initialized
|
||||||
|
* @returns {Promise<boolean>}
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
isInitialized(): Promise<any> { return; };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* show ad of specified type
|
||||||
|
* @param {number} adType
|
||||||
|
* @returns {Promise<boolean>}
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
show(adType: number): Promise<any> { return; };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* show ad of specified type with placement options
|
||||||
|
* @param {number} adType
|
||||||
|
* @param {any} placement
|
||||||
|
* @returns {Promise<boolean>}
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
showWithPlacement(
|
||||||
|
adType: number,
|
||||||
|
placement: any
|
||||||
|
): Promise<any> { return; };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hide ad of specified type
|
||||||
|
* @param {number} adType
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
hide(adType: number): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* confirm use of ads of specified type
|
||||||
|
* @param {number} adType
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
confirm(adType: number): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check if ad of specified type has been loaded
|
||||||
|
* @param {number} adType
|
||||||
|
* @returns {Promise<boolean>}
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
isLoaded(adType: number): Promise<any> { return; };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check if ad of specified
|
||||||
|
* @param {number} adType
|
||||||
|
* @returns {Promise<boolean>}
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
isPrecache(adType: number): Promise<any> { return; };
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {number} adType
|
||||||
|
* @param autoCache
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setAutoCache(adType: number, autoCache: any): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* forcefully cache an ad by type
|
||||||
|
* @param {number} adType
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
cache(adType: number): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {boolean} set
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setOnLoadedTriggerBoth(set: boolean): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enable or disable Smart Banners
|
||||||
|
* @param {boolean} enabled
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setSmartBanners(enabled: boolean): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enable or disable banner backgrounds
|
||||||
|
* @param {boolean} enabled
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setBannerBackground(enabled: boolean): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enable or disable banner animations
|
||||||
|
* @param {boolean} enabled
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setBannerAnimation(enabled: boolean): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
set728x90Banners(value: any): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enable or disable logging
|
||||||
|
* @param {boolean} logging
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setLogging(logging: boolean): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enable or disable testing mode
|
||||||
|
* @param {boolean} testing
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setTesting(testing: boolean): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* reset device ID
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
resetUUID(): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get version of Appdeal SDK
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
getVersion(): Promise<any> { return; };
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {string} network
|
||||||
|
* @param {number} adType
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
disableNetwork(network?: string, adType?: number): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {string} network
|
||||||
|
* @param {number} adType
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
disableNetworkType(network?: string, adType?: number): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* disable Location permissions for Appodeal SDK
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
disableLocationPermissionCheck(): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* disable Storage permissions for Appodeal SDK
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
disableWriteExternalStoragePermissionCheck(): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enable event listeners
|
||||||
|
* @param {boolean} enabled
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
enableInterstitialCallbacks(enabled: boolean): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enable event listeners
|
||||||
|
* @param {boolean} enabled
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
enableSkippableVideoCallbacks(enabled: boolean): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enable event listeners
|
||||||
|
* @param {boolean} enabled
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
enableNonSkippableVideoCallbacks(enabled: boolean): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enable event listeners
|
||||||
|
* @param {boolean} enabled
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
enableBannerCallbacks(enabled: boolean): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enable event listeners
|
||||||
|
* @param {boolean} enabled
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
enableRewardedVideoCallbacks(enabled: boolean): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {string} name - name of rule
|
||||||
|
* @param {boolean} value
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setCustomBooleanRule(name: string, value: boolean): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {string} name - name of rule
|
||||||
|
* @param {number} value
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setCustomIntegerRule(name: string, value: number): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set rule with float value
|
||||||
|
* @param {string} name
|
||||||
|
* @param {number} value
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setCustomDoubleRule(name: string, value: number): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set rule with string value
|
||||||
|
* @param {string} name - name of rule
|
||||||
|
* @param {string} value
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setCustomStringRule(name: string, value: string): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set ID preference in Appodeal for current user
|
||||||
|
* @param id
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setUserId(id: any): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set Email preference in Appodeal for current user
|
||||||
|
* @param email
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setEmail(email: any): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set Birthday preference in Appodeal for current user
|
||||||
|
* @param birthday
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setBirthday(birthday: any): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* et Age preference in Appodeal for current user
|
||||||
|
* @param age
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setAge(age: any): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set Gender preference in Appodeal for current user
|
||||||
|
* @param gender
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setGender(gender: any): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set Occupation preference in Appodeal for current user
|
||||||
|
* @param occupation
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setOccupation(occupation: any): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set Relation preference in Appodeal for current user
|
||||||
|
* @param relation
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setRelation(relation: any): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set Smoking preference in Appodeal for current user
|
||||||
|
* @param smoking
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setSmoking(smoking: any): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set Alcohol preference in Appodeal for current user
|
||||||
|
* @param alcohol
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setAlcohol(alcohol: any): void {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set Interests preference in Appodeal for current user
|
||||||
|
* @param interests
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
setInterests(interests: any): void {};
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onInterstitialLoaded',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onInterstitialLoaded(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onInterstitialFailedToLoad',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onInterstitialFailedToLoad(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onInterstitialShown',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onInterstitialShown(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onInterstitialClicked',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onInterstitialClicked(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onInterstitialClosed',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onInterstitialClosed(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onSkippableVideoLoaded',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onSkippableVideoLoaded(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onSkippableVideoFailedToLoad',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onSkippableVideoFailedToLoad(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onSkippableVideoShown',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onSkippableVideoShown(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onSkippableVideoFinished',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onSkippableVideoFinished(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onSkippableVideoClosed',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onSkippableVideoClosed(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onRewardedVideoLoaded',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onRewardedVideoLoaded(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onRewardedVideoFailedToLoad',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onRewardedVideoFailedToLoad(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onRewardedVideoShown',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onRewardedVideoShown(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onRewardedVideoFinished',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onRewardedVideoFinished(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onRewardedVideoClosed',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onRewardedVideoClosed(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onNonSkippableVideoLoaded',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onNonSkippableVideoLoaded(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onNonSkippableVideoFailedToLoad',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onNonSkippableVideoFailedToLoad(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onNonSkippableVideoShown',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onNonSkippableVideoShown(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onNonSkippableVideoFinished',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onNonSkippableVideoFinished(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onNonSkippableVideoClosed',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onNonSkippableVideoClosed(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onBannerClicked',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onBannerClicked(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onBannerFailedToLoad',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onBannerFailedToLoad(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onBannerLoaded',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onBannerLoaded(): Observable<any> { return; }
|
||||||
|
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'onBannerShown',
|
||||||
|
element: document
|
||||||
|
})
|
||||||
|
onBannerShown(): Observable<any> { return; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
import { Cordova, Plugin } from '@ionic-native/core';
|
||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
|
||||||
|
declare var window;
|
||||||
|
|
||||||
|
|
||||||
|
export interface BackgroundFetchConfig {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set true to cease background-fetch from operating after user "closes" the app. Defaults to true.
|
||||||
|
*/
|
||||||
|
stopOnTerminate?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Background Fetch
|
||||||
|
* @description
|
||||||
|
* iOS Background Fetch Implementation. See: https://developer.apple.com/reference/uikit/uiapplication#1657399
|
||||||
|
* iOS Background Fetch is basically an API which wakes up your app about every 15 minutes (during the user's prime-time hours) and provides your app exactly 30s of background running-time. This plugin will execute your provided callbackFn whenever a background-fetch event occurs. There is no way to increase the rate which a fetch-event occurs and this plugin sets the rate to the most frequent possible value of UIApplicationBackgroundFetchIntervalMinimum -- iOS determines the rate automatically based upon device usage and time-of-day (ie: fetch-rate is about ~15min during prime-time hours; less frequently when the user is presumed to be sleeping, at 3am for example).
|
||||||
|
* For more detail, please see https://github.com/transistorsoft/cordova-plugin-background-fetch
|
||||||
|
*
|
||||||
|
* @usage
|
||||||
|
*
|
||||||
|
* ```typescript
|
||||||
|
* import { BackgroundFetch, BackgroundFetchConfig } from '@ionic-native/background-fetch';
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* constructor(private backgroundFetch: BackgroundFetch) {
|
||||||
|
*
|
||||||
|
* const config: BackgroundFetchConfig = {
|
||||||
|
* stopOnTerminate: false, // Set true to cease background-fetch from operating after user "closes" the app. Defaults to true.
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
* backgroundFetch.configure(config)
|
||||||
|
* .then(() => {
|
||||||
|
* console.log('Background Fetch initialized');
|
||||||
|
*
|
||||||
|
* this.backgroundFetch.finish();
|
||||||
|
*
|
||||||
|
* })
|
||||||
|
* .catch(e => console.log('Error initializing background fetch', e));
|
||||||
|
*
|
||||||
|
* // Start the background-fetch API. Your callbackFn provided to #configure will be executed each time a background-fetch event occurs. NOTE the #configure method automatically calls #start. You do not have to call this method after you #configure the plugin
|
||||||
|
* backgroundFetch.start();
|
||||||
|
*
|
||||||
|
* // Stop the background-fetch API from firing fetch events. Your callbackFn provided to #configure will no longer be executed.
|
||||||
|
* backgroundFetch.stop();
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* @interfaces
|
||||||
|
* BackgroundFetchConfig
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Plugin({
|
||||||
|
pluginName: 'BackgroundFetch',
|
||||||
|
plugin: 'cordova-plugin-background-fetch',
|
||||||
|
pluginRef: 'BackgroundFetch',
|
||||||
|
repo: 'https://github.com/transistorsoft/cordova-plugin-background-fetch',
|
||||||
|
platforms: ['iOS']
|
||||||
|
})
|
||||||
|
@Injectable()
|
||||||
|
export class BackgroundFetch {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the plugin's fetch callbackFn
|
||||||
|
*
|
||||||
|
* @param {BackgroundFetchConfig} config Configuration for plugin
|
||||||
|
* @return {Promise<any>}
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
callbackOrder: 'reverse'
|
||||||
|
})
|
||||||
|
configure(config: BackgroundFetchConfig): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start the background-fetch API.
|
||||||
|
* Your callbackFn provided to #configure will be executed each time a background-fetch event occurs. NOTE the #configure method automatically calls #start. You do not have to call this method after you #configure the plugin
|
||||||
|
* @returns {Promise<any>}
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
start(): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop the background-fetch API from firing fetch events. Your callbackFn provided to #configure will no longer be executed.
|
||||||
|
* @returns {Promise<any>}
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
stop(): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* You MUST call this method in your fetch callbackFn provided to #configure in order to signal to iOS that your fetch action is complete. iOS provides only 30s of background-time for a fetch-event -- if you exceed this 30s, iOS will kill your app.
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
sync: true
|
||||||
|
})
|
||||||
|
finish(): void { }
|
||||||
|
|
||||||
|
}
|
||||||
+145
-83
@@ -1,8 +1,10 @@
|
|||||||
import {Cordova, Plugin} from './plugin';
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Cordova, Plugin } from '@ionic-native/core';
|
||||||
|
import { Observable } from 'rxjs/Observable';
|
||||||
|
|
||||||
declare var window;
|
declare var window;
|
||||||
|
|
||||||
export interface Location {
|
export interface BackgroundGeolocationResponse {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ID of location as stored in DB (or null)
|
* ID of location as stored in DB (or null)
|
||||||
@@ -49,6 +51,11 @@ export interface Location {
|
|||||||
*/
|
*/
|
||||||
altitude: number;
|
altitude: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* accuracy of the altitude if available.
|
||||||
|
*/
|
||||||
|
altitudeAccuracy: number;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* bearing, in degrees.
|
* bearing, in degrees.
|
||||||
*/
|
*/
|
||||||
@@ -65,7 +72,7 @@ export interface Location {
|
|||||||
timestamp: number;
|
timestamp: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Config {
|
export interface BackgroundGeolocationConfig {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Desired accuracy in meters. Possible values [0, 10, 100, 1000]. The lower
|
* Desired accuracy in meters. Possible values [0, 10, 100, 1000]. The lower
|
||||||
@@ -121,10 +128,14 @@ export interface Config {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* ANDROID, WP8 ONLY
|
* ANDROID, WP8 ONLY
|
||||||
* The minimum time interval between location updates in seconds.
|
* When using BackgroundGeolocation.LocationProvider.ANDROID_DISTANCE_FILTER_PROVIDER:
|
||||||
|
* The minimum time interval between location updates in milliseconds.
|
||||||
* @see Android docs (http://developer.android.com/reference/android/location/LocationManager.html#requestLocationUpdates(long,%20float,%20android.location.Criteria,%20android.app.PendingIntent))
|
* @see Android docs (http://developer.android.com/reference/android/location/LocationManager.html#requestLocationUpdates(long,%20float,%20android.location.Criteria,%20android.app.PendingIntent))
|
||||||
* and the MS doc (http://msdn.microsoft.com/en-us/library/windows/apps/windows.devices.geolocation.geolocator.reportinterval)
|
* and the MS doc (http://msdn.microsoft.com/en-us/library/windows/apps/windows.devices.geolocation.geolocator.reportinterval)
|
||||||
* for more information
|
* for more information
|
||||||
|
* When using BackgroundGeolocation.LocationProvider.ANDROID_ACTIVITY_PROVIDER:
|
||||||
|
* Rate in milliseconds at which your app prefers to receive location updates.
|
||||||
|
* @see Android docs (https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#getInterval())
|
||||||
*/
|
*/
|
||||||
interval?: number;
|
interval?: number;
|
||||||
|
|
||||||
@@ -220,26 +231,48 @@ export interface Config {
|
|||||||
* Defaults to 10000
|
* Defaults to 10000
|
||||||
*/
|
*/
|
||||||
maxLocations?: number;
|
maxLocations?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ANDROID ONLY with BackgroundGeolocation.LocationProvider.ANDROID_ACTIVITY_PROVIDER
|
||||||
|
*
|
||||||
|
* Fastest rate in milliseconds at which your app can handle location updates.
|
||||||
|
* @see Android docs (https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#getFastestInterval())
|
||||||
|
*/
|
||||||
|
fastestInterval?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ANDROID ONLY with BackgroundGeolocation.LocationProvider.ANDROID_ACTIVITY_PROVIDER
|
||||||
|
*
|
||||||
|
* Rate in milliseconds at which activity recognition occurs. Larger values will result in fewer activity detections while improving battery life.
|
||||||
|
*/
|
||||||
|
activitiesInterval?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ANDROID ONLY with BackgroundGeolocation.LocationProvider.ANDROID_ACTIVITY_PROVIDER
|
||||||
|
*
|
||||||
|
* stop() is forced, when the STILL activity is detected (default is true)
|
||||||
|
*/
|
||||||
|
stopOnStillActivity?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name BackgroundGeolocation
|
* @name Background Geolocation
|
||||||
* @description
|
* @description
|
||||||
* This plugin provides foreground and background geolocation with battery-saving "circular region monitoring" and "stop detection". For
|
* This plugin provides foreground and background geolocation with battery-saving "circular region monitoring" and "stop detection". For
|
||||||
* more detail, please see https://github.com/mauron85/cordova-plugin-background-geolocation
|
* more detail, please see https://github.com/mauron85/cordova-plugin-background-geolocation
|
||||||
*
|
*
|
||||||
* @usage
|
* @usage
|
||||||
*
|
*
|
||||||
|
* BackgroundGeolocation must be called within app.ts and or before Geolocation. Otherwise the platform will not ask you for background tracking permission.
|
||||||
|
*
|
||||||
* ```typescript
|
* ```typescript
|
||||||
* import { BackgroundGeolocation } from 'ionic-native';
|
* import { BackgroundGeolocation, BackgroundGeolocationConfig } from '@ionic-native/background-geolocation';
|
||||||
*
|
*
|
||||||
|
* constructor(private backgroundGeolocation: BackgroundGeolocation) { }
|
||||||
*
|
*
|
||||||
* // When device is ready :
|
* ...
|
||||||
* platform.ready().then(() => {
|
*
|
||||||
* // IMPORTANT: BackgroundGeolocation must be called within app.ts and or before Geolocation. Otherwise the platform will not ask you for background tracking permission.
|
* const config: BackgroundGeolocationConfig = {
|
||||||
*
|
|
||||||
* // BackgroundGeolocation is highly configurable. See platform specific configuration options
|
|
||||||
* let config = {
|
|
||||||
* desiredAccuracy: 10,
|
* desiredAccuracy: 10,
|
||||||
* stationaryRadius: 20,
|
* stationaryRadius: 20,
|
||||||
* distanceFilter: 30,
|
* distanceFilter: 30,
|
||||||
@@ -247,33 +280,37 @@ export interface Config {
|
|||||||
* stopOnTerminate: false, // enable this to clear background location settings when the app terminates
|
* stopOnTerminate: false, // enable this to clear background location settings when the app terminates
|
||||||
* };
|
* };
|
||||||
*
|
*
|
||||||
* BackgroundGeolocation.configure((location) => {
|
* this.backgroundGeolocation.configure(config)
|
||||||
console.log('[js] BackgroundGeolocation callback: ' + location.latitude + ',' + location.longitude);
|
* .subscribe((location: BackgroundGeolocationResponse) => {
|
||||||
|
|
||||||
// IMPORTANT: You must execute the finish method here to inform the native plugin that you're finished,
|
|
||||||
// and the background-task may be completed. You must do this regardless if your HTTP request is successful or not.
|
|
||||||
// IF YOU DON'T, ios will CRASH YOUR APP for spending too much time in the background.
|
|
||||||
BackgroundGeolocation.finish(); // FOR IOS ONLY
|
|
||||||
|
|
||||||
* }, (error) => {
|
|
||||||
* console.log('BackgroundGeolocation error');
|
|
||||||
* }, config);
|
|
||||||
*
|
*
|
||||||
* // Turn ON the background-geolocation system. The user will be tracked whenever they suspend the app.
|
* console.log(location);
|
||||||
* BackgroundGeolocation.start();
|
*
|
||||||
* })
|
* // IMPORTANT: You must execute the finish method here to inform the native plugin that you're finished,
|
||||||
|
* // and the background-task may be completed. You must do this regardless if your HTTP request is successful or not.
|
||||||
|
* // IF YOU DON'T, ios will CRASH YOUR APP for spending too much time in the background.
|
||||||
|
* this.backgroundGeolocation.finish(); // FOR IOS ONLY
|
||||||
|
*
|
||||||
|
* });
|
||||||
|
*
|
||||||
|
* // start recording location
|
||||||
|
* this.backgroundGeolocation.start();
|
||||||
*
|
*
|
||||||
* // If you wish to turn OFF background-tracking, call the #stop method.
|
* // If you wish to turn OFF background-tracking, call the #stop method.
|
||||||
* BackgroundGeolocation.stop();
|
* this.backgroundGeolocation.stop();
|
||||||
*
|
*
|
||||||
* ```
|
* ```
|
||||||
|
* @interfaces
|
||||||
|
* BackgroundGeolocationResponse
|
||||||
|
* BackgroundGeolocationConfig
|
||||||
*/
|
*/
|
||||||
@Plugin({
|
@Plugin({
|
||||||
|
pluginName: 'BackgroundGeolocation',
|
||||||
plugin: 'cordova-plugin-mauron85-background-geolocation',
|
plugin: 'cordova-plugin-mauron85-background-geolocation',
|
||||||
pluginRef: 'backgroundGeolocation',
|
pluginRef: 'backgroundGeolocation',
|
||||||
repo: 'https://github.com/mauron85/cordova-plugin-background-geolocation',
|
repo: 'https://github.com/mauron85/cordova-plugin-background-geolocation',
|
||||||
platforms: ['iOS', 'Android', 'Windows Phone 8']
|
platforms: ['iOS', 'Android', 'Windows Phone 8']
|
||||||
})
|
})
|
||||||
|
@Injectable()
|
||||||
export class BackgroundGeolocation {
|
export class BackgroundGeolocation {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -285,7 +322,7 @@ export class BackgroundGeolocation {
|
|||||||
*
|
*
|
||||||
* @enum {number}
|
* @enum {number}
|
||||||
*/
|
*/
|
||||||
static LocationProvider: any = {
|
LocationProvider: any = {
|
||||||
ANDROID_DISTANCE_FILTER_PROVIDER: 0,
|
ANDROID_DISTANCE_FILTER_PROVIDER: 0,
|
||||||
ANDROID_ACTIVITY_PROVIDER: 1
|
ANDROID_ACTIVITY_PROVIDER: 1
|
||||||
};
|
};
|
||||||
@@ -303,7 +340,7 @@ export class BackgroundGeolocation {
|
|||||||
*
|
*
|
||||||
* enum {number}
|
* enum {number}
|
||||||
*/
|
*/
|
||||||
static Accuracy: any = {
|
Accuracy: any = {
|
||||||
HIGH: 0,
|
HIGH: 0,
|
||||||
MEDIUM: 10,
|
MEDIUM: 10,
|
||||||
LOW: 100,
|
LOW: 100,
|
||||||
@@ -319,7 +356,7 @@ export class BackgroundGeolocation {
|
|||||||
*
|
*
|
||||||
* @enum {number}
|
* @enum {number}
|
||||||
*/
|
*/
|
||||||
static Mode: any = {
|
Mode: any = {
|
||||||
BACKGROUND: 0,
|
BACKGROUND: 0,
|
||||||
FOREGROUND: 1
|
FOREGROUND: 1
|
||||||
};
|
};
|
||||||
@@ -327,104 +364,118 @@ export class BackgroundGeolocation {
|
|||||||
/**
|
/**
|
||||||
* Configure the plugin.
|
* Configure the plugin.
|
||||||
*
|
*
|
||||||
* @param {Function} Success callback will be called when background location is determined.
|
* @param options {BackgroundGeolocationConfig} options An object of type Config
|
||||||
* @param {Function} Fail callback to be executed every time a geolocation error occurs.
|
* @return {Observable<BackgroundGeolocationResponse>}
|
||||||
* @param {Object} An object of type Config
|
|
||||||
*
|
|
||||||
* @return Location object, which tries to mimic w3c Coordinates interface.
|
|
||||||
* See http://dev.w3.org/geo/api/spec-source.html#coordinates_interface
|
|
||||||
* Callback to be executed every time a geolocation is recorded in the background.
|
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
sync: true
|
callbackOrder: 'reverse',
|
||||||
|
observable: true
|
||||||
})
|
})
|
||||||
static configure(callback: Function, errorCallback: Function, options: Config): void { return; }
|
configure(options: BackgroundGeolocationConfig): Observable<BackgroundGeolocationResponse> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Turn ON the background-geolocation system.
|
* Turn ON the background-geolocation system.
|
||||||
* The user will be tracked whenever they suspend the app.
|
* The user will be tracked whenever they suspend the app.
|
||||||
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static start(): Promise<any> { return; }
|
start(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Turn OFF background-tracking
|
* Turn OFF background-tracking
|
||||||
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static stop(): Promise<any> { return; }
|
stop(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Inform the native plugin that you're finished, the background-task may be completed
|
* Inform the native plugin that you're finished, the background-task may be completed
|
||||||
* NOTE: IOS, WP only
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova({
|
||||||
static finish() { }
|
platforms: ['iOS', 'Windows Phone']
|
||||||
|
})
|
||||||
|
finish(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Force the plugin to enter "moving" or "stationary" state
|
* Force the plugin to enter "moving" or "stationary" state
|
||||||
* NOTE: IOS, WP only
|
* @param isMoving {boolean}
|
||||||
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova({
|
||||||
static changePace(isMoving: boolean) { }
|
platforms: ['iOS', 'Windows Phone']
|
||||||
|
})
|
||||||
|
changePace(isMoving: boolean): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setup configuration
|
* Setup configuration
|
||||||
|
* @param options {BackgroundGeolocationConfig}
|
||||||
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
callbackOrder: 'reverse'
|
callbackOrder: 'reverse'
|
||||||
})
|
})
|
||||||
static setConfig(options: Config): Promise<any> { return; }
|
setConfig(options: BackgroundGeolocationConfig): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns current stationaryLocation if available. null if not
|
* Returns current stationaryLocation if available. null if not
|
||||||
* NOTE: IOS, WP only
|
* @returns {Promise<Location>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova({
|
||||||
static getStationaryLocation(): Promise<Location> { return; }
|
platforms: ['iOS', 'Windows Phone']
|
||||||
|
})
|
||||||
|
getStationaryLocation(): Promise<BackgroundGeolocationResponse> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a stationary-region listener. Whenever the devices enters "stationary-mode",
|
* Add a stationary-region listener. Whenever the devices enters "stationary-mode",
|
||||||
* your #success callback will be executed with #location param containing #radius of region
|
* your #success callback will be executed with #location param containing #radius of region
|
||||||
* NOTE: IOS, WP only
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova({
|
||||||
static onStationary(): Promise<any> { return; }
|
platforms: ['iOS', 'Windows Phone']
|
||||||
|
})
|
||||||
|
onStationary(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if location is enabled on the device
|
* Check if location is enabled on the device
|
||||||
* @returns {Promise<number>} Returns a promise with int argument that takes values 0, 1 (true).
|
* @returns {Promise<number>} Returns a promise with int argument that takes values 0, 1 (true).
|
||||||
* NOTE: ANDROID only
|
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova({
|
||||||
static isLocationEnabled(): Promise<number> { return; }
|
platforms: ['Android']
|
||||||
|
})
|
||||||
|
isLocationEnabled(): Promise<number> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display app settings to change permissions
|
* Display app settings to change permissions
|
||||||
*/
|
*/
|
||||||
@Cordova({sync: true})
|
@Cordova({sync: true})
|
||||||
static showAppSettings(): void { }
|
showAppSettings(): void { }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display device location settings
|
* Display device location settings
|
||||||
*/
|
*/
|
||||||
@Cordova({sync: true})
|
@Cordova({sync: true})
|
||||||
static showLocationSettings(): void { }
|
showLocationSettings(): void { }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method can be used to detect user changes in location services settings.
|
* Method can be used to detect user changes in location services settings.
|
||||||
* If user enable or disable location services then success callback will be executed.
|
* If user enable or disable location services then success callback will be executed.
|
||||||
* In case or error (SettingNotFoundException) fail callback will be executed.
|
* In case or error (SettingNotFoundException) fail callback will be executed.
|
||||||
* NOTE: ANDROID only
|
* @returns {Promise<boolean>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova({
|
||||||
static watchLocationMode(): Promise<boolean> { return; }
|
platforms: ['Android']
|
||||||
|
})
|
||||||
|
watchLocationMode(): Promise<boolean> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stop watching for location mode changes.
|
* Stop watching for location mode changes.
|
||||||
* NOTE: ANDROID only
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova({
|
||||||
static stopWatchingLocationMode() { }
|
platforms: ['Android']
|
||||||
|
})
|
||||||
|
stopWatchingLocationMode(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method will return all stored locations.
|
* Method will return all stored locations.
|
||||||
@@ -433,30 +484,38 @@ export class BackgroundGeolocation {
|
|||||||
* by the system
|
* by the system
|
||||||
* or
|
* or
|
||||||
* - option.debug is true
|
* - option.debug is true
|
||||||
* NOTE: ANDROID only
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova({
|
||||||
static getLocations(): Promise<any> { return; }
|
platforms: ['Android']
|
||||||
|
})
|
||||||
|
getLocations(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method will return locations, which has not been yet posted to server. NOTE: Locations does contain locationId.
|
* Method will return locations, which has not been yet posted to server. NOTE: Locations does contain locationId.
|
||||||
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static getValidLocations(): Promise<any> { return; }
|
getValidLocations(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete stored location by given locationId.
|
* Delete stored location by given locationId.
|
||||||
* NOTE: ANDROID only
|
* @param locationId {number}
|
||||||
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova({
|
||||||
static deleteLocation(locationId: number): Promise<any> { return; }
|
platforms: ['Android']
|
||||||
|
})
|
||||||
|
deleteLocation(locationId: number): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete all stored locations.
|
* Delete all stored locations.
|
||||||
* NOTE: ANDROID only
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova({
|
||||||
static deleteAllLocations(): Promise<any> { return; }
|
platforms: ['Android']
|
||||||
|
})
|
||||||
|
deleteAllLocations(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Normally plugin will handle switching between BACKGROUND and FOREGROUND mode itself.
|
* Normally plugin will handle switching between BACKGROUND and FOREGROUND mode itself.
|
||||||
@@ -467,20 +526,23 @@ export class BackgroundGeolocation {
|
|||||||
*
|
*
|
||||||
* BackgroundGeolocation.Mode.FOREGROUND
|
* BackgroundGeolocation.Mode.FOREGROUND
|
||||||
* BackgroundGeolocation.Mode.BACKGROUND
|
* BackgroundGeolocation.Mode.BACKGROUND
|
||||||
*
|
**
|
||||||
* NOTE: iOS only
|
* @param modeId {number}
|
||||||
*
|
* @returns {Promise<any>}
|
||||||
* @param {number} See above.
|
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova({
|
||||||
static switchMode(modeId: number): Promise<any> { return; }
|
platforms: ['iOS']
|
||||||
|
})
|
||||||
|
switchMode(modeId: number): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return all logged events. Useful for plugin debugging. Parameter limit limits number of returned entries.
|
* Return all logged events. Useful for plugin debugging. Parameter limit limits number of returned entries.
|
||||||
* @see https://github.com/mauron85/cordova-plugin-background-geolocation/tree/v2.2.1#debugging for more information.
|
* @see https://github.com/mauron85/cordova-plugin-background-geolocation/tree/v2.2.1#debugging for more information.
|
||||||
*
|
*
|
||||||
* @param {number} Limits the number of entries
|
* @param limit {number} Limits the number of entries
|
||||||
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static getLogEntries(limit: number): Promise<any> { return; }
|
getLogEntries(limit: number): Promise<any> { return; }
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,195 @@
|
|||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Cordova, Plugin } from '@ionic-native/core';
|
||||||
|
import { Observable } from 'rxjs/Observable';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configurations items that can be updated.
|
||||||
|
*/
|
||||||
|
export interface BackgroundModeConfiguration {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Title of the background task
|
||||||
|
*/
|
||||||
|
title?: String;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The text that scrolls itself on statusbar
|
||||||
|
*/
|
||||||
|
ticker?: String;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Description of background task
|
||||||
|
*/
|
||||||
|
text?: String;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* if true plugin will not display a notification. Default is false.
|
||||||
|
*/
|
||||||
|
silent?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* By default the app will come to foreground when taping on the notification. If false, plugin wont come to foreground when tapped.
|
||||||
|
*/
|
||||||
|
resume?: boolean;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Background Mode
|
||||||
|
* @description
|
||||||
|
* Cordova plugin to prevent the app from going to sleep while in background.
|
||||||
|
* Requires Cordova plugin: cordova-plugin-background-mode. For more info about plugin, vist: https://github.com/katzer/cordova-plugin-background-mode
|
||||||
|
*@usage
|
||||||
|
* ```typescript
|
||||||
|
* import { BackgroundMode } from '@ionic-native/background-mode';
|
||||||
|
*
|
||||||
|
* constructor(private backgroundMode: BackgroundMode) { }
|
||||||
|
*
|
||||||
|
* ...
|
||||||
|
*
|
||||||
|
* this.backgroundMode.enable();
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @interfaces
|
||||||
|
* BackgroundModeConfiguration
|
||||||
|
*/
|
||||||
|
@Plugin({
|
||||||
|
pluginName: 'BackgroundMode',
|
||||||
|
plugin: 'cordova-plugin-background-mode',
|
||||||
|
pluginRef: 'cordova.plugins.backgroundMode',
|
||||||
|
repo: 'https://github.com/katzer/cordova-plugin-background-mode',
|
||||||
|
platforms: ['Android', 'iOS', 'Windows Phone 8']
|
||||||
|
})
|
||||||
|
@Injectable()
|
||||||
|
export class BackgroundMode {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable the background mode.
|
||||||
|
* Once called, prevents the app from being paused while in background.
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
sync: true
|
||||||
|
})
|
||||||
|
enable(): void { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable the background mode.
|
||||||
|
* Once the background mode has been disabled, the app will be paused when in background.
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
disable(): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if background mode is enabled or not.
|
||||||
|
* @returns {boolean} returns a boolean that indicates if the background mode is enabled.
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
sync: true
|
||||||
|
})
|
||||||
|
isEnabled(): boolean { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Can be used to get the information if the background mode is active.
|
||||||
|
* @returns {boolean} returns a boolean that indicates if the background mode is active.
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
sync: true
|
||||||
|
})
|
||||||
|
isActive(): boolean { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Override the default title, ticker and text.
|
||||||
|
* Available only for Android platform.
|
||||||
|
* @param {Configure} options List of option to configure. See table below
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
platforms: ['Android']
|
||||||
|
})
|
||||||
|
setDefaults(options?: BackgroundModeConfiguration): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Modify the displayed information.
|
||||||
|
* Available only for Android platform.
|
||||||
|
* @param {Configure} options Any options you want to update. See table below.
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
platforms: ['Android']
|
||||||
|
})
|
||||||
|
configure(options?: BackgroundModeConfiguration): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Listen for events that the plugin fires. Available events are `enable`, `disable`, `activate`, `deactivate` and `failure`.
|
||||||
|
* @param event {string} Event name
|
||||||
|
* @returns {Observable<any>}
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
observable: true,
|
||||||
|
clearFunction: 'un',
|
||||||
|
clearWithArgs: true
|
||||||
|
})
|
||||||
|
on(event: string): Observable<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Android allows to programmatically move from foreground to background.
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
platforms: ['Android'],
|
||||||
|
sync: true
|
||||||
|
})
|
||||||
|
moveToBackground(): void {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Android allows to programmatically move from background to foreground.
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
platforms: ['Android'],
|
||||||
|
sync: true
|
||||||
|
})
|
||||||
|
moveToForeground(): void {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Override the back button on Android to go to background instead of closing the app.
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
platforms: ['Android'],
|
||||||
|
sync: true
|
||||||
|
})
|
||||||
|
overrideBackButton(): void {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exclude the app from the recent task list works on Android 5.0+.
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
platforms: ['Android'],
|
||||||
|
sync: true
|
||||||
|
})
|
||||||
|
excludeFromTaskList(): void {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The method works async instead of isActive() or isEnabled().
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
platforms: ['Android']
|
||||||
|
})
|
||||||
|
isScreenOff(): Promise<boolean> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Turn screen on
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
platforms: ['Android'],
|
||||||
|
sync: true
|
||||||
|
})
|
||||||
|
wakeUp(): void {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Turn screen on and show app even locked
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
platforms: ['Android'],
|
||||||
|
sync: true
|
||||||
|
})
|
||||||
|
unlock(): void {}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Plugin, Cordova } from '@ionic-native/core';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @beta
|
||||||
|
* @name Backlight
|
||||||
|
* @description
|
||||||
|
* This plugin adds turning on/off the device backlight.
|
||||||
|
*
|
||||||
|
* @usage
|
||||||
|
* ```
|
||||||
|
* import { Backlight } from '@ionic-native/backlight';
|
||||||
|
*
|
||||||
|
* constructor(private backlight: Backlight) { }
|
||||||
|
*
|
||||||
|
* ...
|
||||||
|
*
|
||||||
|
* // Turn backlight on
|
||||||
|
* this.backlight.on().then(() => console.log('backlight on'));
|
||||||
|
*
|
||||||
|
* // Turn backlight off
|
||||||
|
* this.backlight.off().then(() => console.log('backlight off'));
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
@Plugin({
|
||||||
|
pluginName: 'Backlight',
|
||||||
|
plugin: 'cordova-plugin-backlight',
|
||||||
|
pluginRef: 'cordova.plugins.Backlight',
|
||||||
|
repo: 'https://github.com/mebibou/cordova-plugin-backlight',
|
||||||
|
platforms: ['Android']
|
||||||
|
})
|
||||||
|
@Injectable()
|
||||||
|
export class Backlight {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function turns backlight on
|
||||||
|
* @return {Promise<any>} Returns a promise that resolves when the backlight is on
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
on(): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function turns backlight off
|
||||||
|
* @return {Promise<any>} Returns a promise that resolves when the backlight is off
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
off(): Promise<any> { return; }
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
import { Cordova, Plugin } from './plugin';
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Cordova, Plugin } from '@ionic-native/core';
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name Badge
|
* @name Badge
|
||||||
@@ -9,70 +11,77 @@ import { Cordova, Plugin } from './plugin';
|
|||||||
*
|
*
|
||||||
* @usage
|
* @usage
|
||||||
* ```typescript
|
* ```typescript
|
||||||
* import { Badge } from 'ionic-native';
|
* import { Badge } from '@ionic-native/badge';
|
||||||
*
|
*
|
||||||
|
* constructor(private badge: Badge) { }
|
||||||
*
|
*
|
||||||
* Badge.set(10);
|
* ...
|
||||||
* Badge.increase();
|
*
|
||||||
* Badge.clear();
|
* this.badge.set(10);
|
||||||
|
* this.badge.increase(1);
|
||||||
|
* this.badge.clear();
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
@Plugin({
|
@Plugin({
|
||||||
|
pluginName: 'Badge',
|
||||||
plugin: 'cordova-plugin-badge',
|
plugin: 'cordova-plugin-badge',
|
||||||
pluginRef: 'cordova.plugins.notification.badge',
|
pluginRef: 'cordova.plugins.notification.badge',
|
||||||
repo: 'https://github.com/katzer/cordova-plugin-badge',
|
repo: 'https://github.com/katzer/cordova-plugin-badge',
|
||||||
platforms: ['Android', 'iOS', 'Browser', 'Windows', 'Amazon FireOS', 'Windows Phone 8']
|
platforms: ['Android', 'iOS', 'Browser', 'Windows', 'Amazon FireOS', 'Windows Phone 8']
|
||||||
})
|
})
|
||||||
|
@Injectable()
|
||||||
export class Badge {
|
export class Badge {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clear the badge of the app icon.
|
* Clear the badge of the app icon.
|
||||||
|
* @returns {Promise<boolean>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static clear(): Promise<boolean> { return; }
|
clear(): Promise<boolean> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the badge of the app icon.
|
* Set the badge of the app icon.
|
||||||
* @param {number} badgeNumber The new badge number.
|
* @param {number} badgeNumber The new badge number.
|
||||||
* @returns {Promise}
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static set(badgeNumber: number): Promise<any> { return; }
|
set(badgeNumber: number): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the badge of the app icon.
|
* Get the badge of the app icon.
|
||||||
* @returns {Promise}
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static get(): Promise<any> { return; }
|
get(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Increase the badge number.
|
* Increase the badge number.
|
||||||
* @param {number} increaseBy Count to add to the current badge number
|
* @param {number} increaseBy Count to add to the current badge number
|
||||||
* @returns {Promise}
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static increase(increaseBy: number): Promise<any> { return; }
|
increase(increaseBy: number): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decrease the badge number.
|
* Decrease the badge number.
|
||||||
* @param {number} decreaseBy Count to subtract from the current badge number
|
* @param {number} decreaseBy Count to subtract from the current badge number
|
||||||
* @returns {Promise}
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static decrease(decreaseBy: number): Promise<any> { return; }
|
decrease(decreaseBy: number): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine if the app has permission to show badges.
|
* Determine if the app has permission to show badges.
|
||||||
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static hasPermission(): Promise<any> { return; }
|
hasPermission(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register permission to set badge notifications
|
* Register permission to set badge notifications
|
||||||
* @returns {Promise}
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static registerPermission(): Promise<any> { return; }
|
registerPermission(): Promise<any> { return; }
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,126 @@
|
|||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Cordova, Plugin } from '@ionic-native/core';
|
||||||
|
|
||||||
|
|
||||||
|
export interface BarcodeScannerOptions {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prefer front camera. Supported on iOS and Android.
|
||||||
|
*/
|
||||||
|
preferFrontCamera?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show flip camera button. Supported on iOS and Android.
|
||||||
|
*/
|
||||||
|
showFlipCameraButton?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show torch button. Supported on iOS and Android.
|
||||||
|
*/
|
||||||
|
showTorchButton?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable animations. Supported on iOS only.
|
||||||
|
*/
|
||||||
|
disableAnimations?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable success beep. Supported on iOS only.
|
||||||
|
*/
|
||||||
|
disableSuccessBeep?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prompt text. Supported on Android only.
|
||||||
|
*/
|
||||||
|
prompt?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formats separated by commas. Defaults to all formats except `PDF_417` and `RSS_EXPANDED`.
|
||||||
|
*/
|
||||||
|
formats?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Orientation. Supported on Android only. Can be set to `portrait` or `landscape`. Defaults to none so the user can rotate the phone and pick an orientation.
|
||||||
|
*/
|
||||||
|
orientation?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Launch with the torch switched on (if available). Supported on Android only.
|
||||||
|
*/
|
||||||
|
torchOn?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display scanned text for X ms. 0 suppresses it entirely, default 1500. Supported on Android only.
|
||||||
|
*/
|
||||||
|
resultDisplayDuration?: number;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Barcode Scanner
|
||||||
|
* @description
|
||||||
|
* The Barcode Scanner Plugin opens a camera view and automatically scans a barcode, returning the data back to you.
|
||||||
|
*
|
||||||
|
* Requires Cordova plugin: `phonegap-plugin-barcodescanner`. For more info, please see the [BarcodeScanner plugin docs](https://github.com/phonegap/phonegap-plugin-barcodescanner).
|
||||||
|
*
|
||||||
|
* @usage
|
||||||
|
* ```typescript
|
||||||
|
* import { BarcodeScanner } from '@ionic-native/barcode-scanner';
|
||||||
|
*
|
||||||
|
* constructor(private barcodeScanner: BarcodeScanner) { }
|
||||||
|
*
|
||||||
|
* ...
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* this.barcodeScanner.scan().then((barcodeData) => {
|
||||||
|
* // Success! Barcode data is here
|
||||||
|
* }, (err) => {
|
||||||
|
* // An error occurred
|
||||||
|
* });
|
||||||
|
* ```
|
||||||
|
* @interfaces
|
||||||
|
* BarcodeScannerOptions
|
||||||
|
*/
|
||||||
|
@Plugin({
|
||||||
|
pluginName: 'BarcodeScanner',
|
||||||
|
plugin: 'phonegap-plugin-barcodescanner',
|
||||||
|
pluginRef: 'cordova.plugins.barcodeScanner',
|
||||||
|
repo: 'https://github.com/phonegap/phonegap-plugin-barcodescanner',
|
||||||
|
platforms: ['Android', 'iOS', 'Windows Phone 8', 'Windows 10', 'Windows 8', 'BlackBerry 10', 'Browser']
|
||||||
|
})
|
||||||
|
@Injectable()
|
||||||
|
export class BarcodeScanner {
|
||||||
|
|
||||||
|
Encode: {
|
||||||
|
TEXT_TYPE: string;
|
||||||
|
EMAIL_TYPE: string;
|
||||||
|
PHONE_TYPE: string;
|
||||||
|
SMS_TYPE: string;
|
||||||
|
} = {
|
||||||
|
TEXT_TYPE: 'TEXT_TYPE',
|
||||||
|
EMAIL_TYPE: 'EMAIL_TYPE',
|
||||||
|
PHONE_TYPE: 'PHONE_TYPE',
|
||||||
|
SMS_TYPE: 'SMS_TYPE'
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open the barcode scanner.
|
||||||
|
* @param options {BarcodeScannerOptions} Optional options to pass to the scanner
|
||||||
|
* @returns {Promise<any>} Returns a Promise that resolves with scanner data, or rejects with an error.
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
callbackOrder: 'reverse'
|
||||||
|
})
|
||||||
|
scan(options?: BarcodeScannerOptions): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encodes data into a barcode.
|
||||||
|
* NOTE: not well supported on Android
|
||||||
|
* @param type {string} Type of encoding
|
||||||
|
* @param data {any} Data to encode
|
||||||
|
* @returns {Promise<any>}
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
encode(type: string, data: any): Promise<any> { return; }
|
||||||
|
|
||||||
|
}
|
||||||
+15
-6
@@ -1,37 +1,46 @@
|
|||||||
import { Cordova, Plugin } from './plugin';
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Cordova, Plugin } from '@ionic-native/core';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name Base64 To Gallery
|
* @name Base64 To Gallery
|
||||||
* @description This plugin allows you to save base64 data as a png image into the device
|
* @description This plugin allows you to save base64 data as a png image into the device
|
||||||
* @usage
|
* @usage
|
||||||
* ```typescript
|
* ```typescript
|
||||||
* import { Base64ToGallery } from 'ionic-native';
|
* import { Base64ToGallery } from '@ionic-native/base64-to-gallery';
|
||||||
|
*
|
||||||
|
* constructor(private base64ToGallery: Base64ToGallery) { }
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* Base64ToGallery.base64ToGallery(base64Data, 'img_').then(
|
* ...
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* this.base64ToGallery.base64ToGallery(base64Data, { prefix: '_img' }).then(
|
||||||
* res => console.log('Saved image to gallery ', res),
|
* res => console.log('Saved image to gallery ', res),
|
||||||
* err => console.log('Error saving image to gallery ', err)
|
* err => console.log('Error saving image to gallery ', err)
|
||||||
* );
|
* );
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
@Plugin({
|
@Plugin({
|
||||||
|
pluginName: 'Base64ToGallery',
|
||||||
plugin: 'cordova-base64-to-gallery',
|
plugin: 'cordova-base64-to-gallery',
|
||||||
pluginRef: 'cordova',
|
pluginRef: 'cordova',
|
||||||
repo: 'https://github.com/Nexxa/cordova-base64-to-gallery',
|
repo: 'https://github.com/Nexxa/cordova-base64-to-gallery',
|
||||||
platforms: ['Android', 'iOS', 'Windows Phone 8']
|
platforms: ['Android', 'iOS', 'Windows Phone 8']
|
||||||
})
|
})
|
||||||
|
@Injectable()
|
||||||
export class Base64ToGallery {
|
export class Base64ToGallery {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts a base64 string to an image file in the device gallery
|
* Converts a base64 string to an image file in the device gallery
|
||||||
* @param {string} data The actual base64 string that you want to save
|
* @param {string} data The actual base64 string that you want to save
|
||||||
* @param {any} options (optional) An object with properties: prefix: string, mediaScanner: boolean. Prefix will be prepended to the filename. If true, mediaScanner runs Media Scanner on Android and saves to Camera Roll on iOS; if false, saves to Library folder on iOS.
|
* @param {any} options (optional) An object with properties: prefix: string, mediaScanner: boolean. Prefix will be prepended to the filename. If true, mediaScanner runs Media Scanner on Android and saves to Camera Roll on iOS; if false, saves to Library folder on iOS.
|
||||||
* @returns {Promise} returns a promise that resolves when the image is saved.
|
* @returns {Promise<any>} returns a promise that resolves when the image is saved.
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
successIndex: 2,
|
successIndex: 2,
|
||||||
errorIndex: 3
|
errorIndex: 3
|
||||||
})
|
})
|
||||||
static base64ToGallery(data: string, options?: {prefix?: string; mediaScanner?: boolean}): Promise<any> {
|
base64ToGallery(data: string, options?: {prefix?: string; mediaScanner?: boolean}): Promise<any> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,68 +1,9 @@
|
|||||||
import { Cordova, Plugin } from './plugin';
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Cordova, Plugin } from '@ionic-native/core';
|
||||||
import { Observable } from 'rxjs/Observable';
|
import { Observable } from 'rxjs/Observable';
|
||||||
|
|
||||||
/**
|
export interface BatteryStatusResponse {
|
||||||
* @name Battery Status
|
|
||||||
* @description
|
|
||||||
* Requires Cordova plugin: cordova-plugin-batterystatus. For more info, please see the [BatteryStatus plugin docs](https://github.com/apache/cordova-plugin-battery-status).
|
|
||||||
*
|
|
||||||
* @usage
|
|
||||||
* ```typescript
|
|
||||||
* import { BatteryStatus } from 'ionic-native';
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* // watch change in battery status
|
|
||||||
* let subscription = BatteryStatus.onChange().subscribe(
|
|
||||||
* (status: StatusObject) => {
|
|
||||||
* console.log(status.level, status.isPlugged);
|
|
||||||
* }
|
|
||||||
* );
|
|
||||||
*
|
|
||||||
* // stop watch
|
|
||||||
* subscription.unsubscribe();
|
|
||||||
*
|
|
||||||
* ```
|
|
||||||
*/
|
|
||||||
@Plugin({
|
|
||||||
plugin: 'cordova-plugin-battery-status',
|
|
||||||
repo: 'https://github.com/apache/cordova-plugin-battery-status',
|
|
||||||
platforms: ['Amazon Fire OS', 'iOS', 'Android', 'BlackBerry 10', 'Windows Phone 7', 'Windows Phone 8', 'Windows', 'Firefox OS', 'Browser']
|
|
||||||
})
|
|
||||||
export class BatteryStatus {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Watch the change in battery level
|
|
||||||
* @returns {Observable} Returns an observable that pushes a status object
|
|
||||||
*/
|
|
||||||
@Cordova({
|
|
||||||
eventObservable: true,
|
|
||||||
event: 'batterystatus'
|
|
||||||
})
|
|
||||||
static onChange(): Observable<StatusObject> { return; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Watch when the battery level goes low
|
|
||||||
* @returns {Observable<StatusObject>} Returns an observable that pushes a status object
|
|
||||||
*/
|
|
||||||
@Cordova({
|
|
||||||
eventObservable: true,
|
|
||||||
event: 'batterylow'
|
|
||||||
})
|
|
||||||
static onLow(): Observable<StatusObject> { return; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Watch when the battery level goes to critial
|
|
||||||
* @returns {Observable<StatusObject>} Returns an observable that pushes a status object
|
|
||||||
*/
|
|
||||||
@Cordova({
|
|
||||||
eventObservable: true,
|
|
||||||
event: 'batterycritical'
|
|
||||||
})
|
|
||||||
static onCritical(): Observable<StatusObject> { return; }
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface StatusObject {
|
|
||||||
/**
|
/**
|
||||||
* The battery charge percentage
|
* The battery charge percentage
|
||||||
*/
|
*/
|
||||||
@@ -72,4 +13,75 @@ export interface StatusObject {
|
|||||||
* A boolean that indicates whether the device is plugged in
|
* A boolean that indicates whether the device is plugged in
|
||||||
*/
|
*/
|
||||||
isPlugged: boolean;
|
isPlugged: boolean;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Battery Status
|
||||||
|
* @description
|
||||||
|
* Requires Cordova plugin: cordova-plugin-batterystatus. For more info, please see the [BatteryStatus plugin docs](https://github.com/apache/cordova-plugin-battery-status).
|
||||||
|
*
|
||||||
|
* @usage
|
||||||
|
* ```typescript
|
||||||
|
* import { BatteryStatus } from '@ionic-native/battery-status';
|
||||||
|
*
|
||||||
|
* constructor(private batteryStatus: BatteryStatus) { }
|
||||||
|
*
|
||||||
|
* ...
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* // watch change in battery status
|
||||||
|
* let subscription = this.batteryStatus.onChange().subscribe(
|
||||||
|
* (status: StatusObject) => {
|
||||||
|
* console.log(status.level, status.isPlugged);
|
||||||
|
* }
|
||||||
|
* );
|
||||||
|
*
|
||||||
|
* // stop watch
|
||||||
|
* subscription.unsubscribe();
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* @interfaces
|
||||||
|
* BatteryStatusResponse
|
||||||
|
*/
|
||||||
|
@Plugin({
|
||||||
|
pluginName: 'BatteryStatus',
|
||||||
|
plugin: 'cordova-plugin-battery-status',
|
||||||
|
pluginRef: 'navigator.battery',
|
||||||
|
repo: 'https://github.com/apache/cordova-plugin-battery-status',
|
||||||
|
platforms: ['Amazon Fire OS', 'iOS', 'Android', 'BlackBerry 10', 'Windows Phone 7', 'Windows Phone 8', 'Windows', 'Firefox OS', 'Browser']
|
||||||
|
})
|
||||||
|
@Injectable()
|
||||||
|
export class BatteryStatus {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Watch the change in battery level
|
||||||
|
* @returns {Observable<BatteryStatusResponse>} Returns an observable that pushes a status object
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'batterystatus'
|
||||||
|
})
|
||||||
|
onChange(): Observable<BatteryStatusResponse> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Watch when the battery level goes low
|
||||||
|
* @returns {Observable<BatteryStatusResponse>} Returns an observable that pushes a status object
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'batterylow'
|
||||||
|
})
|
||||||
|
onLow(): Observable<BatteryStatusResponse> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Watch when the battery level goes to critial
|
||||||
|
* @returns {Observable<BatteryStatusResponse>} Returns an observable that pushes a status object
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
eventObservable: true,
|
||||||
|
event: 'batterycritical'
|
||||||
|
})
|
||||||
|
onCritical(): Observable<BatteryStatusResponse> { return; }
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import { Cordova, Plugin } from './plugin';
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Cordova, Plugin } from '@ionic-native/core';
|
||||||
import { Observable } from 'rxjs/Observable';
|
import { Observable } from 'rxjs/Observable';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -20,6 +21,14 @@ import { Observable } from 'rxjs/Observable';
|
|||||||
*
|
*
|
||||||
* @usage
|
* @usage
|
||||||
*
|
*
|
||||||
|
* ```typescript
|
||||||
|
*
|
||||||
|
* import { BLE } from '@ionic-native/ble';
|
||||||
|
*
|
||||||
|
* constructor(private ble: BLE) { }
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
*
|
||||||
* ## Peripheral Data
|
* ## Peripheral Data
|
||||||
*
|
*
|
||||||
* Peripheral Data is passed to the success callback when scanning and connecting. Limited data is passed when scanning.
|
* Peripheral Data is passed to the success callback when scanning and connecting. Limited data is passed when scanning.
|
||||||
@@ -160,12 +169,15 @@ import { Observable } from 'rxjs/Observable';
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@Plugin({
|
@Plugin({
|
||||||
|
pluginName: 'BLE',
|
||||||
plugin: 'cordova-plugin-ble-central',
|
plugin: 'cordova-plugin-ble-central',
|
||||||
pluginRef: 'ble',
|
pluginRef: 'ble',
|
||||||
repo: 'https://github.com/don/cordova-plugin-ble-central',
|
repo: 'https://github.com/don/cordova-plugin-ble-central',
|
||||||
platforms: ['iOS', 'Android']
|
platforms: ['iOS', 'Android']
|
||||||
})
|
})
|
||||||
|
@Injectable()
|
||||||
export class BLE {
|
export class BLE {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scan and discover BLE peripherals for the specified amount of time.
|
* Scan and discover BLE peripherals for the specified amount of time.
|
||||||
*
|
*
|
||||||
@@ -177,12 +189,12 @@ export class BLE {
|
|||||||
* ```
|
* ```
|
||||||
* @param {string[]} services List of service UUIDs to discover, or `[]` to find all devices
|
* @param {string[]} services List of service UUIDs to discover, or `[]` to find all devices
|
||||||
* @param {number} seconds Number of seconds to run discovery
|
* @param {number} seconds Number of seconds to run discovery
|
||||||
* @return Returns an Observable that notifies of each peripheral that is discovered during the specified time.
|
* @returns {Observable<any>} Returns an Observable that notifies of each peripheral that is discovered during the specified time.
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
observable: true
|
observable: true
|
||||||
})
|
})
|
||||||
static scan(services: string[], seconds: number): Observable<any> { return; }
|
scan(services: string[], seconds: number): Observable<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scan and discover BLE peripherals until `stopScan` is called.
|
* Scan and discover BLE peripherals until `stopScan` is called.
|
||||||
@@ -198,27 +210,27 @@ export class BLE {
|
|||||||
* }, 5000);
|
* }, 5000);
|
||||||
* ```
|
* ```
|
||||||
* @param {string[]} services List of service UUIDs to discover, or `[]` to find all devices
|
* @param {string[]} services List of service UUIDs to discover, or `[]` to find all devices
|
||||||
* @return Returns an Observable that notifies of each peripheral discovered.
|
* @returns {Observable<any>} Returns an Observable that notifies of each peripheral discovered.
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
observable: true,
|
observable: true,
|
||||||
clearFunction: 'stopScan',
|
clearFunction: 'stopScan',
|
||||||
clearWithArgs: true
|
clearWithArgs: false
|
||||||
})
|
})
|
||||||
static startScan(services: string[]): Observable<any> { return; }
|
startScan(services: string[]): Observable<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scans for BLE devices. This function operates similarly to the `startScan` function, but allows you to specify extra options (like allowing duplicate device reports).
|
* Scans for BLE devices. This function operates similarly to the `startScan` function, but allows you to specify extra options (like allowing duplicate device reports).
|
||||||
* @param {string[]} services List of service UUIDs to discover, or `[]` to find all devices
|
* @param {string[]} services List of service UUIDs to discover, or `[]` to find all devices
|
||||||
* @param options {any}
|
* @param options {any}
|
||||||
* @return Returns an Observable that notifies of each peripheral discovered.
|
* @returns {Observable<any>} Returns an Observable that notifies of each peripheral discovered.
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
observable: true,
|
observable: true,
|
||||||
clearFunction: 'stopScan',
|
clearFunction: 'stopScan',
|
||||||
clearWithArgs: true
|
clearWithArgs: false
|
||||||
})
|
})
|
||||||
static startScanWithOptions(services: string[], options: {reportDuplicates?: boolean} | any): Observable<any> { return; }
|
startScanWithOptions(services: string[], options: {reportDuplicates?: boolean} | any): Observable<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stop a scan started by `startScan`.
|
* Stop a scan started by `startScan`.
|
||||||
@@ -235,7 +247,7 @@ export class BLE {
|
|||||||
* @return returns a Promise.
|
* @return returns a Promise.
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static stopScan(): Promise<any> { return; }
|
stopScan(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connect to a peripheral.
|
* Connect to a peripheral.
|
||||||
@@ -256,7 +268,7 @@ export class BLE {
|
|||||||
clearFunction: 'disconnect',
|
clearFunction: 'disconnect',
|
||||||
clearWithArgs: true
|
clearWithArgs: true
|
||||||
})
|
})
|
||||||
static connect(deviceId: string): Observable<any> { return; }
|
connect(deviceId: string): Observable<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disconnect from a peripheral.
|
* Disconnect from a peripheral.
|
||||||
@@ -270,7 +282,7 @@ export class BLE {
|
|||||||
* @return Returns a Promise
|
* @return Returns a Promise
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static disconnect(deviceId: string): Promise<any> { return; }
|
disconnect(deviceId: string): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read the value of a characteristic.
|
* Read the value of a characteristic.
|
||||||
@@ -281,7 +293,7 @@ export class BLE {
|
|||||||
* @return Returns a Promise
|
* @return Returns a Promise
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static read(
|
read(
|
||||||
deviceId: string,
|
deviceId: string,
|
||||||
serviceUUID: string,
|
serviceUUID: string,
|
||||||
characteristicUUID: string
|
characteristicUUID: string
|
||||||
@@ -316,7 +328,7 @@ export class BLE {
|
|||||||
* @return Returns a Promise
|
* @return Returns a Promise
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static write(
|
write(
|
||||||
deviceId: string,
|
deviceId: string,
|
||||||
serviceUUID: string,
|
serviceUUID: string,
|
||||||
characteristicUUID: string,
|
characteristicUUID: string,
|
||||||
@@ -333,7 +345,7 @@ export class BLE {
|
|||||||
* @return Returns a Promise
|
* @return Returns a Promise
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static writeWithoutResponse(
|
writeWithoutResponse(
|
||||||
deviceId: string,
|
deviceId: string,
|
||||||
serviceUUID: string,
|
serviceUUID: string,
|
||||||
characteristicUUID: string,
|
characteristicUUID: string,
|
||||||
@@ -360,7 +372,7 @@ export class BLE {
|
|||||||
clearFunction: 'stopNotification',
|
clearFunction: 'stopNotification',
|
||||||
clearWithArgs: true
|
clearWithArgs: true
|
||||||
})
|
})
|
||||||
static startNotification(
|
startNotification(
|
||||||
deviceId: string,
|
deviceId: string,
|
||||||
serviceUUID: string,
|
serviceUUID: string,
|
||||||
characteristicUUID: string
|
characteristicUUID: string
|
||||||
@@ -372,10 +384,10 @@ export class BLE {
|
|||||||
* @param {string} deviceId UUID or MAC address of the peripheral
|
* @param {string} deviceId UUID or MAC address of the peripheral
|
||||||
* @param {string} serviceUUID UUID of the BLE service
|
* @param {string} serviceUUID UUID of the BLE service
|
||||||
* @param {string} characteristicUUID UUID of the BLE characteristic
|
* @param {string} characteristicUUID UUID of the BLE characteristic
|
||||||
* @return Returns a Promise.
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static stopNotification(
|
stopNotification(
|
||||||
deviceId: string,
|
deviceId: string,
|
||||||
serviceUUID: string,
|
serviceUUID: string,
|
||||||
characteristicUUID: string
|
characteristicUUID: string
|
||||||
@@ -392,39 +404,44 @@ export class BLE {
|
|||||||
* );
|
* );
|
||||||
* ```
|
* ```
|
||||||
* @param {string} deviceId UUID or MAC address of the peripheral
|
* @param {string} deviceId UUID or MAC address of the peripheral
|
||||||
* @return Returns a Promise.
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static isConnected(deviceId: string): Promise<any> { return; }
|
isConnected(deviceId: string): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Report if bluetooth is enabled.
|
* Report if bluetooth is enabled.
|
||||||
*
|
*
|
||||||
* @usage
|
* @returns {Promise<void>} Returns a Promise that resolves if Bluetooth is enabled, and rejects if disabled.
|
||||||
* ```
|
|
||||||
* BLE.isEnabled().then(
|
|
||||||
* () => { console.log('enabled'); },
|
|
||||||
* () => { console.log('not enabled'); }
|
|
||||||
* );
|
|
||||||
* ```
|
|
||||||
* @return Returns a Promise.
|
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static isEnabled(): Promise<any> { return; }
|
isEnabled(): Promise<void> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Open System Bluetooth settings (Android only).
|
* Open System Bluetooth settings (Android only).
|
||||||
*
|
*
|
||||||
* @return Returns a Promise.
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static showBluetoothSettings(): Promise<any> { return; }
|
showBluetoothSettings(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enable Bluetooth on the device (Android only).
|
* Enable Bluetooth on the device (Android only).
|
||||||
*
|
*
|
||||||
* @return Returns a Promise.
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static enable(): Promise<any> { return; }
|
enable(): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read the RSSI value on the device connection.
|
||||||
|
*
|
||||||
|
* @param {string} deviceId UUID or MAC address of the peripheral
|
||||||
|
*
|
||||||
|
*@returns {Promise<any>}
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
static readRSSI(
|
||||||
|
deviceId: string,
|
||||||
|
): Promise<any> { return; }
|
||||||
}
|
}
|
||||||
+54
-42
@@ -1,4 +1,5 @@
|
|||||||
import { Cordova, Plugin } from './plugin';
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Cordova, Plugin } from '@ionic-native/core';
|
||||||
import { Observable } from 'rxjs/Observable';
|
import { Observable } from 'rxjs/Observable';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -6,14 +7,16 @@ import { Observable } from 'rxjs/Observable';
|
|||||||
* @description This plugin enables serial communication over Bluetooth. It was written for communicating between Android or iOS and an Arduino.
|
* @description This plugin enables serial communication over Bluetooth. It was written for communicating between Android or iOS and an Arduino.
|
||||||
* @usage
|
* @usage
|
||||||
* ```typescript
|
* ```typescript
|
||||||
* import { BluetoothSerial } from 'ionic-native';
|
* import { BluetoothSerial } from '@ionic-native/bluetooth-serial';
|
||||||
|
*
|
||||||
|
* constructor(private bluetoothSerial: BluetoothSerial) { }
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* // Write a string
|
* // Write a string
|
||||||
* BluetoothSerial.write("hello world").then(success, failure);
|
* this.bluetoothSerial.write("hello world").then(success, failure);
|
||||||
*
|
*
|
||||||
* // Array of int or bytes
|
* // Array of int or bytes
|
||||||
* BluetoothSerial.write([186, 220, 222]).then(success, failure);
|
* this.bluetoothSerial.write([186, 220, 222]).then(success, failure);
|
||||||
*
|
*
|
||||||
* // Typed Array
|
* // Typed Array
|
||||||
* var data = new Uint8Array(4);
|
* var data = new Uint8Array(4);
|
||||||
@@ -21,186 +24,195 @@ import { Observable } from 'rxjs/Observable';
|
|||||||
* data[1] = 0x42;
|
* data[1] = 0x42;
|
||||||
* data[2] = 0x43;
|
* data[2] = 0x43;
|
||||||
* data[3] = 0x44;
|
* data[3] = 0x44;
|
||||||
* BluetoothSerial.write(data).then(success, failure);
|
* this.bluetoothSerial.write(data).then(success, failure);
|
||||||
*
|
*
|
||||||
* // Array Buffer
|
* // Array Buffer
|
||||||
* BluetoothSerial.write(data.buffer).then(success, failure);
|
* this.bluetoothSerial.write(data.buffer).then(success, failure);
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
@Plugin({
|
@Plugin({
|
||||||
|
pluginName: 'BluetoothSerial',
|
||||||
repo: 'https://github.com/don/BluetoothSerial',
|
repo: 'https://github.com/don/BluetoothSerial',
|
||||||
plugin: 'cordova-plugin-bluetooth-serial',
|
plugin: 'cordova-plugin-bluetooth-serial',
|
||||||
pluginRef: 'bluetoothSerial',
|
pluginRef: 'bluetoothSerial',
|
||||||
platforms: ['Android', 'iOS', 'Windows Phone', 'Browser']
|
platforms: ['Android', 'iOS', 'Windows Phone', 'Browser']
|
||||||
})
|
})
|
||||||
|
@Injectable()
|
||||||
export class BluetoothSerial {
|
export class BluetoothSerial {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connect to a Bluetooth device
|
* Connect to a Bluetooth device
|
||||||
* @param {string} macAddress_or_uuid Identifier of the remote device
|
* @param {string} macAddress_or_uuid Identifier of the remote device
|
||||||
* @returns {Observable} Subscribe to connect, unsubscribe to disconnect.
|
* @returns {Observable<any>} Subscribe to connect, unsubscribe to disconnect.
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
platforms: ['Android', 'iOS', 'Windows Phone'],
|
platforms: ['Android', 'iOS', 'Windows Phone'],
|
||||||
observable: true,
|
observable: true,
|
||||||
clearFunction: 'disconnect'
|
clearFunction: 'disconnect'
|
||||||
})
|
})
|
||||||
static connect(macAddress_or_uuid: string): Observable<any> { return; }
|
connect(macAddress_or_uuid: string): Observable<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connect insecurely to a Bluetooth device
|
* Connect insecurely to a Bluetooth device
|
||||||
* @param {string} macAddress Identifier of the remote device
|
* @param {string} macAddress Identifier of the remote device
|
||||||
* @returns {Observable} Subscribe to connect, unsubscribe to disconnect.
|
* @returns {Observable<any>} Subscribe to connect, unsubscribe to disconnect.
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
platforms: ['Android'],
|
platforms: ['Android'],
|
||||||
observable: true,
|
observable: true,
|
||||||
clearFunction: 'disconnect'
|
clearFunction: 'disconnect'
|
||||||
})
|
})
|
||||||
static connectInsecure(macAddress: string): Observable<any> { return; }
|
connectInsecure(macAddress: string): Observable<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disconnect from the connected device
|
||||||
|
* @returns {Promise<any>}
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
disconnect(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Writes data to the serial port
|
* Writes data to the serial port
|
||||||
* @param {any} data ArrayBuffer of data
|
* @param {any} data ArrayBuffer of data
|
||||||
* @returns {Promise} returns a promise when data has been written
|
* @returns {Promise<any>} returns a promise when data has been written
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
platforms: ['Android', 'iOS', 'Windows Phone']
|
platforms: ['Android', 'iOS', 'Windows Phone']
|
||||||
})
|
})
|
||||||
static write(data: any): Promise<any> { return; }
|
write(data: any): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the number of bytes of data available
|
* Gets the number of bytes of data available
|
||||||
* @returns {Promise} returns a promise that contains the available bytes
|
* @returns {Promise<any>} returns a promise that contains the available bytes
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
platforms: ['Android', 'iOS', 'Windows Phone']
|
platforms: ['Android', 'iOS', 'Windows Phone']
|
||||||
}) static available(): Promise<any> { return; }
|
}) available(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads data from the buffer
|
* Reads data from the buffer
|
||||||
* @returns {Promise} returns a promise with data from the buffer
|
* @returns {Promise<any>} returns a promise with data from the buffer
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
platforms: ['Android', 'iOS', 'Windows Phone']
|
platforms: ['Android', 'iOS', 'Windows Phone']
|
||||||
})
|
})
|
||||||
static read(): Promise<any> { return; }
|
read(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads data from the buffer until it reaches a delimiter
|
* Reads data from the buffer until it reaches a delimiter
|
||||||
* @param {string} delimiter string that you want to search until
|
* @param {string} delimiter string that you want to search until
|
||||||
* @returns {Promise} returns a promise
|
* @returns {Promise<any>} returns a promise
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
platforms: ['Android', 'iOS', 'Windows Phone']
|
platforms: ['Android', 'iOS', 'Windows Phone']
|
||||||
})
|
})
|
||||||
static readUntil(delimiter: string): Promise<any> { return; }
|
readUntil(delimiter: string): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Subscribe to be notified when data is received
|
* Subscribe to be notified when data is received
|
||||||
* @param {string} delimiter the string you want to watch for
|
* @param {string} delimiter the string you want to watch for
|
||||||
* @returns {Observable} returns an observable.
|
* @returns {Observable<any>} returns an observable.
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
platforms: ['Android', 'iOS', 'Windows Phone'],
|
platforms: ['Android', 'iOS', 'Windows Phone'],
|
||||||
observable: true,
|
observable: true,
|
||||||
clearFunction: 'unsubscribe'
|
clearFunction: 'unsubscribe'
|
||||||
})
|
})
|
||||||
static subscribe(delimiter: string): Observable<any> { return; }
|
subscribe(delimiter: string): Observable<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Subscribe to be notified when data is received
|
* Subscribe to be notified when data is received
|
||||||
* @returns {Observable} returns an observable
|
* @returns {Observable<any>} returns an observable
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
platforms: ['Android', 'iOS', 'Windows Phone'],
|
platforms: ['Android', 'iOS', 'Windows Phone'],
|
||||||
observable: true,
|
observable: true,
|
||||||
clearFunction: 'unsubscribeRawData'
|
clearFunction: 'unsubscribeRawData'
|
||||||
})
|
})
|
||||||
static subscribeRawData(): Observable<any> { return; }
|
subscribeRawData(): Observable<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clears data in buffer
|
* Clears data in buffer
|
||||||
* @returns {Promise} returns a promise when completed
|
* @returns {Promise<any>} returns a promise when completed
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
platforms: ['Android', 'iOS', 'Windows Phone']
|
platforms: ['Android', 'iOS', 'Windows Phone']
|
||||||
})
|
})
|
||||||
static clear(): Promise<any> { return; }
|
clear(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lists bonded devices
|
* Lists bonded devices
|
||||||
* @returns {Promise} returns a promise
|
* @returns {Promise<any>} returns a promise
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
platforms: ['Android', 'iOS', 'Windows Phone']
|
platforms: ['Android', 'iOS', 'Windows Phone']
|
||||||
})
|
})
|
||||||
static list(): Promise<any> { return; }
|
list(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reports if bluetooth is enabled
|
* Reports if bluetooth is enabled
|
||||||
* @returns {Promise} returns a promise
|
* @returns {Promise<any>} returns a promise
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
platforms: ['Android', 'iOS', 'Windows Phone']
|
platforms: ['Android', 'iOS', 'Windows Phone']
|
||||||
})
|
})
|
||||||
static isEnabled(): Promise<any> { return; }
|
isEnabled(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reports the connection status
|
* Reports the connection status
|
||||||
* @returns {Promise} returns a promise
|
* @returns {Promise<any>} returns a promise
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
platforms: ['Android', 'iOS', 'Windows Phone']
|
platforms: ['Android', 'iOS', 'Windows Phone']
|
||||||
})
|
})
|
||||||
static isConnected(): Promise<any> { return; }
|
isConnected(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads the RSSI from the connected peripheral
|
* Reads the RSSI from the connected peripheral
|
||||||
* @returns {Promise} returns a promise
|
* @returns {Promise<any>} returns a promise
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
platforms: ['Android', 'iOS', 'Windows Phone']
|
platforms: ['Android', 'iOS', 'Windows Phone']
|
||||||
})
|
})
|
||||||
static readRSSI(): Promise<any> { return; }
|
readRSSI(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show the Bluetooth settings on the device
|
* Show the Bluetooth settings on the device
|
||||||
* @returns {Promise} returns a promise
|
* @returns {Promise<any>} returns a promise
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
platforms: ['Android', 'iOS', 'Windows Phone']
|
platforms: ['Android', 'iOS', 'Windows Phone']
|
||||||
})
|
})
|
||||||
static showBluetoothSettings(): Promise<any> { return; }
|
showBluetoothSettings(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enable Bluetooth on the device
|
* Enable Bluetooth on the device
|
||||||
* @returns {Promise} returns a promise
|
* @returns {Promise<any>} returns a promise
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
platforms: ['Android', 'iOS', 'Windows Phone']
|
platforms: ['Android', 'iOS', 'Windows Phone']
|
||||||
})
|
})
|
||||||
static enable(): Promise<any> { return; }
|
enable(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Discover unpaired devices
|
* Discover unpaired devices
|
||||||
* @returns {Promise} returns a promise
|
* @returns {Promise<any>} returns a promise
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
platforms: ['Android', 'iOS', 'Windows Phone']
|
platforms: ['Android', 'iOS', 'Windows Phone']
|
||||||
})
|
})
|
||||||
static discoverUnpaired(): Promise<any> { return; }
|
discoverUnpaired(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Subscribe to be notified on Bluetooth device discovery. Discovery process must be initiated with the `discoverUnpaired` function.
|
* Subscribe to be notified on Bluetooth device discovery. Discovery process must be initiated with the `discoverUnpaired` function.
|
||||||
* @returns {Observable} Returns an observable
|
* @returns {Observable<any>} Returns an observable
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
platforms: ['Android', 'iOS', 'Windows Phone'],
|
platforms: ['Android', 'iOS', 'Windows Phone'],
|
||||||
observable: true,
|
observable: true,
|
||||||
clearFunction: 'clearDeviceDiscoveredListener'
|
clearFunction: 'clearDeviceDiscoveredListener'
|
||||||
})
|
})
|
||||||
static setDeviceDiscoveredListener(): Observable<any> { return; }
|
setDeviceDiscoveredListener(): Observable<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the human readable device name that is broadcasted to other devices
|
* Sets the human readable device name that is broadcasted to other devices
|
||||||
@@ -210,7 +222,7 @@ export class BluetoothSerial {
|
|||||||
platforms: ['Android'],
|
platforms: ['Android'],
|
||||||
sync: true
|
sync: true
|
||||||
})
|
})
|
||||||
static setName(newName: string): void { }
|
setName(newName: string): void { }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes the device discoverable by other devices
|
* Makes the device discoverable by other devices
|
||||||
@@ -220,6 +232,6 @@ export class BluetoothSerial {
|
|||||||
platforms: ['Android'],
|
platforms: ['Android'],
|
||||||
sync: true
|
sync: true
|
||||||
})
|
})
|
||||||
static setDiscoverable(discoverableDuration: number): void { }
|
setDiscoverable(discoverableDuration: number): void { }
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import { Cordova, Plugin } from './plugin';
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Cordova, Plugin } from '@ionic-native/core';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name Brightness
|
* @name Brightness
|
||||||
@@ -9,44 +10,49 @@ import { Cordova, Plugin } from './plugin';
|
|||||||
*
|
*
|
||||||
* @usage
|
* @usage
|
||||||
* ```typescript
|
* ```typescript
|
||||||
* import { Brightness } from 'ionic-native';
|
* import { Brightness } from '@ionic-native/brightness';
|
||||||
*
|
*
|
||||||
|
* constructor(private brightness: Brightness) { }
|
||||||
|
*
|
||||||
|
* ...
|
||||||
*
|
*
|
||||||
* let brightnessValue: number = 0.8;
|
* let brightnessValue: number = 0.8;
|
||||||
* Brightness.setBrightness(brightnessValue);
|
* this.brightness.setBrightness(brightnessValue);
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@Plugin({
|
@Plugin({
|
||||||
|
pluginName: 'Brightness',
|
||||||
plugin: 'cordova-plugin-brightness',
|
plugin: 'cordova-plugin-brightness',
|
||||||
pluginRef: 'cordova.plugins.brightness',
|
pluginRef: 'cordova.plugins.brightness',
|
||||||
repo: 'https://github.com/mgcrea/cordova-plugin-brightness',
|
repo: 'https://github.com/mgcrea/cordova-plugin-brightness',
|
||||||
platforms: ['Android', 'iOS']
|
platforms: ['Android', 'iOS']
|
||||||
})
|
})
|
||||||
|
@Injectable()
|
||||||
export class Brightness {
|
export class Brightness {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the brightness of the display.
|
* Sets the brightness of the display.
|
||||||
*
|
*
|
||||||
* @param {value} Floating number between 0 and 1 in which case 1 means 100% brightness and 0 means 0% brightness.
|
* @param {value} Floating number between 0 and 1 in which case 1 means 100% brightness and 0 means 0% brightness.
|
||||||
* @returns {Promise} Returns a Promise that resolves if setting brightness was successful.
|
* @returns {Promise<any>} Returns a Promise that resolves if setting brightness was successful.
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static setBrightness(value: number): Promise<any> { return; }
|
setBrightness(value: number): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads the current brightness of the device display.
|
* Reads the current brightness of the device display.
|
||||||
*
|
*
|
||||||
* @returns {Promise} Returns a Promise that resolves with the
|
* @returns {Promise<any>} Returns a Promise that resolves with the
|
||||||
* brightness value of the device display (floating number between 0 and 1).
|
* brightness value of the device display (floating number between 0 and 1).
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static getBrightness(): Promise<any> { return; }
|
getBrightness(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Keeps the screen on. Prevents the device from setting the screen to sleep.
|
* Keeps the screen on. Prevents the device from setting the screen to sleep.
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static setKeepScreenOn(value: boolean): void { }
|
setKeepScreenOn(value: boolean): void { }
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Plugin, Cordova } from '@ionic-native/core';
|
||||||
|
import { Observable } from 'rxjs/Observable';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Broadcaster
|
||||||
|
* @description
|
||||||
|
* This plugin adds exchanging events between native code and your app.
|
||||||
|
*
|
||||||
|
* @usage
|
||||||
|
* ```
|
||||||
|
* import { Broadcaster } from '@ionic-native/broadcaster';
|
||||||
|
*
|
||||||
|
* constructor(private broadcaster: Broadcaster) { }
|
||||||
|
*
|
||||||
|
* ...
|
||||||
|
*
|
||||||
|
* // Listen to events from Native
|
||||||
|
* this.broadcaster.addEventListener('eventName').then((event) => console.log(event));
|
||||||
|
*
|
||||||
|
* // Send event to Native
|
||||||
|
* this.broadcaster.fireNativeEvent('eventName', {}).then(() => console.log('success'));
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
@Plugin({
|
||||||
|
pluginName: 'Broadcaster',
|
||||||
|
plugin: 'cordova-plugin-broadcaster',
|
||||||
|
pluginRef: 'broadcaster',
|
||||||
|
repo: 'https://github.com/bsorrentino/cordova-broadcaster',
|
||||||
|
platforms: ['Android', 'iOS']
|
||||||
|
})
|
||||||
|
@Injectable()
|
||||||
|
export class Broadcaster {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function listen to an event sent from the native code
|
||||||
|
* @param eventName {string}
|
||||||
|
* @return {Observable<any>} Returns an observable to watch when an event is received
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
observable: true,
|
||||||
|
clearFunction: 'removeEventListener',
|
||||||
|
clearWithArgs: true
|
||||||
|
})
|
||||||
|
addEventListener(eventName: string): Observable<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function sends data to the native code
|
||||||
|
* @param eventName {string}
|
||||||
|
* @param eventData {any}
|
||||||
|
* @return {Promise<any>} Returns a promise that resolves when an event is successfully fired
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
fireNativeEvent(eventName: string, eventData: any): Promise<any> { return; }
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
import { Plugin, Cordova } from '@ionic-native/core';
|
||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Browser Tab
|
||||||
|
* @description
|
||||||
|
* This plugin provides an interface to in-app browser tabs that exist on some mobile platforms, specifically [Custom Tabs](http://developer.android.com/tools/support-library/features.html#custom-tabs) on Android (including the [Chrome Custom Tabs](https://developer.chrome.com/multidevice/android/customtabs) implementation), and [SFSafariViewController](https://developer.apple.com/library/ios/documentation/SafariServices/Reference/SFSafariViewController_Ref/) on iOS.
|
||||||
|
*
|
||||||
|
* @usage
|
||||||
|
* ```
|
||||||
|
* import { BrowserTab } from '@ionic-native/browser-tab';
|
||||||
|
*
|
||||||
|
* constructor(private browserTab: BrowserTab) {
|
||||||
|
*
|
||||||
|
* browserTab.isAvailable()
|
||||||
|
* .then((isAvailable: boolean) => {
|
||||||
|
*
|
||||||
|
* if (isAvailable) {
|
||||||
|
*
|
||||||
|
* browserTab.open('https://ionic.io');
|
||||||
|
*
|
||||||
|
* } else {
|
||||||
|
*
|
||||||
|
* // open URL with InAppBrowser instead or SafariViewController
|
||||||
|
*
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* });
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
@Plugin({
|
||||||
|
pluginName: 'BrowserTab',
|
||||||
|
plugin: 'cordova-plugin-browsertab',
|
||||||
|
pluginRef: 'cordova.plugins.browsertab',
|
||||||
|
repo: 'https://github.com/google/cordova-plugin-browsertab',
|
||||||
|
platforms: ['Android', 'iOS']
|
||||||
|
})
|
||||||
|
@Injectable()
|
||||||
|
export class BrowserTab {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if BrowserTab option is available
|
||||||
|
* @return {Promise<any>} Returns a promise that resolves when check is successful and returns true or false
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
isAvailable(): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens the provided URL using a browser tab
|
||||||
|
* @param {string} url The URL you want to open
|
||||||
|
* @return {Promise<any>} Returns a promise that resolves when check open was successful
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
openUrl(url: string): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes browser tab
|
||||||
|
* @return {Promise<any>} Returns a promise that resolves when close was finished
|
||||||
|
*/
|
||||||
|
@Cordova()
|
||||||
|
close(): Promise<any> { return; }
|
||||||
|
}
|
||||||
@@ -1,19 +1,53 @@
|
|||||||
import { Cordova, Plugin } from './plugin';
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Cordova, Plugin } from '@ionic-native/core';
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
export interface CalendarOptions {
|
export interface CalendarOptions {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Id
|
||||||
|
*/
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
firstReminderMinutes?: number;
|
firstReminderMinutes?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
secondReminderMinutes?: number;
|
secondReminderMinutes?: number;
|
||||||
recurrence?: string; // options are: 'daily', 'weekly', 'monthly', 'yearly'
|
|
||||||
recurrenceInterval?: number; // only used when recurrence is set
|
/**
|
||||||
|
* Recurrence. Can be set to `daily`, `weekly`, `monthly` or `yearly`
|
||||||
|
*/
|
||||||
|
recurrence?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recurrence interval. Valid only when `recurrence` option is set.
|
||||||
|
*/
|
||||||
|
recurrenceInterval?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recurrence end date. Valid only when `recurrence` option is set.
|
||||||
|
*/
|
||||||
recurrenceEndDate?: Date;
|
recurrenceEndDate?: Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calendar name. Ths is supported by `iOS` only.
|
||||||
|
*/
|
||||||
calendarName?: string;
|
calendarName?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calendar id
|
||||||
|
*/
|
||||||
calendarId?: number;
|
calendarId?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* URL
|
||||||
|
*/
|
||||||
url?: string;
|
url?: string;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -26,23 +60,27 @@ export interface CalendarOptions {
|
|||||||
*
|
*
|
||||||
* @usage
|
* @usage
|
||||||
* ```
|
* ```
|
||||||
* import {Calendar} from 'ionic-native';
|
* import {Calendar} from '@ionic-native/calendar';
|
||||||
|
*
|
||||||
|
* constructor(private calendar: Calendar) { }
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*
|
* this.calendar.createCalendar('MyCalendar').then(
|
||||||
* Calendar.createCalendar('MyCalendar').then(
|
|
||||||
* (msg) => { console.log(msg); },
|
* (msg) => { console.log(msg); },
|
||||||
* (err) => { console.log(err); }
|
* (err) => { console.log(err); }
|
||||||
* );
|
* );
|
||||||
* ```
|
* ```
|
||||||
*
|
* @interfaces
|
||||||
|
* CalendarOptions
|
||||||
*/
|
*/
|
||||||
@Plugin({
|
@Plugin({
|
||||||
|
pluginName: 'Calendar',
|
||||||
plugin: 'cordova-plugin-calendar',
|
plugin: 'cordova-plugin-calendar',
|
||||||
pluginRef: 'plugins.calendar',
|
pluginRef: 'plugins.calendar',
|
||||||
repo: 'https://github.com/EddyVerbruggen/Calendar-PhoneGap-Plugin',
|
repo: 'https://github.com/EddyVerbruggen/Calendar-PhoneGap-Plugin',
|
||||||
platforms: ['Android', 'iOS']
|
platforms: ['Android', 'iOS']
|
||||||
})
|
})
|
||||||
|
@Injectable()
|
||||||
export class Calendar {
|
export class Calendar {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -53,94 +91,73 @@ export class Calendar {
|
|||||||
* - You're using Android < 6, or
|
* - You're using Android < 6, or
|
||||||
* - You've already granted permission
|
* - You've already granted permission
|
||||||
*
|
*
|
||||||
* If this returns false, you should call `requestReadWritePermissions` function
|
* If this returns false, you should call the `requestReadWritePermission` function
|
||||||
* @returns {Promise<boolean>}
|
* @returns {Promise<boolean>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static hasReadWritePermission(): Promise<boolean> { return; }
|
hasReadWritePermission(): Promise<boolean> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if we have read permission
|
* Check if we have read permission
|
||||||
* @returns {Promise<boolean>}
|
* @returns {Promise<boolean>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static hasReadPermission(): Promise<boolean> { return; }
|
hasReadPermission(): Promise<boolean> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if we have write permission
|
* Check if we have write permission
|
||||||
* @returns {Promise<boolean>}
|
* @returns {Promise<boolean>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static hasWritePermission(): Promise<boolean> { return; }
|
hasWritePermission(): Promise<boolean> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request write permission
|
* Request write permission
|
||||||
* @returns {Promise<any>}
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static requestWritePermission(): Promise<any> { return; }
|
requestWritePermission(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request read permission
|
* Request read permission
|
||||||
* @returns {Promise<any>}
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static requestReadPermission(): Promise<any> { return; }
|
requestReadPermission(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Requests read/write permissions
|
* Requests read/write permissions
|
||||||
* @returns {Promise<any>}
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static requestReadWritePermission(): Promise<any> { return; }
|
requestReadWritePermission(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a calendar. (iOS only)
|
* Create a calendar. (iOS only)
|
||||||
*
|
*
|
||||||
* @param {string | Object} nameOrOptions either a string name or a options object. If string, provide the calendar name. IF an object, provide a calendar name as a string and a calendar color in hex format as a string
|
* @param {string | Object} nameOrOptions either a string name or a options object. If string, provide the calendar name. IF an object, provide a calendar name as a string and a calendar color in hex format as a string
|
||||||
* @return {Promise} Returns a Promise
|
* @returns {Promise<any>} Returns a Promise
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static createCalendar(
|
createCalendar(nameOrOptions: string | any): Promise<any> { return; }
|
||||||
nameOrOptions: string | { calendarName: string, calendarColor: string }
|
|
||||||
): Promise<any> { return; }
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete a calendar. (iOS only)
|
* Delete a calendar. (iOS only)
|
||||||
* @param {string} name Name of the calendar to delete.
|
* @param {string} name Name of the calendar to delete.
|
||||||
* @return Returns a Promise
|
* @returns {Promise<any>} Returns a Promise
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static deleteCalendar(name: string): Promise<any> { return; }
|
deleteCalendar(name: string): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the default calendar options.
|
* Returns the default calendar options.
|
||||||
*
|
*
|
||||||
* @return Returns an object with the default calendar options:
|
* @return {CalendarOptions} Returns an object with the default calendar options
|
||||||
* firstReminderMinutes: 60,
|
|
||||||
* secondReminderMinutes: null,
|
|
||||||
* recurrence: null, // options are: 'daily', 'weekly', 'monthly', 'yearly'
|
|
||||||
* recurrenceInterval: 1, // only used when recurrence is set
|
|
||||||
* recurrenceEndDate: null,
|
|
||||||
* calendarName: null,
|
|
||||||
* calendarId: null,
|
|
||||||
* url: null
|
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
sync: true
|
sync: true
|
||||||
})
|
})
|
||||||
static getCalendarOptions(): CalendarOptions {
|
getCalendarOptions(): CalendarOptions { return; }
|
||||||
return {
|
|
||||||
firstReminderMinutes: 60,
|
|
||||||
secondReminderMinutes: null,
|
|
||||||
recurrence: null,
|
|
||||||
recurrenceInterval: 1,
|
|
||||||
recurrenceEndDate: null,
|
|
||||||
calendarName: null,
|
|
||||||
calendarId: null,
|
|
||||||
url: null
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Silently create an event.
|
* Silently create an event.
|
||||||
@@ -149,10 +166,10 @@ export class Calendar {
|
|||||||
* @param {string} [notes] The event notes
|
* @param {string} [notes] The event notes
|
||||||
* @param {Date} [startDate] The event start date
|
* @param {Date} [startDate] The event start date
|
||||||
* @param {Date} [endDate] The event end date
|
* @param {Date} [endDate] The event end date
|
||||||
* @return Returns a Promise
|
* @returns {Promise<any>} Returns a Promise
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static createEvent(
|
createEvent(
|
||||||
title?: string,
|
title?: string,
|
||||||
location?: string,
|
location?: string,
|
||||||
notes?: string,
|
notes?: string,
|
||||||
@@ -169,10 +186,10 @@ export class Calendar {
|
|||||||
* @param {Date} [startDate] The event start date
|
* @param {Date} [startDate] The event start date
|
||||||
* @param {Date} [endDate] The event end date
|
* @param {Date} [endDate] The event end date
|
||||||
* @param {CalendarOptions} [options] Additional options, see `getCalendarOptions`
|
* @param {CalendarOptions} [options] Additional options, see `getCalendarOptions`
|
||||||
* @return Returns a Promise
|
* @returns {Promise<any>} Returns a Promise
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static createEventWithOptions(
|
createEventWithOptions(
|
||||||
title?: string,
|
title?: string,
|
||||||
location?: string,
|
location?: string,
|
||||||
notes?: string,
|
notes?: string,
|
||||||
@@ -189,10 +206,10 @@ export class Calendar {
|
|||||||
* @param {string} [notes] The event notes
|
* @param {string} [notes] The event notes
|
||||||
* @param {Date} [startDate] The event start date
|
* @param {Date} [startDate] The event start date
|
||||||
* @param {Date} [endDate] The event end date
|
* @param {Date} [endDate] The event end date
|
||||||
* @return Returns a Promise
|
* @returns {Promise<any>} Returns a Promise
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static createEventInteractively(
|
createEventInteractively(
|
||||||
title?: string,
|
title?: string,
|
||||||
location?: string,
|
location?: string,
|
||||||
notes?: string,
|
notes?: string,
|
||||||
@@ -209,10 +226,10 @@ export class Calendar {
|
|||||||
* @param {Date} [startDate] The event start date
|
* @param {Date} [startDate] The event start date
|
||||||
* @param {Date} [endDate] The event end date
|
* @param {Date} [endDate] The event end date
|
||||||
* @param {CalendarOptions} [options] Additional options, see `getCalendarOptions`
|
* @param {CalendarOptions} [options] Additional options, see `getCalendarOptions`
|
||||||
* @return Returns a Promise
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static createEventInteractivelyWithOptions(
|
createEventInteractivelyWithOptions(
|
||||||
title?: string,
|
title?: string,
|
||||||
location?: string,
|
location?: string,
|
||||||
notes?: string,
|
notes?: string,
|
||||||
@@ -221,17 +238,6 @@ export class Calendar {
|
|||||||
options?: CalendarOptions
|
options?: CalendarOptions
|
||||||
): Promise<any> { return; }
|
): Promise<any> { return; }
|
||||||
|
|
||||||
// deprecated
|
|
||||||
// @Cordova()
|
|
||||||
// static createEventInNamedCalendar(
|
|
||||||
// title?: string,
|
|
||||||
// location?: string,
|
|
||||||
// notes?: string,
|
|
||||||
// startDate?: Date,
|
|
||||||
// endDate?: Date,
|
|
||||||
// calendarName?: string
|
|
||||||
// ) {}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find an event.
|
* Find an event.
|
||||||
*
|
*
|
||||||
@@ -240,10 +246,10 @@ export class Calendar {
|
|||||||
* @param {string} [notes] The event notes
|
* @param {string} [notes] The event notes
|
||||||
* @param {Date} [startDate] The event start date
|
* @param {Date} [startDate] The event start date
|
||||||
* @param {Date} [endDate] The event end date
|
* @param {Date} [endDate] The event end date
|
||||||
* @return Returns a Promise
|
* @returns {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static findEvent(
|
findEvent(
|
||||||
title?: string,
|
title?: string,
|
||||||
location?: string,
|
location?: string,
|
||||||
notes?: string,
|
notes?: string,
|
||||||
@@ -259,10 +265,10 @@ export class Calendar {
|
|||||||
* @param {Date} [startDate] The event start date
|
* @param {Date} [startDate] The event start date
|
||||||
* @param {Date} [endDate] The event end date
|
* @param {Date} [endDate] The event end date
|
||||||
* @param {CalendarOptions} [options] Additional options, see `getCalendarOptions`
|
* @param {CalendarOptions} [options] Additional options, see `getCalendarOptions`
|
||||||
* @return Returns a Promise that resolves with the event, or rejects with an error.
|
* @returns {Promise<any>} Returns a Promise that resolves with the event, or rejects with an error.
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static findEventWithOptions(
|
findEventWithOptions(
|
||||||
title?: string,
|
title?: string,
|
||||||
location?: string,
|
location?: string,
|
||||||
notes?: string,
|
notes?: string,
|
||||||
@@ -276,24 +282,28 @@ export class Calendar {
|
|||||||
*
|
*
|
||||||
* @param {Date} [startDate] The start date
|
* @param {Date} [startDate] The start date
|
||||||
* @param {Date} [endDate] The end date
|
* @param {Date} [endDate] The end date
|
||||||
* @return Returns a Promise that resolves with the list of events, or rejects with an error.
|
* @returns {Promise<any>} Returns a Promise that resolves with the list of events, or rejects with an error.
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova({
|
||||||
static listEventsInRange(startDate: Date, endDate: Date): Promise<any> { return; }
|
platforms: ['Android']
|
||||||
|
})
|
||||||
|
listEventsInRange(startDate: Date, endDate: Date): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a list of all calendars.
|
* Get a list of all calendars.
|
||||||
* @return A Promise that resolves with the list of calendars, or rejects with an error.
|
* @returns {Promise<any>} A Promise that resolves with the list of calendars, or rejects with an error.
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static listCalendars(): Promise<any> { return; }
|
listCalendars(): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a list of all future events in the specified calendar. (iOS only)
|
* Get a list of all future events in the specified calendar. (iOS only)
|
||||||
* @return Returns a Promise that resolves with the list of events, or rejects with an error.
|
* @returns {Promise<any>} Returns a Promise that resolves with the list of events, or rejects with an error.
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova({
|
||||||
static findAllEventsInNamedCalendar(calendarName: string): Promise<any> { return; }
|
platforms: ['iOS']
|
||||||
|
})
|
||||||
|
findAllEventsInNamedCalendar(calendarName: string): Promise<any> { return; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Modify an event. (iOS only)
|
* Modify an event. (iOS only)
|
||||||
@@ -310,8 +320,10 @@ export class Calendar {
|
|||||||
* @param {Date} [newEndDate] The new event end date
|
* @param {Date} [newEndDate] The new event end date
|
||||||
* @return Returns a Promise
|
* @return Returns a Promise
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova({
|
||||||
static modifyEvent(
|
platforms: ['iOS']
|
||||||
|
})
|
||||||
|
modifyEvent(
|
||||||
title?: string,
|
title?: string,
|
||||||
location?: string,
|
location?: string,
|
||||||
notes?: string,
|
notes?: string,
|
||||||
@@ -341,8 +353,10 @@ export class Calendar {
|
|||||||
* @param {CalendarOptions} [newOptions] New event options, see `getCalendarOptions`
|
* @param {CalendarOptions} [newOptions] New event options, see `getCalendarOptions`
|
||||||
* @return Returns a Promise
|
* @return Returns a Promise
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova({
|
||||||
static modifyEventWithOptions(
|
platforms: ['iOS']
|
||||||
|
})
|
||||||
|
modifyEventWithOptions(
|
||||||
title?: string,
|
title?: string,
|
||||||
location?: string,
|
location?: string,
|
||||||
notes?: string,
|
notes?: string,
|
||||||
@@ -368,7 +382,7 @@ export class Calendar {
|
|||||||
* @return Returns a Promise
|
* @return Returns a Promise
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static deleteEvent(
|
deleteEvent(
|
||||||
title?: string,
|
title?: string,
|
||||||
location?: string,
|
location?: string,
|
||||||
notes?: string,
|
notes?: string,
|
||||||
@@ -387,8 +401,10 @@ export class Calendar {
|
|||||||
* @param {string} calendarName
|
* @param {string} calendarName
|
||||||
* @return Returns a Promise
|
* @return Returns a Promise
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova({
|
||||||
static deleteEventFromNamedCalendar(
|
platforms: ['iOS']
|
||||||
|
})
|
||||||
|
deleteEventFromNamedCalendar(
|
||||||
title?: string,
|
title?: string,
|
||||||
location?: string,
|
location?: string,
|
||||||
notes?: string,
|
notes?: string,
|
||||||
@@ -403,6 +419,6 @@ export class Calendar {
|
|||||||
* @return {Promise<any>} Promise returns a promise
|
* @return {Promise<any>} Promise returns a promise
|
||||||
*/
|
*/
|
||||||
@Cordova()
|
@Cordova()
|
||||||
static openCalendar(date: Date): Promise<any> { return; }
|
openCalendar(date: Date): Promise<any> { return; }
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,36 +1,46 @@
|
|||||||
import { Plugin, Cordova } from './plugin';
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Plugin, Cordova } from '@ionic-native/core';
|
||||||
/**
|
/**
|
||||||
* @name CallNumber
|
* @name Call Number
|
||||||
* @description
|
* @description
|
||||||
* Call a number directly from your Cordova/Ionic application.
|
* Call a number directly from your Cordova/Ionic application.
|
||||||
*
|
*
|
||||||
* @usage
|
* @usage
|
||||||
* ```
|
* ```
|
||||||
* import {CallNumber} from 'ionic-native';
|
* import {CallNumber} from '@ionic-native/call-number';
|
||||||
*
|
*
|
||||||
* CallNumber.callNumber(18001010101, true)
|
* constructor(private callNumber: CallNumber) { }
|
||||||
|
*
|
||||||
|
* ...
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* this.callNumber.callNumber(18001010101, true)
|
||||||
* .then(() => console.log('Launched dialer!'))
|
* .then(() => console.log('Launched dialer!'))
|
||||||
* .catch(() => console.log('Error launching dialer'));
|
* .catch(() => console.log('Error launching dialer'));
|
||||||
*
|
*
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
@Plugin({
|
@Plugin({
|
||||||
|
pluginName: 'CallNumber',
|
||||||
plugin: 'call-number',
|
plugin: 'call-number',
|
||||||
pluginRef: 'plugins.CallNumber',
|
pluginRef: 'plugins.CallNumber',
|
||||||
repo: 'https://github.com/Rohfosho/CordovaCallNumberPlugin',
|
repo: 'https://github.com/Rohfosho/CordovaCallNumberPlugin',
|
||||||
platforms: ['iOS', 'Android']
|
platforms: ['iOS', 'Android']
|
||||||
})
|
})
|
||||||
|
@Injectable()
|
||||||
export class CallNumber {
|
export class CallNumber {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calls a phone number
|
* Calls a phone number
|
||||||
* @param numberToCall {string} The phone number to call as a string
|
* @param numberToCall {string} The phone number to call as a string
|
||||||
* @param bypassAppChooser {boolean} Set to true to bypass the app chooser and go directly to dialer
|
* @param bypassAppChooser {boolean} Set to true to bypass the app chooser and go directly to dialer
|
||||||
|
* @return {Promise<any>}
|
||||||
*/
|
*/
|
||||||
@Cordova({
|
@Cordova({
|
||||||
callbackOrder: 'reverse'
|
callbackOrder: 'reverse'
|
||||||
})
|
})
|
||||||
static callNumber(numberToCall: string, bypassAppChooser: boolean): Promise<any> {
|
callNumber(numberToCall: string, bypassAppChooser: boolean): Promise<any> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,247 @@
|
|||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Cordova, Plugin } from '@ionic-native/core';
|
||||||
|
|
||||||
|
export interface CameraPreviewDimensions {
|
||||||
|
/** The width of the camera preview, default to window.screen.width */
|
||||||
|
width?: number;
|
||||||
|
|
||||||
|
/** The height of the camera preview, default to window.screen.height */
|
||||||
|
height?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CameraPreviewOptions {
|
||||||
|
/** The left edge in pixels, default 0 */
|
||||||
|
x?: number;
|
||||||
|
|
||||||
|
/** The top edge in pixels, default 0 */
|
||||||
|
y?: number;
|
||||||
|
|
||||||
|
/** The width in pixels, default window.screen.width */
|
||||||
|
width?: number;
|
||||||
|
|
||||||
|
/** The height in pixels, default window.screen.height */
|
||||||
|
height?: number;
|
||||||
|
|
||||||
|
/** Choose the camera to use 'front' or 'rear', default 'front' */
|
||||||
|
camera?: string;
|
||||||
|
|
||||||
|
/** Tap to take a photo, default true (picture quality by default : 85) */
|
||||||
|
tapPhoto?: boolean;
|
||||||
|
|
||||||
|
/** Preview box drag across the screen, default 'false' */
|
||||||
|
previewDrag?: boolean;
|
||||||
|
|
||||||
|
/** Preview box to the back of the webview (true => back, false => front) , default false */
|
||||||
|
toBack?: boolean;
|
||||||
|
|
||||||
|
/** Alpha channel of the preview box, float, [0,1], default 1 */
|
||||||
|
alpha?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CameraPreviewPictureOptions {
|
||||||
|
/** The width in pixels, default 0 */
|
||||||
|
width?: number;
|
||||||
|
/** The height in pixels, default 0 */
|
||||||
|
height?: number;
|
||||||
|
/** The picture quality, 0 - 100, default 85 */
|
||||||
|
quality?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @beta
|
||||||
|
* @name Camera Preview
|
||||||
|
* @description
|
||||||
|
* Showing camera preview in HTML
|
||||||
|
*
|
||||||
|
* Requires Cordova plugin: `https://github.com/cordova-plugin-camera-preview/cordova-plugin-camera-preview.git`. For more info, please see the [Cordova Camera Preview docs](https://github.com/cordova-plugin-camera-preview/cordova-plugin-camera-preview).
|
||||||
|
*
|
||||||
|
* @usage
|
||||||
|
* ```typescript
|
||||||
|
* import { CameraPreview, PictureOptions, CameraPreviewOptions, CameraPreviewDimensions } from 'ionic-native';
|
||||||
|
*
|
||||||
|
* constructor(private cameraPreview: CameraPreview) { }
|
||||||
|
*
|
||||||
|
* ...
|
||||||
|
*
|
||||||
|
* // camera options (Size and location). In the following example, the preview uses the rear camera and display the preview in the back of the webview
|
||||||
|
* const cameraPreviewOpts: CameraPreviewOptions = {
|
||||||
|
* x: 0,
|
||||||
|
* y: 0,
|
||||||
|
* width: window.screen.width,
|
||||||
|
* height: window.screen.height,
|
||||||
|
* camera: 'rear',
|
||||||
|
* tapPhoto: true,
|
||||||
|
* previewDrag: true,
|
||||||
|
* toBack: true,
|
||||||
|
* alpha: 1
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
* // start camera
|
||||||
|
* this.cameraPreview.startCamera(cameraPreviewOpts).then(
|
||||||
|
* (res) => {
|
||||||
|
* console.log(res)
|
||||||
|
* },
|
||||||
|
* (err) => {
|
||||||
|
* console.log(err)
|
||||||
|
* });
|
||||||
|
*
|
||||||
|
* // Set the handler to run every time we take a picture
|
||||||
|
* this.cameraPreview.setOnPictureTakenHandler().subscribe((result) => {
|
||||||
|
* console.log(result);
|
||||||
|
* // do something with the result
|
||||||
|
* });
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* // picture options
|
||||||
|
* const pictureOpts: PictureOptions = {
|
||||||
|
* width: 1280,
|
||||||
|
* height: 1280,
|
||||||
|
* quality: 85
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* // take a picture
|
||||||
|
* this.cameraPreview.takePicture(this.pictureOpts).then((imageData) => {
|
||||||
|
* this.picture = 'data:image/jpeg;base64,' + imageData;
|
||||||
|
* }, (err) => {
|
||||||
|
* console.log(err);
|
||||||
|
* this.picture = 'assets/img/test.jpg';
|
||||||
|
* });
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* // Switch camera
|
||||||
|
* this.cameraPreview.switchCamera();
|
||||||
|
*
|
||||||
|
* // set color effect to negative
|
||||||
|
* this.cameraPreview.setColorEffect('negative');
|
||||||
|
*
|
||||||
|
* // Stop the camera preview
|
||||||
|
* this.cameraPreview.stopCamera();
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @interfaces
|
||||||
|
* CameraPreviewOptions
|
||||||
|
* CameraPreviewPictureOptions
|
||||||
|
* CameraPreviewDimensions
|
||||||
|
*/
|
||||||
|
@Plugin({
|
||||||
|
pluginName: 'CameraPreview',
|
||||||
|
plugin: 'cordova-plugin-camera-preview',
|
||||||
|
pluginRef: 'CameraPreview',
|
||||||
|
repo: 'https://github.com/cordova-plugin-camera-preview/cordova-plugin-camera-preview',
|
||||||
|
platforms: ['Android', 'iOS']
|
||||||
|
})
|
||||||
|
@Injectable()
|
||||||
|
export class CameraPreview {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts the camera preview instance.
|
||||||
|
* @param {CameraPreviewOptions} options
|
||||||
|
* @return {Promise<any>}
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
successIndex: 1,
|
||||||
|
errorIndex: 2
|
||||||
|
})
|
||||||
|
startCamera(options: CameraPreviewOptions): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stops the camera preview instance. (iOS & Android)
|
||||||
|
* @return {Promise<any>}
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
successIndex: 0,
|
||||||
|
errorIndex: 1
|
||||||
|
})
|
||||||
|
stopCamera(): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Switch from the rear camera and front camera, if available.
|
||||||
|
* @return {Promise<any>}
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
successIndex: 0,
|
||||||
|
errorIndex: 1
|
||||||
|
})
|
||||||
|
switchCamera(): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hide the camera preview box.
|
||||||
|
* @return {Promise<any>}
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
successIndex: 0,
|
||||||
|
errorIndex: 1
|
||||||
|
})
|
||||||
|
hide(): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the camera preview box.
|
||||||
|
* @return {Promise<any>}
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
successIndex: 0,
|
||||||
|
errorIndex: 1
|
||||||
|
})
|
||||||
|
show(): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Take the picture (base64)
|
||||||
|
* @param options {CameraPreviewPictureOptions} optional - size and quality of the picture to take
|
||||||
|
* @return {Promise<any>}
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
successIndex: 1,
|
||||||
|
errorIndex: 2
|
||||||
|
})
|
||||||
|
takePicture(options?: CameraPreviewPictureOptions): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Set camera color effect.
|
||||||
|
* @static
|
||||||
|
* @param {string} effect name : 'none' (iOS & Android), 'aqua' (Android), 'blackboard' (Android), 'mono' (iOS & Android), 'negative' (iOS & Android), 'posterize' (iOS & Android), 'sepia' (iOS & Android), 'solarize' (Android) or 'whiteboard' (Android)
|
||||||
|
* @return {Promise<any>}
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
successIndex: 1,
|
||||||
|
errorIndex: 2
|
||||||
|
})
|
||||||
|
setColorEffect(effect: string): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the zoom (Android)
|
||||||
|
* @param zoom {number} Zoom value
|
||||||
|
* @return {Promise<any>}
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
successIndex: 1,
|
||||||
|
errorIndex: 2
|
||||||
|
})
|
||||||
|
setZoom(zoom?: number): Promise<any> { return; }
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the preview Size
|
||||||
|
* @param dimensions {CameraPreviewDimensions}
|
||||||
|
* @return {Promise<any>}
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
successIndex: 1,
|
||||||
|
errorIndex: 2,
|
||||||
|
platforms: ['Android']
|
||||||
|
})
|
||||||
|
setPreviewSize(dimensions?: CameraPreviewDimensions): Promise<any> { return; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the flashmode
|
||||||
|
* @param flashMode {string} 'off' (iOS & Android), 'on' (iOS & Android), 'auto' (iOS & Android), 'torch' (Android)
|
||||||
|
* @return {Promise<any>}
|
||||||
|
*/
|
||||||
|
@Cordova({
|
||||||
|
successIndex: 1,
|
||||||
|
errorIndex: 2
|
||||||
|
})
|
||||||
|
setFlashMode(flashMode?: string): Promise<any> { return; }
|
||||||
|
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user