├── .gitignore
├── README.md
├── demo
├── app
│ ├── App_Resources
│ │ └── Android
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── app.gradle
│ │ │ ├── drawable-hdpi
│ │ │ └── icon.png
│ │ │ ├── drawable-ldpi
│ │ │ └── icon.png
│ │ │ ├── drawable-mdpi
│ │ │ └── icon.png
│ │ │ └── values
│ │ │ ├── colors.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ ├── 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-lock.json
├── package.json
├── references.d.ts
└── tsconfig.json
├── src
├── .npmignore
├── index.d.ts
├── package-lock.json
├── package.json
├── platforms
│ └── android
│ │ ├── AndroidManifest.xml
│ │ └── include.gradle
├── references.d.ts
├── speech-recognition-vosk-jni.d.ts
├── speech-recognition-vosk.android.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 | !src/speech-recognition-vosk-jni.d.ts
12 | !demo/karma.conf.js
13 | !demo/app/tests/*.js
14 | demo/**/*.d.ts
15 | !demo/references.d.ts
16 | demo/platforms
17 | demo/.nsbuildinfo
18 | node_modules
19 | publish/src
20 | publish/package
21 | demo/report/report.html
22 | demo/report/stats.json
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # NativeScript Speech Recognition with Vosk Library
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/alphacep/nativescript-vosk.svg?branch=master
9 | [build-url]:https://travis-ci.org/alphacep/nativescript-vosk
10 | [npm-image]:http://img.shields.io/npm/v/nativescript-vosk.svg
11 | [npm-url]:https://npmjs.org/package/nativescript-vosk
12 | [downloads-image]:http://img.shields.io/npm/dm/nativescript-vosk.svg
13 | [twitter-image]:https://img.shields.io/twitter/follow/alphacep.svg?style=social&label=Follow%20me
14 | [twitter-url]:https://twitter.com/alphacep
15 |
16 | This is a plugin for offline speech recognition in NativeScript library using [Vosk](https://github.com/alphacep/vosk-api) library.
17 |
18 | See the [demo](https://github.com/alphacep/nativescript-vosk/tree/master/demo) in action.
19 |
20 | ## Installation
21 |
22 | From the command prompt go to your app's root folder and execute:
23 |
24 | ```bash
25 | ns plugin add nativescript-vosk
26 | ```
27 |
28 | ## Platforms
29 |
30 | We support only Android for now, iOS will be added some time
31 |
32 | # Thanks
33 |
34 | This demo is largely based on the code of https://github.com/EddyVerbruggen/nativescript-speech-recognition
35 |
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
12 |
13 |
16 |
17 |
18 |
19 |
20 |
26 |
27 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/app.gradle:
--------------------------------------------------------------------------------
1 | android {
2 | defaultConfig {
3 | minSdkVersion 21
4 | targetSdkVersion 29
5 | generatedDensities = []
6 | applicationId = "org.vosk.demo.nativescript"
7 | }
8 | aaptOptions {
9 | additionalParameters "--no-version-vectors"
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-hdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alphacep/nativescript-vosk/5fa5547ac59982c47e1a05f9b66b9d3b831e520a/demo/app/App_Resources/Android/drawable-hdpi/icon.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-ldpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alphacep/nativescript-vosk/5fa5547ac59982c47e1a05f9b66b9d3b831e520a/demo/app/App_Resources/Android/drawable-ldpi/icon.png
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/drawable-mdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alphacep/nativescript-vosk/5fa5547ac59982c47e1a05f9b66b9d3b831e520a/demo/app/App_Resources/Android/drawable-mdpi/icon.png
--------------------------------------------------------------------------------
/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/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Vosk NS Demo
4 |
5 |
--------------------------------------------------------------------------------
/demo/app/App_Resources/Android/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
13 |
14 |
16 |
17 |
18 |
24 |
25 |
27 |
28 |
29 |
34 |
35 |
37 |
38 |
--------------------------------------------------------------------------------
/demo/app/app-root.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/demo/app/app.css:
--------------------------------------------------------------------------------
1 | @import "@nativescript/theme/css/core.css";
2 | @import "@nativescript/theme/css/default.css";
3 |
--------------------------------------------------------------------------------
/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 { VoskDemoModel } 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 VoskDemoModel();
8 | }
9 |
--------------------------------------------------------------------------------
/demo/app/main-page.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/demo/app/main-view-model.ts:
--------------------------------------------------------------------------------
1 | import { Observable, isAndroid } from "@nativescript/core";
2 | import { syncModel, SpeechService } from "nativescript-vosk";
3 |
4 | export class VoskDemoModel extends Observable {
5 |
6 | private speechService : SpeechService;
7 | private model : any;
8 |
9 | public feedback: string = "Press 'Start' and say something";
10 | public listening: boolean = false;
11 |
12 | constructor() {
13 | super();
14 | syncModel().then((model : any) => {
15 | this.model = model;
16 | this.speechService = new SpeechService();
17 | })
18 | }
19 |
20 | public startListening(locale?: string): void {
21 | let that = this; // TODO remove 'that'
22 |
23 | this.speechService.available().then((avail: boolean) => {
24 | if (!avail) {
25 | that.set("feedback", "speech recognition not available");
26 | return;
27 | }
28 | that.speechService.startListening(
29 | that.model,
30 | {
31 | onResult: (hyp: string) => {
32 | that.set("feedback", hyp);
33 | that.set("listening", false);
34 | that.speechService.cancel();
35 | },
36 | onPartialResult: (hyp: string) => {
37 | that.set("feedback", hyp);
38 | },
39 | onFinalResult: (hyp: string) => {
40 | that.set("listening", false);
41 | },
42 | onError: () => {
43 | that.set("listening", false);
44 | },
45 | onTimeout: () => {
46 | that.set("listening", false);
47 | }
48 | }
49 | ).then((started: boolean) => {
50 | that.set("listening", true);
51 | }).catch((error: string | number) => {
52 | console.log(`Error while trying to start listening: ${error}`);
53 | });
54 | });
55 | }
56 |
57 | public stopListening(): void {
58 | let that = this;
59 | this.speechService.stop().then(() => {
60 | that.set("listening", false);
61 | }, (errorMessage: string) => {
62 | console.log(`Error while trying to stop listening: ${errorMessage}`);
63 | });
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/demo/app/tests/tests.js:
--------------------------------------------------------------------------------
1 | var SpeechService = require("nativescript-vosk").SpeechService;
2 | var speechService = new SpeechService();
3 |
4 | describe("available", function() {
5 | it("exists", function() {
6 | expect(speechService.available).toBeDefined();
7 | });
8 |
9 | it("returns a promise", function() {
10 | expect(speechService.available()).toEqual(jasmine.any(Promise));
11 | });
12 | });
13 |
--------------------------------------------------------------------------------
/demo/karma.conf.js:
--------------------------------------------------------------------------------
1 | const filePatterns = ['app/tests/**/*.*'];
2 | module.exports = function (config) {
3 | const options = {
4 |
5 | // base path that will be used to resolve all patterns (eg. files, exclude)
6 | basePath: 'app',
7 |
8 |
9 | // frameworks to use
10 | // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
11 | frameworks: ['jasmine'],
12 |
13 |
14 | // list of files / patterns to load in the browser
15 | files: filePatterns,
16 |
17 |
18 | // list of files to exclude
19 | exclude: [
20 | ],
21 |
22 |
23 | // preprocess matching files before serving them to the browser
24 | // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
25 | preprocessors: {
26 | },
27 |
28 |
29 | // test results reporter to use
30 | // possible values: 'dots', 'progress'
31 | // available reporters: https://npmjs.org/browse/keyword/karma-reporter
32 | reporters: ['progress'],
33 |
34 |
35 | // web server port
36 | port: 9876,
37 |
38 |
39 | // enable / disable colors in the output (reporters and logs)
40 | colors: true,
41 |
42 |
43 | // level of logging
44 | // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
45 | logLevel: config.LOG_INFO,
46 |
47 |
48 | // enable / disable watching file and executing tests whenever any file changes
49 | autoWatch: true,
50 |
51 |
52 | // start these browsers
53 | // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
54 | browsers: [],
55 |
56 | customLaunchers: {
57 | android: {
58 | base: 'NS',
59 | platform: 'android'
60 | },
61 | ios: {
62 | base: 'NS',
63 | platform: 'ios'
64 | },
65 | ios_simulator: {
66 | base: 'NS',
67 | platform: 'ios',
68 | arguments: ['--emulator']
69 | }
70 | },
71 |
72 | // Continuous Integration mode
73 | // if true, Karma captures browsers, runs the tests and exits
74 | singleRun: false
75 | };
76 |
77 | setWebpackPreprocessor(config, options);
78 | setWebpack(config, options);
79 |
80 | config.set(options);
81 | }
82 | module.exports.filePatterns = filePatterns;
83 | // You can also use RegEx if you'd like:
84 | // module.exports.filesRegex = /\.\/tests\/.*\.ts$/;
85 |
86 | function setWebpackPreprocessor(config, options) {
87 | if (config && config.bundle) {
88 | if (!options.preprocessors) {
89 | options.preprocessors = {};
90 | }
91 |
92 | options.files.forEach(file => {
93 | if (!options.preprocessors[file]) {
94 | options.preprocessors[file] = [];
95 | }
96 | options.preprocessors[file].push('webpack');
97 | });
98 | }
99 | }
100 |
101 | function setWebpack(config, options) {
102 | if (config && config.bundle) {
103 | const env = {};
104 | env[config.platform] = true;
105 | env.sourceMap = config.debugBrk;
106 | env.appPath = config.appPath;
107 | env.karmaWebpack = true;
108 | options.webpack = require('./webpack.config')(env);
109 | delete options.webpack.entry;
110 | delete options.webpack.output.libraryTarget;
111 | const invalidPluginsForUnitTesting = ["GenerateBundleStarterPlugin", "GenerateNativeScriptEntryPointsPlugin"];
112 | options.webpack.plugins = options.webpack.plugins.filter(p => !invalidPluginsForUnitTesting.includes(p.constructor.name));
113 | }
114 | }
115 |
--------------------------------------------------------------------------------
/demo/nativescript.config.ts:
--------------------------------------------------------------------------------
1 | import { NativeScriptConfig } from '@nativescript/core';
2 |
3 | export default {
4 | id: 'org.nativescript.plugin.vosk',
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/core": "~8.1.1",
4 | "@nativescript/theme": "~2.3.3",
5 | "@nativescript/unit-test-runner": "~2.0.5",
6 | "nativescript-vosk": "../src"
7 | },
8 | "devDependencies": {
9 | "@nativescript/android": "~8.1.1",
10 | "@nativescript/ios": "~8.1.0",
11 | "@nativescript/types": "~8.1.0",
12 | "@nativescript/webpack": "~5.0.0",
13 | "karma-webpack": "~5.0.0",
14 | "tns-core-modules": "^6.0.0",
15 | "tns-platform-declarations": "^6.0.0",
16 | "typescript": "~4.3.5"
17 | },
18 | "main": "./app/app.ts",
19 | "scripts": {
20 | "build.plugin": "cd ../src && npm run build"
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/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 | },
43 | "exclude": [
44 | "node_modules",
45 | "platforms"
46 | ],
47 | "compileOnSave": false
48 | }
--------------------------------------------------------------------------------
/src/.npmignore:
--------------------------------------------------------------------------------
1 | *.ts
2 | *.map
3 | !speech-recognition-vosk-jni.d.ts
4 | !speech-recognition-vosk.d.ts
5 | !index.d.ts
6 | tsconfig.json
7 | platforms/android/AndroidManifest.xml
8 | platforms/android/include.gradle
9 |
--------------------------------------------------------------------------------
/src/index.d.ts:
--------------------------------------------------------------------------------
1 | export interface RecognitionListener {
2 | onPartialResult: (hyp: string) => void;
3 | onResult: (hyp: string) => void;
4 | onFinalResult: (hyp: string) => void;
5 | onError: () => void;
6 | onTimeout: () => void;
7 | }
8 | export declare class SpeechService {
9 | private onPermissionGranted;
10 | private onPermissionRejected;
11 | private speechService;
12 | constructor();
13 | available(): Promise;
14 | requestPermission(): Promise;
15 | startListening(model: org.vosk.Model, listener: RecognitionListener): Promise;
16 | stop(): Promise;
17 | cancel(): Promise;
18 | shutdown(): Promise;
19 | private wasPermissionGranted;
20 | private _requestPermission;
21 | }
22 | export declare function syncModel(): Promise;
23 |
--------------------------------------------------------------------------------
/src/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nativescript-vosk",
3 | "version": "0.3.31",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "nativescript-vosk",
9 | "version": "0.3.31",
10 | "license": "Apache 2.0",
11 | "devDependencies": {
12 | "@nativescript/core": "~7.0.5",
13 | "@nativescript/types": "~7.0.4",
14 | "rimraf": "^3.0.2",
15 | "tns-core-modules": "^6.0.0",
16 | "tns-platform-declarations": "^6.0.0",
17 | "tslint": "~6.1.3",
18 | "typescript": "~3.9.7"
19 | }
20 | },
21 | "node_modules/@babel/code-frame": {
22 | "version": "7.10.4",
23 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
24 | "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
25 | "dev": true,
26 | "dependencies": {
27 | "@babel/highlight": "^7.10.4"
28 | }
29 | },
30 | "node_modules/@babel/helper-validator-identifier": {
31 | "version": "7.10.4",
32 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
33 | "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
34 | "dev": true
35 | },
36 | "node_modules/@babel/highlight": {
37 | "version": "7.10.4",
38 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
39 | "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
40 | "dev": true,
41 | "dependencies": {
42 | "@babel/helper-validator-identifier": "^7.10.4",
43 | "chalk": "^2.0.0",
44 | "js-tokens": "^4.0.0"
45 | }
46 | },
47 | "node_modules/@nativescript/core": {
48 | "version": "7.0.13",
49 | "resolved": "https://registry.npmjs.org/@nativescript/core/-/core-7.0.13.tgz",
50 | "integrity": "sha512-mB/MA4H7u0KuB0M4GLX2B0Yhii1r6u1WLhRrH6Yi8ixQNMMyXo8OFRxbXWTGj8TEOVPkljExRyOw24QMLc70AA==",
51 | "dev": true,
52 | "hasInstallScript": true,
53 | "dependencies": {
54 | "@nativescript/hook": "~2.0.0",
55 | "css-tree": "^1.0.0-alpha.39",
56 | "reduce-css-calc": "^2.1.7",
57 | "tslib": "~2.0.0"
58 | }
59 | },
60 | "node_modules/@nativescript/hook": {
61 | "version": "2.0.0",
62 | "resolved": "https://registry.npmjs.org/@nativescript/hook/-/hook-2.0.0.tgz",
63 | "integrity": "sha512-v3Hj3Zpd69sQJfFpDNXonV0EjO1a2OL4l48wlo1Ycsqk4r7RY822d/irFTjt0LllRG0OcdEGgfG6wKb0YgPyHw==",
64 | "dev": true,
65 | "dependencies": {
66 | "glob": "^7.1.0",
67 | "mkdirp": "^1.0.4"
68 | }
69 | },
70 | "node_modules/@nativescript/types": {
71 | "version": "7.0.4",
72 | "resolved": "https://registry.npmjs.org/@nativescript/types/-/types-7.0.4.tgz",
73 | "integrity": "sha512-G01GlQm2aZEF05XBXxpyPd8XJE5EXrDRyR2q6vrowAIgSY5KaJXu6YjXz9Zfwmn7tvoyWlFsgxaZy2vPFUcsFQ==",
74 | "dev": true,
75 | "dependencies": {
76 | "@nativescript/types-android": "7.0.4",
77 | "@nativescript/types-ios": "7.0.4"
78 | }
79 | },
80 | "node_modules/@nativescript/types-android": {
81 | "version": "7.0.4",
82 | "resolved": "https://registry.npmjs.org/@nativescript/types-android/-/types-android-7.0.4.tgz",
83 | "integrity": "sha512-atXLPLZ8Kice6WybGAWXB5H2I2yLPwRjcwU7ncpIQ6qD0RvV/hM052fXWHP0k9rUuc9xLrGrZ892Ec1AjNLctQ==",
84 | "dev": true
85 | },
86 | "node_modules/@nativescript/types-ios": {
87 | "version": "7.0.4",
88 | "resolved": "https://registry.npmjs.org/@nativescript/types-ios/-/types-ios-7.0.4.tgz",
89 | "integrity": "sha512-ZydVuj5gMf8L+aJMUhlp1qCM/krkVnEWlykdxnAfUwh+BtDHJd3Tq3H6w9UZnyJyvfqZCkRrpIrNAIgOQ9MuTQ==",
90 | "dev": true
91 | },
92 | "node_modules/ansi-styles": {
93 | "version": "3.2.1",
94 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
95 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
96 | "dev": true,
97 | "dependencies": {
98 | "color-convert": "^1.9.0"
99 | },
100 | "engines": {
101 | "node": ">=4"
102 | }
103 | },
104 | "node_modules/argparse": {
105 | "version": "1.0.10",
106 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
107 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
108 | "dev": true,
109 | "dependencies": {
110 | "sprintf-js": "~1.0.2"
111 | }
112 | },
113 | "node_modules/balanced-match": {
114 | "version": "1.0.0",
115 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
116 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
117 | "dev": true
118 | },
119 | "node_modules/brace-expansion": {
120 | "version": "1.1.11",
121 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
122 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
123 | "dev": true,
124 | "dependencies": {
125 | "balanced-match": "^1.0.0",
126 | "concat-map": "0.0.1"
127 | }
128 | },
129 | "node_modules/builtin-modules": {
130 | "version": "1.1.1",
131 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
132 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
133 | "dev": true,
134 | "engines": {
135 | "node": ">=0.10.0"
136 | }
137 | },
138 | "node_modules/chalk": {
139 | "version": "2.4.2",
140 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
141 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
142 | "dev": true,
143 | "dependencies": {
144 | "ansi-styles": "^3.2.1",
145 | "escape-string-regexp": "^1.0.5",
146 | "supports-color": "^5.3.0"
147 | },
148 | "engines": {
149 | "node": ">=4"
150 | }
151 | },
152 | "node_modules/color-convert": {
153 | "version": "1.9.3",
154 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
155 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
156 | "dev": true,
157 | "dependencies": {
158 | "color-name": "1.1.3"
159 | }
160 | },
161 | "node_modules/color-name": {
162 | "version": "1.1.3",
163 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
164 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
165 | "dev": true
166 | },
167 | "node_modules/commander": {
168 | "version": "2.20.3",
169 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
170 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
171 | "dev": true
172 | },
173 | "node_modules/concat-map": {
174 | "version": "0.0.1",
175 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
176 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
177 | "dev": true
178 | },
179 | "node_modules/css-tree": {
180 | "version": "1.0.0-alpha.39",
181 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz",
182 | "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==",
183 | "dev": true,
184 | "dependencies": {
185 | "mdn-data": "2.0.6",
186 | "source-map": "^0.6.1"
187 | },
188 | "engines": {
189 | "node": ">=8.0.0"
190 | }
191 | },
192 | "node_modules/css-unit-converter": {
193 | "version": "1.1.2",
194 | "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz",
195 | "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==",
196 | "dev": true
197 | },
198 | "node_modules/diff": {
199 | "version": "4.0.2",
200 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
201 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
202 | "dev": true,
203 | "engines": {
204 | "node": ">=0.3.1"
205 | }
206 | },
207 | "node_modules/escape-string-regexp": {
208 | "version": "1.0.5",
209 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
210 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
211 | "dev": true,
212 | "engines": {
213 | "node": ">=0.8.0"
214 | }
215 | },
216 | "node_modules/esprima": {
217 | "version": "4.0.1",
218 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
219 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
220 | "dev": true,
221 | "bin": {
222 | "esparse": "bin/esparse.js",
223 | "esvalidate": "bin/esvalidate.js"
224 | },
225 | "engines": {
226 | "node": ">=4"
227 | }
228 | },
229 | "node_modules/fs.realpath": {
230 | "version": "1.0.0",
231 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
232 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
233 | "dev": true
234 | },
235 | "node_modules/glob": {
236 | "version": "7.1.6",
237 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
238 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
239 | "dev": true,
240 | "dependencies": {
241 | "fs.realpath": "^1.0.0",
242 | "inflight": "^1.0.4",
243 | "inherits": "2",
244 | "minimatch": "^3.0.4",
245 | "once": "^1.3.0",
246 | "path-is-absolute": "^1.0.0"
247 | },
248 | "engines": {
249 | "node": "*"
250 | }
251 | },
252 | "node_modules/has-flag": {
253 | "version": "3.0.0",
254 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
255 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
256 | "dev": true,
257 | "engines": {
258 | "node": ">=4"
259 | }
260 | },
261 | "node_modules/inflight": {
262 | "version": "1.0.6",
263 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
264 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
265 | "dev": true,
266 | "dependencies": {
267 | "once": "^1.3.0",
268 | "wrappy": "1"
269 | }
270 | },
271 | "node_modules/inherits": {
272 | "version": "2.0.3",
273 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
274 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
275 | "dev": true
276 | },
277 | "node_modules/js-tokens": {
278 | "version": "4.0.0",
279 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
280 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
281 | "dev": true
282 | },
283 | "node_modules/js-yaml": {
284 | "version": "3.14.0",
285 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
286 | "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
287 | "dev": true,
288 | "dependencies": {
289 | "argparse": "^1.0.7",
290 | "esprima": "^4.0.0"
291 | },
292 | "bin": {
293 | "js-yaml": "bin/js-yaml.js"
294 | }
295 | },
296 | "node_modules/mdn-data": {
297 | "version": "2.0.6",
298 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz",
299 | "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==",
300 | "dev": true
301 | },
302 | "node_modules/minimatch": {
303 | "version": "3.0.4",
304 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
305 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
306 | "dev": true,
307 | "dependencies": {
308 | "brace-expansion": "^1.1.7"
309 | },
310 | "engines": {
311 | "node": "*"
312 | }
313 | },
314 | "node_modules/minimist": {
315 | "version": "1.2.5",
316 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
317 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
318 | "dev": true
319 | },
320 | "node_modules/mkdirp": {
321 | "version": "1.0.4",
322 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
323 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
324 | "dev": true,
325 | "bin": {
326 | "mkdirp": "bin/cmd.js"
327 | },
328 | "engines": {
329 | "node": ">=10"
330 | }
331 | },
332 | "node_modules/nativescript-hook": {
333 | "version": "0.2.5",
334 | "resolved": "https://registry.npmjs.org/nativescript-hook/-/nativescript-hook-0.2.5.tgz",
335 | "integrity": "sha512-ciGJtNbtMB2lGv8jAkUripkRjd3g8atX9VYPSt6e8PI6YPiOKeoma3xjcXoW66pFMYpHnfrbp6Mq9U/QtiQrVg==",
336 | "dev": true,
337 | "dependencies": {
338 | "glob": "^6.0.1",
339 | "mkdirp": "^0.5.1"
340 | }
341 | },
342 | "node_modules/nativescript-hook/node_modules/glob": {
343 | "version": "6.0.4",
344 | "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
345 | "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
346 | "dev": true,
347 | "dependencies": {
348 | "inflight": "^1.0.4",
349 | "inherits": "2",
350 | "minimatch": "2 || 3",
351 | "once": "^1.3.0",
352 | "path-is-absolute": "^1.0.0"
353 | },
354 | "engines": {
355 | "node": "*"
356 | }
357 | },
358 | "node_modules/nativescript-hook/node_modules/mkdirp": {
359 | "version": "0.5.5",
360 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
361 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
362 | "dev": true,
363 | "dependencies": {
364 | "minimist": "^1.2.5"
365 | },
366 | "bin": {
367 | "mkdirp": "bin/cmd.js"
368 | }
369 | },
370 | "node_modules/once": {
371 | "version": "1.4.0",
372 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
373 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
374 | "dev": true,
375 | "dependencies": {
376 | "wrappy": "1"
377 | }
378 | },
379 | "node_modules/path-is-absolute": {
380 | "version": "1.0.1",
381 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
382 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
383 | "dev": true,
384 | "engines": {
385 | "node": ">=0.10.0"
386 | }
387 | },
388 | "node_modules/path-parse": {
389 | "version": "1.0.7",
390 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
391 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
392 | "dev": true
393 | },
394 | "node_modules/postcss-value-parser": {
395 | "version": "3.3.1",
396 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
397 | "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
398 | "dev": true
399 | },
400 | "node_modules/reduce-css-calc": {
401 | "version": "2.1.7",
402 | "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.7.tgz",
403 | "integrity": "sha512-fDnlZ+AybAS3C7Q9xDq5y8A2z+lT63zLbynew/lur/IR24OQF5x98tfNwf79mzEdfywZ0a2wpM860FhFfMxZlA==",
404 | "dev": true,
405 | "dependencies": {
406 | "css-unit-converter": "^1.1.1",
407 | "postcss-value-parser": "^3.3.0"
408 | }
409 | },
410 | "node_modules/resolve": {
411 | "version": "1.17.0",
412 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
413 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
414 | "dev": true,
415 | "dependencies": {
416 | "path-parse": "^1.0.6"
417 | }
418 | },
419 | "node_modules/rimraf": {
420 | "version": "3.0.2",
421 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
422 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
423 | "dev": true,
424 | "dependencies": {
425 | "glob": "^7.1.3"
426 | },
427 | "bin": {
428 | "rimraf": "bin.js"
429 | }
430 | },
431 | "node_modules/semver": {
432 | "version": "5.5.1",
433 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz",
434 | "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==",
435 | "dev": true,
436 | "bin": {
437 | "semver": "bin/semver"
438 | }
439 | },
440 | "node_modules/source-map": {
441 | "version": "0.6.1",
442 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
443 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
444 | "dev": true,
445 | "engines": {
446 | "node": ">=0.10.0"
447 | }
448 | },
449 | "node_modules/sprintf-js": {
450 | "version": "1.0.3",
451 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
452 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
453 | "dev": true
454 | },
455 | "node_modules/supports-color": {
456 | "version": "5.5.0",
457 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
458 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
459 | "dev": true,
460 | "dependencies": {
461 | "has-flag": "^3.0.0"
462 | },
463 | "engines": {
464 | "node": ">=4"
465 | }
466 | },
467 | "node_modules/tns-core-modules": {
468 | "version": "6.5.27",
469 | "resolved": "https://registry.npmjs.org/tns-core-modules/-/tns-core-modules-6.5.27.tgz",
470 | "integrity": "sha512-tvB8FmWeJvmzLLrTr4V6N/Dt/fNI1PzNQI0YAX0KVIkGMfvKVXQYXC8b0yhIcGiNrQRjlXLlkqA4FwmRXWsxkw==",
471 | "dev": true,
472 | "dependencies": {
473 | "@nativescript/core": "6.5.27"
474 | }
475 | },
476 | "node_modules/tns-core-modules-widgets": {
477 | "version": "6.5.10",
478 | "resolved": "https://registry.npmjs.org/tns-core-modules-widgets/-/tns-core-modules-widgets-6.5.10.tgz",
479 | "integrity": "sha512-esZPbnm0wIn89AoFxdfhFuG0a/JE9A9k3ovBRpzs9O9d/JrChlgkTX4lSRQz6xBHLC1UVaqiTc/DNBGbdaeCyA==",
480 | "dev": true
481 | },
482 | "node_modules/tns-core-modules/node_modules/@nativescript/core": {
483 | "version": "6.5.27",
484 | "resolved": "https://registry.npmjs.org/@nativescript/core/-/core-6.5.27.tgz",
485 | "integrity": "sha512-vqeTqHjJz5y16d23TbJAJFiNnYQTmGf9spAFEHSrTSRk0w1rv38FSxDzwYEb8QYFJffBU37IWnOSNJB3ajIhDw==",
486 | "dev": true,
487 | "hasInstallScript": true,
488 | "dependencies": {
489 | "css-tree": "^1.0.0-alpha.37",
490 | "nativescript-hook": "0.2.5",
491 | "reduce-css-calc": "^2.1.6",
492 | "semver": "6.3.0",
493 | "tns-core-modules-widgets": "latest",
494 | "tslib": "1.10.0"
495 | }
496 | },
497 | "node_modules/tns-core-modules/node_modules/semver": {
498 | "version": "6.3.0",
499 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
500 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
501 | "dev": true,
502 | "bin": {
503 | "semver": "bin/semver.js"
504 | }
505 | },
506 | "node_modules/tns-core-modules/node_modules/tslib": {
507 | "version": "1.10.0",
508 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
509 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
510 | "dev": true
511 | },
512 | "node_modules/tns-platform-declarations": {
513 | "version": "6.5.15",
514 | "resolved": "https://registry.npmjs.org/tns-platform-declarations/-/tns-platform-declarations-6.5.15.tgz",
515 | "integrity": "sha512-gCUt2rjPTndp0K6xrgo6tFJvmkAsVOnIvebUUXMdLsNrJScs+OX4pL4DeIGMHGm/ciLqBlG5ZPkTOi8ZJCZuAQ==",
516 | "dev": true
517 | },
518 | "node_modules/tslib": {
519 | "version": "2.0.3",
520 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
521 | "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==",
522 | "dev": true
523 | },
524 | "node_modules/tslint": {
525 | "version": "6.1.3",
526 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz",
527 | "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==",
528 | "dev": true,
529 | "dependencies": {
530 | "@babel/code-frame": "^7.0.0",
531 | "builtin-modules": "^1.1.1",
532 | "chalk": "^2.3.0",
533 | "commander": "^2.12.1",
534 | "diff": "^4.0.1",
535 | "glob": "^7.1.1",
536 | "js-yaml": "^3.13.1",
537 | "minimatch": "^3.0.4",
538 | "mkdirp": "^0.5.3",
539 | "resolve": "^1.3.2",
540 | "semver": "^5.3.0",
541 | "tslib": "^1.13.0",
542 | "tsutils": "^2.29.0"
543 | },
544 | "bin": {
545 | "tslint": "bin/tslint"
546 | },
547 | "engines": {
548 | "node": ">=4.8.0"
549 | }
550 | },
551 | "node_modules/tslint/node_modules/mkdirp": {
552 | "version": "0.5.5",
553 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
554 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
555 | "dev": true,
556 | "dependencies": {
557 | "minimist": "^1.2.5"
558 | },
559 | "bin": {
560 | "mkdirp": "bin/cmd.js"
561 | }
562 | },
563 | "node_modules/tslint/node_modules/tslib": {
564 | "version": "1.13.0",
565 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
566 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
567 | "dev": true
568 | },
569 | "node_modules/tsutils": {
570 | "version": "2.29.0",
571 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
572 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
573 | "dev": true,
574 | "dependencies": {
575 | "tslib": "^1.8.1"
576 | }
577 | },
578 | "node_modules/tsutils/node_modules/tslib": {
579 | "version": "1.13.0",
580 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
581 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
582 | "dev": true
583 | },
584 | "node_modules/typescript": {
585 | "version": "3.9.7",
586 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz",
587 | "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==",
588 | "dev": true,
589 | "bin": {
590 | "tsc": "bin/tsc",
591 | "tsserver": "bin/tsserver"
592 | },
593 | "engines": {
594 | "node": ">=4.2.0"
595 | }
596 | },
597 | "node_modules/wrappy": {
598 | "version": "1.0.2",
599 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
600 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
601 | "dev": true
602 | }
603 | },
604 | "dependencies": {
605 | "@babel/code-frame": {
606 | "version": "7.10.4",
607 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
608 | "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
609 | "dev": true,
610 | "requires": {
611 | "@babel/highlight": "^7.10.4"
612 | }
613 | },
614 | "@babel/helper-validator-identifier": {
615 | "version": "7.10.4",
616 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
617 | "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
618 | "dev": true
619 | },
620 | "@babel/highlight": {
621 | "version": "7.10.4",
622 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
623 | "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
624 | "dev": true,
625 | "requires": {
626 | "@babel/helper-validator-identifier": "^7.10.4",
627 | "chalk": "^2.0.0",
628 | "js-tokens": "^4.0.0"
629 | }
630 | },
631 | "@nativescript/core": {
632 | "version": "7.0.13",
633 | "resolved": "https://registry.npmjs.org/@nativescript/core/-/core-7.0.13.tgz",
634 | "integrity": "sha512-mB/MA4H7u0KuB0M4GLX2B0Yhii1r6u1WLhRrH6Yi8ixQNMMyXo8OFRxbXWTGj8TEOVPkljExRyOw24QMLc70AA==",
635 | "dev": true,
636 | "requires": {
637 | "@nativescript/hook": "~2.0.0",
638 | "css-tree": "^1.0.0-alpha.39",
639 | "reduce-css-calc": "^2.1.7",
640 | "tslib": "~2.0.0"
641 | }
642 | },
643 | "@nativescript/hook": {
644 | "version": "2.0.0",
645 | "resolved": "https://registry.npmjs.org/@nativescript/hook/-/hook-2.0.0.tgz",
646 | "integrity": "sha512-v3Hj3Zpd69sQJfFpDNXonV0EjO1a2OL4l48wlo1Ycsqk4r7RY822d/irFTjt0LllRG0OcdEGgfG6wKb0YgPyHw==",
647 | "dev": true,
648 | "requires": {
649 | "glob": "^7.1.0",
650 | "mkdirp": "^1.0.4"
651 | }
652 | },
653 | "@nativescript/types": {
654 | "version": "7.0.4",
655 | "resolved": "https://registry.npmjs.org/@nativescript/types/-/types-7.0.4.tgz",
656 | "integrity": "sha512-G01GlQm2aZEF05XBXxpyPd8XJE5EXrDRyR2q6vrowAIgSY5KaJXu6YjXz9Zfwmn7tvoyWlFsgxaZy2vPFUcsFQ==",
657 | "dev": true,
658 | "requires": {
659 | "@nativescript/types-android": "7.0.4",
660 | "@nativescript/types-ios": "7.0.4"
661 | }
662 | },
663 | "@nativescript/types-android": {
664 | "version": "7.0.4",
665 | "resolved": "https://registry.npmjs.org/@nativescript/types-android/-/types-android-7.0.4.tgz",
666 | "integrity": "sha512-atXLPLZ8Kice6WybGAWXB5H2I2yLPwRjcwU7ncpIQ6qD0RvV/hM052fXWHP0k9rUuc9xLrGrZ892Ec1AjNLctQ==",
667 | "dev": true
668 | },
669 | "@nativescript/types-ios": {
670 | "version": "7.0.4",
671 | "resolved": "https://registry.npmjs.org/@nativescript/types-ios/-/types-ios-7.0.4.tgz",
672 | "integrity": "sha512-ZydVuj5gMf8L+aJMUhlp1qCM/krkVnEWlykdxnAfUwh+BtDHJd3Tq3H6w9UZnyJyvfqZCkRrpIrNAIgOQ9MuTQ==",
673 | "dev": true
674 | },
675 | "ansi-styles": {
676 | "version": "3.2.1",
677 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
678 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
679 | "dev": true,
680 | "requires": {
681 | "color-convert": "^1.9.0"
682 | }
683 | },
684 | "argparse": {
685 | "version": "1.0.10",
686 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
687 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
688 | "dev": true,
689 | "requires": {
690 | "sprintf-js": "~1.0.2"
691 | }
692 | },
693 | "balanced-match": {
694 | "version": "1.0.0",
695 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
696 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
697 | "dev": true
698 | },
699 | "brace-expansion": {
700 | "version": "1.1.11",
701 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
702 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
703 | "dev": true,
704 | "requires": {
705 | "balanced-match": "^1.0.0",
706 | "concat-map": "0.0.1"
707 | }
708 | },
709 | "builtin-modules": {
710 | "version": "1.1.1",
711 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
712 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
713 | "dev": true
714 | },
715 | "chalk": {
716 | "version": "2.4.2",
717 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
718 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
719 | "dev": true,
720 | "requires": {
721 | "ansi-styles": "^3.2.1",
722 | "escape-string-regexp": "^1.0.5",
723 | "supports-color": "^5.3.0"
724 | }
725 | },
726 | "color-convert": {
727 | "version": "1.9.3",
728 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
729 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
730 | "dev": true,
731 | "requires": {
732 | "color-name": "1.1.3"
733 | }
734 | },
735 | "color-name": {
736 | "version": "1.1.3",
737 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
738 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
739 | "dev": true
740 | },
741 | "commander": {
742 | "version": "2.20.3",
743 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
744 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
745 | "dev": true
746 | },
747 | "concat-map": {
748 | "version": "0.0.1",
749 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
750 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
751 | "dev": true
752 | },
753 | "css-tree": {
754 | "version": "1.0.0-alpha.39",
755 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz",
756 | "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==",
757 | "dev": true,
758 | "requires": {
759 | "mdn-data": "2.0.6",
760 | "source-map": "^0.6.1"
761 | }
762 | },
763 | "css-unit-converter": {
764 | "version": "1.1.2",
765 | "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz",
766 | "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==",
767 | "dev": true
768 | },
769 | "diff": {
770 | "version": "4.0.2",
771 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
772 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
773 | "dev": true
774 | },
775 | "escape-string-regexp": {
776 | "version": "1.0.5",
777 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
778 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
779 | "dev": true
780 | },
781 | "esprima": {
782 | "version": "4.0.1",
783 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
784 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
785 | "dev": true
786 | },
787 | "fs.realpath": {
788 | "version": "1.0.0",
789 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
790 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
791 | "dev": true
792 | },
793 | "glob": {
794 | "version": "7.1.6",
795 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
796 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
797 | "dev": true,
798 | "requires": {
799 | "fs.realpath": "^1.0.0",
800 | "inflight": "^1.0.4",
801 | "inherits": "2",
802 | "minimatch": "^3.0.4",
803 | "once": "^1.3.0",
804 | "path-is-absolute": "^1.0.0"
805 | }
806 | },
807 | "has-flag": {
808 | "version": "3.0.0",
809 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
810 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
811 | "dev": true
812 | },
813 | "inflight": {
814 | "version": "1.0.6",
815 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
816 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
817 | "dev": true,
818 | "requires": {
819 | "once": "^1.3.0",
820 | "wrappy": "1"
821 | }
822 | },
823 | "inherits": {
824 | "version": "2.0.3",
825 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
826 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
827 | "dev": true
828 | },
829 | "js-tokens": {
830 | "version": "4.0.0",
831 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
832 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
833 | "dev": true
834 | },
835 | "js-yaml": {
836 | "version": "3.14.0",
837 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
838 | "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
839 | "dev": true,
840 | "requires": {
841 | "argparse": "^1.0.7",
842 | "esprima": "^4.0.0"
843 | }
844 | },
845 | "mdn-data": {
846 | "version": "2.0.6",
847 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz",
848 | "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==",
849 | "dev": true
850 | },
851 | "minimatch": {
852 | "version": "3.0.4",
853 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
854 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
855 | "dev": true,
856 | "requires": {
857 | "brace-expansion": "^1.1.7"
858 | }
859 | },
860 | "minimist": {
861 | "version": "1.2.5",
862 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
863 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
864 | "dev": true
865 | },
866 | "mkdirp": {
867 | "version": "1.0.4",
868 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
869 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
870 | "dev": true
871 | },
872 | "nativescript-hook": {
873 | "version": "0.2.5",
874 | "resolved": "https://registry.npmjs.org/nativescript-hook/-/nativescript-hook-0.2.5.tgz",
875 | "integrity": "sha512-ciGJtNbtMB2lGv8jAkUripkRjd3g8atX9VYPSt6e8PI6YPiOKeoma3xjcXoW66pFMYpHnfrbp6Mq9U/QtiQrVg==",
876 | "dev": true,
877 | "requires": {
878 | "glob": "^6.0.1",
879 | "mkdirp": "^0.5.1"
880 | },
881 | "dependencies": {
882 | "glob": {
883 | "version": "6.0.4",
884 | "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
885 | "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
886 | "dev": true,
887 | "requires": {
888 | "inflight": "^1.0.4",
889 | "inherits": "2",
890 | "minimatch": "2 || 3",
891 | "once": "^1.3.0",
892 | "path-is-absolute": "^1.0.0"
893 | }
894 | },
895 | "mkdirp": {
896 | "version": "0.5.5",
897 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
898 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
899 | "dev": true,
900 | "requires": {
901 | "minimist": "^1.2.5"
902 | }
903 | }
904 | }
905 | },
906 | "once": {
907 | "version": "1.4.0",
908 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
909 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
910 | "dev": true,
911 | "requires": {
912 | "wrappy": "1"
913 | }
914 | },
915 | "path-is-absolute": {
916 | "version": "1.0.1",
917 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
918 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
919 | "dev": true
920 | },
921 | "path-parse": {
922 | "version": "1.0.7",
923 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
924 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
925 | "dev": true
926 | },
927 | "postcss-value-parser": {
928 | "version": "3.3.1",
929 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
930 | "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
931 | "dev": true
932 | },
933 | "reduce-css-calc": {
934 | "version": "2.1.7",
935 | "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.7.tgz",
936 | "integrity": "sha512-fDnlZ+AybAS3C7Q9xDq5y8A2z+lT63zLbynew/lur/IR24OQF5x98tfNwf79mzEdfywZ0a2wpM860FhFfMxZlA==",
937 | "dev": true,
938 | "requires": {
939 | "css-unit-converter": "^1.1.1",
940 | "postcss-value-parser": "^3.3.0"
941 | }
942 | },
943 | "resolve": {
944 | "version": "1.17.0",
945 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
946 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
947 | "dev": true,
948 | "requires": {
949 | "path-parse": "^1.0.6"
950 | }
951 | },
952 | "rimraf": {
953 | "version": "3.0.2",
954 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
955 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
956 | "dev": true,
957 | "requires": {
958 | "glob": "^7.1.3"
959 | }
960 | },
961 | "semver": {
962 | "version": "5.5.1",
963 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz",
964 | "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==",
965 | "dev": true
966 | },
967 | "source-map": {
968 | "version": "0.6.1",
969 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
970 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
971 | "dev": true
972 | },
973 | "sprintf-js": {
974 | "version": "1.0.3",
975 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
976 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
977 | "dev": true
978 | },
979 | "supports-color": {
980 | "version": "5.5.0",
981 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
982 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
983 | "dev": true,
984 | "requires": {
985 | "has-flag": "^3.0.0"
986 | }
987 | },
988 | "tns-core-modules": {
989 | "version": "6.5.27",
990 | "resolved": "https://registry.npmjs.org/tns-core-modules/-/tns-core-modules-6.5.27.tgz",
991 | "integrity": "sha512-tvB8FmWeJvmzLLrTr4V6N/Dt/fNI1PzNQI0YAX0KVIkGMfvKVXQYXC8b0yhIcGiNrQRjlXLlkqA4FwmRXWsxkw==",
992 | "dev": true,
993 | "requires": {
994 | "@nativescript/core": "6.5.27"
995 | },
996 | "dependencies": {
997 | "@nativescript/core": {
998 | "version": "6.5.27",
999 | "resolved": "https://registry.npmjs.org/@nativescript/core/-/core-6.5.27.tgz",
1000 | "integrity": "sha512-vqeTqHjJz5y16d23TbJAJFiNnYQTmGf9spAFEHSrTSRk0w1rv38FSxDzwYEb8QYFJffBU37IWnOSNJB3ajIhDw==",
1001 | "dev": true,
1002 | "requires": {
1003 | "css-tree": "^1.0.0-alpha.37",
1004 | "nativescript-hook": "0.2.5",
1005 | "reduce-css-calc": "^2.1.6",
1006 | "semver": "6.3.0",
1007 | "tns-core-modules-widgets": "latest",
1008 | "tslib": "1.10.0"
1009 | }
1010 | },
1011 | "semver": {
1012 | "version": "6.3.0",
1013 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1014 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
1015 | "dev": true
1016 | },
1017 | "tslib": {
1018 | "version": "1.10.0",
1019 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
1020 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
1021 | "dev": true
1022 | }
1023 | }
1024 | },
1025 | "tns-core-modules-widgets": {
1026 | "version": "6.5.10",
1027 | "resolved": "https://registry.npmjs.org/tns-core-modules-widgets/-/tns-core-modules-widgets-6.5.10.tgz",
1028 | "integrity": "sha512-esZPbnm0wIn89AoFxdfhFuG0a/JE9A9k3ovBRpzs9O9d/JrChlgkTX4lSRQz6xBHLC1UVaqiTc/DNBGbdaeCyA==",
1029 | "dev": true
1030 | },
1031 | "tns-platform-declarations": {
1032 | "version": "6.5.15",
1033 | "resolved": "https://registry.npmjs.org/tns-platform-declarations/-/tns-platform-declarations-6.5.15.tgz",
1034 | "integrity": "sha512-gCUt2rjPTndp0K6xrgo6tFJvmkAsVOnIvebUUXMdLsNrJScs+OX4pL4DeIGMHGm/ciLqBlG5ZPkTOi8ZJCZuAQ==",
1035 | "dev": true
1036 | },
1037 | "tslib": {
1038 | "version": "2.0.3",
1039 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
1040 | "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==",
1041 | "dev": true
1042 | },
1043 | "tslint": {
1044 | "version": "6.1.3",
1045 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz",
1046 | "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==",
1047 | "dev": true,
1048 | "requires": {
1049 | "@babel/code-frame": "^7.0.0",
1050 | "builtin-modules": "^1.1.1",
1051 | "chalk": "^2.3.0",
1052 | "commander": "^2.12.1",
1053 | "diff": "^4.0.1",
1054 | "glob": "^7.1.1",
1055 | "js-yaml": "^3.13.1",
1056 | "minimatch": "^3.0.4",
1057 | "mkdirp": "^0.5.3",
1058 | "resolve": "^1.3.2",
1059 | "semver": "^5.3.0",
1060 | "tslib": "^1.13.0",
1061 | "tsutils": "^2.29.0"
1062 | },
1063 | "dependencies": {
1064 | "mkdirp": {
1065 | "version": "0.5.5",
1066 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
1067 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
1068 | "dev": true,
1069 | "requires": {
1070 | "minimist": "^1.2.5"
1071 | }
1072 | },
1073 | "tslib": {
1074 | "version": "1.13.0",
1075 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
1076 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
1077 | "dev": true
1078 | }
1079 | }
1080 | },
1081 | "tsutils": {
1082 | "version": "2.29.0",
1083 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
1084 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
1085 | "dev": true,
1086 | "requires": {
1087 | "tslib": "^1.8.1"
1088 | },
1089 | "dependencies": {
1090 | "tslib": {
1091 | "version": "1.13.0",
1092 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
1093 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
1094 | "dev": true
1095 | }
1096 | }
1097 | },
1098 | "typescript": {
1099 | "version": "3.9.7",
1100 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz",
1101 | "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==",
1102 | "dev": true
1103 | },
1104 | "wrappy": {
1105 | "version": "1.0.2",
1106 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1107 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
1108 | "dev": true
1109 | }
1110 | }
1111 | }
1112 |
--------------------------------------------------------------------------------
/src/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nativescript-vosk",
3 | "version": "0.3.32",
4 | "description": "Speech recognition plugin using Vosk library.",
5 | "main": "speech-recognition-vosk",
6 | "typings": "index.d.ts",
7 | "nativescript": {
8 | "platforms": {
9 | "android": "3.0.0"
10 | }
11 | },
12 | "scripts": {
13 | "tsc": "tsc -skipLibCheck",
14 | "build": "npm i && npm run tsc",
15 | "postclone": "npm i && cd ../demo && npm i && cd ../src && npm run plugin.link",
16 | "test.android": "npm i && npm run tsc && npm run tslint && cd ../demo && tns build android && tns test android --justlaunch",
17 | "test.ios": "npm i && npm run tsc && npm run tslint && cd ../demo && tns build ios && tns test ios --justlaunch",
18 | "tslint": "cd .. && tslint \"**/*.ts\" --config tslint.json --exclude \"**/node_modules/**\"",
19 | "plugin.link": "npm link && cd ../demo && npm link nativescript-speech-recognition && cd ../src",
20 | "plugin.tscwatch": "npm run tsc -- -w",
21 | "demo.ios": "npm run build && cd ../demo && tns run ios",
22 | "demo.android": "npm run build && cd ../demo && tns run android",
23 | "demo.android.clean": "npm run build && cd ../demo && tns plugin remove nativescript-speech-recognition && tns plugin add ../src && tns run android",
24 | "demo.reset": "cd ../demo && rimraf platforms",
25 | "plugin.prepare": "npm run tsc && cd ../demo && tns plugin remove nativescript-speech-recognition && tns plugin add ../src",
26 | "clean": "cd ../demo && rimraf hooks node_modules platforms && cd ../src && rimraf node_modules && npm run plugin.link",
27 | "ci.tslint": "npm i && tslint '**/*.ts' --config '../tslint.json' --exclude '**/node_modules/**'",
28 | "changelog": "conventional-changelog -i ../CHANGELOG.md -s -r 0",
29 | "changelog:add": "git add ../CHANGELOG.md && git commit -m 'updated CHANGELOG.md'"
30 | },
31 | "repository": {
32 | "type": "git",
33 | "url": "https://github.com/alphacep/nativescript-vosk.git"
34 | },
35 | "keywords": [
36 | "NativeScript",
37 | "JavaScript",
38 | "iOS",
39 | "Siri",
40 | "Speech to text",
41 | "Speech",
42 | "Recognition",
43 | "Voice",
44 | "Vosk"
45 | ],
46 | "author": {
47 | "name": "Alpha Cephei Inc.",
48 | "email": "contact@alphacephei.com"
49 | },
50 | "contributors": [
51 | {
52 | "name": "Eddy Verbruggen",
53 | "email": "eddyverbruggen@gmail.com"
54 | },
55 | {
56 | "name": "Brad Martin",
57 | "email": "bradwaynemartin@gmail.com",
58 | "url": "https://github.com/bradmartin"
59 | }
60 | ],
61 | "bugs": {
62 | "url": "https://github.com/alphacep/nativescript-vosk/issues"
63 | },
64 | "license": "Apache 2.0",
65 | "homepage": "https://github.com/alphacep/nativescript-vosk",
66 | "readmeFilename": "README.md",
67 | "devDependencies": {
68 | "@nativescript/core": "~7.0.5",
69 | "@nativescript/types": "~7.0.4",
70 | "rimraf": "^3.0.2",
71 | "tns-core-modules": "^6.0.0",
72 | "tns-platform-declarations": "^6.0.0",
73 | "tslint": "~6.1.3",
74 | "typescript": "~3.9.7"
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/src/platforms/android/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/src/platforms/android/include.gradle:
--------------------------------------------------------------------------------
1 | /* Include.gradle configuration: http://docs.nativescript.org/plugins/plugins#includegradle-specification */
2 |
3 | android {
4 |
5 | }
6 |
7 | repositories {
8 | mavenCentral()
9 | mavenLocal()
10 | maven {
11 | url "https://alphacephei.com/maven"
12 | }
13 | }
14 |
15 | dependencies {
16 | implementation 'net.java.dev.jna:jna:5.8.0@aar'
17 | implementation group: 'com.alphacephei', name: 'vosk-android', version: '0.3.31'
18 | implementation group: 'com.alphacephei', name: 'vosk-model-en', version: '0.3.31'
19 | }
20 |
21 |
--------------------------------------------------------------------------------
/src/references.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 | ///
3 | ///
4 |
--------------------------------------------------------------------------------
/src/speech-recognition-vosk-jni.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
3 | declare module org {
4 | export module vosk {
5 | export class LogLevel {
6 | public static class: java.lang.Class;
7 | public static WARNINGS: org.vosk.LogLevel;
8 | public static INFO: org.vosk.LogLevel;
9 | public static DEBUG: org.vosk.LogLevel;
10 | public getValue(): number;
11 | public static values(): androidNative.Array;
12 | public static valueOf(param0: string): org.vosk.LogLevel;
13 | }
14 | }
15 | }
16 |
17 | declare module org {
18 | export module vosk {
19 | export class Model {
20 | public static class: java.lang.Class;
21 | public constructor();
22 | public close(): void;
23 | public constructor(param0: string);
24 | }
25 | }
26 | }
27 |
28 | declare module org {
29 | export module vosk {
30 | export class Recognizer {
31 | public static class: java.lang.Class;
32 | public getResult(): string;
33 | public getFinalResult(): string;
34 | public constructor(param0: org.vosk.Model, param1: number);
35 | public acceptWaveForm(param0: androidNative.Array, param1: number): boolean;
36 | public constructor(param0: org.vosk.Model, param1: number, param2: org.vosk.SpeakerModel);
37 | public getPartialResult(): string;
38 | public setSpeakerModel(param0: org.vosk.SpeakerModel): void;
39 | public reset(): void;
40 | public close(): void;
41 | public constructor(param0: org.vosk.Model, param1: number, param2: string);
42 | public setMaxAlternatives(param0: number): void;
43 | public setWords(param0: boolean): void;
44 | }
45 | }
46 | }
47 |
48 | declare module org {
49 | export module vosk {
50 | export class SpeakerModel {
51 | public static class: java.lang.Class;
52 | public constructor();
53 | public close(): void;
54 | public constructor(param0: string);
55 | }
56 | }
57 | }
58 |
59 | declare module org {
60 | export module vosk {
61 | export module android {
62 | export class RecognitionListener {
63 | public static class: java.lang.Class;
64 | /**
65 | * Constructs a new instance of the org.vosk.android.RecognitionListener interface with the provided implementation. An empty constructor exists calling super() when extending the interface class.
66 | */
67 | public constructor(implementation: {
68 | onPartialResult(param0: string): void;
69 | onResult(param0: string): void;
70 | onFinalResult(param0: string): void;
71 | onError(param0: java.lang.Exception): void;
72 | onTimeout(): void;
73 | });
74 | public constructor();
75 | public onFinalResult(param0: string): void;
76 | public onResult(param0: string): void;
77 | public onPartialResult(param0: string): void;
78 | public onError(param0: java.lang.Exception): void;
79 | public onTimeout(): void;
80 | }
81 | }
82 | }
83 | }
84 |
85 | declare module org {
86 | export module vosk {
87 | export module android {
88 | export class SpeechService {
89 | public static class: java.lang.Class;
90 | public constructor(param0: org.vosk.Recognizer, param1: number);
91 | public startListening(param0: org.vosk.android.RecognitionListener, param1: number): boolean;
92 | public stop(): boolean;
93 | public reset(): void;
94 | public shutdown(): void;
95 | public startListening(param0: org.vosk.android.RecognitionListener): boolean;
96 | public cancel(): boolean;
97 | public setPause(param0: boolean): void;
98 | }
99 | }
100 | }
101 | }
102 |
103 | declare module org {
104 | export module vosk {
105 | export module android {
106 | export class SpeechStreamService {
107 | public static class: java.lang.Class;
108 | public start(param0: org.vosk.android.RecognitionListener): boolean;
109 | public stop(): boolean;
110 | public constructor(param0: org.vosk.Recognizer, param1: java.io.InputStream, param2: number);
111 | public start(param0: org.vosk.android.RecognitionListener, param1: number): boolean;
112 | }
113 | }
114 | }
115 | }
116 |
117 | declare module org {
118 | export module vosk {
119 | export module android {
120 | export class StorageService {
121 | public static class: java.lang.Class;
122 | public static TAG: string;
123 | public static sync(param0: globalAndroid.content.Context, param1: string, param2: string): string;
124 | public static unpack(param0: globalAndroid.content.Context, param1: string, param2: string, param3: org.vosk.android.StorageService.Callback, param4: org.vosk.android.StorageService.Callback): void;
125 | public constructor();
126 | }
127 | export module StorageService {
128 | export class Callback extends java.lang.Object {
129 | public static class: java.lang.Class>;
130 | /**
131 | * Constructs a new instance of the org.vosk.android.StorageService$Callback interface with the provided implementation. An empty constructor exists calling super() when extending the interface class.
132 | */
133 | public constructor(implementation: {
134 | onComplete(param0: R): void;
135 | });
136 | public constructor();
137 | public onComplete(param0: R): void;
138 | }
139 | }
140 | }
141 | }
142 | }
143 |
144 | //Generics information:
145 | //org.vosk.android.StorageService.Callback:1
146 |
147 |
--------------------------------------------------------------------------------
/src/speech-recognition-vosk.android.ts:
--------------------------------------------------------------------------------
1 | import { AndroidApplication, Application, ApplicationEventData, Utils} from "@nativescript/core";
2 |
3 | export interface RecognitionListener {
4 |
5 | /**
6 | * The callback function invoked when speech is recognized.
7 | * @param transcription
8 | */
9 | onPartialResult: (hyp: string) => void;
10 |
11 | /**
12 | * The callback function invoked when speech is recognized.
13 | * @param transcription
14 | */
15 | onResult: (hyp: string) => void;
16 |
17 | /**
18 | * The callback function invoked when speech is recognized.
19 | * @param transcription
20 | */
21 | onFinalResult: (hyp: string) => void;
22 |
23 | /**
24 | * Called when an error occurs.
25 | */
26 | onError: () => void;
27 |
28 | /**
29 | * Called after timeout expired
30 | */
31 | onTimeout: () => void;
32 | }
33 |
34 | declare let global: any;
35 | const AppPackageName = global.androidx.core.app;
36 | const ContentPackageName = global.androidx.core.content;
37 |
38 | export class SpeechService {
39 |
40 | private onPermissionGranted: Function;
41 | private onPermissionRejected: Function;
42 | private speechService: org.vosk.android.SpeechService = null;
43 |
44 | constructor() {
45 | let self = this;
46 | Application.android.on(AndroidApplication.activityRequestPermissionsEvent, function (args: any) {
47 | for (let i = 0; i < args.permissions.length; i++) {
48 | if (args.grantResults[i] === android.content.pm.PackageManager.PERMISSION_DENIED) {
49 | if (self.onPermissionRejected) {
50 | self.onPermissionRejected("Please allow access to the Microphone and try again.");
51 | } else {
52 | console.log("Please allow access to the Microphone and try again. (tip: pass in a reject to receive this message in your app)");
53 | }
54 | return;
55 | }
56 | }
57 | if (self.onPermissionGranted) {
58 | self.onPermissionGranted();
59 | }
60 | });
61 |
62 | Application.on(Application.suspendEvent, (args: ApplicationEventData) => {
63 | if (this.speechService !== null) {
64 | this.cancel();
65 | this.shutdown();
66 | }
67 | });
68 | }
69 |
70 | available(): Promise {
71 | return new Promise((resolve, reject) => {
72 | resolve(android.speech.SpeechRecognizer.isRecognitionAvailable(Utils.android.getApplicationContext()));
73 | });
74 | }
75 |
76 | requestPermission(): Promise {
77 | console.log(">> requestPermission");
78 | return new Promise((resolve, reject) => {
79 | this._requestPermission(
80 | () => resolve(true),
81 | () => resolve(false));
82 | });
83 | }
84 |
85 | startListening(model: org.vosk.Model, listener: RecognitionListener): Promise {
86 | return new Promise((resolve, reject) => {
87 |
88 | let onPermissionGranted = () => {
89 |
90 | let loopHandler = new android.os.Handler(android.os.Looper.getMainLooper());
91 | loopHandler.post(new java.lang.Runnable({
92 | run: () => {
93 |
94 | let recognizer = new org.vosk.Recognizer(model, 16000.0);
95 |
96 | this.speechService = new org.vosk.android.SpeechService(recognizer, 16000.0);
97 | this.speechService.startListening(new org.vosk.android.RecognitionListener({
98 |
99 | onPartialResult(hyp: string) {
100 | listener.onPartialResult(hyp);
101 | },
102 |
103 | onResult(hyp: string) {
104 | listener.onResult(hyp);
105 | },
106 |
107 | onFinalResult(hyp: string) {
108 | listener.onFinalResult(hyp);
109 | },
110 |
111 | onTimeout() {
112 | listener.onTimeout();
113 | },
114 |
115 | onError(e: java.lang.Exception) {
116 | listener.onError();
117 | }
118 | }));
119 | resolve(true);
120 | }
121 | }));
122 | };
123 |
124 | if (!this.wasPermissionGranted()) {
125 | this._requestPermission(onPermissionGranted, reject);
126 | return;
127 | }
128 |
129 | onPermissionGranted();
130 | });
131 | }
132 |
133 | stop(): Promise {
134 | return new Promise((resolve, reject) => {
135 | if (this.speechService === null) {
136 | reject("Not running");
137 | return;
138 | }
139 |
140 | let loopHandler = new android.os.Handler(android.os.Looper.getMainLooper());
141 | loopHandler.post(new java.lang.Runnable({
142 | run: () => {
143 | this.speechService.stop();
144 | resolve();
145 | }
146 | }));
147 | });
148 | }
149 |
150 | cancel(): Promise {
151 | return new Promise((resolve, reject) => {
152 | if (this.speechService === null) {
153 | reject("Not running");
154 | return;
155 | }
156 |
157 | let loopHandler = new android.os.Handler(android.os.Looper.getMainLooper());
158 | loopHandler.post(new java.lang.Runnable({
159 | run: () => {
160 | this.speechService.cancel();
161 | resolve();
162 | }
163 | }));
164 | });
165 | }
166 |
167 | shutdown(): Promise {
168 | return new Promise((resolve, reject) => {
169 | if (this.speechService === null) {
170 | reject("Not running");
171 | return;
172 | }
173 |
174 | let loopHandler = new android.os.Handler(android.os.Looper.getMainLooper());
175 | loopHandler.post(new java.lang.Runnable({
176 | run: () => {
177 | this.speechService.shutdown();
178 | resolve();
179 | }
180 | }));
181 | });
182 | }
183 |
184 | private wasPermissionGranted(): boolean {
185 | let hasPermission = android.os.Build.VERSION.SDK_INT < 23; // Android M. (6.0)
186 | if (!hasPermission) {
187 | hasPermission = android.content.pm.PackageManager.PERMISSION_GRANTED ===
188 | ContentPackageName.ContextCompat.checkSelfPermission(
189 | Utils.android.getApplicationContext(),
190 | android.Manifest.permission.RECORD_AUDIO);
191 | }
192 | return hasPermission;
193 | }
194 |
195 | private _requestPermission(onPermissionGranted: Function, reject): void {
196 | this.onPermissionGranted = onPermissionGranted;
197 | this.onPermissionRejected = reject;
198 | AppPackageName.ActivityCompat.requestPermissions(
199 | Application.android.foregroundActivity || Application.android.startActivity, // TODO application.android.context
200 | [android.Manifest.permission.RECORD_AUDIO],
201 | 444 // irrelevant since we simply invoke onPermissionGranted
202 | );
203 | }
204 | }
205 |
206 | export function syncModel() : Promise {
207 |
208 | return new Promise((resolve, reject) => {
209 | let loopHandler = new android.os.Handler(android.os.Looper.getMainLooper());
210 | loopHandler.post(new java.lang.Runnable({
211 | run: () => {
212 | let outputPath = org.vosk.android.StorageService.sync(Utils.android.getApplicationContext(), "model-en-us", "model");
213 | let model = new org.vosk.Model(outputPath);
214 | resolve(model);
215 | }
216 | }));
217 | });
218 | }
219 |
--------------------------------------------------------------------------------
/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 | }
--------------------------------------------------------------------------------