├── .gitignore
├── .travis.yml
├── CHANGELOG.md
├── LICENSE
├── README.md
├── demo
├── app
│ ├── App_Resources
│ │ ├── Android
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── app.gradle
│ │ │ ├── drawable-hdpi
│ │ │ │ ├── background.png
│ │ │ │ ├── icon.png
│ │ │ │ └── logo.png
│ │ │ ├── drawable-ldpi
│ │ │ │ ├── background.png
│ │ │ │ ├── icon.png
│ │ │ │ └── logo.png
│ │ │ ├── drawable-mdpi
│ │ │ │ ├── background.png
│ │ │ │ ├── icon.png
│ │ │ │ └── logo.png
│ │ │ ├── drawable-nodpi
│ │ │ │ └── splash_screen.xml
│ │ │ ├── drawable-xhdpi
│ │ │ │ ├── background.png
│ │ │ │ ├── icon.png
│ │ │ │ └── logo.png
│ │ │ ├── drawable-xxhdpi
│ │ │ │ ├── background.png
│ │ │ │ ├── icon.png
│ │ │ │ └── logo.png
│ │ │ ├── drawable-xxxhdpi
│ │ │ │ ├── background.png
│ │ │ │ ├── icon.png
│ │ │ │ └── logo.png
│ │ │ ├── values-v21
│ │ │ │ ├── colors.xml
│ │ │ │ └── styles.xml
│ │ │ └── values
│ │ │ │ ├── colors.xml
│ │ │ │ └── styles.xml
│ │ └── iOS
│ │ │ ├── Assets.xcassets
│ │ │ ├── AppIcon.appiconset
│ │ │ │ ├── Contents.json
│ │ │ │ ├── icon-29.png
│ │ │ │ ├── icon-29@2x.png
│ │ │ │ ├── icon-29@3x.png
│ │ │ │ ├── icon-40.png
│ │ │ │ ├── icon-40@2x.png
│ │ │ │ ├── icon-40@3x.png
│ │ │ │ ├── icon-50.png
│ │ │ │ ├── icon-50@2x.png
│ │ │ │ ├── icon-57.png
│ │ │ │ ├── icon-57@2x.png
│ │ │ │ ├── icon-60@2x.png
│ │ │ │ ├── icon-60@3x.png
│ │ │ │ ├── icon-72.png
│ │ │ │ ├── icon-72@2x.png
│ │ │ │ ├── icon-76.png
│ │ │ │ ├── icon-76@2x.png
│ │ │ │ └── icon-83.5@2x.png
│ │ │ ├── Contents.json
│ │ │ ├── LaunchImage.launchimage
│ │ │ │ ├── Contents.json
│ │ │ │ ├── Default-568h@2x.png
│ │ │ │ ├── Default-667h@2x.png
│ │ │ │ ├── Default-736h@3x.png
│ │ │ │ ├── Default-Landscape.png
│ │ │ │ ├── Default-Landscape@2x.png
│ │ │ │ ├── Default-Landscape@3x.png
│ │ │ │ ├── Default-Portrait.png
│ │ │ │ ├── Default-Portrait@2x.png
│ │ │ │ ├── Default.png
│ │ │ │ └── Default@2x.png
│ │ │ ├── LaunchScreen.AspectFill.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ ├── LaunchScreen-AspectFill.png
│ │ │ │ └── LaunchScreen-AspectFill@2x.png
│ │ │ └── LaunchScreen.Center.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ ├── LaunchScreen-Center.png
│ │ │ │ └── LaunchScreen-Center@2x.png
│ │ │ ├── Info.plist
│ │ │ ├── LaunchScreen.storyboard
│ │ │ └── build.xcconfig
│ ├── app-root.xml
│ ├── app.css
│ ├── app.ts
│ ├── main-page.ts
│ ├── main-page.xml
│ ├── main-view-model.ts
│ └── tests
│ │ └── tests.js
├── karma.conf.js
├── nativescript.config.ts
├── package.json
├── references.d.ts
└── tsconfig.json
├── publish
├── pack.sh
├── package-lock.json
├── package.json
└── publish.sh
├── screenshots
├── ios-en.jpg
└── ios-nl.jpg
├── src
├── .npmignore
├── index.d.ts
├── package-lock.json
├── package.json
├── platforms
│ ├── android
│ │ └── AndroidManifest.xml
│ └── ios
│ │ └── Info.plist
├── references.d.ts
├── speech-recognition.android.ts
├── speech-recognition.common.ts
├── speech-recognition.ios.ts
└── tsconfig.json
└── tslint.json
/.gitignore:
--------------------------------------------------------------------------------
1 | .vscode/
2 | .idea/
3 | .DS_Store
4 | *.js
5 | *.js.map
6 | *.log.*
7 | src/**/*.d.ts
8 | src/platforms/android/*.aar
9 | !src/index.d.ts
10 | !src/references.d.ts
11 | !demo/karma.conf.js
12 | !demo/app/tests/*.js
13 | demo/**/*.d.ts
14 | !demo/references.d.ts
15 | demo/platforms
16 | demo/.nsbuildinfo
17 | node_modules
18 | publish/src
19 | publish/package
20 | demo/report/report.html
21 | demo/report/stats.json
22 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | matrix:
2 | include:
3 | - stage: "Lint"
4 | language: node_js
5 | os: linux
6 | node_js: "10"
7 | script: cd src && npm run ci.tslint
8 | - stage: "WebPack, Build"
9 | os: osx
10 | env:
11 | - WebPack="iOS"
12 | osx_image: xcode11.2
13 | language: node_js
14 | node_js: "10"
15 | jdk: oraclejdk8
16 | before_script: pod repo update
17 | script: cd demo && npm run build.plugin && npm i && tns build ios --bundle --env.uglify
18 | - language: android
19 | os: linux
20 | env:
21 | - WebPack="Android"
22 | jdk: oraclejdk8
23 | dist: trusty
24 | before_install: nvm install 10
25 | script: cd demo && npm run build.plugin && npm i && tns build android --bundle --env.uglify --env.snapshot
26 | - language: android
27 | env:
28 | - BuildAndroid="28"
29 | os: linux
30 | jdk: oraclejdk8
31 | dist: trusty
32 | before_install: nvm install 10
33 | script:
34 | - cd src && npm i && npm run tsc && cd ../demo && tns build android
35 | - os: osx
36 | env:
37 | - BuildiOS="12"
38 | - Xcode="11.0"
39 | osx_image: xcode11.2
40 | language: node_js
41 | node_js: "10"
42 | jdk: oraclejdk8
43 | before_script: pod repo update
44 | script:
45 | - cd src && npm i && npm run tsc && cd ../demo && tns build ios
46 |
47 | android:
48 | components:
49 | - tools
50 | - platform-tools
51 | - build-tools-28.0.3
52 | - android-28
53 | - extra-android-m2repository
54 | - sys-img-armeabi-v7a-android-21
55 |
56 | before_install:
57 | - sudo pip install --upgrade pip
58 | - sudo pip install six
59 |
60 | install:
61 | - echo no | npm install -g nativescript
62 | - tns usage-reporting disable
63 | - tns error-reporting disable
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 |
2 | ## 1.4.1 (2018-09-21)
3 |
4 | * - https://github.com/EddyVerbruggen/nativescript-speech-recognition/pull/23 ([e040e13](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/e040e13))
5 | * Added onError callback to options. Only called in Android. ([bd64fde](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/bd64fde))
6 | * Link to where error code constants and their meaning can be found. ([00508ea](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/00508ea))
7 | * Publish the aar instead of the manifest ([994b9a0](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/994b9a0))
8 | * Use the correct default locale on iOS #19 -- this is actually a better (but identical) fix.. just le ([8288f9b](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/8288f9b)), closes [#19](https://github.com/EddyVerbruggen/nativescript-speech-recognition/issues/19)
9 |
10 |
11 |
12 |
13 | ## 1.3.2 (2018-03-28)
14 |
15 | * Documentation #17 ([4db6241](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/4db6241)), closes [#17](https://github.com/EddyVerbruggen/nativescript-speech-recognition/issues/17)
16 | * Fixed the link tot he pluginshowcase app ([f1f7852](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/f1f7852))
17 | * Use the correct default locale on iOS #19 ([f0c7f0f](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/f0c7f0f)), closes [#19](https://github.com/EddyVerbruggen/nativescript-speech-recognition/issues/19)
18 |
19 |
20 |
21 |
22 | ## 1.3.1 (2017-09-17)
23 |
24 | * bump ([5753995](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/5753995))
25 |
26 |
27 |
28 |
29 | ## 1.3.0 (2017-09-16)
30 |
31 | * bump ([e0b8b17](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/e0b8b17))
32 | * bump ([42935cf](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/42935cf))
33 | * ignore some more ([1a80426](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/1a80426))
34 | * The 'finished' boolean is not correct when partial results are requested #16 ([243f73a](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/243f73a)), closes [#16](https://github.com/EddyVerbruggen/nativescript-speech-recognition/issues/16)
35 | * traviz ([1e8f533](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/1e8f533))
36 | * travizz ([06a8f0b](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/06a8f0b))
37 |
38 |
39 |
40 |
41 | ## 1.2.1 (2017-08-26)
42 |
43 | * #14 Reset the audio session on iOS after recording ([18f964d](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/18f964d)), closes [#14](https://github.com/EddyVerbruggen/nativescript-speech-recognition/issues/14)
44 | * #15 Add a 'requestPermissions' method ([a054a22](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/a054a22)), closes [#15](https://github.com/EddyVerbruggen/nativescript-speech-recognition/issues/15)
45 | * cleanup ([371c0d0](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/371c0d0))
46 | * Plugin breaks when resuming app #7 ([99781bb](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/99781bb)), closes [#7](https://github.com/EddyVerbruggen/nativescript-speech-recognition/issues/7)
47 |
48 |
49 |
50 |
51 | ## 1.2.0 (2017-05-28)
52 |
53 | * - cleanup ([b53ac27](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/b53ac27))
54 | * .ignore fixes ([be0a69d](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/be0a69d))
55 | * * updates SpeechRecognitionOptions interface with onPartialResult callback ([469ff36](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/469ff36))
56 | * + ability to receive partial results on Android ([d971d3e](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/d971d3e))
57 | * Added YouTube link to an Angular video ([ee45704](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/ee45704))
58 | * bump ([7603a65](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/7603a65))
59 | * changelog ([d804b5b](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/d804b5b))
60 | * Device or Emulator? #9 ([4de4425](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/4de4425)), closes [#9](https://github.com/EddyVerbruggen/nativescript-speech-recognition/issues/9)
61 | * ignore some more ([0c37443](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/0c37443))
62 |
63 |
64 |
65 |
66 | ## 1.1.3 (2017-04-10)
67 |
68 | * add support for language #5 ([f90e237](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/f90e237)), closes [#5](https://github.com/EddyVerbruggen/nativescript-speech-recognition/issues/5)
69 | * fix table formatting ([b823de9](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/b823de9))
70 | * Update README.md ([c0da3e7](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/c0da3e7))
71 | * Update README.md ([06af1f8](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/06af1f8))
72 |
73 |
74 |
75 |
76 | ## 1.1.2 (2017-03-05)
77 |
78 | * add contrib ([e348a75](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/e348a75))
79 | * bump ([48be4d9](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/48be4d9))
80 | * bump ([ad72ab6](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/ad72ab6))
81 | * Fix Android result transcript.text ([5960662](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/5960662))
82 | * Removed a note about Android ([920678d](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/920678d))
83 | * Update README.md ([ae44722](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/ae44722))
84 | * updated CHANGELOG.md ([2ad4eee](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/2ad4eee))
85 |
86 |
87 |
88 |
89 | ## 1.1.0 (2017-02-14)
90 |
91 | * Added Android ([6cf5e8d](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/6cf5e8d))
92 | * Doc++ ([e64962a](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/e64962a))
93 | * Doc++ ([4e51922](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/4e51922))
94 | * Enjoy, world! ([eb6599c](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/eb6599c))
95 | * run android demo on device ([f7d69c6](https://github.com/EddyVerbruggen/nativescript-speech-recognition/commit/f7d69c6))
96 |
97 |
98 |
99 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | nativescript-speech-recognition
4 | Copyright (c) 2017, Eddy Verbruggen
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy of
7 | this software and associated documentation files (the "Software"), to deal in
8 | the Software without restriction, including without limitation the rights to
9 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
10 | the Software, and to permit persons to whom the Software is furnished to do so,
11 | subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in all
14 | copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
18 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
19 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
20 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # NativeScript Speech Recognition
2 |
3 | [![Build Status][build-status]][build-url]
4 | [![NPM version][npm-image]][npm-url]
5 | [![Downloads][downloads-image]][npm-url]
6 | [![Twitter Follow][twitter-image]][twitter-url]
7 |
8 | [build-status]:https://travis-ci.org/EddyVerbruggen/nativescript-speech-recognition.svg?branch=master
9 | [build-url]:https://travis-ci.org/EddyVerbruggen/nativescript-speech-recognition
10 | [npm-image]:http://img.shields.io/npm/v/nativescript-speech-recognition.svg
11 | [npm-url]:https://npmjs.org/package/nativescript-speech-recognition
12 | [downloads-image]:http://img.shields.io/npm/dm/nativescript-speech-recognition.svg
13 | [twitter-image]:https://img.shields.io/twitter/follow/eddyverbruggen.svg?style=social&label=Follow%20me
14 | [twitter-url]:https://twitter.com/eddyverbruggen
15 |
16 | This is the plugin [demo](https://github.com/EddyVerbruggen/nativescript-speech-recognition/tree/master/demo) in action..
17 |
18 | | ..while recognizing Dutch 🇳🇱 | .. after recognizing American-English 🇺🇸 |
19 | | --- | --- |
20 | |
|
|
21 |
22 | ## Installation
23 | From the command prompt go to your app's root folder and execute:
24 |
25 | ### NativeScript 7+:
26 | ```bash
27 | ns plugin add nativescript-speech-recognition
28 | ```
29 |
30 | ### NativeScript < 7:
31 | ```
32 | tns plugin add nativescript-speech-recognition@1.5.0
33 | ```
34 |
35 | ## Testing
36 | You'll need to test this on a real device as a Simulator/Emulator doesn't have speech recognition capabilities.
37 |
38 | ## API
39 |
40 | ### `available`
41 |
42 | Depending on the OS version a speech engine may not be available.
43 |
44 | #### JavaScript
45 | ```js
46 | // require the plugin
47 | var SpeechRecognition = require("nativescript-speech-recognition").SpeechRecognition;
48 |
49 | // instantiate the plugin
50 | var speechRecognition = new SpeechRecognition();
51 |
52 | speechRecognition.available().then(
53 | function(available) {
54 | console.log(available ? "YES!" : "NO");
55 | }
56 | );
57 | ```
58 |
59 | #### TypeScript
60 | ```typescript
61 | // import the plugin
62 | import { SpeechRecognition } from "nativescript-speech-recognition";
63 |
64 | class SomeClass {
65 | private speechRecognition = new SpeechRecognition();
66 |
67 | public checkAvailability(): void {
68 | this.speechRecognition.available().then(
69 | (available: boolean) => console.log(available ? "YES!" : "NO"),
70 | (err: string) => console.log(err)
71 | );
72 | }
73 | }
74 | ```
75 |
76 | ### `requestPermission`
77 | You can either let `startListening` handle permissions when needed, but if you want to have more control
78 | over when the permission popups are shown, you can use this function:
79 |
80 | ```typescript
81 | this.speechRecognition.requestPermission().then((granted: boolean) => {
82 | console.log("Granted? " + granted);
83 | });
84 | ```
85 |
86 | ### `startListening`
87 |
88 | On iOS this will trigger two prompts:
89 |
90 | The first prompt requests to allow Apple to analyze the voice input. The user will see a consent screen which you can extend with your own message by adding a fragment like this to `app/App_Resources/iOS/Info.plist`:
91 |
92 | ```xml
93 | NSSpeechRecognitionUsageDescription
94 | My custom recognition usage description. Overriding the default empty one in the plugin.
95 | ```
96 |
97 | The second prompt requests access to the microphone:
98 |
99 | ```xml
100 | NSMicrophoneUsageDescription
101 | My custom microphone usage description. Overriding the default empty one in the plugin.
102 | ```
103 |
104 | #### TypeScript
105 | ```typescript
106 | // import the options
107 | import { SpeechRecognitionTranscription } from "nativescript-speech-recognition";
108 |
109 | this.speechRecognition.startListening(
110 | {
111 | // optional, uses the device locale by default
112 | locale: "en-US",
113 | // set to true to get results back continuously
114 | returnPartialResults: true,
115 | // this callback will be invoked repeatedly during recognition
116 | onResult: (transcription: SpeechRecognitionTranscription) => {
117 | console.log(`User said: ${transcription.text}`);
118 | console.log(`User finished?: ${transcription.finished}`);
119 | },
120 | onError: (error: string | number) => {
121 | // because of the way iOS and Android differ, this is either:
122 | // - iOS: A 'string', describing the issue.
123 | // - Android: A 'number', referencing an 'ERROR_*' constant from https://developer.android.com/reference/android/speech/SpeechRecognizer.
124 | // If that code is either 6 or 7 you may want to restart listening.
125 | }
126 | }
127 | ).then(
128 | (started: boolean) => { console.log(`started listening`) },
129 | (errorMessage: string) => { console.log(`Error: ${errorMessage}`); }
130 | ).catch((error: string | number) => {
131 | // same as the 'onError' handler, but this may not return if the error occurs after listening has successfully started (because that resolves the promise,
132 | // hence the' onError' handler was created.
133 | });
134 | ```
135 |
136 | ##### Angular tip
137 | If you're using this plugin in Angular, then note that the `onResult` callback is not part of Angular's lifecycle.
138 | So either update the UI in [an `ngZone` as shown here](https://github.com/EddyVerbruggen/nativescript-pluginshowcase/blob/28f65ef98716ad7c4698071b9c394cceb2d9748f/app/speech/speech.component.ts#L154),
139 | or use [`ChangeDetectorRef` as shown here](https://blog.paulhalliday.io/2017/06/24/nativescript-speech-recognition/).
140 |
141 | ### `stopListening`
142 |
143 | #### TypeScript
144 | ```typescript
145 | this.speechRecognition.stopListening().then(
146 | () => { console.log(`stopped listening`) },
147 | (errorMessage: string) => { console.log(`Stop error: ${errorMessage}`); }
148 | );
149 | ```
150 |
151 | ## Demo app (Angular)
152 | This plugin is part of the [plugin showcase app](https://github.com/EddyVerbruggen/nativescript-pluginshowcase/tree/master/app/speech) I built using Angular.
153 |
154 | ### Angular video tutorial
155 | Rather watch a video? Check out [this tutorial on YouTube](https://www.youtube.com/watch?v=C5i_EYjfuTE).
156 |
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
12 |
13 |
16 |
17 |
18 |
19 |
20 |
21 |
27 |
28 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/app.gradle:
--------------------------------------------------------------------------------
1 | android {
2 | defaultConfig {
3 | generatedDensities = []
4 | applicationId = "org.nativescript.plugin.speechrecognition"
5 | }
6 | aaptOptions {
7 | additionalParameters "--no-version-vectors"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-hdpi/background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/Android/drawable-hdpi/background.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-hdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/Android/drawable-hdpi/icon.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-hdpi/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/Android/drawable-hdpi/logo.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-ldpi/background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/Android/drawable-ldpi/background.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-ldpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/Android/drawable-ldpi/icon.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-ldpi/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/Android/drawable-ldpi/logo.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-mdpi/background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/Android/drawable-mdpi/background.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-mdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/Android/drawable-mdpi/icon.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-mdpi/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/Android/drawable-mdpi/logo.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-nodpi/splash_screen.xml:
--------------------------------------------------------------------------------
1 |
2 | -
3 |
4 |
5 | -
6 |
7 |
8 |
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-xhdpi/background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/Android/drawable-xhdpi/background.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-xhdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/Android/drawable-xhdpi/icon.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-xhdpi/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/Android/drawable-xhdpi/logo.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-xxhdpi/background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/Android/drawable-xxhdpi/background.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-xxhdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/Android/drawable-xxhdpi/icon.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-xxhdpi/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/Android/drawable-xxhdpi/logo.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-xxxhdpi/background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/Android/drawable-xxxhdpi/background.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-xxxhdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/Android/drawable-xxxhdpi/icon.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-xxxhdpi/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/Android/drawable-xxxhdpi/logo.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/values-v21/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3d5afe
4 |
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/values-v21/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
9 |
10 |
11 |
14 |
15 |
16 |
19 |
20 |
23 |
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #F5F5F5
4 | #757575
5 | #33B5E5
6 | #272734
7 |
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
18 |
19 |
21 |
22 |
23 |
31 |
32 |
34 |
35 |
36 |
42 |
43 |
45 |
46 |
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "29x29",
5 | "idiom" : "iphone",
6 | "filename" : "icon-29.png",
7 | "scale" : "1x"
8 | },
9 | {
10 | "size" : "29x29",
11 | "idiom" : "iphone",
12 | "filename" : "icon-29@2x.png",
13 | "scale" : "2x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "icon-29@3x.png",
19 | "scale" : "3x"
20 | },
21 | {
22 | "size" : "40x40",
23 | "idiom" : "iphone",
24 | "filename" : "icon-40@2x.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "40x40",
29 | "idiom" : "iphone",
30 | "filename" : "icon-40@3x.png",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "57x57",
35 | "idiom" : "iphone",
36 | "filename" : "icon-57.png",
37 | "scale" : "1x"
38 | },
39 | {
40 | "size" : "57x57",
41 | "idiom" : "iphone",
42 | "filename" : "icon-57@2x.png",
43 | "scale" : "2x"
44 | },
45 | {
46 | "size" : "60x60",
47 | "idiom" : "iphone",
48 | "filename" : "icon-60@2x.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "60x60",
53 | "idiom" : "iphone",
54 | "filename" : "icon-60@3x.png",
55 | "scale" : "3x"
56 | },
57 | {
58 | "size" : "29x29",
59 | "idiom" : "ipad",
60 | "filename" : "icon-29.png",
61 | "scale" : "1x"
62 | },
63 | {
64 | "size" : "29x29",
65 | "idiom" : "ipad",
66 | "filename" : "icon-29@2x.png",
67 | "scale" : "2x"
68 | },
69 | {
70 | "size" : "40x40",
71 | "idiom" : "ipad",
72 | "filename" : "icon-40.png",
73 | "scale" : "1x"
74 | },
75 | {
76 | "size" : "40x40",
77 | "idiom" : "ipad",
78 | "filename" : "icon-40@2x.png",
79 | "scale" : "2x"
80 | },
81 | {
82 | "size" : "50x50",
83 | "idiom" : "ipad",
84 | "filename" : "icon-50.png",
85 | "scale" : "1x"
86 | },
87 | {
88 | "size" : "50x50",
89 | "idiom" : "ipad",
90 | "filename" : "icon-50@2x.png",
91 | "scale" : "2x"
92 | },
93 | {
94 | "size" : "72x72",
95 | "idiom" : "ipad",
96 | "filename" : "icon-72.png",
97 | "scale" : "1x"
98 | },
99 | {
100 | "size" : "72x72",
101 | "idiom" : "ipad",
102 | "filename" : "icon-72@2x.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "76x76",
107 | "idiom" : "ipad",
108 | "filename" : "icon-76.png",
109 | "scale" : "1x"
110 | },
111 | {
112 | "size" : "76x76",
113 | "idiom" : "ipad",
114 | "filename" : "icon-76@2x.png",
115 | "scale" : "2x"
116 | },
117 | {
118 | "size" : "83.5x83.5",
119 | "idiom" : "ipad",
120 | "filename" : "icon-83.5@2x.png",
121 | "scale" : "2x"
122 | }
123 | ],
124 | "info" : {
125 | "version" : 1,
126 | "author" : "xcode"
127 | }
128 | }
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-50.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-50.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-50@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-50@2x.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-57.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-57@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-57@2x.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-72.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-72@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-72@2x.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-76.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "extent" : "full-screen",
5 | "idiom" : "iphone",
6 | "subtype" : "736h",
7 | "filename" : "Default-736h@3x.png",
8 | "minimum-system-version" : "8.0",
9 | "orientation" : "portrait",
10 | "scale" : "3x"
11 | },
12 | {
13 | "extent" : "full-screen",
14 | "idiom" : "iphone",
15 | "subtype" : "736h",
16 | "filename" : "Default-Landscape@3x.png",
17 | "minimum-system-version" : "8.0",
18 | "orientation" : "landscape",
19 | "scale" : "3x"
20 | },
21 | {
22 | "extent" : "full-screen",
23 | "idiom" : "iphone",
24 | "subtype" : "667h",
25 | "filename" : "Default-667h@2x.png",
26 | "minimum-system-version" : "8.0",
27 | "orientation" : "portrait",
28 | "scale" : "2x"
29 | },
30 | {
31 | "orientation" : "portrait",
32 | "idiom" : "iphone",
33 | "filename" : "Default@2x.png",
34 | "extent" : "full-screen",
35 | "minimum-system-version" : "7.0",
36 | "scale" : "2x"
37 | },
38 | {
39 | "extent" : "full-screen",
40 | "idiom" : "iphone",
41 | "subtype" : "retina4",
42 | "filename" : "Default-568h@2x.png",
43 | "minimum-system-version" : "7.0",
44 | "orientation" : "portrait",
45 | "scale" : "2x"
46 | },
47 | {
48 | "orientation" : "portrait",
49 | "idiom" : "ipad",
50 | "filename" : "Default-Portrait.png",
51 | "extent" : "full-screen",
52 | "minimum-system-version" : "7.0",
53 | "scale" : "1x"
54 | },
55 | {
56 | "orientation" : "landscape",
57 | "idiom" : "ipad",
58 | "filename" : "Default-Landscape.png",
59 | "extent" : "full-screen",
60 | "minimum-system-version" : "7.0",
61 | "scale" : "1x"
62 | },
63 | {
64 | "orientation" : "portrait",
65 | "idiom" : "ipad",
66 | "filename" : "Default-Portrait@2x.png",
67 | "extent" : "full-screen",
68 | "minimum-system-version" : "7.0",
69 | "scale" : "2x"
70 | },
71 | {
72 | "orientation" : "landscape",
73 | "idiom" : "ipad",
74 | "filename" : "Default-Landscape@2x.png",
75 | "extent" : "full-screen",
76 | "minimum-system-version" : "7.0",
77 | "scale" : "2x"
78 | },
79 | {
80 | "orientation" : "portrait",
81 | "idiom" : "iphone",
82 | "filename" : "Default.png",
83 | "extent" : "full-screen",
84 | "scale" : "1x"
85 | },
86 | {
87 | "orientation" : "portrait",
88 | "idiom" : "iphone",
89 | "filename" : "Default@2x.png",
90 | "extent" : "full-screen",
91 | "scale" : "2x"
92 | },
93 | {
94 | "orientation" : "portrait",
95 | "idiom" : "iphone",
96 | "filename" : "Default-568h@2x.png",
97 | "extent" : "full-screen",
98 | "subtype" : "retina4",
99 | "scale" : "2x"
100 | },
101 | {
102 | "orientation" : "portrait",
103 | "idiom" : "ipad",
104 | "extent" : "to-status-bar",
105 | "scale" : "1x"
106 | },
107 | {
108 | "orientation" : "portrait",
109 | "idiom" : "ipad",
110 | "filename" : "Default-Portrait.png",
111 | "extent" : "full-screen",
112 | "scale" : "1x"
113 | },
114 | {
115 | "orientation" : "landscape",
116 | "idiom" : "ipad",
117 | "extent" : "to-status-bar",
118 | "scale" : "1x"
119 | },
120 | {
121 | "orientation" : "landscape",
122 | "idiom" : "ipad",
123 | "filename" : "Default-Landscape.png",
124 | "extent" : "full-screen",
125 | "scale" : "1x"
126 | },
127 | {
128 | "orientation" : "portrait",
129 | "idiom" : "ipad",
130 | "extent" : "to-status-bar",
131 | "scale" : "2x"
132 | },
133 | {
134 | "orientation" : "portrait",
135 | "idiom" : "ipad",
136 | "filename" : "Default-Portrait@2x.png",
137 | "extent" : "full-screen",
138 | "scale" : "2x"
139 | },
140 | {
141 | "orientation" : "landscape",
142 | "idiom" : "ipad",
143 | "extent" : "to-status-bar",
144 | "scale" : "2x"
145 | },
146 | {
147 | "orientation" : "landscape",
148 | "idiom" : "ipad",
149 | "filename" : "Default-Landscape@2x.png",
150 | "extent" : "full-screen",
151 | "scale" : "2x"
152 | }
153 | ],
154 | "info" : {
155 | "version" : 1,
156 | "author" : "xcode"
157 | }
158 | }
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-568h@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-568h@2x.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-667h@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-667h@2x.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-736h@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-736h@3x.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape@2x.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape@3x.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait@2x.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default@2x.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "LaunchScreen-AspectFill.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "LaunchScreen-AspectFill@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "scale" : "3x"
16 | }
17 | ],
18 | "info" : {
19 | "version" : 1,
20 | "author" : "xcode"
21 | }
22 | }
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/LaunchScreen-AspectFill.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/LaunchScreen-AspectFill.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/LaunchScreen-AspectFill@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/LaunchScreen-AspectFill@2x.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "LaunchScreen-Center.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "LaunchScreen-Center@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "scale" : "3x"
16 | }
17 | ],
18 | "info" : {
19 | "version" : 1,
20 | "author" : "xcode"
21 | }
22 | }
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/LaunchScreen-Center.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/LaunchScreen-Center.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/LaunchScreen-Center@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/demo/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/LaunchScreen-Center@2x.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleDisplayName
8 | Speech Recog.
9 | CFBundleExecutable
10 | ${EXECUTABLE_NAME}
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | Speech Recog.
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1.0
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIRequiresFullScreen
28 |
29 | UIRequiredDeviceCapabilities
30 |
31 | armv7
32 |
33 | UISupportedInterfaceOrientations
34 |
35 | UIInterfaceOrientationPortrait
36 | UIInterfaceOrientationLandscapeLeft
37 | UIInterfaceOrientationLandscapeRight
38 |
39 | UISupportedInterfaceOrientations~ipad
40 |
41 | UIInterfaceOrientationPortrait
42 | UIInterfaceOrientationPortraitUpsideDown
43 | UIInterfaceOrientationLandscapeLeft
44 | UIInterfaceOrientationLandscapeRight
45 |
46 | NSMicrophoneUsageDescription
47 | My custom microphone usage description. Overriding the default empty one in the plugin.
48 |
49 |
50 |
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/demo/app/App_Resources/iOS/build.xcconfig:
--------------------------------------------------------------------------------
1 | // You can add custom settings here
2 | // for example you can uncomment the following line to force distribution code signing
3 | // CODE_SIGN_IDENTITY = iPhone Distribution
4 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
5 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
6 |
--------------------------------------------------------------------------------
/demo/app/app-root.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/demo/app/app.css:
--------------------------------------------------------------------------------
1 | @import "~@nativescript/theme/css/core.css";
2 | @import "~@nativescript/theme/css/default.css";
--------------------------------------------------------------------------------
/demo/app/app.ts:
--------------------------------------------------------------------------------
1 | import { Application } from "@nativescript/core";
2 |
3 | Application.run({moduleName: "app-root"});
--------------------------------------------------------------------------------
/demo/app/main-page.ts:
--------------------------------------------------------------------------------
1 | import { NavigatedData, Page } from "@nativescript/core";
2 | import { HelloWorldModel } from "./main-view-model";
3 |
4 | export function navigatingTo(args: NavigatedData) {
5 | // Get the event sender
6 | const page = args.object;
7 | page.bindingContext = new HelloWorldModel();
8 | }
--------------------------------------------------------------------------------
/demo/app/main-page.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/demo/app/main-view-model.ts:
--------------------------------------------------------------------------------
1 | import { Observable, isAndroid } from "@nativescript/core";
2 | import { SpeechRecognition, SpeechRecognitionTranscription } from "nativescript-speech-recognition";
3 |
4 | export class HelloWorldModel extends Observable {
5 |
6 | private speechRecognition: SpeechRecognition;
7 | public feedback: string = "pick a language and say something..";
8 | public listening: boolean = false;
9 |
10 | constructor() {
11 | super();
12 | this.speechRecognition = new SpeechRecognition();
13 |
14 | // Testing manual persmission. You don't need to do this.
15 | setTimeout(() => this.requestPermission(), 1500);
16 | }
17 |
18 | public startListeningDefault(): void {
19 | this.startListening();
20 | }
21 |
22 | public startListeningNL(): void {
23 | this.startListening("nl-NL");
24 | }
25 |
26 | public startListeningEN(): void {
27 | this.startListening("en-US");
28 | }
29 |
30 | public startListening(locale?: string): void {
31 | let that = this; // TODO remove 'that'
32 |
33 | this.speechRecognition.available().then((avail: boolean) => {
34 | if (!avail) {
35 | that.set("feedback", "speech recognition not available");
36 | return;
37 | }
38 | that.speechRecognition.startListening(
39 | {
40 | returnPartialResults: true,
41 | locale: locale,
42 | onResult: (transcription: SpeechRecognitionTranscription) => {
43 | that.set("feedback", transcription.text);
44 | if (transcription.finished) {
45 | that.set("listening", false);
46 | }
47 | },
48 | onError: (error: string | number) => {
49 | console.log(">>>> error: " + error);
50 | // because of the way iOS and Android differ, this is either:
51 | // - iOS: A 'string', describing the issue.
52 | // - Android: A 'number', referencing an 'ERROR_*' constant from https://developer.android.com/reference/android/speech/SpeechRecognizer.
53 | // If that code is either 6 or 7 you may want to restart listening.
54 | if (isAndroid && error === 6 /* timeout */) {
55 | // that.startListening(locale);
56 | }
57 | }
58 | }
59 | ).then((started: boolean) => {
60 | that.set("listening", true);
61 | }).catch((error: string | number) => {
62 | console.log(`Error while trying to start listening: ${error}`);
63 | });
64 | });
65 | }
66 |
67 | public stopListening(): void {
68 | let that = this;
69 | this.speechRecognition.stopListening().then(() => {
70 | that.set("listening", false);
71 | }, (errorMessage: string) => {
72 | console.log(`Error while trying to stop listening: ${errorMessage}`);
73 | });
74 | }
75 |
76 | public requestPermission(): void {
77 | let that = this;
78 | this.speechRecognition.requestPermission().then((granted: boolean) => {
79 | console.log("Granted? " + granted);
80 | });
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/demo/app/tests/tests.js:
--------------------------------------------------------------------------------
1 | var SpeechRecognition = require("nativescript-speech-recognition").SpeechRecognition;
2 | var speechRecognition = new SpeechRecognition();
3 |
4 | describe("available", function() {
5 | it("exists", function() {
6 | expect(speechRecognition.available).toBeDefined();
7 | });
8 |
9 | it("returns a promise", function() {
10 | expect(speechRecognition.available()).toEqual(jasmine.any(Promise));
11 | });
12 | });
--------------------------------------------------------------------------------
/demo/karma.conf.js:
--------------------------------------------------------------------------------
1 | module.exports = function (config) {
2 | const options = {
3 |
4 | // base path that will be used to resolve all patterns (eg. files, exclude)
5 | basePath: '',
6 |
7 |
8 | // frameworks to use
9 | // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
10 | frameworks: ['jasmine'],
11 |
12 |
13 | // list of files / patterns to load in the browser
14 | files: ['app/tests/**/*.*'],
15 |
16 |
17 | // list of files to exclude
18 | exclude: [
19 | ],
20 |
21 |
22 | // preprocess matching files before serving them to the browser
23 | // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
24 | preprocessors: {
25 | },
26 |
27 |
28 | // test results reporter to use
29 | // possible values: 'dots', 'progress'
30 | // available reporters: https://npmjs.org/browse/keyword/karma-reporter
31 | reporters: ['progress'],
32 |
33 |
34 | // web server port
35 | port: 9876,
36 |
37 |
38 | // enable / disable colors in the output (reporters and logs)
39 | colors: true,
40 |
41 |
42 | // level of logging
43 | // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
44 | logLevel: config.LOG_INFO,
45 |
46 |
47 | // enable / disable watching file and executing tests whenever any file changes
48 | autoWatch: true,
49 |
50 |
51 | // start these browsers
52 | // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
53 | browsers: [],
54 |
55 | customLaunchers: {
56 | android: {
57 | base: 'NS',
58 | platform: 'android'
59 | },
60 | ios: {
61 | base: 'NS',
62 | platform: 'ios'
63 | },
64 | ios_simulator: {
65 | base: 'NS',
66 | platform: 'ios',
67 | arguments: ['--emulator']
68 | }
69 | },
70 |
71 | // Continuous Integration mode
72 | // if true, Karma captures browsers, runs the tests and exits
73 | singleRun: false
74 | };
75 |
76 | setWebpackPreprocessor(config, options);
77 | setWebpack(config, options);
78 |
79 | config.set(options);
80 | }
81 |
82 | function setWebpackPreprocessor(config, options) {
83 | if (config && config.bundle) {
84 | if (!options.preprocessors) {
85 | options.preprocessors = {};
86 | }
87 |
88 | options.files.forEach(file => {
89 | if (!options.preprocessors[file]) {
90 | options.preprocessors[file] = [];
91 | }
92 | options.preprocessors[file].push('webpack');
93 | });
94 | }
95 | }
96 |
97 | function setWebpack(config, options) {
98 | if (config && config.bundle) {
99 | const env = {};
100 | env[config.platform] = true;
101 | env.sourceMap = config.debugBrk;
102 | options.webpack = require('./webpack.config')(env);
103 | delete options.webpack.entry;
104 | delete options.webpack.output.libraryTarget;
105 | const invalidPluginsForUnitTesting = ["GenerateBundleStarterPlugin", "GenerateNativeScriptEntryPointsPlugin"];
106 | options.webpack.plugins = options.webpack.plugins.filter(p => !invalidPluginsForUnitTesting.includes(p.constructor.name));
107 | }
108 | }
109 |
--------------------------------------------------------------------------------
/demo/nativescript.config.ts:
--------------------------------------------------------------------------------
1 | import { NativeScriptConfig } from '@nativescript/core';
2 |
3 | export default {
4 | id: 'org.nativescript.plugin.speechrecognition',
5 | appResourcesPath: 'app/App_Resources',
6 | android: {
7 | v8Flags: '--expose_gc',
8 | markingMode: 'none',
9 | }
10 | } as NativeScriptConfig;
11 |
--------------------------------------------------------------------------------
/demo/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "nativescript-speech-recognition": "../src",
4 | "@nativescript/theme": "~2.3.3",
5 | "nativescript-unit-test-runner": "~0.6.4",
6 | "@nativescript/core": "~7.0.5"
7 | },
8 | "devDependencies": {
9 | "@nativescript/android": "7.0.0",
10 | "@nativescript/ios": "7.0.0",
11 | "@nativescript/types": "~7.0.4",
12 | "@nativescript/webpack": "~3.0.4",
13 | "babel-traverse": "6.26.0",
14 | "babel-types": "6.26.0",
15 | "babylon": "6.18.0",
16 | "lazy": "1.0.11",
17 | "typescript": "~3.9.7"
18 | },
19 | "main": "app.js",
20 | "scripts": {
21 | "build.plugin": "cd ../src && npm run build"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/demo/references.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 | ///
3 |
--------------------------------------------------------------------------------
/demo/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es2017",
4 | "module": "esnext",
5 | "moduleResolution": "node",
6 | "declaration": false,
7 | "removeComments": false,
8 | "noLib": false,
9 | "emitDecoratorMetadata": true,
10 | "experimentalDecorators": true,
11 | "skipLibCheck": true,
12 | "lib": [
13 | "es6",
14 | "dom",
15 | "es2015.iterable",
16 | "es2017"
17 | ],
18 | "pretty": true,
19 | "allowUnreachableCode": false,
20 | "allowUnusedLabels": false,
21 | "noEmitHelpers": true,
22 | "noEmitOnError": false,
23 | "noImplicitAny": false,
24 | "noImplicitReturns": true,
25 | "noImplicitUseStrict": false,
26 | "noFallthroughCasesInSwitch": true,
27 | "typeRoots": [
28 | "./node_modules/@types",
29 | "./node_modules"
30 | ],
31 | "types": [],
32 | "baseUrl": ".",
33 | "paths": {
34 | "*": [
35 | "./node_modules/tns-core-modules/*",
36 | "./node_modules/*"
37 | ],
38 | "~/*": [
39 | "app/*"
40 | ]
41 | },
42 | "moduleResolution": "node"
43 | },
44 | "exclude": [
45 | "node_modules",
46 | "platforms"
47 | ],
48 | "compileOnSave": false
49 | }
--------------------------------------------------------------------------------
/publish/pack.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | SOURCE_DIR=../src;
4 | TO_SOURCE_DIR=src;
5 | PACK_DIR=package;
6 | ROOT_DIR=..;
7 | PUBLISH=--publish
8 |
9 | install(){
10 | npm i
11 | }
12 |
13 | pack() {
14 |
15 | echo 'Clearing /src and /package...'
16 | node_modules/.bin/rimraf "$TO_SOURCE_DIR"
17 | node_modules/.bin/rimraf "$PACK_DIR"
18 |
19 | # copy src
20 | echo 'Copying src...'
21 | node_modules/.bin/ncp "$SOURCE_DIR" "$TO_SOURCE_DIR"
22 |
23 | # copy README & LICENSE to src
24 | echo 'Copying README and LICENSE to /src...'
25 | node_modules/.bin/ncp "$ROOT_DIR"/LICENSE "$TO_SOURCE_DIR"/LICENSE
26 | node_modules/.bin/ncp "$ROOT_DIR"/README.md "$TO_SOURCE_DIR"/README.md
27 |
28 | # compile package and copy files required by npm
29 | echo 'Building /src...'
30 | cd "$TO_SOURCE_DIR"
31 | node_modules/.bin/tsc
32 | cd ..
33 |
34 | echo 'Creating package...'
35 | # create package dir
36 | mkdir "$PACK_DIR"
37 |
38 | # create the package
39 | cd "$PACK_DIR"
40 | npm pack ../"$TO_SOURCE_DIR"
41 |
42 | # delete source directory used to create the package
43 | cd ..
44 | node_modules/.bin/rimraf "$TO_SOURCE_DIR"
45 | }
46 |
47 | install && pack
--------------------------------------------------------------------------------
/publish/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nativescript-publish",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "balanced-match": {
8 | "version": "1.0.0",
9 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
10 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
11 | "dev": true
12 | },
13 | "brace-expansion": {
14 | "version": "1.1.11",
15 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
16 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
17 | "dev": true,
18 | "requires": {
19 | "balanced-match": "^1.0.0",
20 | "concat-map": "0.0.1"
21 | }
22 | },
23 | "concat-map": {
24 | "version": "0.0.1",
25 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
26 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
27 | "dev": true
28 | },
29 | "fs.realpath": {
30 | "version": "1.0.0",
31 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
32 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
33 | "dev": true
34 | },
35 | "glob": {
36 | "version": "7.1.2",
37 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
38 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
39 | "dev": true,
40 | "requires": {
41 | "fs.realpath": "^1.0.0",
42 | "inflight": "^1.0.4",
43 | "inherits": "2",
44 | "minimatch": "^3.0.4",
45 | "once": "^1.3.0",
46 | "path-is-absolute": "^1.0.0"
47 | }
48 | },
49 | "inflight": {
50 | "version": "1.0.6",
51 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
52 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
53 | "dev": true,
54 | "requires": {
55 | "once": "^1.3.0",
56 | "wrappy": "1"
57 | }
58 | },
59 | "inherits": {
60 | "version": "2.0.3",
61 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
62 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
63 | "dev": true
64 | },
65 | "minimatch": {
66 | "version": "3.0.4",
67 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
68 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
69 | "dev": true,
70 | "requires": {
71 | "brace-expansion": "^1.1.7"
72 | }
73 | },
74 | "ncp": {
75 | "version": "2.0.0",
76 | "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
77 | "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=",
78 | "dev": true
79 | },
80 | "once": {
81 | "version": "1.4.0",
82 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
83 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
84 | "dev": true,
85 | "requires": {
86 | "wrappy": "1"
87 | }
88 | },
89 | "path-is-absolute": {
90 | "version": "1.0.1",
91 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
92 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
93 | "dev": true
94 | },
95 | "rimraf": {
96 | "version": "2.6.2",
97 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
98 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
99 | "dev": true,
100 | "requires": {
101 | "glob": "^7.0.5"
102 | }
103 | },
104 | "wrappy": {
105 | "version": "1.0.2",
106 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
107 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
108 | "dev": true
109 | }
110 | }
111 | }
112 |
--------------------------------------------------------------------------------
/publish/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nativescript-publish",
3 | "version": "1.0.0",
4 | "description": "Publish helper",
5 | "devDependencies": {
6 | "ncp": "^2.0.0",
7 | "rimraf": "^2.5.0"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/publish/publish.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | PACK_DIR=package;
4 |
5 | publish() {
6 | cd $PACK_DIR
7 | echo 'Publishing to npm...'
8 | npm publish *.tgz
9 | }
10 |
11 | ./pack.sh && publish
12 |
--------------------------------------------------------------------------------
/screenshots/ios-en.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/screenshots/ios-en.jpg
--------------------------------------------------------------------------------
/screenshots/ios-nl.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EddyVerbruggen/nativescript-speech-recognition/2fe477f832bb9111660b77ef8c2fd7c3afc58173/screenshots/ios-nl.jpg
--------------------------------------------------------------------------------
/src/.npmignore:
--------------------------------------------------------------------------------
1 | *.ts
2 | *.map
3 | !speech-recognition.*.d.ts
4 | !index.d.ts
5 | tsconfig.json
6 | platforms/android/AndroidManifest.xml
7 |
--------------------------------------------------------------------------------
/src/index.d.ts:
--------------------------------------------------------------------------------
1 | export * from "./speech-recognition.ios";
2 |
3 | export * from "./speech-recognition.common";
--------------------------------------------------------------------------------
/src/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nativescript-speech-recognition",
3 | "version": "2.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@babel/code-frame": {
8 | "version": "7.10.4",
9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
10 | "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
11 | "dev": true,
12 | "requires": {
13 | "@babel/highlight": "^7.10.4"
14 | }
15 | },
16 | "@babel/helper-validator-identifier": {
17 | "version": "7.10.4",
18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
19 | "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
20 | "dev": true
21 | },
22 | "@babel/highlight": {
23 | "version": "7.10.4",
24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
25 | "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
26 | "dev": true,
27 | "requires": {
28 | "@babel/helper-validator-identifier": "^7.10.4",
29 | "chalk": "^2.0.0",
30 | "js-tokens": "^4.0.0"
31 | }
32 | },
33 | "@nativescript/core": {
34 | "version": "7.0.5",
35 | "resolved": "https://registry.npmjs.org/@nativescript/core/-/core-7.0.5.tgz",
36 | "integrity": "sha512-iYqPrTagkt0phI+mWqXZQLVs/8fok4Uyu9LGDv40eMSHYnBhAQAAWd8bzWo62ahvDodxhiZ5yf5PWD3ofor4Ig==",
37 | "dev": true,
38 | "requires": {
39 | "@nativescript/hook": "~2.0.0",
40 | "css-tree": "^1.0.0-alpha.39",
41 | "reduce-css-calc": "^2.1.7",
42 | "tslib": "2.0.0"
43 | }
44 | },
45 | "@nativescript/hook": {
46 | "version": "2.0.0",
47 | "resolved": "https://registry.npmjs.org/@nativescript/hook/-/hook-2.0.0.tgz",
48 | "integrity": "sha512-v3Hj3Zpd69sQJfFpDNXonV0EjO1a2OL4l48wlo1Ycsqk4r7RY822d/irFTjt0LllRG0OcdEGgfG6wKb0YgPyHw==",
49 | "dev": true,
50 | "requires": {
51 | "glob": "^7.1.0",
52 | "mkdirp": "^1.0.4"
53 | }
54 | },
55 | "@nativescript/types": {
56 | "version": "7.0.4",
57 | "resolved": "https://registry.npmjs.org/@nativescript/types/-/types-7.0.4.tgz",
58 | "integrity": "sha512-G01GlQm2aZEF05XBXxpyPd8XJE5EXrDRyR2q6vrowAIgSY5KaJXu6YjXz9Zfwmn7tvoyWlFsgxaZy2vPFUcsFQ==",
59 | "dev": true,
60 | "requires": {
61 | "@nativescript/types-android": "7.0.4",
62 | "@nativescript/types-ios": "7.0.4"
63 | }
64 | },
65 | "@nativescript/types-android": {
66 | "version": "7.0.4",
67 | "resolved": "https://registry.npmjs.org/@nativescript/types-android/-/types-android-7.0.4.tgz",
68 | "integrity": "sha512-atXLPLZ8Kice6WybGAWXB5H2I2yLPwRjcwU7ncpIQ6qD0RvV/hM052fXWHP0k9rUuc9xLrGrZ892Ec1AjNLctQ==",
69 | "dev": true
70 | },
71 | "@nativescript/types-ios": {
72 | "version": "7.0.4",
73 | "resolved": "https://registry.npmjs.org/@nativescript/types-ios/-/types-ios-7.0.4.tgz",
74 | "integrity": "sha512-ZydVuj5gMf8L+aJMUhlp1qCM/krkVnEWlykdxnAfUwh+BtDHJd3Tq3H6w9UZnyJyvfqZCkRrpIrNAIgOQ9MuTQ==",
75 | "dev": true
76 | },
77 | "JSONStream": {
78 | "version": "1.3.3",
79 | "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.3.tgz",
80 | "integrity": "sha512-3Sp6WZZ/lXl+nTDoGpGWHEpTnnC6X5fnkolYZR6nwIfzbxxvA8utPWe1gCt7i0m9uVGsSz2IS8K8mJ7HmlduMg==",
81 | "dev": true,
82 | "requires": {
83 | "jsonparse": "^1.2.0",
84 | "through": ">=2.2.7 <3"
85 | }
86 | },
87 | "add-stream": {
88 | "version": "1.0.0",
89 | "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz",
90 | "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=",
91 | "dev": true
92 | },
93 | "ansi-styles": {
94 | "version": "3.2.1",
95 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
96 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
97 | "dev": true,
98 | "requires": {
99 | "color-convert": "^1.9.0"
100 | }
101 | },
102 | "argparse": {
103 | "version": "1.0.10",
104 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
105 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
106 | "dev": true,
107 | "requires": {
108 | "sprintf-js": "~1.0.2"
109 | }
110 | },
111 | "array-find-index": {
112 | "version": "1.0.2",
113 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
114 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
115 | "dev": true
116 | },
117 | "array-ify": {
118 | "version": "1.0.0",
119 | "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
120 | "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=",
121 | "dev": true
122 | },
123 | "arrify": {
124 | "version": "1.0.1",
125 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
126 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
127 | "dev": true
128 | },
129 | "balanced-match": {
130 | "version": "1.0.0",
131 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
132 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
133 | "dev": true
134 | },
135 | "brace-expansion": {
136 | "version": "1.1.11",
137 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
138 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
139 | "dev": true,
140 | "requires": {
141 | "balanced-match": "^1.0.0",
142 | "concat-map": "0.0.1"
143 | }
144 | },
145 | "builtin-modules": {
146 | "version": "1.1.1",
147 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
148 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
149 | "dev": true
150 | },
151 | "camelcase-keys": {
152 | "version": "4.2.0",
153 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz",
154 | "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=",
155 | "dev": true,
156 | "requires": {
157 | "camelcase": "^4.1.0",
158 | "map-obj": "^2.0.0",
159 | "quick-lru": "^1.0.0"
160 | },
161 | "dependencies": {
162 | "camelcase": {
163 | "version": "4.1.0",
164 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
165 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
166 | "dev": true
167 | }
168 | }
169 | },
170 | "chalk": {
171 | "version": "2.4.2",
172 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
173 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
174 | "dev": true,
175 | "requires": {
176 | "ansi-styles": "^3.2.1",
177 | "escape-string-regexp": "^1.0.5",
178 | "supports-color": "^5.3.0"
179 | }
180 | },
181 | "color-convert": {
182 | "version": "1.9.3",
183 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
184 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
185 | "dev": true,
186 | "requires": {
187 | "color-name": "1.1.3"
188 | }
189 | },
190 | "color-name": {
191 | "version": "1.1.3",
192 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
193 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
194 | "dev": true
195 | },
196 | "commander": {
197 | "version": "2.20.3",
198 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
199 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
200 | "dev": true
201 | },
202 | "compare-func": {
203 | "version": "1.3.2",
204 | "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz",
205 | "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=",
206 | "dev": true,
207 | "requires": {
208 | "array-ify": "^1.0.0",
209 | "dot-prop": "^3.0.0"
210 | }
211 | },
212 | "concat-map": {
213 | "version": "0.0.1",
214 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
215 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
216 | "dev": true
217 | },
218 | "conventional-changelog": {
219 | "version": "1.1.24",
220 | "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.24.tgz",
221 | "integrity": "sha512-2WcSUst4Y3Z4hHvoMTWXMJr/DmgVdLiMOVY1Kak2LfFz+GIz2KDp5naqbFesYbfXPmaZ5p491dO0FWZIJoJw1Q==",
222 | "dev": true,
223 | "requires": {
224 | "conventional-changelog-angular": "^1.6.6",
225 | "conventional-changelog-atom": "^0.2.8",
226 | "conventional-changelog-codemirror": "^0.3.8",
227 | "conventional-changelog-core": "^2.0.11",
228 | "conventional-changelog-ember": "^0.3.12",
229 | "conventional-changelog-eslint": "^1.0.9",
230 | "conventional-changelog-express": "^0.3.6",
231 | "conventional-changelog-jquery": "^0.1.0",
232 | "conventional-changelog-jscs": "^0.1.0",
233 | "conventional-changelog-jshint": "^0.3.8",
234 | "conventional-changelog-preset-loader": "^1.1.8"
235 | }
236 | },
237 | "conventional-changelog-angular": {
238 | "version": "1.6.6",
239 | "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz",
240 | "integrity": "sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg==",
241 | "dev": true,
242 | "requires": {
243 | "compare-func": "^1.3.1",
244 | "q": "^1.5.1"
245 | }
246 | },
247 | "conventional-changelog-atom": {
248 | "version": "0.2.8",
249 | "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-0.2.8.tgz",
250 | "integrity": "sha512-8pPZqhMbrnltNBizjoDCb/Sz85KyUXNDQxuAEYAU5V/eHn0okMBVjqc8aHWYpHrytyZWvMGbayOlDv7i8kEf6g==",
251 | "dev": true,
252 | "requires": {
253 | "q": "^1.5.1"
254 | }
255 | },
256 | "conventional-changelog-cli": {
257 | "version": "1.3.22",
258 | "resolved": "https://registry.npmjs.org/conventional-changelog-cli/-/conventional-changelog-cli-1.3.22.tgz",
259 | "integrity": "sha512-pnjdIJbxjkZ5VdAX/H1wndr1G10CY8MuZgnXuJhIHglOXfIrXygb7KZC836GW9uo1u8PjEIvIw/bKX0lOmOzZg==",
260 | "dev": true,
261 | "requires": {
262 | "add-stream": "^1.0.0",
263 | "conventional-changelog": "^1.1.24",
264 | "lodash": "^4.2.1",
265 | "meow": "^4.0.0",
266 | "tempfile": "^1.1.1"
267 | }
268 | },
269 | "conventional-changelog-codemirror": {
270 | "version": "0.3.8",
271 | "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.8.tgz",
272 | "integrity": "sha512-3HFZKtBXTaUCHvz7ai6nk2+psRIkldDoNzCsom0egDtVmPsvvHZkzjynhdQyULfacRSsBTaiQ0ol6nBOL4dDiQ==",
273 | "dev": true,
274 | "requires": {
275 | "q": "^1.5.1"
276 | }
277 | },
278 | "conventional-changelog-core": {
279 | "version": "2.0.11",
280 | "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-2.0.11.tgz",
281 | "integrity": "sha512-HvTE6RlqeEZ/NFPtQeFLsIDOLrGP3bXYr7lFLMhCVsbduF1MXIe8OODkwMFyo1i9ku9NWBwVnVn0jDmIFXjDRg==",
282 | "dev": true,
283 | "requires": {
284 | "conventional-changelog-writer": "^3.0.9",
285 | "conventional-commits-parser": "^2.1.7",
286 | "dateformat": "^3.0.0",
287 | "get-pkg-repo": "^1.0.0",
288 | "git-raw-commits": "^1.3.6",
289 | "git-remote-origin-url": "^2.0.0",
290 | "git-semver-tags": "^1.3.6",
291 | "lodash": "^4.2.1",
292 | "normalize-package-data": "^2.3.5",
293 | "q": "^1.5.1",
294 | "read-pkg": "^1.1.0",
295 | "read-pkg-up": "^1.0.1",
296 | "through2": "^2.0.0"
297 | }
298 | },
299 | "conventional-changelog-ember": {
300 | "version": "0.3.12",
301 | "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.3.12.tgz",
302 | "integrity": "sha512-mmJzA7uzbrOqeF89dMMi6z17O07ORTXlTMArnLG9ZTX4oLaKNolUlxFUFlFm9JUoVWajVpaHQWjxH1EOQ+ARoQ==",
303 | "dev": true,
304 | "requires": {
305 | "q": "^1.5.1"
306 | }
307 | },
308 | "conventional-changelog-eslint": {
309 | "version": "1.0.9",
310 | "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.9.tgz",
311 | "integrity": "sha512-h87nfVh2fdk9fJIvz26wCBsbDC/KxqCc5wSlNMZbXcARtbgNbNDIF7Y7ctokFdnxkzVdaHsbINkh548T9eBA7Q==",
312 | "dev": true,
313 | "requires": {
314 | "q": "^1.5.1"
315 | }
316 | },
317 | "conventional-changelog-express": {
318 | "version": "0.3.6",
319 | "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-0.3.6.tgz",
320 | "integrity": "sha512-3iWVtBJZ9RnRnZveNDzOD8QRn6g6vUif0qVTWWyi5nUIAbuN1FfPVyKdAlJJfp5Im+dE8Kiy/d2SpaX/0X678Q==",
321 | "dev": true,
322 | "requires": {
323 | "q": "^1.5.1"
324 | }
325 | },
326 | "conventional-changelog-jquery": {
327 | "version": "0.1.0",
328 | "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz",
329 | "integrity": "sha1-Agg5cWLjhGmG5xJztsecW1+A9RA=",
330 | "dev": true,
331 | "requires": {
332 | "q": "^1.4.1"
333 | }
334 | },
335 | "conventional-changelog-jscs": {
336 | "version": "0.1.0",
337 | "resolved": "https://registry.npmjs.org/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz",
338 | "integrity": "sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw=",
339 | "dev": true,
340 | "requires": {
341 | "q": "^1.4.1"
342 | }
343 | },
344 | "conventional-changelog-jshint": {
345 | "version": "0.3.8",
346 | "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.8.tgz",
347 | "integrity": "sha512-hn9QU4ZI/5V50wKPJNPGT4gEWgiBFpV6adieILW4MaUFynuDYOvQ71EMSj3EznJyKi/KzuXpc9dGmX8njZMjig==",
348 | "dev": true,
349 | "requires": {
350 | "compare-func": "^1.3.1",
351 | "q": "^1.5.1"
352 | }
353 | },
354 | "conventional-changelog-preset-loader": {
355 | "version": "1.1.8",
356 | "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.8.tgz",
357 | "integrity": "sha512-MkksM4G4YdrMlT2MbTsV2F6LXu/hZR0Tc/yenRrDIKRwBl/SP7ER4ZDlglqJsCzLJi4UonBc52Bkm5hzrOVCcw==",
358 | "dev": true
359 | },
360 | "conventional-changelog-writer": {
361 | "version": "3.0.9",
362 | "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-3.0.9.tgz",
363 | "integrity": "sha512-n9KbsxlJxRQsUnK6wIBRnARacvNnN4C/nxnxCkH+B/R1JS2Fa+DiP1dU4I59mEDEjgnFaN2+9wr1P1s7GYB5/Q==",
364 | "dev": true,
365 | "requires": {
366 | "compare-func": "^1.3.1",
367 | "conventional-commits-filter": "^1.1.6",
368 | "dateformat": "^3.0.0",
369 | "handlebars": "^4.0.2",
370 | "json-stringify-safe": "^5.0.1",
371 | "lodash": "^4.2.1",
372 | "meow": "^4.0.0",
373 | "semver": "^5.5.0",
374 | "split": "^1.0.0",
375 | "through2": "^2.0.0"
376 | }
377 | },
378 | "conventional-commits-filter": {
379 | "version": "1.1.6",
380 | "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.6.tgz",
381 | "integrity": "sha512-KcDgtCRKJCQhyk6VLT7zR+ZOyCnerfemE/CsR3iQpzRRFbLEs0Y6rwk3mpDvtOh04X223z+1xyJ582Stfct/0Q==",
382 | "dev": true,
383 | "requires": {
384 | "is-subset": "^0.1.1",
385 | "modify-values": "^1.0.0"
386 | }
387 | },
388 | "conventional-commits-parser": {
389 | "version": "2.1.7",
390 | "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz",
391 | "integrity": "sha512-BoMaddIEJ6B4QVMSDu9IkVImlGOSGA1I2BQyOZHeLQ6qVOJLcLKn97+fL6dGbzWEiqDzfH4OkcveULmeq2MHFQ==",
392 | "dev": true,
393 | "requires": {
394 | "JSONStream": "^1.0.4",
395 | "is-text-path": "^1.0.0",
396 | "lodash": "^4.2.1",
397 | "meow": "^4.0.0",
398 | "split2": "^2.0.0",
399 | "through2": "^2.0.0",
400 | "trim-off-newlines": "^1.0.0"
401 | }
402 | },
403 | "core-util-is": {
404 | "version": "1.0.2",
405 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
406 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
407 | "dev": true
408 | },
409 | "css-tree": {
410 | "version": "1.0.0-alpha.39",
411 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz",
412 | "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==",
413 | "dev": true,
414 | "requires": {
415 | "mdn-data": "2.0.6",
416 | "source-map": "^0.6.1"
417 | }
418 | },
419 | "css-unit-converter": {
420 | "version": "1.1.2",
421 | "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz",
422 | "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==",
423 | "dev": true
424 | },
425 | "currently-unhandled": {
426 | "version": "0.4.1",
427 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
428 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
429 | "dev": true,
430 | "requires": {
431 | "array-find-index": "^1.0.1"
432 | }
433 | },
434 | "dargs": {
435 | "version": "4.1.0",
436 | "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz",
437 | "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=",
438 | "dev": true,
439 | "requires": {
440 | "number-is-nan": "^1.0.0"
441 | }
442 | },
443 | "dateformat": {
444 | "version": "3.0.3",
445 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
446 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
447 | "dev": true
448 | },
449 | "decamelize": {
450 | "version": "1.2.0",
451 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
452 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
453 | "dev": true
454 | },
455 | "decamelize-keys": {
456 | "version": "1.1.0",
457 | "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
458 | "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
459 | "dev": true,
460 | "requires": {
461 | "decamelize": "^1.1.0",
462 | "map-obj": "^1.0.0"
463 | },
464 | "dependencies": {
465 | "map-obj": {
466 | "version": "1.0.1",
467 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
468 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
469 | "dev": true
470 | }
471 | }
472 | },
473 | "diff": {
474 | "version": "4.0.2",
475 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
476 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
477 | "dev": true
478 | },
479 | "dot-prop": {
480 | "version": "3.0.0",
481 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz",
482 | "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=",
483 | "dev": true,
484 | "requires": {
485 | "is-obj": "^1.0.0"
486 | }
487 | },
488 | "error-ex": {
489 | "version": "1.3.2",
490 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
491 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
492 | "dev": true,
493 | "requires": {
494 | "is-arrayish": "^0.2.1"
495 | }
496 | },
497 | "escape-string-regexp": {
498 | "version": "1.0.5",
499 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
500 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
501 | "dev": true
502 | },
503 | "esprima": {
504 | "version": "4.0.1",
505 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
506 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
507 | "dev": true
508 | },
509 | "find-up": {
510 | "version": "2.1.0",
511 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
512 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
513 | "dev": true,
514 | "requires": {
515 | "locate-path": "^2.0.0"
516 | }
517 | },
518 | "fs.realpath": {
519 | "version": "1.0.0",
520 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
521 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
522 | "dev": true
523 | },
524 | "get-pkg-repo": {
525 | "version": "1.4.0",
526 | "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz",
527 | "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=",
528 | "dev": true,
529 | "requires": {
530 | "hosted-git-info": "^2.1.4",
531 | "meow": "^3.3.0",
532 | "normalize-package-data": "^2.3.0",
533 | "parse-github-repo-url": "^1.3.0",
534 | "through2": "^2.0.0"
535 | },
536 | "dependencies": {
537 | "camelcase": {
538 | "version": "2.1.1",
539 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
540 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
541 | "dev": true
542 | },
543 | "camelcase-keys": {
544 | "version": "2.1.0",
545 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
546 | "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
547 | "dev": true,
548 | "requires": {
549 | "camelcase": "^2.0.0",
550 | "map-obj": "^1.0.0"
551 | }
552 | },
553 | "indent-string": {
554 | "version": "2.1.0",
555 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
556 | "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
557 | "dev": true,
558 | "requires": {
559 | "repeating": "^2.0.0"
560 | }
561 | },
562 | "map-obj": {
563 | "version": "1.0.1",
564 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
565 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
566 | "dev": true
567 | },
568 | "meow": {
569 | "version": "3.7.0",
570 | "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
571 | "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
572 | "dev": true,
573 | "requires": {
574 | "camelcase-keys": "^2.0.0",
575 | "decamelize": "^1.1.2",
576 | "loud-rejection": "^1.0.0",
577 | "map-obj": "^1.0.1",
578 | "minimist": "^1.1.3",
579 | "normalize-package-data": "^2.3.4",
580 | "object-assign": "^4.0.1",
581 | "read-pkg-up": "^1.0.1",
582 | "redent": "^1.0.0",
583 | "trim-newlines": "^1.0.0"
584 | }
585 | },
586 | "minimist": {
587 | "version": "1.2.0",
588 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
589 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
590 | "dev": true
591 | },
592 | "redent": {
593 | "version": "1.0.0",
594 | "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
595 | "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
596 | "dev": true,
597 | "requires": {
598 | "indent-string": "^2.1.0",
599 | "strip-indent": "^1.0.1"
600 | }
601 | },
602 | "strip-indent": {
603 | "version": "1.0.1",
604 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
605 | "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
606 | "dev": true,
607 | "requires": {
608 | "get-stdin": "^4.0.1"
609 | }
610 | },
611 | "trim-newlines": {
612 | "version": "1.0.0",
613 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
614 | "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
615 | "dev": true
616 | }
617 | }
618 | },
619 | "get-stdin": {
620 | "version": "4.0.1",
621 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
622 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
623 | "dev": true
624 | },
625 | "git-raw-commits": {
626 | "version": "1.3.6",
627 | "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.6.tgz",
628 | "integrity": "sha512-svsK26tQ8vEKnMshTDatSIQSMDdz8CxIIqKsvPqbtV23Etmw6VNaFAitu8zwZ0VrOne7FztwPyRLxK7/DIUTQg==",
629 | "dev": true,
630 | "requires": {
631 | "dargs": "^4.0.1",
632 | "lodash.template": "^4.0.2",
633 | "meow": "^4.0.0",
634 | "split2": "^2.0.0",
635 | "through2": "^2.0.0"
636 | }
637 | },
638 | "git-remote-origin-url": {
639 | "version": "2.0.0",
640 | "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz",
641 | "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=",
642 | "dev": true,
643 | "requires": {
644 | "gitconfiglocal": "^1.0.0",
645 | "pify": "^2.3.0"
646 | },
647 | "dependencies": {
648 | "pify": {
649 | "version": "2.3.0",
650 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
651 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
652 | "dev": true
653 | }
654 | }
655 | },
656 | "git-semver-tags": {
657 | "version": "1.3.6",
658 | "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.3.6.tgz",
659 | "integrity": "sha512-2jHlJnln4D/ECk9FxGEBh3k44wgYdWjWDtMmJPaecjoRmxKo3Y1Lh8GMYuOPu04CHw86NTAODchYjC5pnpMQig==",
660 | "dev": true,
661 | "requires": {
662 | "meow": "^4.0.0",
663 | "semver": "^5.5.0"
664 | }
665 | },
666 | "gitconfiglocal": {
667 | "version": "1.0.0",
668 | "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz",
669 | "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=",
670 | "dev": true,
671 | "requires": {
672 | "ini": "^1.3.2"
673 | }
674 | },
675 | "glob": {
676 | "version": "7.1.6",
677 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
678 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
679 | "dev": true,
680 | "requires": {
681 | "fs.realpath": "^1.0.0",
682 | "inflight": "^1.0.4",
683 | "inherits": "2",
684 | "minimatch": "^3.0.4",
685 | "once": "^1.3.0",
686 | "path-is-absolute": "^1.0.0"
687 | }
688 | },
689 | "graceful-fs": {
690 | "version": "4.1.11",
691 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
692 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
693 | "dev": true
694 | },
695 | "handlebars": {
696 | "version": "4.5.1",
697 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.1.tgz",
698 | "integrity": "sha512-C29UoFzHe9yM61lOsIlCE5/mQVGrnIOrOq7maQl76L7tYPCgC1og0Ajt6uWnX4ZTxBPnjw+CUvawphwCfJgUnA==",
699 | "dev": true,
700 | "requires": {
701 | "neo-async": "^2.6.0",
702 | "optimist": "^0.6.1",
703 | "source-map": "^0.6.1",
704 | "uglify-js": "^3.1.4"
705 | },
706 | "dependencies": {
707 | "commander": {
708 | "version": "2.20.3",
709 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
710 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
711 | "dev": true,
712 | "optional": true
713 | },
714 | "source-map": {
715 | "version": "0.6.1",
716 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
717 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
718 | "dev": true
719 | },
720 | "uglify-js": {
721 | "version": "3.6.7",
722 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.7.tgz",
723 | "integrity": "sha512-4sXQDzmdnoXiO+xvmTzQsfIiwrjUCSA95rSP4SEd8tDb51W2TiDOlL76Hl+Kw0Ie42PSItCW8/t6pBNCF2R48A==",
724 | "dev": true,
725 | "optional": true,
726 | "requires": {
727 | "commander": "~2.20.3",
728 | "source-map": "~0.6.1"
729 | }
730 | }
731 | }
732 | },
733 | "has-flag": {
734 | "version": "3.0.0",
735 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
736 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
737 | "dev": true
738 | },
739 | "hosted-git-info": {
740 | "version": "2.7.1",
741 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
742 | "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
743 | "dev": true
744 | },
745 | "indent-string": {
746 | "version": "3.2.0",
747 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
748 | "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
749 | "dev": true
750 | },
751 | "inflight": {
752 | "version": "1.0.6",
753 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
754 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
755 | "dev": true,
756 | "requires": {
757 | "once": "^1.3.0",
758 | "wrappy": "1"
759 | }
760 | },
761 | "inherits": {
762 | "version": "2.0.3",
763 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
764 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
765 | "dev": true
766 | },
767 | "ini": {
768 | "version": "1.3.5",
769 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
770 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
771 | "dev": true
772 | },
773 | "is-arrayish": {
774 | "version": "0.2.1",
775 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
776 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
777 | "dev": true
778 | },
779 | "is-builtin-module": {
780 | "version": "1.0.0",
781 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
782 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
783 | "dev": true,
784 | "requires": {
785 | "builtin-modules": "^1.0.0"
786 | }
787 | },
788 | "is-finite": {
789 | "version": "1.0.2",
790 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
791 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
792 | "dev": true,
793 | "requires": {
794 | "number-is-nan": "^1.0.0"
795 | }
796 | },
797 | "is-obj": {
798 | "version": "1.0.1",
799 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
800 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
801 | "dev": true
802 | },
803 | "is-plain-obj": {
804 | "version": "1.1.0",
805 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
806 | "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
807 | "dev": true
808 | },
809 | "is-subset": {
810 | "version": "0.1.1",
811 | "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz",
812 | "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=",
813 | "dev": true
814 | },
815 | "is-text-path": {
816 | "version": "1.0.1",
817 | "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz",
818 | "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=",
819 | "dev": true,
820 | "requires": {
821 | "text-extensions": "^1.0.0"
822 | }
823 | },
824 | "is-utf8": {
825 | "version": "0.2.1",
826 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
827 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
828 | "dev": true
829 | },
830 | "isarray": {
831 | "version": "1.0.0",
832 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
833 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
834 | "dev": true
835 | },
836 | "js-tokens": {
837 | "version": "4.0.0",
838 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
839 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
840 | "dev": true
841 | },
842 | "js-yaml": {
843 | "version": "3.14.0",
844 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
845 | "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
846 | "dev": true,
847 | "requires": {
848 | "argparse": "^1.0.7",
849 | "esprima": "^4.0.0"
850 | }
851 | },
852 | "json-parse-better-errors": {
853 | "version": "1.0.2",
854 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
855 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
856 | "dev": true
857 | },
858 | "json-stringify-safe": {
859 | "version": "5.0.1",
860 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
861 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
862 | "dev": true
863 | },
864 | "jsonparse": {
865 | "version": "1.3.1",
866 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
867 | "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
868 | "dev": true
869 | },
870 | "load-json-file": {
871 | "version": "4.0.0",
872 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
873 | "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
874 | "dev": true,
875 | "requires": {
876 | "graceful-fs": "^4.1.2",
877 | "parse-json": "^4.0.0",
878 | "pify": "^3.0.0",
879 | "strip-bom": "^3.0.0"
880 | }
881 | },
882 | "locate-path": {
883 | "version": "2.0.0",
884 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
885 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
886 | "dev": true,
887 | "requires": {
888 | "p-locate": "^2.0.0",
889 | "path-exists": "^3.0.0"
890 | }
891 | },
892 | "lodash": {
893 | "version": "4.17.15",
894 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
895 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
896 | "dev": true
897 | },
898 | "lodash._reinterpolate": {
899 | "version": "3.0.0",
900 | "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
901 | "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
902 | "dev": true
903 | },
904 | "lodash.template": {
905 | "version": "4.5.0",
906 | "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
907 | "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
908 | "dev": true,
909 | "requires": {
910 | "lodash._reinterpolate": "^3.0.0",
911 | "lodash.templatesettings": "^4.0.0"
912 | }
913 | },
914 | "lodash.templatesettings": {
915 | "version": "4.1.0",
916 | "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz",
917 | "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=",
918 | "dev": true,
919 | "requires": {
920 | "lodash._reinterpolate": "~3.0.0"
921 | }
922 | },
923 | "loud-rejection": {
924 | "version": "1.6.0",
925 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
926 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
927 | "dev": true,
928 | "requires": {
929 | "currently-unhandled": "^0.4.1",
930 | "signal-exit": "^3.0.0"
931 | }
932 | },
933 | "map-obj": {
934 | "version": "2.0.0",
935 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz",
936 | "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=",
937 | "dev": true
938 | },
939 | "mdn-data": {
940 | "version": "2.0.6",
941 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz",
942 | "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==",
943 | "dev": true
944 | },
945 | "meow": {
946 | "version": "4.0.1",
947 | "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz",
948 | "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==",
949 | "dev": true,
950 | "requires": {
951 | "camelcase-keys": "^4.0.0",
952 | "decamelize-keys": "^1.0.0",
953 | "loud-rejection": "^1.0.0",
954 | "minimist": "^1.1.3",
955 | "minimist-options": "^3.0.1",
956 | "normalize-package-data": "^2.3.4",
957 | "read-pkg-up": "^3.0.0",
958 | "redent": "^2.0.0",
959 | "trim-newlines": "^2.0.0"
960 | },
961 | "dependencies": {
962 | "minimist": {
963 | "version": "1.2.0",
964 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
965 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
966 | "dev": true
967 | },
968 | "read-pkg": {
969 | "version": "3.0.0",
970 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
971 | "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
972 | "dev": true,
973 | "requires": {
974 | "load-json-file": "^4.0.0",
975 | "normalize-package-data": "^2.3.2",
976 | "path-type": "^3.0.0"
977 | }
978 | },
979 | "read-pkg-up": {
980 | "version": "3.0.0",
981 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
982 | "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
983 | "dev": true,
984 | "requires": {
985 | "find-up": "^2.0.0",
986 | "read-pkg": "^3.0.0"
987 | }
988 | }
989 | }
990 | },
991 | "minimatch": {
992 | "version": "3.0.4",
993 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
994 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
995 | "dev": true,
996 | "requires": {
997 | "brace-expansion": "^1.1.7"
998 | }
999 | },
1000 | "minimist": {
1001 | "version": "0.0.10",
1002 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
1003 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
1004 | "dev": true
1005 | },
1006 | "minimist-options": {
1007 | "version": "3.0.2",
1008 | "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz",
1009 | "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==",
1010 | "dev": true,
1011 | "requires": {
1012 | "arrify": "^1.0.1",
1013 | "is-plain-obj": "^1.1.0"
1014 | }
1015 | },
1016 | "mkdirp": {
1017 | "version": "1.0.4",
1018 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
1019 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
1020 | "dev": true
1021 | },
1022 | "modify-values": {
1023 | "version": "1.0.1",
1024 | "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz",
1025 | "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==",
1026 | "dev": true
1027 | },
1028 | "neo-async": {
1029 | "version": "2.6.1",
1030 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
1031 | "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==",
1032 | "dev": true
1033 | },
1034 | "normalize-package-data": {
1035 | "version": "2.4.0",
1036 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
1037 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
1038 | "dev": true,
1039 | "requires": {
1040 | "hosted-git-info": "^2.1.4",
1041 | "is-builtin-module": "^1.0.0",
1042 | "semver": "2 || 3 || 4 || 5",
1043 | "validate-npm-package-license": "^3.0.1"
1044 | }
1045 | },
1046 | "number-is-nan": {
1047 | "version": "1.0.1",
1048 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
1049 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
1050 | "dev": true
1051 | },
1052 | "object-assign": {
1053 | "version": "4.1.1",
1054 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1055 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
1056 | "dev": true
1057 | },
1058 | "once": {
1059 | "version": "1.4.0",
1060 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1061 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1062 | "dev": true,
1063 | "requires": {
1064 | "wrappy": "1"
1065 | }
1066 | },
1067 | "optimist": {
1068 | "version": "0.6.1",
1069 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
1070 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
1071 | "dev": true,
1072 | "requires": {
1073 | "minimist": "~0.0.1",
1074 | "wordwrap": "~0.0.2"
1075 | }
1076 | },
1077 | "os-tmpdir": {
1078 | "version": "1.0.2",
1079 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
1080 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
1081 | "dev": true
1082 | },
1083 | "p-limit": {
1084 | "version": "1.3.0",
1085 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
1086 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
1087 | "dev": true,
1088 | "requires": {
1089 | "p-try": "^1.0.0"
1090 | }
1091 | },
1092 | "p-locate": {
1093 | "version": "2.0.0",
1094 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
1095 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
1096 | "dev": true,
1097 | "requires": {
1098 | "p-limit": "^1.1.0"
1099 | }
1100 | },
1101 | "p-try": {
1102 | "version": "1.0.0",
1103 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
1104 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
1105 | "dev": true
1106 | },
1107 | "parse-github-repo-url": {
1108 | "version": "1.4.1",
1109 | "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz",
1110 | "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=",
1111 | "dev": true
1112 | },
1113 | "parse-json": {
1114 | "version": "4.0.0",
1115 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
1116 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
1117 | "dev": true,
1118 | "requires": {
1119 | "error-ex": "^1.3.1",
1120 | "json-parse-better-errors": "^1.0.1"
1121 | }
1122 | },
1123 | "path-exists": {
1124 | "version": "3.0.0",
1125 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
1126 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
1127 | "dev": true
1128 | },
1129 | "path-is-absolute": {
1130 | "version": "1.0.1",
1131 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1132 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1133 | "dev": true
1134 | },
1135 | "path-parse": {
1136 | "version": "1.0.6",
1137 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
1138 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
1139 | "dev": true
1140 | },
1141 | "path-type": {
1142 | "version": "3.0.0",
1143 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
1144 | "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
1145 | "dev": true,
1146 | "requires": {
1147 | "pify": "^3.0.0"
1148 | }
1149 | },
1150 | "pify": {
1151 | "version": "3.0.0",
1152 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
1153 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
1154 | "dev": true
1155 | },
1156 | "pinkie": {
1157 | "version": "2.0.4",
1158 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
1159 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
1160 | "dev": true
1161 | },
1162 | "pinkie-promise": {
1163 | "version": "2.0.1",
1164 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
1165 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
1166 | "dev": true,
1167 | "requires": {
1168 | "pinkie": "^2.0.0"
1169 | }
1170 | },
1171 | "postcss-value-parser": {
1172 | "version": "3.3.1",
1173 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
1174 | "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
1175 | "dev": true
1176 | },
1177 | "process-nextick-args": {
1178 | "version": "2.0.0",
1179 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
1180 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
1181 | "dev": true
1182 | },
1183 | "q": {
1184 | "version": "1.5.1",
1185 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
1186 | "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
1187 | "dev": true
1188 | },
1189 | "quick-lru": {
1190 | "version": "1.1.0",
1191 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz",
1192 | "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=",
1193 | "dev": true
1194 | },
1195 | "read-pkg": {
1196 | "version": "1.1.0",
1197 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
1198 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
1199 | "dev": true,
1200 | "requires": {
1201 | "load-json-file": "^1.0.0",
1202 | "normalize-package-data": "^2.3.2",
1203 | "path-type": "^1.0.0"
1204 | },
1205 | "dependencies": {
1206 | "load-json-file": {
1207 | "version": "1.1.0",
1208 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
1209 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
1210 | "dev": true,
1211 | "requires": {
1212 | "graceful-fs": "^4.1.2",
1213 | "parse-json": "^2.2.0",
1214 | "pify": "^2.0.0",
1215 | "pinkie-promise": "^2.0.0",
1216 | "strip-bom": "^2.0.0"
1217 | }
1218 | },
1219 | "parse-json": {
1220 | "version": "2.2.0",
1221 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
1222 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
1223 | "dev": true,
1224 | "requires": {
1225 | "error-ex": "^1.2.0"
1226 | }
1227 | },
1228 | "path-type": {
1229 | "version": "1.1.0",
1230 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
1231 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
1232 | "dev": true,
1233 | "requires": {
1234 | "graceful-fs": "^4.1.2",
1235 | "pify": "^2.0.0",
1236 | "pinkie-promise": "^2.0.0"
1237 | }
1238 | },
1239 | "pify": {
1240 | "version": "2.3.0",
1241 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
1242 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
1243 | "dev": true
1244 | },
1245 | "strip-bom": {
1246 | "version": "2.0.0",
1247 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
1248 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
1249 | "dev": true,
1250 | "requires": {
1251 | "is-utf8": "^0.2.0"
1252 | }
1253 | }
1254 | }
1255 | },
1256 | "read-pkg-up": {
1257 | "version": "1.0.1",
1258 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
1259 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
1260 | "dev": true,
1261 | "requires": {
1262 | "find-up": "^1.0.0",
1263 | "read-pkg": "^1.0.0"
1264 | },
1265 | "dependencies": {
1266 | "find-up": {
1267 | "version": "1.1.2",
1268 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
1269 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
1270 | "dev": true,
1271 | "requires": {
1272 | "path-exists": "^2.0.0",
1273 | "pinkie-promise": "^2.0.0"
1274 | }
1275 | },
1276 | "path-exists": {
1277 | "version": "2.1.0",
1278 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
1279 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
1280 | "dev": true,
1281 | "requires": {
1282 | "pinkie-promise": "^2.0.0"
1283 | }
1284 | }
1285 | }
1286 | },
1287 | "readable-stream": {
1288 | "version": "2.3.6",
1289 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
1290 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
1291 | "dev": true,
1292 | "requires": {
1293 | "core-util-is": "~1.0.0",
1294 | "inherits": "~2.0.3",
1295 | "isarray": "~1.0.0",
1296 | "process-nextick-args": "~2.0.0",
1297 | "safe-buffer": "~5.1.1",
1298 | "string_decoder": "~1.1.1",
1299 | "util-deprecate": "~1.0.1"
1300 | }
1301 | },
1302 | "redent": {
1303 | "version": "2.0.0",
1304 | "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz",
1305 | "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=",
1306 | "dev": true,
1307 | "requires": {
1308 | "indent-string": "^3.0.0",
1309 | "strip-indent": "^2.0.0"
1310 | }
1311 | },
1312 | "reduce-css-calc": {
1313 | "version": "2.1.7",
1314 | "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.7.tgz",
1315 | "integrity": "sha512-fDnlZ+AybAS3C7Q9xDq5y8A2z+lT63zLbynew/lur/IR24OQF5x98tfNwf79mzEdfywZ0a2wpM860FhFfMxZlA==",
1316 | "dev": true,
1317 | "requires": {
1318 | "css-unit-converter": "^1.1.1",
1319 | "postcss-value-parser": "^3.3.0"
1320 | }
1321 | },
1322 | "repeating": {
1323 | "version": "2.0.1",
1324 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
1325 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
1326 | "dev": true,
1327 | "requires": {
1328 | "is-finite": "^1.0.0"
1329 | }
1330 | },
1331 | "resolve": {
1332 | "version": "1.17.0",
1333 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
1334 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
1335 | "dev": true,
1336 | "requires": {
1337 | "path-parse": "^1.0.6"
1338 | }
1339 | },
1340 | "rimraf": {
1341 | "version": "3.0.2",
1342 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
1343 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
1344 | "dev": true,
1345 | "requires": {
1346 | "glob": "^7.1.3"
1347 | }
1348 | },
1349 | "safe-buffer": {
1350 | "version": "5.1.2",
1351 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1352 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1353 | "dev": true
1354 | },
1355 | "semver": {
1356 | "version": "5.5.1",
1357 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz",
1358 | "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==",
1359 | "dev": true
1360 | },
1361 | "signal-exit": {
1362 | "version": "3.0.2",
1363 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
1364 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
1365 | "dev": true
1366 | },
1367 | "source-map": {
1368 | "version": "0.6.1",
1369 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1370 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1371 | "dev": true
1372 | },
1373 | "spdx-correct": {
1374 | "version": "3.0.0",
1375 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
1376 | "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
1377 | "dev": true,
1378 | "requires": {
1379 | "spdx-expression-parse": "^3.0.0",
1380 | "spdx-license-ids": "^3.0.0"
1381 | }
1382 | },
1383 | "spdx-exceptions": {
1384 | "version": "2.1.0",
1385 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
1386 | "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==",
1387 | "dev": true
1388 | },
1389 | "spdx-expression-parse": {
1390 | "version": "3.0.0",
1391 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
1392 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
1393 | "dev": true,
1394 | "requires": {
1395 | "spdx-exceptions": "^2.1.0",
1396 | "spdx-license-ids": "^3.0.0"
1397 | }
1398 | },
1399 | "spdx-license-ids": {
1400 | "version": "3.0.0",
1401 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
1402 | "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==",
1403 | "dev": true
1404 | },
1405 | "split": {
1406 | "version": "1.0.1",
1407 | "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
1408 | "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
1409 | "dev": true,
1410 | "requires": {
1411 | "through": "2"
1412 | }
1413 | },
1414 | "split2": {
1415 | "version": "2.2.0",
1416 | "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz",
1417 | "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==",
1418 | "dev": true,
1419 | "requires": {
1420 | "through2": "^2.0.2"
1421 | }
1422 | },
1423 | "sprintf-js": {
1424 | "version": "1.0.3",
1425 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
1426 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
1427 | "dev": true
1428 | },
1429 | "string_decoder": {
1430 | "version": "1.1.1",
1431 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1432 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1433 | "dev": true,
1434 | "requires": {
1435 | "safe-buffer": "~5.1.0"
1436 | }
1437 | },
1438 | "strip-bom": {
1439 | "version": "3.0.0",
1440 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
1441 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
1442 | "dev": true
1443 | },
1444 | "strip-indent": {
1445 | "version": "2.0.0",
1446 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
1447 | "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
1448 | "dev": true
1449 | },
1450 | "supports-color": {
1451 | "version": "5.5.0",
1452 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1453 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1454 | "dev": true,
1455 | "requires": {
1456 | "has-flag": "^3.0.0"
1457 | }
1458 | },
1459 | "tempfile": {
1460 | "version": "1.1.1",
1461 | "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz",
1462 | "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=",
1463 | "dev": true,
1464 | "requires": {
1465 | "os-tmpdir": "^1.0.0",
1466 | "uuid": "^2.0.1"
1467 | }
1468 | },
1469 | "text-extensions": {
1470 | "version": "1.8.0",
1471 | "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.8.0.tgz",
1472 | "integrity": "sha512-mVzjRxuWnDKs/qH1rbOJEVHLlSX9kty9lpi7lMvLgU9S74mQ8/Ozg9UPcKxShh0qG2NZ+NyPOPpcZU4C1Eld9A==",
1473 | "dev": true
1474 | },
1475 | "through": {
1476 | "version": "2.3.8",
1477 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
1478 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
1479 | "dev": true
1480 | },
1481 | "through2": {
1482 | "version": "2.0.3",
1483 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
1484 | "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
1485 | "dev": true,
1486 | "requires": {
1487 | "readable-stream": "^2.1.5",
1488 | "xtend": "~4.0.1"
1489 | }
1490 | },
1491 | "trim-newlines": {
1492 | "version": "2.0.0",
1493 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz",
1494 | "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=",
1495 | "dev": true
1496 | },
1497 | "trim-off-newlines": {
1498 | "version": "1.0.1",
1499 | "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz",
1500 | "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=",
1501 | "dev": true
1502 | },
1503 | "tslib": {
1504 | "version": "2.0.0",
1505 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz",
1506 | "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==",
1507 | "dev": true
1508 | },
1509 | "tslint": {
1510 | "version": "6.1.3",
1511 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz",
1512 | "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==",
1513 | "dev": true,
1514 | "requires": {
1515 | "@babel/code-frame": "^7.0.0",
1516 | "builtin-modules": "^1.1.1",
1517 | "chalk": "^2.3.0",
1518 | "commander": "^2.12.1",
1519 | "diff": "^4.0.1",
1520 | "glob": "^7.1.1",
1521 | "js-yaml": "^3.13.1",
1522 | "minimatch": "^3.0.4",
1523 | "mkdirp": "^0.5.3",
1524 | "resolve": "^1.3.2",
1525 | "semver": "^5.3.0",
1526 | "tslib": "^1.13.0",
1527 | "tsutils": "^2.29.0"
1528 | },
1529 | "dependencies": {
1530 | "minimist": {
1531 | "version": "1.2.5",
1532 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
1533 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
1534 | "dev": true
1535 | },
1536 | "mkdirp": {
1537 | "version": "0.5.5",
1538 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
1539 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
1540 | "dev": true,
1541 | "requires": {
1542 | "minimist": "^1.2.5"
1543 | }
1544 | },
1545 | "tslib": {
1546 | "version": "1.13.0",
1547 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
1548 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
1549 | "dev": true
1550 | }
1551 | }
1552 | },
1553 | "tsutils": {
1554 | "version": "2.29.0",
1555 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
1556 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
1557 | "dev": true,
1558 | "requires": {
1559 | "tslib": "^1.8.1"
1560 | },
1561 | "dependencies": {
1562 | "tslib": {
1563 | "version": "1.13.0",
1564 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
1565 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
1566 | "dev": true
1567 | }
1568 | }
1569 | },
1570 | "typescript": {
1571 | "version": "3.9.7",
1572 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz",
1573 | "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==",
1574 | "dev": true
1575 | },
1576 | "util-deprecate": {
1577 | "version": "1.0.2",
1578 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1579 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
1580 | "dev": true
1581 | },
1582 | "uuid": {
1583 | "version": "2.0.3",
1584 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
1585 | "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=",
1586 | "dev": true
1587 | },
1588 | "validate-npm-package-license": {
1589 | "version": "3.0.4",
1590 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
1591 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
1592 | "dev": true,
1593 | "requires": {
1594 | "spdx-correct": "^3.0.0",
1595 | "spdx-expression-parse": "^3.0.0"
1596 | }
1597 | },
1598 | "wordwrap": {
1599 | "version": "0.0.3",
1600 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
1601 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
1602 | "dev": true
1603 | },
1604 | "wrappy": {
1605 | "version": "1.0.2",
1606 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1607 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
1608 | "dev": true
1609 | },
1610 | "xtend": {
1611 | "version": "4.0.1",
1612 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
1613 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
1614 | "dev": true
1615 | }
1616 | }
1617 | }
1618 |
--------------------------------------------------------------------------------
/src/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nativescript-speech-recognition",
3 | "version": "2.0.0",
4 | "description": "Speech to text plugin, leveraging iOS and Android's built-in recognition engines.",
5 | "main": "speech-recognition",
6 | "typings": "index.d.ts",
7 | "nativescript": {
8 | "platforms": {
9 | "android": "3.0.0",
10 | "ios": "3.0.0"
11 | }
12 | },
13 | "scripts": {
14 | "tsc": "tsc -skipLibCheck",
15 | "build": "npm i && npm run tsc",
16 | "postclone": "npm i && cd ../demo && npm i && cd ../src && npm run plugin.link",
17 | "test.android": "npm i && npm run tsc && npm run tslint && cd ../demo && tns build android && tns test android --justlaunch",
18 | "test.ios": "npm i && npm run tsc && npm run tslint && cd ../demo && tns build ios && tns test ios --justlaunch",
19 | "tslint": "cd .. && tslint \"**/*.ts\" --config tslint.json --exclude \"**/node_modules/**\"",
20 | "plugin.link": "npm link && cd ../demo && npm link nativescript-speech-recognition && cd ../src",
21 | "plugin.tscwatch": "npm run tsc -- -w",
22 | "demo.ios": "npm run build && cd ../demo && tns run ios",
23 | "demo.android": "npm run build && cd ../demo && tns run android",
24 | "demo.android.clean": "npm run build && cd ../demo && tns plugin remove nativescript-speech-recognition && tns plugin add ../src && tns run android",
25 | "demo.reset": "cd ../demo && rimraf platforms",
26 | "plugin.prepare": "npm run tsc && cd ../demo && tns plugin remove nativescript-speech-recognition && tns plugin add ../src",
27 | "clean": "cd ../demo && rimraf hooks node_modules platforms && cd ../src && rimraf node_modules && npm run plugin.link",
28 | "ci.tslint": "npm i && tslint '**/*.ts' --config '../tslint.json' --exclude '**/node_modules/**'",
29 | "changelog": "conventional-changelog -i ../CHANGELOG.md -s -r 0",
30 | "changelog:add": "git add ../CHANGELOG.md && git commit -m 'updated CHANGELOG.md'"
31 | },
32 | "repository": {
33 | "type": "git",
34 | "url": "https://github.com/EddyVerbruggen/nativescript-speech-recognition.git"
35 | },
36 | "keywords": [
37 | "NativeScript",
38 | "JavaScript",
39 | "iOS",
40 | "Siri",
41 | "Speech to text",
42 | "Speech",
43 | "Recognition",
44 | "Voice"
45 | ],
46 | "author": {
47 | "name": "Eddy Verbruggen",
48 | "email": "eddyverbruggen@gmail.com"
49 | },
50 | "contributors": [
51 | {
52 | "name": "Brad Martin",
53 | "email": "bradwaynemartin@gmail.com",
54 | "url": "https://github.com/bradmartin"
55 | }
56 | ],
57 | "bugs": {
58 | "url": "https://github.com/EddyVerbruggen/nativescript-speech-recognition/issues"
59 | },
60 | "license": "MIT",
61 | "homepage": "https://github.com/EddyVerbruggen/nativescript-speech-recognition",
62 | "readmeFilename": "README.md",
63 | "devDependencies": {
64 | "@nativescript/core": "~7.0.5",
65 | "@nativescript/types": "~7.0.4",
66 | "conventional-changelog-cli": "^1.3.2",
67 | "rimraf": "^3.0.2",
68 | "tslint": "~6.1.3",
69 | "typescript": "~3.9.7"
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/src/platforms/android/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/src/platforms/ios/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | NSSpeechRecognitionUsageDescription
6 |
7 | NSMicrophoneUsageDescription
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/references.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/src/speech-recognition.android.ts:
--------------------------------------------------------------------------------
1 | import { SpeechRecognitionApi, SpeechRecognitionOptions } from "./speech-recognition.common";
2 | import { AndroidApplication, Application, ApplicationEventData, Utils} from "@nativescript/core";
3 |
4 | declare let global: any;
5 |
6 | const AppPackageName = useAndroidX() ? global.androidx.core.app : android.support.v4.app;
7 | const ContentPackageName = useAndroidX() ? global.androidx.core.content : (android.support.v4 as any).content;
8 |
9 | function useAndroidX () {
10 | return global.androidx && global.androidx.appcompat;
11 | }
12 |
13 | export class SpeechRecognition implements SpeechRecognitionApi {
14 |
15 | private onPermissionGranted: Function;
16 | private onPermissionRejected: Function;
17 | private recognizer: android.speech.SpeechRecognizer = null;
18 |
19 | constructor() {
20 | let self = this;
21 | Application.android.on(AndroidApplication.activityRequestPermissionsEvent, function (args: any) {
22 | for (let i = 0; i < args.permissions.length; i++) {
23 | if (args.grantResults[i] === android.content.pm.PackageManager.PERMISSION_DENIED) {
24 | if (self.onPermissionRejected) {
25 | self.onPermissionRejected("Please allow access to the Microphone and try again.");
26 | } else {
27 | console.log("Please allow access to the Microphone and try again. (tip: pass in a reject to receive this message in your app)");
28 | }
29 | return;
30 | }
31 | }
32 | if (self.onPermissionGranted) {
33 | self.onPermissionGranted();
34 | }
35 | });
36 |
37 | Application.on(Application.suspendEvent, (args: ApplicationEventData) => {
38 | if (this.recognizer !== null) {
39 | this.stopListening();
40 | }
41 | });
42 | }
43 |
44 | available(): Promise {
45 | return new Promise((resolve, reject) => {
46 | resolve(android.speech.SpeechRecognizer.isRecognitionAvailable(Utils.android.getApplicationContext()));
47 | });
48 | }
49 |
50 | requestPermission(): Promise {
51 | console.log(">> requestPermission");
52 | return new Promise((resolve, reject) => {
53 | this._requestPermission(
54 | () => resolve(true),
55 | () => resolve(false));
56 | });
57 | }
58 |
59 | startListening(options: SpeechRecognitionOptions): Promise {
60 | return new Promise((resolve, reject) => {
61 |
62 | let onPermissionGranted = () => {
63 |
64 | function sendBackResults(results: android.os.Bundle, partial: boolean) {
65 | let transcripts = results.getStringArrayList(android.speech.SpeechRecognizer.RESULTS_RECOGNITION);
66 | let transcript = null;
67 | // let confidences = results.getFloatArray(android.speech.SpeechRecognizer.CONFIDENCE_SCORES);
68 | if (!transcripts.isEmpty()) {
69 | // TODO return alternatives in a future version, as well as the confidence (can be done on iOS as well)
70 | // for (let i = 0; i < transcripts.size(); i++) {
71 | // transcript = transcripts.get(i);
72 | // }
73 | transcript = transcripts.get(0); // the first one has the highest confidence
74 | }
75 | options.onResult({
76 | text: transcript,
77 | // confidence: confidences[0],
78 | finished: !partial
79 | });
80 | }
81 |
82 | let loopHandler = new android.os.Handler(android.os.Looper.getMainLooper());
83 | loopHandler.post(new java.lang.Runnable({
84 | run: () => {
85 | this.recognizer = android.speech.SpeechRecognizer.createSpeechRecognizer(Utils.android.getApplicationContext());
86 | this.recognizer.setRecognitionListener(new android.speech.RecognitionListener({
87 | /**
88 | * Called when the endpointer is ready for the user to start speaking.
89 | * @param params parameters set by the recognition service. Reserved for future use.
90 | */
91 | onReadyForSpeech(params: android.os.Bundle) {
92 | resolve(true);
93 | },
94 |
95 | /**
96 | * The user has started to speak.
97 | */
98 | onBeginningOfSpeech() {
99 | },
100 |
101 | /**
102 | * The sound level in the audio stream has changed. There is no guarantee that this method will be called.
103 | * @param rmsdB the new RMS dB value
104 | */
105 | onRmsChanged(rmsdB: number) {
106 | },
107 |
108 | /**
109 | * More sound has been received. The purpose of this function is to allow giving feedback to the user regarding the captured audio. There is no guarantee that this method will be called.
110 | * @param buffer a buffer containing a sequence of big-endian 16-bit integers representing a
111 | */
112 | onBufferReceived(buffer: native.Array) {
113 | },
114 |
115 | /**
116 | * Called after the user stops speaking.
117 | */
118 | onEndOfSpeech() {
119 | },
120 |
121 | /**
122 | * A network or recognition error occurred.
123 | * Or just keep silent for a few seconds.
124 | * @param error code is defined in {@link SpeechRecognizer}
125 | */
126 | onError(error: number) {
127 | console.log("Error: " + error);
128 | // not that if resolve() already ran, reject() won't have effect. That's why we also invoke the 'onError' callback.
129 | options.onError && options.onError(error);
130 | reject(error);
131 | },
132 |
133 | /**
134 | * Called when recognition results are ready.
135 | * @param results the recognition results. To retrieve the results in {@code
136 | */
137 | onResults(results: android.os.Bundle) {
138 | sendBackResults(results, false);
139 | },
140 |
141 | /**
142 | * Called when partial recognition results are available. The callback might be called at any time between #onBeginningOfSpeech() and #onResults(Bundle) when partial results are ready. This method may be called zero, one or multiple times for each call to SpeechRecognizer#startListening(Intent), depending on the speech recognition service implementation. To request partial results, use RecognizerIntent#EXTRA_PARTIAL_RESULTS
143 | * @param partialResults the returned results. To retrieve the results in
144 | */
145 | onPartialResults(partialResults: android.os.Bundle) {
146 | if (options.returnPartialResults) {
147 | sendBackResults(partialResults, true);
148 | }
149 | },
150 |
151 | /**
152 | * Reserved for adding future events.
153 | * @param eventType the type of the occurred event
154 | * @param params a Bundle containing the passed parameters
155 | */
156 |
157 | onEvent(eventType: number, params: android.os.Bundle) {
158 | }
159 | }));
160 | }
161 | }));
162 |
163 | let intent = new android.content.Intent(android.speech.RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
164 | intent.putExtra(android.speech.RecognizerIntent.EXTRA_LANGUAGE_MODEL, android.speech.RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
165 | intent.putExtra(android.speech.RecognizerIntent.EXTRA_CALLING_PACKAGE, "voice.recognition.test");
166 | // if not set, the default will be used
167 | if (options.locale) {
168 | intent.putExtra(android.speech.RecognizerIntent.EXTRA_LANGUAGE, options.locale);
169 | }
170 | // to be able to receive partial results
171 | if (options.returnPartialResults) {
172 | intent.putExtra(android.speech.RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
173 | }
174 | intent.putExtra(android.speech.RecognizerIntent.EXTRA_MAX_RESULTS, 100);
175 | loopHandler.post(new java.lang.Runnable({
176 | run: () => {
177 | this.recognizer.startListening(intent);
178 | // resolve(true);
179 | }
180 | }));
181 | };
182 |
183 | if (!this.wasPermissionGranted()) {
184 | this._requestPermission(onPermissionGranted, reject);
185 | return;
186 | }
187 |
188 | onPermissionGranted();
189 | });
190 | }
191 |
192 | stopListening(): Promise {
193 | return new Promise((resolve, reject) => {
194 | if (this.recognizer === null) {
195 | reject("Not running");
196 | return;
197 | }
198 |
199 | let loopHandler = new android.os.Handler(android.os.Looper.getMainLooper());
200 | loopHandler.post(new java.lang.Runnable({
201 | run: () => {
202 | this.recognizer.stopListening();
203 | this.recognizer.cancel();
204 | this.recognizer.destroy();
205 | this.recognizer = null;
206 | resolve();
207 | }
208 | }));
209 | });
210 | }
211 |
212 | private wasPermissionGranted(): boolean {
213 | let hasPermission = android.os.Build.VERSION.SDK_INT < 23; // Android M. (6.0)
214 | if (!hasPermission) {
215 | hasPermission = android.content.pm.PackageManager.PERMISSION_GRANTED ===
216 | ContentPackageName.ContextCompat.checkSelfPermission(
217 | Utils.android.getApplicationContext(),
218 | android.Manifest.permission.RECORD_AUDIO);
219 | }
220 | return hasPermission;
221 | }
222 |
223 | private _requestPermission(onPermissionGranted: Function, reject): void {
224 | this.onPermissionGranted = onPermissionGranted;
225 | this.onPermissionRejected = reject;
226 | AppPackageName.ActivityCompat.requestPermissions(
227 | Application.android.foregroundActivity || Application.android.startActivity, // TODO application.android.context
228 | [android.Manifest.permission.RECORD_AUDIO],
229 | 444 // irrelevant since we simply invoke onPermissionGranted
230 | );
231 | }
232 | }
233 |
--------------------------------------------------------------------------------
/src/speech-recognition.common.ts:
--------------------------------------------------------------------------------
1 | export interface SpeechRecognitionTranscription {
2 | text: string;
3 | finished: boolean;
4 | // confidence: number; // TODO some day
5 | }
6 |
7 | export interface SpeechRecognitionOptions {
8 | /**
9 | * Example: "nl-NL".
10 | * Default: the system locale.
11 | */
12 | locale?: string;
13 |
14 | /**
15 | * Set to true to get results back continuously.
16 | */
17 | returnPartialResults?: boolean;
18 |
19 | /**
20 | * The callback function invoked when speech is recognized.
21 | * @param transcription
22 | */
23 | onResult: (transcription: SpeechRecognitionTranscription) => void;
24 |
25 | /**
26 | * TODO iOS, README
27 | * The callback function invoked when an error occurs during speech recognition
28 | * @param error:
29 | * - iOS: (string) description of the error.
30 | * - Android: (number) 'ERROR_*' constant from https://developer.android.com/reference/android/speech/SpeechRecognizer.
31 | */
32 | onError?: (error: string | number) => void;
33 | }
34 |
35 | export interface SpeechRecognitionApi {
36 | available(): Promise;
37 | requestPermission(): Promise;
38 | startListening(options: SpeechRecognitionOptions): Promise;
39 | stopListening(): Promise;
40 | }
41 |
--------------------------------------------------------------------------------
/src/speech-recognition.ios.ts:
--------------------------------------------------------------------------------
1 | import { Device } from "@nativescript/core";
2 | import { SpeechRecognitionApi, SpeechRecognitionOptions } from "./speech-recognition.common";
3 |
4 | export class SpeechRecognition implements SpeechRecognitionApi {
5 |
6 | private recognitionRequest: SFSpeechAudioBufferRecognitionRequest = null;
7 | private audioEngine: AVAudioEngine = null;
8 | private speechRecognizer: SFSpeechRecognizer = null;
9 | private recognitionTask: SFSpeechRecognitionTask = null;
10 | private inputNode: AVAudioInputNode = null;
11 | private audioSession: AVAudioSession = null;
12 |
13 | constructor() {
14 | this.audioEngine = AVAudioEngine.new();
15 | }
16 |
17 | available(): Promise {
18 | return new Promise((resolve, reject) => {
19 | resolve(parseInt(Device.osVersion) >= 10);
20 | });
21 | }
22 |
23 | requestPermission(): Promise {
24 | return new Promise((resolve, reject) => {
25 | SFSpeechRecognizer.requestAuthorization((status: SFSpeechRecognizerAuthorizationStatus) => {
26 | if (status !== SFSpeechRecognizerAuthorizationStatus.Authorized) {
27 | resolve(false);
28 | return;
29 | }
30 | AVAudioSession.sharedInstance().requestRecordPermission((granted: boolean) => {
31 | resolve(granted);
32 | });
33 | });
34 | });
35 | }
36 |
37 | startListening(options: SpeechRecognitionOptions): Promise {
38 | return new Promise((resolve, reject) => {
39 | const locale = NSLocale.alloc().initWithLocaleIdentifier(options.locale ? options.locale : Device.language);
40 | this.speechRecognizer = SFSpeechRecognizer.alloc().initWithLocale(locale);
41 |
42 | if (this.recognitionTask !== null) {
43 | this.recognitionTask.cancel();
44 | this.recognitionTask = null;
45 | }
46 |
47 | SFSpeechRecognizer.requestAuthorization((status: SFSpeechRecognizerAuthorizationStatus) => {
48 | if (status !== SFSpeechRecognizerAuthorizationStatus.Authorized) {
49 | options.onError && options.onError("Not authorized");
50 | reject("Not authorized");
51 | return;
52 | }
53 |
54 | this.audioSession = AVAudioSession.sharedInstance();
55 | this.audioSession.setCategoryError(AVAudioSessionCategoryRecord);
56 | this.audioSession.setModeError(AVAudioSessionModeMeasurement);
57 | this.audioSession.setActiveWithOptionsError(true, AVAudioSessionSetActiveOptions.NotifyOthersOnDeactivation);
58 |
59 | this.recognitionRequest = SFSpeechAudioBufferRecognitionRequest.new();
60 | if (!this.recognitionRequest) {
61 | options.onError && options.onError("Unable to create an SFSpeechAudioBufferRecognitionRequest object");
62 | reject("Unable to create an SFSpeechAudioBufferRecognitionRequest object");
63 | return;
64 | }
65 |
66 | this.inputNode = this.audioEngine.inputNode;
67 | if (!this.inputNode) {
68 | options.onError && options.onError("Audio engine has no input node");
69 | reject("Audio engine has no input node");
70 | return;
71 | }
72 |
73 | this.recognitionRequest.shouldReportPartialResults = options.returnPartialResults;
74 |
75 | this.recognitionTask = this.speechRecognizer.recognitionTaskWithRequestResultHandler(
76 | this.recognitionRequest,
77 | (result: SFSpeechRecognitionResult, error: NSError) => {
78 | if (result !== null) {
79 | options.onResult({
80 | finished: result.final,
81 | text: result.bestTranscription.formattedString
82 | });
83 | }
84 |
85 | if (error !== null || (result !== null && result.final)) {
86 | this.audioEngine.stop();
87 | this.inputNode.removeTapOnBus(0);
88 | this.audioSession.setCategoryError(AVAudioSessionCategoryPlayback);
89 | this.audioSession.setModeError(AVAudioSessionModeDefault);
90 | this.recognitionRequest = null;
91 | this.recognitionTask = null;
92 | }
93 |
94 | if (error !== null) {
95 | console.log("error in handler: " + error.localizedDescription);
96 | options.onError && options.onError(error.localizedDescription);
97 | // no need to 'reject' as the promise has been resolved by now anyway
98 | }
99 | });
100 |
101 | let that = this;
102 |
103 | let recordingFormat = this.inputNode.outputFormatForBus(0);
104 | this.inputNode.installTapOnBusBufferSizeFormatBlock(0, 1024, recordingFormat, (buffer: AVAudioPCMBuffer, when: AVAudioTime) => {
105 | that.recognitionRequest.appendAudioPCMBuffer(buffer);
106 | });
107 |
108 | this.audioEngine.prepare();
109 | resolve(this.audioEngine.startAndReturnError());
110 | });
111 | });
112 | }
113 |
114 | stopListening(): Promise {
115 | return new Promise((resolve, reject) => {
116 | if (!this.audioEngine.running) {
117 | reject("Not running");
118 | return;
119 | }
120 |
121 | this.audioEngine.stop();
122 | this.recognitionRequest.endAudio();
123 | this.audioSession.setCategoryError(AVAudioSessionCategoryPlayback);
124 | this.audioSession.setModeError(AVAudioSessionModeDefault);
125 | this.speechRecognizer = null;
126 | this.recognitionTask = null;
127 | resolve();
128 | });
129 | }
130 | }
131 |
--------------------------------------------------------------------------------
/src/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es5",
4 | "module": "commonjs",
5 | "declaration": true,
6 | "removeComments": true,
7 | "noLib": false,
8 | "emitDecoratorMetadata": true,
9 | "experimentalDecorators": true,
10 | "lib": ["es6", "dom"],
11 | "sourceMap": true,
12 | "pretty": true,
13 | "allowUnreachableCode": false,
14 | "allowUnusedLabels": false,
15 | "noEmitHelpers": true,
16 | "noEmitOnError": false,
17 | "noImplicitAny": false,
18 | "noImplicitReturns": true,
19 | "noImplicitUseStrict": false,
20 | "noFallthroughCasesInSwitch": true
21 | },
22 | "exclude": [
23 | "demo/node_modules",
24 | "demo/platforms",
25 | "node_modules",
26 | "platforms"
27 | ],
28 | "compileOnSave": false
29 | }
30 |
--------------------------------------------------------------------------------
/tslint.json:
--------------------------------------------------------------------------------
1 | {
2 | "rules": {
3 | "class-name": true,
4 | "comment-format": [
5 | true,
6 | "check-space"
7 | ],
8 | "indent": [
9 | true,
10 | "spaces"
11 | ],
12 | "no-duplicate-variable": true,
13 | "no-eval": true,
14 | "no-internal-module": true,
15 | "no-trailing-whitespace": true,
16 | "no-var-keyword": true,
17 | "one-line": [
18 | true,
19 | "check-open-brace",
20 | "check-whitespace"
21 | ],
22 | "quotemark": [
23 | true,
24 | "double"
25 | ],
26 | "semicolon": [
27 | true,
28 | "always"
29 | ],
30 | "triple-equals": [
31 | true,
32 | "allow-null-check"
33 | ],
34 | "typedef-whitespace": [
35 | true,
36 | {
37 | "call-signature": "nospace",
38 | "index-signature": "nospace",
39 | "parameter": "nospace",
40 | "property-declaration": "nospace",
41 | "variable-declaration": "nospace"
42 | }
43 | ],
44 | "variable-name": [
45 | true,
46 | "ban-keywords"
47 | ],
48 | "whitespace": [
49 | true,
50 | "check-branch",
51 | "check-decl",
52 | "check-operator",
53 | "check-separator",
54 | "check-type"
55 | ]
56 | }
57 | }
--------------------------------------------------------------------------------