diff --git a/.gitignore b/.gitignore
index 1e12dbb4f..ac58c285c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,7 @@
.DS_Store
node_modules/
.idea
+.tmp
+aot/
dist/
scripts/ionic-native-bower
diff --git a/DEVELOPER.md b/DEVELOPER.md
index e52ff352b..9cf7bf27b 100644
--- a/DEVELOPER.md
+++ b/DEVELOPER.md
@@ -12,6 +12,9 @@ First, let's start by creating a new plugin wrapper from template.
// Make sure to capitalize the first letter, or use CamelCase if necessary.
gulp plugin:create -n PluginName
+
+// add -m flag to get a minimal template to start with
+gulp plugin:create -m -n PluginName
```
@@ -22,17 +25,18 @@ Let's take a look at the existing plugin wrapper for Geolocation to see what goe
plugin: 'cordova-plugin-geolocation',
pluginRef: 'navigator.geolocation'
})
+@Injectable()
export class Geolocation {
@Cordova()
- static getCurrentPosition(options?: GeolocationOptions): Promise { return }
+ getCurrentPosition(options?: GeolocationOptions): Promise { return; }
@Cordova({
callbackOrder: 'reverse',
observable: true,
clearFunction: 'clearWatch'
})
- static watchPosition(options?: GeolocationOptions): Observable { return }
+ watchPosition(options?: GeolocationOptions): Observable { return; }
}
```
@@ -41,6 +45,7 @@ export class Geolocation {
First and foremost, we want to create a class representing our plugin, in this case Geolocation.
```
+@Injectable()
class Geolocation {
}
@@ -57,6 +62,7 @@ For example, the `@Plugin` decorator adds information about the plugin to our Ge
plugin: 'cordova-plugin-geolocation',
pluginRef: 'navigator.geolocation'
})
+@Injectable()
export class Geolocation {
}
@@ -74,7 +80,7 @@ Let's take a look at `getCurrentPosition` first.
```
@Cordova()
- static getCurrentPosition(options?: GeolocationOptions): Promise { return }
+ getCurrentPosition(options?: GeolocationOptions): Promise { return }
```
It's just a stub. The `return` is only there to keep the TypeScript type-checker from complaining since we indicate that `getCurrentPosition` returns a `Promise`.
@@ -91,7 +97,7 @@ Next, let's look at the `watchPosition` method.
observable: true,
clearFunction: 'clearWatch'
})
- static watchPosition(options?: GeolocationOptions): Observable { return }
+ watchPosition(options?: GeolocationOptions): Observable { return }
```
The `@Cordova` decorator has a few more options now.
@@ -102,58 +108,6 @@ The `@Cordova` decorator has a few more options now.
`clearFunction` is used in conjunction with the `observable` option and indicates the function to be called when the Observable is disposed.
-### Updating index.ts
-
-For new plugins, you will need to update `/src/index.ts` to properly export your plugin and make it available for use.
-
-1. Import the plugin class into `index.ts`:
-
-`import {PluginClassName} from ./plugins/filenameForPlugin`
-
-No need to put the `.ts` extension on the filename.
-
-2. Add the plugin class name to the list in the `export` object:
-
-```
-export {
- ActionSheet,
- AdMob,
- AndroidFingerprintAuth,
- YourPluginClassName,
- ...
-}
-```
-
-3. Add the plugin class name to the `window['IonicNative']` object:
-
-```
-window['IonicNative'] = {
- ActionSheet: ActionSheet,
- AdMob: AdMob,
- AndroidFingerprintAuth: AndroidFingerprintAuth,
- YourPluginClassName: YourPluginClassName,
- ...
-```
-
-4. If your plugin exports any other objects outside of the plugin class, add an export statement for the file:
-
-`export * from './plugins/filenameForPlugin';`
-
-No need to put the `.ts` extension on the filename.
-
-For example, `googlemaps.ts` exports a const outside of the plugin's main `GoogleMap` class:
-
-```
-export const GoogleMapsAnimation = {
- BOUNCE: 'BOUNCE',
- DROP: 'DROP'
-};
-```
-
-To properly export `GoogleMapsAnimation`, `index.ts` is updated with:
-
-`export * from './plugins/googlemaps';`
-
### Testing your changes
You need to run `npm run build` in the `ionic-native` project, this will create a `dist` directory. Then, you must go to your ionic application folder and replace your current `node_modules/ionic-native/dist/` with the newly generated one.
@@ -164,7 +118,7 @@ You need to run `npm run lint` to analyze the code and ensure it's consistency w
### 'Wrapping' Up
-That's it! The only thing left to do is rigorously document the plugin and it's usage. Take a look at some of the other plugins for good documentation styles.
+That's it! The only thing left to do is rigorously document the plugin and it's usage. Take a look at some of the other plugins for good documentation styles.
## Commit Message Format
diff --git a/circle.yml b/circle.yml
index 331652216..da298f405 100644
--- a/circle.yml
+++ b/circle.yml
@@ -1,6 +1,6 @@
machine:
node:
- version: 4.1.0
+ version: 7.10.0
ruby:
version: 2.1.2
@@ -17,7 +17,6 @@ dependencies:
test:
override:
- - npm test
- npm run build
deployment:
diff --git a/gulpfile.js b/gulpfile.js
index 93d75ac45..3cd607b11 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -1,6 +1,5 @@
var gulp = require('gulp');
var minimist = require('minimist');
-var uglify = require('gulp-uglify');
var rename = require("gulp-rename");
var tslint = require('gulp-tslint');
var decamelize = require('decamelize');
@@ -17,16 +16,6 @@ var flags = minimist(process.argv.slice(2), flagConfig);
/* Docs tasks */
require('./scripts/docs/gulp-tasks')(gulp, flags);
-
-gulp.task("minify:dist", function(){
- gulp.src('./dist/ionic.native.js')
- .pipe(uglify())
- .pipe(rename({
- suffix: '.min'
- }))
- .pipe(gulp.dest('./dist'));
-});
-
gulp.task('lint', function() {
gulp.src('src/**/*.ts')
.pipe(tslint({
@@ -38,12 +27,21 @@ gulp.task('lint', function() {
gulp.task('plugin:create', function(){
if(flags.n && flags.n !== ''){
- var src = flags.m?'./scripts/templates/wrap-min.tmpl':'./scripts/templates/wrap.tmpl';
+
+ const src = flags.m?'./scripts/templates/wrap-min.tmpl':'./scripts/templates/wrap.tmpl',
+ pluginName = flags.n,
+ pluginPackageName = decamelize(pluginName, '-'),
+ pluginNameSpaced = pluginName.replace(/(?!^)([A-Z])/g, ' $1');
+
return gulp.src(src)
- .pipe(replace('PluginName', flags.n))
- .pipe(rename(decamelize(flags.n, '-') + '.ts'))
- .pipe(gulp.dest('./src/plugins/'));
+ .pipe(replace('PluginName', pluginName))
+ .pipe(replace('Plugin Name', pluginNameSpaced))
+ .pipe(rename('index.ts'))
+ .pipe(gulp.dest('./src/@ionic-native/plugins/' + pluginPackageName));
+
} else {
+
console.log("Usage is: gulp plugin:create -n PluginName");
+
}
});
diff --git a/karma.conf.ts b/karma.conf.ts
deleted file mode 100644
index 5b3106254..000000000
--- a/karma.conf.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-const WATCH = process.argv.indexOf('--watch') > -1;
-
-module.exports = config => {
- config.set({
-
- // base path that will be used to resolve all patterns (eg. files, exclude)
- basePath: './',
-
- // frameworks to use
- // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
- frameworks: ['jasmine', 'browserify'],
-
- // list of files / patterns to load in the browser
- files: [
- 'test/**/*.spec.ts'
- ],
-
- // preprocess matching files before serving them to the browser
- // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
- preprocessors: {
- 'test/**/*.spec.ts': ['browserify']
- },
-
- browserify: {
- debug: true,
- plugin: [ 'tsify' ],
- extensions: ['.js', '.ts']
- },
-
- phantomjsLauncher: {
- // Have phantomjs exit if a ResourceError is encountered (useful if karma exits without killing phantom)
- exitOnResourceError: true
- },
-
- // test results reporter to use
- // possible values: 'dots', 'progress'
- // available reporters: https://npmjs.org/browse/keyword/karma-reporter
- reporters: ['dots'],
-
- // web server port
- port: 9876,
-
- // enable / disable colors in the output (reporters and logs)
- colors: true,
-
- // level of logging
- // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
- logLevel: config.LOG_INFO,
-
- // enable / disable watching file and executing tests whenever any file changes
- autoWatch: WATCH,
-
- // start these browsers
- // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
- browsers: ['PhantomJS'],
-
- // Continuous Integration mode
- // if true, Karma captures browsers, runs the tests and exits
- singleRun: !WATCH
- });
-};
diff --git a/package.json b/package.json
index b9f37cc11..7da7622f4 100644
--- a/package.json
+++ b/package.json
@@ -1,73 +1,50 @@
{
"name": "ionic-native",
- "version": "2.9.0",
+ "version": "3.1.0-rc.6",
"description": "Native plugin wrappers for Cordova and Ionic with TypeScript, ES6+, Promise and Observable support",
- "main": "dist/es5/index.js",
- "module": "dist/esm/index.js",
- "typings": "dist/es5/index.d.ts",
- "files": [
- "dist"
- ],
- "dependencies": {
- "rxjs": "5.0.1"
- },
+ "license": "MIT",
"devDependencies": {
- "browserify": "^13.3.0",
+ "@angular/compiler": "2.4.8",
+ "@angular/compiler-cli": "2.4.8",
+ "@angular/core": "2.4.8",
"canonical-path": "0.0.2",
- "conventional-changelog-cli": "^1.2.0",
- "conventional-github-releaser": "^1.1.3",
- "cpr": "^2.0.2",
- "cz-conventional-changelog": "^1.2.0",
- "decamelize": "^1.2.0",
- "dgeni": "^0.4.2",
- "dgeni-packages": "^0.10.18",
- "es6-shim": "~0.35.2",
- "glob": "^7.1.1",
- "gulp": "^3.9.1",
- "gulp-rename": "^1.2.2",
- "gulp-replace": "^0.5.4",
- "gulp-tslint": "^6.1.2",
- "gulp-uglify": "^2.0.0",
- "jasmine-core": "~2.5.2",
- "karma": "~1.3.0",
- "karma-browserify": "~5.1.0",
- "karma-jasmine": "~1.1.0",
- "karma-phantomjs-launcher": "~1.0.2",
+ "child-process-promise": "2.2.0",
+ "conventional-changelog-cli": "1.2.0",
+ "cpr": "2.0.2",
+ "cz-conventional-changelog": "1.2.0",
+ "decamelize": "1.2.0",
+ "dgeni": "0.4.7",
+ "dgeni-packages": "0.16.10",
+ "fs-extra": "2.0.0",
+ "fs-extra-promise": "0.4.1",
+ "gulp": "3.9.1",
+ "gulp-rename": "1.2.2",
+ "gulp-replace": "0.5.4",
+ "gulp-tslint": "6.1.2",
"lodash": "4.17.4",
- "minimist": "^1.1.3",
- "mkdirp": "^0.5.1",
+ "minimist": "1.1.3",
"node-html-encoder": "0.0.2",
"q": "1.4.1",
- "semver": "^5.3.0",
- "tsify": "~3.0.0",
- "tslint": "^3.15.1",
+ "queue": "4.2.1",
+ "rimraf": "2.5.4",
+ "rxjs": "5.0.1",
+ "semver": "5.3.0",
+ "tslint": "3.15.1",
"tslint-ionic-rules": "0.0.7",
"typescript": "2.0.09",
- "watchify": "~3.7.0"
+ "zone.js": "0.7.2"
},
"scripts": {
- "test": "karma start",
- "test:watch": "npm test -- --watch",
"start": "npm run test:watch",
"lint": "gulp lint",
- "build": "npm run lint && npm run build:js && npm run build:esm && npm run build:bundle && npm run build:minify",
- "build:js": "tsc -p tsconfig-es5.json",
- "build:esm": "tsc -p tsconfig-esm.json",
- "build:bundle": "browserify dist/es5/index.js > dist/ionic.native.js",
- "build:minify": "gulp minify:dist",
- "shipit": "npm run build && npm publish && bash ./scripts/bower.sh",
- "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0",
- "plugin:create": "gulp plugin:create"
+ "build": "npm run clean && npm run lint && npm run build:core && npm run build:modules",
+ "build:core": "ngc -p scripts/build/tsconfig-core.json",
+ "build:modules": "node scripts/build/build.js",
+ "clean": "rimraf dist",
+ "shipit": "npm run build && gulp readmes && npm run npmpub",
+ "npmpub": "node scripts/build/publish.js",
+ "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0"
},
- "repository": {
- "type": "git",
- "url": "https://github.com/driftyco/ionic-native.git"
- },
- "license": "MIT",
- "bugs": {
- "url": "https://github.com/driftyco/ionic-native/issues"
- },
- "homepage": "https://github.com/driftyco/ionic-native",
"config": {
"commitizen": {
"path": "./node_modules/cz-conventional-changelog"
diff --git a/scripts/bower.json b/scripts/bower.json
deleted file mode 100644
index 678bac591..000000000
--- a/scripts/bower.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "name": "ionic-native",
- "description": "Native plugin wrappers for Cordova and Ionic with TypeScript, ES6+, Promise and Observable support",
- "main": [
- "ionic.native.js"
- ],
- "authors": [
- "Max Lynch "
- ],
- "license": "MIT",
- "keywords": [
- "ionic",
- "native",
- "html5",
- "hybrid",
- "mobile"
- ],
- "homepage": "https://github.com/driftyco/ionic-native-bower",
- "ignore": [
- "**/.*",
- "node_modules",
- "bower_components",
- "test",
- "tests"
- ]
-}
diff --git a/scripts/bower.sh b/scripts/bower.sh
deleted file mode 100644
index cf70d3731..000000000
--- a/scripts/bower.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/bash
-set -e
-
-
-# readJsonProp(jsonFile, property)
-# - restriction: property needs to be on an own line!
-function readJsonProp {
- echo $(sed -En 's/.*"'$2'"[ ]*:[ ]*"(.*)".*/\1/p' $1)
-}
-
-VERSION=$(readJsonProp "package.json" "version")
-
-echo "BOWERING IONIC-NATIVE VERSION $VERSION. FOR GREAT JUSTICE..."
-
-DIR="scripts/ionic-native-bower"
-rm -rf $DIR
-mkdir $DIR
-cp dist/ionic.native.js dist/ionic.native.min.js $DIR
-cd $DIR
-git init
-git remote add origin git@github.com:driftyco/ionic-native-bower.git
-cp ../bower.json .
-git add .
-git commit -m "Bower release"
-git tag -f -m v$VERSION v$VERSION
-git push -f --tags origin master
-
-echo "BOWERING COMPLETED SOMEWHAT SUCCESSFULLY"
diff --git a/scripts/build/build.js b/scripts/build/build.js
new file mode 100644
index 000000000..c544e1b7d
--- /dev/null
+++ b/scripts/build/build.js
@@ -0,0 +1,135 @@
+// Node module dependencies
+const fs = require('fs-extra-promise').useFs(require('fs-extra')),
+ queue = require('queue'),
+ path = require('path'),
+ exec = require('child_process').exec;
+
+// Constants for the build process. Paths and JSON files templates
+const ROOT = path.resolve(path.join(__dirname, '../../')), // root ionic-native directory
+ PLUGINS_PATH = path.resolve(ROOT, 'src/@ionic-native/plugins'), // path to plugins source files
+ CORE_PACKAGE_JSON = require(path.resolve(__dirname, 'core-package.json')), // core package.json
+ PLUGIN_PACKAGE_JSON = require(path.resolve(__dirname, 'plugin-package.json')), // plugin package.json template
+ PLUGIN_TS_CONFIG = require(path.resolve(__dirname, 'tsconfig-plugin.json')), // plugin tsconfig template
+ BUILD_TMP = path.resolve(ROOT, '.tmp'), // tmp directory path
+ BUILD_DIST_ROOT = path.resolve(ROOT, 'dist/packages-dist/@ionic-native'), // dist directory root path
+ BUILD_PLUGINS_DIST = path.resolve(BUILD_DIST_ROOT, 'plugins'), // plugins dist directory path
+ BUILD_CORE_DIST = path.resolve(BUILD_DIST_ROOT, 'core'); // core dist directory path
+
+
+// dependency versions
+const ANGULAR_VERSION = '2.4.8',
+ RXJS_VERSION = '5.0.1',
+ IONIC_NATIVE_VERSION = require(path.resolve(ROOT, 'package.json')).version;
+
+// package dependencies
+const CORE_PEER_DEPS = {
+ 'rxjs': RXJS_VERSION
+};
+
+const PLUGIN_PEER_DEPS = {
+ '@ionic-native/core': IONIC_NATIVE_VERSION,
+ '@angular/core': ANGULAR_VERSION,
+ 'rxjs': RXJS_VERSION
+};
+
+// set peer dependencies for all plugins
+PLUGIN_PACKAGE_JSON.peerDependencies = PLUGIN_PEER_DEPS;
+
+
+// Delete dist directory and any temporary files
+console.log('Removing old TMP directory');
+fs.removeSync(BUILD_TMP);
+fs.removeSync(BUILD_PLUGINS_DIST);
+
+
+// Create tmp/dist directories
+console.log('Making new TMP directory');
+fs.mkdirpSync(BUILD_TMP);
+
+
+// Prepare and copy the core module's package.json
+console.log('Preparing core module package.json');
+CORE_PACKAGE_JSON.version = IONIC_NATIVE_VERSION;
+CORE_PACKAGE_JSON.peerDependencies = CORE_PEER_DEPS;
+fs.writeJsonSync(path.resolve(BUILD_CORE_DIST, 'package.json'), CORE_PACKAGE_JSON);
+
+
+// Fetch a list of the plugins
+const PLUGINS = fs.readdirSync(PLUGINS_PATH);
+
+
+// Create a queue to process tasks
+const QUEUE = queue({
+ concurrency: require('os').cpus().length
+});
+
+
+// Function to process a single plugin
+const addPluginToQueue = pluginName => {
+
+ QUEUE.push((callback) => {
+
+ console.log(`Building plugin: ${pluginName}`);
+
+ const PLUGIN_BUILD_DIR = path.resolve(BUILD_TMP, 'plugins', pluginName),
+ PLUGIN_SRC_PATH = path.resolve(PLUGINS_PATH, pluginName, 'index.ts');
+
+ let tsConfigPath;
+
+ fs.mkdirpAsync(PLUGIN_BUILD_DIR) // create tmp build dir
+ .then(() => fs.mkdirpAsync(path.resolve(BUILD_PLUGINS_DIST, pluginName))) // create dist dir
+ .then(() => {
+
+ // Write tsconfig.json
+ const tsConfig = JSON.parse(JSON.stringify(PLUGIN_TS_CONFIG));
+ tsConfig.files = [PLUGIN_SRC_PATH];
+ // tsConfig.compilerOptions.paths['@ionic-native/core'] = [BUILD_CORE_DIST];
+
+ tsConfigPath = path.resolve(PLUGIN_BUILD_DIR, 'tsconfig.json');
+
+ return fs.writeJsonAsync(tsConfigPath, tsConfig);
+ })
+ .then(() => {
+ // clone package.json
+ const packageJson = JSON.parse(JSON.stringify(PLUGIN_PACKAGE_JSON));
+
+ packageJson.name = `@ionic-native/${pluginName}`;
+ packageJson.version = IONIC_NATIVE_VERSION;
+
+ return fs.writeJsonAsync(path.resolve(BUILD_PLUGINS_DIST, pluginName, 'package.json'), packageJson);
+ })
+ .then(() => {
+
+ // compile the plugin
+ exec(`${ROOT}/node_modules/.bin/ngc -p ${tsConfigPath}`, (err, stdout, stderr) => {
+
+ if (err) {
+ // oops! something went wrong.
+ callback(`\n\nBuilding ${pluginName} failed.`);
+ console.log(err);
+ return;
+ }
+
+ // we're done with this plugin!
+ callback();
+
+ });
+
+ })
+ .catch(callback);
+
+ }); // QUEUE.push end
+
+};
+
+PLUGINS.forEach(addPluginToQueue);
+
+QUEUE.start((err) => {
+
+ if (err) {
+ console.log('Error building plugins. ', err);
+ } else {
+ console.log('Done processing plugins!');
+ }
+
+});
diff --git a/scripts/build/core-package.json b/scripts/build/core-package.json
new file mode 100644
index 000000000..c1fe2083b
--- /dev/null
+++ b/scripts/build/core-package.json
@@ -0,0 +1,14 @@
+{
+ "name": "@ionic-native/core",
+ "version": "{{VERSION}}",
+ "description": "Ionic Native - Native plugins for ionic apps",
+ "module": "index.js",
+ "typings": "index.d.ts",
+ "author": "ionic",
+ "license": "MIT",
+ "peerDependencies": {},
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/driftyco/ionic-native.git"
+ }
+}
diff --git a/scripts/build/plugin-package.json b/scripts/build/plugin-package.json
new file mode 100644
index 000000000..191556ae4
--- /dev/null
+++ b/scripts/build/plugin-package.json
@@ -0,0 +1,14 @@
+{
+ "name": "@ionic-native/{{PLUGIN}}",
+ "version": "{{VERSION}}",
+ "description": "Ionic Native - Native plugins for ionic apps",
+ "module": "index.js",
+ "typings": "index.d.ts",
+ "author": "ionic",
+ "license": "MIT",
+ "peerDependencies": {},
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/driftyco/ionic-native.git"
+ }
+}
diff --git a/scripts/build/publish.js b/scripts/build/publish.js
new file mode 100644
index 000000000..cfb00c318
--- /dev/null
+++ b/scripts/build/publish.js
@@ -0,0 +1,56 @@
+// Node module dependencies
+const fs = require('fs-extra-promise').useFs(require('fs-extra')),
+ queue = require('queue'),
+ path = require('path'),
+ exec = require('child-process-promise').exec;
+
+
+const ROOT = path.resolve(path.join(__dirname, '../../')),
+ DIST = path.resolve(ROOT, 'dist', 'packages-dist', '@ionic-native'),
+ PLUGINS_ROOT = path.resolve(DIST, 'plugins'),
+ CORE = path.resolve(DIST, 'core');
+
+const FLAGS = '--access public'; // add any flags here if you want... (example: --tag alpha)
+
+console.log('Publishing @ionic-native/core');
+exec(`npm publish ${CORE} ${FLAGS}`)
+ .then(() => {
+
+ const PLUGINS = fs.readdirSync(PLUGINS_ROOT);
+
+ const QUEUE = queue({
+ concurrency: 10
+ });
+
+ PLUGINS.forEach(pluginName => {
+
+ QUEUE.push(done => {
+
+ console.log(`Publishing plugin ${pluginName}`);
+ const pluginPath = path.resolve(PLUGINS_ROOT, pluginName);
+
+ exec(`npm publish ${pluginPath} ${FLAGS}`)
+ .then(() => done())
+ .catch(done);
+
+ });
+
+ });
+
+ QUEUE.start((err) => {
+
+ if (err) {
+ console.log('Error publishing ionic-native. ', err);
+ } else {
+ console.log('Done publishing ionic-native!');
+ }
+
+ });
+
+ })
+ .catch(e => {
+
+ console.log('Publish failed');
+ console.log(e);
+
+ });
diff --git a/scripts/build/tsconfig-core.json b/scripts/build/tsconfig-core.json
new file mode 100644
index 000000000..7d9890ed1
--- /dev/null
+++ b/scripts/build/tsconfig-core.json
@@ -0,0 +1,22 @@
+{
+ "compilerOptions": {
+ "baseUrl": ".",
+ "declaration": true,
+ "stripInternal": true,
+ "experimentalDecorators": true,
+ "emitDecoratorMetadata": true,
+ "module": "es2015",
+ "moduleResolution": "node",
+ "outDir": "../../dist/packages-dist/",
+ "rootDir": "../../src/",
+ "target": "es5",
+ "skipLibCheck": true,
+ "lib": ["es2015", "dom"]
+ },
+ "files": [
+ "../../src/@ionic-native/core/index.ts"
+ ],
+ "angularCompilerOptions": {
+ "genDir": "../../.tmp/core-aot"
+ }
+}
diff --git a/scripts/build/tsconfig-plugin.json b/scripts/build/tsconfig-plugin.json
new file mode 100644
index 000000000..0de7d7fa7
--- /dev/null
+++ b/scripts/build/tsconfig-plugin.json
@@ -0,0 +1,22 @@
+{
+ "compilerOptions": {
+ "baseUrl": ".",
+ "declaration": true,
+ "stripInternal": true,
+ "experimentalDecorators": true,
+ "emitDecoratorMetadata": true,
+ "module": "es2015",
+ "moduleResolution": "node",
+ "outDir": "../../../dist/packages-dist/",
+ "paths": {
+ "@ionic-native/core": ["../../../dist/packages-dist/@ionic-native/core"]
+ },
+ "rootDir": "../../../src/",
+ "target": "es5",
+ "skipLibCheck": true,
+ "lib": ["es2015", "dom"]
+ },
+ "files": [
+ "../../../src/@ionic-native/plugins/{{PLUGIN}}/index.ts"
+ ]
+}
diff --git a/scripts/config.json b/scripts/config.json
index dd051dc14..8b4b8a512 100644
--- a/scripts/config.json
+++ b/scripts/config.json
@@ -1,5 +1,6 @@
{
"sitePath": "../ionic-site",
"v2DocsDir": "docs/v2/native",
- "docsDest": "../ionic-site/content/docs/v2/native"
+ "docsDest": "../ionic-site/content/docs/v2/native",
+ "pluginDir": "dist/packages-dist/@ionic-native/plugins"
}
diff --git a/scripts/docs/dgeni-config.js b/scripts/docs/dgeni-config.js
index d79ca7faa..5b47e9f78 100644
--- a/scripts/docs/dgeni-config.js
+++ b/scripts/docs/dgeni-config.js
@@ -1,9 +1,8 @@
var Package = require('dgeni').Package;
var jsdocPackage = require('dgeni-packages/jsdoc');
var nunjucksPackage = require('dgeni-packages/nunjucks');
-var typescriptPackage = require('./typescript-package');
-var linksPackage = require('./links-package');
-var gitPackage = require('dgeni-packages/git');
+var typescriptPackage = require('dgeni-packages/typescript');
+var linksPackage = require('dgeni-packages/links');
var path = require('path');
var semver = require('semver');
var fs = require('fs');
@@ -14,9 +13,7 @@ var projectPackage = require('../../package.json');
// Define the dgeni package for generating the docs
module.exports = function(currentVersion) {
- return new Package('ionic-v2-docs',
- [jsdocPackage, nunjucksPackage, typescriptPackage,
- linksPackage, gitPackage])
+ return new Package('ionic-v2-docs', [jsdocPackage, nunjucksPackage, typescriptPackage, linksPackage])
// .processor(require('./processors/latest-version'))
.processor(require('./processors/jekyll'))
@@ -72,7 +69,7 @@ module.exports = function(currentVersion) {
log.level = 'error'; //'silly', 'debug', 'info', 'warn', 'error'
})
-.config(function(renderDocsProcessor, computePathsProcessor, versionInfo) {
+.config(function(renderDocsProcessor, computePathsProcessor) {
versions = [];
// new version, add it to the versions list
@@ -98,7 +95,6 @@ module.exports = function(currentVersion) {
};
renderDocsProcessor.extraData.version = versionData;
- renderDocsProcessor.extraData.versionInfo = versionInfo;
computePathsProcessor.pathTemplates = [{
docTypes: ['class', 'var', 'function', 'let'],
getOutputPath: function(doc) {
@@ -117,10 +113,9 @@ module.exports = function(currentVersion) {
readFilesProcessor.$enabled = false;
readFilesProcessor.basePath = path.resolve(__dirname, '../..');
- readTypeScriptModules.basePath = path.resolve(path.resolve(__dirname,
- '../..'));
+ readTypeScriptModules.basePath = path.resolve(__dirname, '../..');
readTypeScriptModules.sourceFiles = [
- 'src/index.ts'
+ './src/@ionic-native/plugins/**/*.ts'
];
})
@@ -148,7 +143,7 @@ module.exports = function(currentVersion) {
// Configure file writing
.config(function(writeFilesProcessor) {
- writeFilesProcessor.outputFolder = config.sitePath;
+ writeFilesProcessor.outputFolder = '../ionic-site/';
})
// Configure rendering
@@ -169,7 +164,8 @@ module.exports = function(currentVersion) {
templateEngine.filters.push(
require('./filters/capital'),
require('./filters/code'),
- require('./filters/dump')
+ require('./filters/dump'),
+ require('./filters/dashify')
);
templateFinder.templateFolders.unshift(path.resolve(__dirname, 'templates'));
diff --git a/scripts/docs/dgeni-readmes-config.js b/scripts/docs/dgeni-readmes-config.js
new file mode 100644
index 000000000..2a58f85ea
--- /dev/null
+++ b/scripts/docs/dgeni-readmes-config.js
@@ -0,0 +1,177 @@
+var Package = require('dgeni').Package;
+var jsdocPackage = require('dgeni-packages/jsdoc');
+var nunjucksPackage = require('dgeni-packages/nunjucks');
+var typescriptPackage = require('dgeni-packages/typescript');
+var linksPackage = require('dgeni-packages/links');
+var path = require('path');
+var semver = require('semver');
+var fs = require('fs');
+var _ = require('lodash');
+var config = require('../config.json');
+var projectPackage = require('../../package.json');
+
+// jscs:disable validateIndentation
+
+// Define the dgeni package for generating the docs
+module.exports = function(currentVersion) {
+
+ return new Package('ionic-v2-docs', [jsdocPackage, nunjucksPackage, typescriptPackage, linksPackage])
+
+// .processor(require('./processors/latest-version'))
+.processor(require('./processors/readmes'))
+.processor(require('./processors/remove-private-members'))
+.processor(require('./processors/hide-private-api'))
+// .processor(require('./processors/collect-inputs-outputs'))
+
+// for debugging docs
+// .processor(function test(){
+// return {
+//
+// $runBefore: ['rendering-docs'],
+// $process: function(docs){
+// docs.forEach(function(doc){
+// if (doc.name == "Camera"){
+//
+// // console.log(doc.tags);
+// // doc.tags.forEach(function(tag){
+// // if(tag.tagName == 'classes'){
+// //
+// // }
+// // });
+//
+// // doc.moduleDoc.exports.forEach(function(d,i){
+// // if(d.name === 'CameraOptions') {
+// // console.log('Name: ' + d.name);
+// // console.log('Type: ' + d.docType);
+// // console.log('First member: ', d.members[0]);
+// // }
+// // });
+//
+//
+// // var exports = doc.exportSymbol.parent.exports;
+// // for(var p in exports) {
+// // if(p == 'CameraOptions')
+// // {
+// // var x = exports[p];
+// // console.log(x.members.quality);
+// // }
+// // }
+// // doc.members.forEach(function(method){
+// // if (method.name === "getPicture") {
+// // console.log(method);
+// // }
+// // })
+// }
+// })
+// }
+// }
+// })
+.config(function(log) {
+ log.level = 'error'; //'silly', 'debug', 'info', 'warn', 'error'
+})
+
+.config(function(renderDocsProcessor, computePathsProcessor) {
+
+ versions = [];
+ // new version, add it to the versions list
+ if (currentVersion != 'nightly' && !_.includes(versions, currentVersion)) {
+ versions.unshift(currentVersion);
+ }
+ //First semver valid version is latest
+ var latestVersion = _.find(versions, semver.valid);
+ versions = versions.map(function(version) {
+ // We don't separate by versions so always put the docs in the root
+ var folder = '';
+ return {
+ href: '/' + config.v2DocsDir.replace('content/', ''),
+ folder: folder,
+ name: version
+ };
+ });
+
+ var versionData = {
+ list: versions,
+ current: _.find(versions, {name: currentVersion}),
+ latest: _.find(versions, {name: latestVersion}) || _.first(versions)
+ };
+
+ renderDocsProcessor.extraData.version = versionData;
+ computePathsProcessor.pathTemplates = [{
+ docTypes: ['class'],
+ getOutputPath: function(doc) {
+ return doc.originalModule.replace(config.pluginDir + '/', '')
+ .replace('/index', '') + '/README.md';
+ }
+ }];
+})
+
+//configure file reading
+.config(function(readFilesProcessor, readTypeScriptModules) {
+
+ // Don't run unwanted processors since we are not using the normal file reading processor
+ readFilesProcessor.$enabled = false;
+ readFilesProcessor.basePath = path.resolve(__dirname, '../..');
+
+ readTypeScriptModules.basePath = path.resolve(path.resolve(__dirname, '../..'));
+ readTypeScriptModules.sourceFiles = ['./src/@ionic-native/plugins/**/*.ts'];
+})
+
+.config(function(parseTagsProcessor) {
+ parseTagsProcessor.tagDefinitions = parseTagsProcessor.tagDefinitions
+ .concat(require('./tag-defs/tag-defs'));
+})
+
+// .config(function(parseTagsProcessor) {
+// // We actually don't want to parse param docs in this package as we are
+// // getting the data out using TS
+// parseTagsProcessor.tagDefinitions.forEach(function(tagDef) {
+// console.log(tagDef);
+// if (tagDef.name === 'param') {
+// tagDef.docProperty = 'paramData';
+// tagDef.transforms = [];
+// }
+// });
+// })
+
+// Configure links
+.config(function(getLinkInfo) {
+ getLinkInfo.useFirstAmbiguousLink = false;
+})
+
+// Configure file writing
+.config(function(writeFilesProcessor) {
+ writeFilesProcessor.outputFolder = './dist/packages-dist/';
+})
+
+// Configure rendering
+.config(function(templateFinder, templateEngine) {
+
+ // Nunjucks and Angular conflict in their template bindings so change the Nunjucks
+ // Also conflict with Jekyll
+ templateEngine.config.tags = {
+ variableStart: '<$',
+ variableEnd: '$>',
+ blockStart: '<@',
+ blockEnd: '@>',
+ commentStart: '<#',
+ commentEnd: '#>'
+ };
+
+ // add custom filters to nunjucks
+ templateEngine.filters.push(
+ require('./filters/capital'),
+ require('./filters/code'),
+ require('./filters/dump')
+ );
+
+ templateFinder.templateFolders.unshift(path.resolve(__dirname, 'templates'));
+
+ // Specify how to match docs to templates.
+ templateFinder.templatePatterns = [
+ '${ doc.template }',
+ '${ doc.docType }.template.md',
+ 'readme.template.md'
+ ];
+});
+
+};
diff --git a/scripts/docs/filters/dashify.js b/scripts/docs/filters/dashify.js
new file mode 100644
index 000000000..85cc7663c
--- /dev/null
+++ b/scripts/docs/filters/dashify.js
@@ -0,0 +1,7 @@
+module.exports = {
+ name: 'dashify',
+ process: function(str) {
+ str || (str = '');
+ return str.replace(/\s/g, '-');
+ }
+};
diff --git a/scripts/docs/gulp-tasks.js b/scripts/docs/gulp-tasks.js
index 19d246581..58a3a8a69 100644
--- a/scripts/docs/gulp-tasks.js
+++ b/scripts/docs/gulp-tasks.js
@@ -7,7 +7,23 @@ module.exports = function(gulp) {
try {
var ionicPackage = require('./dgeni-config')(projectPackage.version);
var dgeni = new Dgeni([ionicPackage]);
- return dgeni.generate();
+ return dgeni.generate().then(function(docs) {
+ console.log(docs.length + ' docs generated');
+ });
+ } catch (err) {
+ console.log(err.stack);
+ }
+ });
+
+ gulp.task('readmes', [], function() {
+ var Dgeni = require('dgeni');
+ var semver = require('semver');
+ try {
+ var ionicPackage = require('./dgeni-readmes-config')(projectPackage.version);
+ var dgeni = new Dgeni([ionicPackage]);
+ return dgeni.generate().then(function(docs) {
+ console.log(docs.length + ' README files generated');
+ });
} catch (err) {
console.log(err.stack);
}
diff --git a/scripts/docs/links-package/index.js b/scripts/docs/links-package/index.js
deleted file mode 100644
index a3ffc7199..000000000
--- a/scripts/docs/links-package/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var Package = require('dgeni').Package;
-
-module.exports = new Package('links', [])
-
-.factory(require('./inline-tag-defs/link'))
-.factory(require('dgeni-packages/ngdoc/services/getAliases'))
-.factory(require('dgeni-packages/ngdoc/services/getDocFromAlias'))
-.factory(require('./services/getLinkInfo'))
-
-.config(function(inlineTagProcessor, linkInlineTagDef) {
- inlineTagProcessor.inlineTagDefinitions.push(linkInlineTagDef);
-});
diff --git a/scripts/docs/links-package/inline-tag-defs/link.js b/scripts/docs/links-package/inline-tag-defs/link.js
deleted file mode 100644
index 89272c63c..000000000
--- a/scripts/docs/links-package/inline-tag-defs/link.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var INLINE_LINK = /(\S+)(?:\s+([\s\S]+))?/;
-
-/**
- * @dgService linkInlineTagDef
- * @description
- * Process inline link tags (of the form {@link some/uri Some Title}), replacing them with HTML anchors
- * @kind function
- * @param {Object} url The url to match
- * @param {Function} docs error message
- * @return {String} The html link information
- *
- * @property {boolean} relativeLinks Whether we expect the links to be relative to the originating doc
- */
-module.exports = function linkInlineTagDef(getLinkInfo, createDocMessage, log) {
- return {
- name: 'link',
- description: 'Process inline link tags (of the form {@link some/uri Some Title}), replacing them with HTML anchors',
- handler: function(doc, tagName, tagDescription) {
-
- // Parse out the uri and title
- return tagDescription.replace(INLINE_LINK, function(match, uri, title) {
-
- var linkInfo = getLinkInfo(uri, title, doc);
-
- if ( !linkInfo.valid ) {
- log.warn(createDocMessage(linkInfo.error, doc));
- }
-
- return "" + linkInfo.title + "";
- });
- }
- };
-};
\ No newline at end of file
diff --git a/scripts/docs/links-package/services/getLinkInfo.js b/scripts/docs/links-package/services/getLinkInfo.js
deleted file mode 100644
index 787ff0433..000000000
--- a/scripts/docs/links-package/services/getLinkInfo.js
+++ /dev/null
@@ -1,72 +0,0 @@
-var _ = require('lodash');
-var path = require('canonical-path');
-
-/**
- * @dgService getLinkInfo
- * @description
- * Get link information to a document that matches the given url
- * @kind function
- * @param {String} url The url to match
- * @param {String} title An optional title to return in the link information
- * @return {Object} The link information
- *
- * @property {boolean} relativeLinks Whether we expect the links to be relative to the originating doc
- */
-module.exports = function getLinkInfo(getDocFromAlias, encodeCodeBlock, log) {
-
- return function getLinkInfoImpl(url, title, currentDoc) {
- var linkInfo = {
- url: url,
- type: 'url',
- valid: true,
- title: title || url
- };
-
- if ( !url ) {
- throw new Error('Invalid url');
- }
-
- var docs = getDocFromAlias(url, currentDoc);
-
- if ( !getLinkInfoImpl.useFirstAmbiguousLink && docs.length > 1 ) {
-
- linkInfo.valid = false;
- linkInfo.errorType = 'ambiguous';
- linkInfo.error = 'Ambiguous link: "' + url + '".\n' +
- docs.reduce(function(msg, doc) { return msg + '\n "' + doc.id + '" ('+ doc.docType + ') : (' + doc.path + ' / ' + doc.fileInfo.relativePath + ')'; }, 'Matching docs: ');
-
- } else if ( docs.length >= 1 ) {
-
- linkInfo.url = docs[0].path;
- linkInfo.title = title || encodeCodeBlock(docs[0].name, true);
- linkInfo.type = 'doc';
-
- if ( getLinkInfoImpl.relativeLinks && currentDoc && currentDoc.path ) {
- var currentFolder = path.dirname(currentDoc.path);
- var docFolder = path.dirname(linkInfo.url);
- var relativeFolder = path.relative(path.join('/', currentFolder), path.join('/', docFolder));
- linkInfo.url = path.join(relativeFolder, path.basename(linkInfo.url));
- log.debug(currentDoc.path, docs[0].path, linkInfo.url);
- }
-
- } else if ( url.indexOf('#') > 0 ) {
- var pathAndHash = url.split('#');
- linkInfo = getLinkInfoImpl(pathAndHash[0], title, currentDoc);
- linkInfo.url = linkInfo.url + '#' + pathAndHash[1];
- return linkInfo;
-
- } else if ( url.indexOf('/') === -1 && url.indexOf('#') !== 0 ) {
-
- linkInfo.valid = false;
- linkInfo.errorType = 'missing';
- linkInfo.error = 'Invalid link (does not match any doc): "' + url + '"';
-
- } else {
-
- linkInfo.title = title || (( url.indexOf('#') === 0 ) ? url.substring(1) : path.basename(url, '.html'));
-
- }
-
- return linkInfo;
- };
-};
\ No newline at end of file
diff --git a/scripts/docs/processors/hide-private-api.js b/scripts/docs/processors/hide-private-api.js
index 15e2b6eb2..bd475a46a 100644
--- a/scripts/docs/processors/hide-private-api.js
+++ b/scripts/docs/processors/hide-private-api.js
@@ -5,14 +5,14 @@ module.exports = function removePrivateApi() {
$runBefore: ['rendering-docs'],
$process: function(docs) {
var publicDocs = [];
- docs.forEach(function(doc){
- if(!doc.private){
+ docs.forEach(function(doc){
+ if (!doc.private && (!doc.tags || !doc.tags.tagsByName.get('hidden'))){
publicDocs.push(doc);
return doc
}
- })
- docs = publicDocs;
- return docs;
+ });
+ docs = publicDocs;
+ return docs;
}
}
};
diff --git a/scripts/docs/processors/jekyll.js b/scripts/docs/processors/jekyll.js
index 0122b7afd..993224985 100644
--- a/scripts/docs/processors/jekyll.js
+++ b/scripts/docs/processors/jekyll.js
@@ -17,7 +17,7 @@ module.exports = function jekyll(renderDocsProcessor) {
return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
});
docs.forEach(function(doc, i) {
- doc.outputPath = doc.outputPath.toLowerCase().replace(' ', '-');
+ doc.outputPath = doc.outputPath.toLowerCase().replace(/\s/g, '-');
docs[i].URL = doc.outputPath.replace('docs/v2//', 'docs/v2/')
.replace('/index.md', '')
.replace('content/', '');
diff --git a/scripts/docs/processors/readmes.js b/scripts/docs/processors/readmes.js
new file mode 100644
index 000000000..e5c1f458c
--- /dev/null
+++ b/scripts/docs/processors/readmes.js
@@ -0,0 +1,25 @@
+module.exports = function jekyll(renderDocsProcessor) {
+ return {
+ name: 'readmes',
+ description: 'Create jekyll includes',
+ $runAfter: ['paths-computed'],
+ $runBefore: ['rendering-docs'],
+ $process: function(docs) {
+ var currentVersion = renderDocsProcessor.extraData.version.current.name;
+
+ // pretty up and sort the docs object for menu generation
+ docs = docs.filter(function(doc) {
+ return (!!doc.name && !!doc.outputPath) || doc.docType === 'index-page';
+ });
+
+ docs.forEach(function(doc, i) {
+ doc.npmId = doc.outputPath.replace('/README.md', '')
+ .replace('src/@ionic-native/plugins/','');
+ doc.outputPath = doc.outputPath.replace('src/', '');
+ });
+
+ // returning docs will replace docs object in the next process
+ return docs;
+ }
+ };
+};
diff --git a/scripts/docs/processors/remove-private-members.js b/scripts/docs/processors/remove-private-members.js
index 59946a9d8..36fdd3303 100644
--- a/scripts/docs/processors/remove-private-members.js
+++ b/scripts/docs/processors/remove-private-members.js
@@ -6,16 +6,19 @@ module.exports = function removePrivateMembers() {
$runBefore: ['rendering-docs'],
$process: function(docs) {
docs.forEach(function(doc) {
+
if (doc.members) {
doc.members = doc.members.filter(function(member) {
- return !member.tags.tagsByName.get('private');
+ return !member.tags.tagsByName.get('hidden');
});
}
+
if (doc.statics) {
doc.statics = doc.statics.filter(function(staticMethod) {
- return !staticMethod.tags.tagsByName.get('private');
+ return !staticMethod.tags.tagsByName.get('hidden');
});
}
+
});
return docs;
diff --git a/scripts/docs/tag-defs/tag-defs.js b/scripts/docs/tag-defs/tag-defs.js
index 5f01bfa2b..98a043ac8 100644
--- a/scripts/docs/tag-defs/tag-defs.js
+++ b/scripts/docs/tag-defs/tag-defs.js
@@ -6,6 +6,7 @@ module.exports = [
return typeof value !== 'undefined';
}},
{'name': 'usage'},
+ {'name': 'hidden'}, // hide from docs
{'name': 'classes'}, // related classes
{'name': 'interfaces'} // related interfaces
];
diff --git a/scripts/docs/templates/common.template.html b/scripts/docs/templates/common.template.html
index 77bf359a7..79efbd3c3 100644
--- a/scripts/docs/templates/common.template.html
+++ b/scripts/docs/templates/common.template.html
@@ -53,7 +53,7 @@ docType: "<$ doc.docType $>"
<@- endmacro -@>
<@ macro githubViewLink(doc) -@>
-<$ doc.fileInfo.relativePath $> (line <$ doc.location.start.line+1 $>)
+<$ doc.fileInfo.relativePath $> (line <$ doc.location.start.line+1 $>)
<@- endmacro -@>
<@ macro paramTable(params, isDirective) -@>
@@ -224,7 +224,10 @@ docType: "<$ doc.docType $>"
<@ endif @>
-$ <@ if prop.install @><$ prop.install $><@ else @>ionic plugin add <$ prop.plugin $><@ endif -@>
+
+ $ <@ if prop.install @><$ prop.install $><@ else @>ionic plugin add <$ prop.plugin $><@ endif -@>
+ $ npm install --save @ionic-native/<$ prop.pluginRef $>
+
Repo:
<$ prop.repo $>
diff --git a/scripts/docs/templates/native_menu.template.html b/scripts/docs/templates/native_menu.template.html
index abdcd033c..abe7a91c3 100644
--- a/scripts/docs/templates/native_menu.template.html
+++ b/scripts/docs/templates/native_menu.template.html
@@ -1,9 +1,9 @@
<@ for doc in docs @><@ if doc.URL and doc.private != true and doc.beta != true @>
-
+
<$ doc.name $>
<@ endif @><@ endfor @>
<@ for doc in docs @><@ if doc.URL and doc.private != true and doc.beta == true @>
-
+
<$ doc.name $> β
<@ endif @><@ endfor @>
diff --git a/scripts/docs/templates/readme.template.md b/scripts/docs/templates/readme.template.md
new file mode 100644
index 000000000..44041c233
--- /dev/null
+++ b/scripts/docs/templates/readme.template.md
@@ -0,0 +1,38 @@
+
+ Improve this doc
+
+
+# <$ doc.name $>
+
+<@- if doc.beta == true @>
+
+ This plugin is still in beta stage and may not work as expected. Please
+ submit any issues to the plugin repo.
+
+<@ endif -@>
+
+
+<@ for prop in doc.decorators[0].argumentInfo @>
+
+```
+$ <@ if prop.install @><$ prop.install $><@ else @>ionic plugin add <$ prop.plugin $><@ endif @>
+$ npm install --save @ionic-native/<$ doc.npmId $>
+```
+
+## [Usage Documentation](https://ionicframework.com/docs/v2/native/<$ doc.fileInfo.relativePath|replace('/home/ubuntu/ionic-native/', '')|replace('//','/')|replace('index.ts','')|replace('src/@ionic-native/plugins/','') $>)
+
+Plugin Repo: [<$ prop.repo $>](<$ prop.repo $>)
+
+<$ doc.description $>
+
+<@- if prop.platforms @>
+
+## Supported platforms
+<@ for platform in prop.platforms -@>
+- <$ platform $>
+<@ endfor @>
+
+<@ endif -@>
+
+<@ endfor @>
diff --git a/scripts/docs/typescript-definition-package/index.js b/scripts/docs/typescript-definition-package/index.js
deleted file mode 100644
index 532cfe5d3..000000000
--- a/scripts/docs/typescript-definition-package/index.js
+++ /dev/null
@@ -1,100 +0,0 @@
-var Package = require('dgeni').Package;
-var jsdocPackage = require('dgeni-packages/jsdoc');
-var nunjucksPackage = require('dgeni-packages/nunjucks');
-var typescriptPackage = require('../typescript-package');
-var gitPackage = require('dgeni-packages/git');
-var path = require('canonical-path');
-
-// Define the dgeni package for generating the docs
-module.exports = new Package('angular-v2-docs', [jsdocPackage, nunjucksPackage, typescriptPackage, gitPackage])
-
-// Register the processors
-.processor(require('./processors/createTypeDefinitionFile'))
-
-.config(function(readFilesProcessor, inlineTagProcessor) {
- readFilesProcessor.basePath = path.resolve(__dirname, '../..');
- // Don't run unwanted processors
- readFilesProcessor.$enabled = false;
- inlineTagProcessor.$enabled = false;
-})
-
-
-// Configure the log service
-.config(function(log) {
- log.level = 'info';
-})
-
-
-.config(function(renderDocsProcessor, versionInfo) {
- renderDocsProcessor.extraData.versionInfo = versionInfo;
-})
-
-.config(function(readFilesProcessor, inlineTagProcessor, readTypeScriptModules, createTypeDefinitionFile) {
-
- // Don't run unwanted processors
- readFilesProcessor.$enabled = false; // We are not using the normal file reading processor
- inlineTagProcessor.$enabled = false; // We are not actually processing the inline link tags
-
- // Configure file reading
- readFilesProcessor.basePath = path.resolve(__dirname, '../..');
- readTypeScriptModules.sourceFiles = [
- 'angular2/angular2.ts',
- 'angular2/router.ts'
- ];
- readTypeScriptModules.basePath = path.resolve(path.resolve(__dirname, '../../modules'));
-
- createTypeDefinitionFile.typeDefinitions = [
- {
- id: 'angular2/angular2',
- modules: {
- 'angular2/angular2': 'angular2/angular2',
- }
- },
- {
- id: 'angular2/router',
- modules: {
- 'angular2/router': 'angular2/router'
- }
- }
- ];
-})
-
-
-.config(function(parseTagsProcessor, getInjectables) {
- // We actually don't want to parse param docs in this package as we are getting the data out using TS
- parseTagsProcessor.tagDefinitions.forEach(function(tagDef) {
- if (tagDef.name === 'param') {
- tagDef.docProperty = 'paramData';
- tagDef.transforms = [];
- }
- });
-
-})
-
-
-// Configure file writing
-.config(function(writeFilesProcessor) {
- writeFilesProcessor.outputFolder = 'dist/docs';
-})
-
-
-// Configure rendering
-.config(function(templateFinder, templateEngine) {
-
- // Nunjucks and Angular conflict in their template bindings so change Nunjucks
- templateEngine.config.tags = {
- variableStart: '{$',
- variableEnd: '$}'
- };
-
- templateFinder.templateFolders
- .unshift(path.resolve(__dirname, 'templates'));
-
- templateFinder.templatePatterns = [
- '${ doc.template }',
- '${ doc.id }.${ doc.docType }.template.html',
- '${ doc.id }.template.html',
- '${ doc.docType }.template.html',
- 'common.template.html'
- ];
-});
\ No newline at end of file
diff --git a/scripts/docs/typescript-definition-package/mocks/mockPackage.js b/scripts/docs/typescript-definition-package/mocks/mockPackage.js
deleted file mode 100644
index 692309100..000000000
--- a/scripts/docs/typescript-definition-package/mocks/mockPackage.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var Package = require('dgeni').Package;
-
-module.exports = function mockPackage() {
-
- return new Package('mockPackage', [require('../')])
-
- // provide a mock log service
- .factory('log', function() { return require('dgeni/lib/mocks/log')(false); })
-// .factory('templateEngine', function() { return {}; });
-
-};
diff --git a/scripts/docs/typescript-definition-package/processors/createTypeDefinitionFile.js b/scripts/docs/typescript-definition-package/processors/createTypeDefinitionFile.js
deleted file mode 100644
index f3bc002ca..000000000
--- a/scripts/docs/typescript-definition-package/processors/createTypeDefinitionFile.js
+++ /dev/null
@@ -1,86 +0,0 @@
-var _ = require('lodash');
-var path = require('canonical-path');
-
-module.exports = function createTypeDefinitionFile(log) {
-
- return {
- $runAfter: ['processing-docs'],
- $runBefore: ['docs-processed'],
- $validate: {
- dtsPath: { presence: true },
- dtsExtension: { presence: true },
- typeDefinitions: { presence: true }
- },
- dtsPath: 'typings',
- dtsExtension: '.d.ts',
- typeDefinitions: [],
- $process: function(docs) {
- var dtsPath = this.dtsPath;
- var dtsExtension = this.dtsExtension;
-
- // For each type definition that we wish to create we define a dgeni "doc" for it
- var typeDefDocs = _.map(this.typeDefinitions, function(def) {
-
- var id = def.id + dtsExtension;
- var docPath = path.join(dtsPath, id);
-
- return {
- docType: 'type-definition',
- id: id,
- aliases: [id],
- path: docPath,
- outputPath: docPath,
- // A type definition may include a number of top level modules
- // And those modules could be aliased (such as 'angular2/angular2.api' -> 'angular2/angular2')
- moduleDocs: _.transform(def.modules, function(moduleDocs, id, alias) {
- moduleDocs[id] = { id: alias, doc: null };
- })
- };
- });
-
- // Now add all the module docs to their corresponding type definition doc
- _.forEach(docs, function(doc) {
- _.forEach(typeDefDocs, function(typeDefDoc) {
- if(typeDefDoc.moduleDocs[doc.id]) {
- // Add a copy, because we are going to modify it
- typeDefDoc.moduleDocs[doc.id].doc = doc;
- }
- });
- });
-
- return _.filter(typeDefDocs, function(doc) {
- _.forEach(doc.moduleDocs, function(modDoc, alias) {
- if (!doc || !modDoc.doc) {
- log.error('createTypeDefinitionFile processor: no such module "' + alias + '" (Did you forget to add it to the modules to load?)');
- doc = null;
- return;
- }
- _.forEach(modDoc.doc.exports, function(exportDoc) {
-
- // Search for classes with a constructor marked as `@private`
- if (exportDoc.docType === 'class' && exportDoc.constructorDoc && exportDoc.constructorDoc.private) {
-
- // Convert this class to an interface with no constructor
- exportDoc.docType = 'interface';
- exportDoc.constructorDoc = null;
-
- if (exportDoc.heritage) {
- // convert the heritage since interfaces use `extends` not `implements`
- exportDoc.heritage = exportDoc.heritage.replace('implements', 'extends');
- }
-
- // Add the `declare var SomeClass extends InjectableReference` construct
- modDoc.doc.exports.push({
- docType: 'var',
- name: exportDoc.name,
- id: exportDoc.id,
- heritage: ': InjectableReference'
- });
- }
- });
- });
- return !!doc;
- });
- }
- };
-};
diff --git a/scripts/docs/typescript-definition-package/processors/createTypeDefinitionFile.spec.js b/scripts/docs/typescript-definition-package/processors/createTypeDefinitionFile.spec.js
deleted file mode 100644
index 1bf15092d..000000000
--- a/scripts/docs/typescript-definition-package/processors/createTypeDefinitionFile.spec.js
+++ /dev/null
@@ -1,48 +0,0 @@
-var mockPackage = require('../mocks/mockPackage');
-var Dgeni = require('dgeni');
-var path = require('canonical-path');
-var _ = require('lodash');
-
-describe('createTypeDefinitionFile processor', function() {
- var dgeni, injector, processor;
-
- beforeEach(function() {
- dgeni = new Dgeni([mockPackage()]);
- injector = dgeni.configureInjector();
- processor = injector.get('createTypeDefinitionFile');
-
- // Initialize the processor
- processor.typeDefinitions = [{
- id: 'angular2/angular2',
- modules: { 'angular2/angular2': 'angular2/angular2' }
- }];
- });
-
-
-
- describe('classes with private constructors', function() {
-
- it('should convert heritage from `implements` into `extends`', function() {
-
- // Create some mock docs for testing
- var docs = [
- {
- id: 'angular2/angular2',
- exports: [
- { docType: 'class', heritage: 'implements Xyz', constructorDoc: { private: true } }
- ]
- }
- ];
-
- docs = processor.$process(docs);
-
- expect(docs.length).toEqual(1);
- expect(docs[0].docType).toEqual('type-definition');
-
- var moduleDoc = docs[0].moduleDocs['angular2/angular2'].doc;
- expect(moduleDoc.exports.length).toEqual(2);
- expect(moduleDoc.exports[0].heritage).toEqual('extends Xyz');
- });
- });
-
-});
\ No newline at end of file
diff --git a/scripts/docs/typescript-definition-package/templates/angular2/angular2.d.ts.template.html b/scripts/docs/typescript-definition-package/templates/angular2/angular2.d.ts.template.html
deleted file mode 100644
index ce9778bfd..000000000
--- a/scripts/docs/typescript-definition-package/templates/angular2/angular2.d.ts.template.html
+++ /dev/null
@@ -1,17 +0,0 @@
-{% extends '../type-definition.template.html' %}
-{% block staticDeclarations %}
-
-interface List extends Array {}
-interface Map {}
-interface StringMap extends Map {}
-
-declare module ng {
- // See https://github.com/Microsoft/TypeScript/issues/1168
- class BaseException /* extends Error */ {
- message: string;
- stack: string;
- toString(): string;
- }
- interface InjectableReference {}
-}
-{% endblock %}
diff --git a/scripts/docs/typescript-definition-package/templates/type-definition.template.html b/scripts/docs/typescript-definition-package/templates/type-definition.template.html
deleted file mode 100644
index 4ebceffaa..000000000
--- a/scripts/docs/typescript-definition-package/templates/type-definition.template.html
+++ /dev/null
@@ -1,72 +0,0 @@
-
-{%- macro commentBlock(doc, level) -%}
-{%- if doc.content | trim %}
-
-{% if level > 1 %}{$ '/**' | indent(level-1, true) | replace(r/\n$/, "") $}{% else %}/**{% endif %}
-{$ doc.content | trim | replace(r/^/gm, "* ") | indent(level, true) | replace(r/\n$/, "") $}
-{$ '*/' | indent(level, true) | replace(r/\n$/, "") $}{% endif -%}
-{%- endmacro -%}
-
-
-{%- macro memberInfo(member) -%}
-{$ commentBlock(member, 5) $}
- {$ member.name $}{% if member.optional %}?{% endif -%}
-{% if member.typeParameters %}<{% for typeParam in member.typeParameters %}{$ typeParam $}{% if not loop.last %}, {% endif %}{% endfor %}>{% endif -%}
-{%- if member.parameters -%}({% for param in member.parameters %}{$ param $}{% if not loop.last %}, {% endif %}{% endfor %}){%- endif -%}
-{%- if member.returnType == 'Directive' %}: DirectiveAnnotation{%- elif member.returnType -%}: {$ member.returnType $}{%- else -%}: void
-{%- endif -%};
-{%- endmacro -%}
-
-
-// Type definitions for Angular v{$ versionInfo.currentVersion.full | replace(r/\+/, "_") $}
-// Project: http://angular.io/
-// Definitions by: angular team
-// Definitions: https://github.com/borisyankov/DefinitelyTyped
-
-// ***********************************************************
-// This file is generated by the Angular build process.
-// Please do not create manual edits or send pull requests
-// modifying this file.
-// ***********************************************************
-{% block staticDeclarations %}{% endblock %}
-{% for alias, module in doc.moduleDocs %}
-{$ commentBlock(module.doc, 1) $}
-declare module ng {
-
- {%- for export in module.doc.exports -%}
- {%- if export.content -%}
- {$ commentBlock(export, 3) $}
- {%- endif %}
- {$ export.docType $} {$ export.name $}{$ export.typeParams $}{%- if export.heritage == ' extends Directive' %} extends DirectiveAnnotation{% else %}{$ export.heritage $}{% endif %}
- {%- if export.docType == 'class' or export.docType == 'interface' %} {
- {%- if export.newMember %}
- {$ memberInfo(export.newMember) $}
- {% endif %}
- {%- if export.callMember %}
- {$ memberInfo(export.callMember) $}
- {% endif -%}
- {%- for member in export.members %}
- {$ memberInfo(member) $}
- {%- endfor %}
- }
-
- {%- elif export.docType == 'enum' %} {
- {%- for member in export.members %}
- {$ member $}{% if not loop.last %},
- {%- endif -%}
- {%- endfor %}
- }
-
- {%- else -%}
- {% if export.parameters %}({% for param in export.parameters %}{$ param $}{% if not loop.last %}, {% endif %}{% endfor %}){%- endif %}
- {%- if export.returnType %} : {$ export.returnType $} {% endif -%}
- ;
- {%- endif %}
- {% endfor %}
-}
-
-{% endfor %}
-
-declare module "angular2/angular2" {
- export = ng;
-}
diff --git a/scripts/docs/typescript-package/index.js b/scripts/docs/typescript-package/index.js
deleted file mode 100755
index 876c08085..000000000
--- a/scripts/docs/typescript-package/index.js
+++ /dev/null
@@ -1,74 +0,0 @@
-var basePackage = require('dgeni-packages/base');
-var Package = require('dgeni').Package;
-var path = require('canonical-path');
-
-// Define the dgeni package for generating the docs
-module.exports = new Package('typescript-parsing', [basePackage])
-
-// Register the services and file readers
-.factory(require('./services/modules'))
-.factory(require('./services/tsParser'))
-.factory(require('./services/tsParser/createCompilerHost'))
-.factory(require('./services/tsParser/getFileInfo'))
-.factory(require('./services/tsParser/getExportDocType'))
-.factory(require('./services/tsParser/getContent'))
-.factory(require('./services/tsParser/getDirectiveInfo'))
-
-.factory(require('./services/convertPrivateClassesToInterfaces'))
-
-.factory('EXPORT_DOC_TYPES', function() {
- return [
- 'class',
- 'interface',
- 'function',
- 'var',
- 'const',
- 'let',
- 'enum',
- 'type-alias'
- ];
-})
-
-
-// Register the processors
-.processor(require('./processors/readTypeScriptModules'))
-
-
-// Configure the log service
-.config(function(log) {
- log.level = 'warn';
-})
-
-
-// Configure ids and paths
-.config(function(computeIdsProcessor, computePathsProcessor, EXPORT_DOC_TYPES) {
-
- computeIdsProcessor.idTemplates.push({
- docTypes: ['member'],
- idTemplate: '${classDoc.id}.${name}',
- getAliases: function(doc) {
- return doc.classDoc.aliases.map(function(alias) { return alias + '.' + doc.name; });
- }
- });
-
- computePathsProcessor.pathTemplates.push({
- docTypes: ['member'],
- pathTemplate: '${classDoc.path}#${name}',
- getOutputPath: function() {} // These docs are not written to their own file, instead they are part of their class doc
- });
-
- var MODULES_DOCS_PATH = 'partials/modules';
-
- computePathsProcessor.pathTemplates.push({
- docTypes: ['module'],
- pathTemplate: '/${id}',
- outputPathTemplate: MODULES_DOCS_PATH + '/${id}/index.html'
- });
-
- computePathsProcessor.pathTemplates.push({
- docTypes: EXPORT_DOC_TYPES,
- pathTemplate: '${moduleDoc.path}/${name}',
- outputPathTemplate: MODULES_DOCS_PATH + '/${path}/index.html'
- });
-
-});
diff --git a/scripts/docs/typescript-package/mocks/mockPackage.js b/scripts/docs/typescript-package/mocks/mockPackage.js
deleted file mode 100755
index 834d53c95..000000000
--- a/scripts/docs/typescript-package/mocks/mockPackage.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var Package = require('dgeni').Package;
-
-module.exports = function mockPackage() {
-
- return new Package('mockPackage', [require('../')])
-
- // provide a mock log service
- .factory('log', function() { return require('dgeni/lib/mocks/log')(false); })
- .factory('templateEngine', function() { return {}; });
-
-};
diff --git a/scripts/docs/typescript-package/mocks/readTypeScriptModules/ignoreExportsMatching.ts b/scripts/docs/typescript-package/mocks/readTypeScriptModules/ignoreExportsMatching.ts
deleted file mode 100755
index 476d4cc44..000000000
--- a/scripts/docs/typescript-package/mocks/readTypeScriptModules/ignoreExportsMatching.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export var __esModule = true;
-export class OKToExport {}
-export function _thisIsPrivate() {}
-export var thisIsOK = '!';
\ No newline at end of file
diff --git a/scripts/docs/typescript-package/mocks/readTypeScriptModules/interfaces.ts b/scripts/docs/typescript-package/mocks/readTypeScriptModules/interfaces.ts
deleted file mode 100755
index a2d4be4fe..000000000
--- a/scripts/docs/typescript-package/mocks/readTypeScriptModules/interfaces.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export interface MyInterface {
- optionalProperty? : string
- >(param: T) : U
- new (param: number) : MyInterface
-}
\ No newline at end of file
diff --git a/scripts/docs/typescript-package/mocks/readTypeScriptModules/orderingOfMembers.ts b/scripts/docs/typescript-package/mocks/readTypeScriptModules/orderingOfMembers.ts
deleted file mode 100755
index 2020ec7fa..000000000
--- a/scripts/docs/typescript-package/mocks/readTypeScriptModules/orderingOfMembers.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export class Test {
- firstItem;
- constructor() { this.doStuff(); }
- otherMethod() {}
- doStuff() {}
-}
\ No newline at end of file
diff --git a/scripts/docs/typescript-package/mocks/readTypeScriptModules/privateModule.ts b/scripts/docs/typescript-package/mocks/readTypeScriptModules/privateModule.ts
deleted file mode 100755
index d4c6ef610..000000000
--- a/scripts/docs/typescript-package/mocks/readTypeScriptModules/privateModule.ts
+++ /dev/null
@@ -1 +0,0 @@
-export var x = 10;
\ No newline at end of file
diff --git a/scripts/docs/typescript-package/mocks/readTypeScriptModules/publicModule.ts b/scripts/docs/typescript-package/mocks/readTypeScriptModules/publicModule.ts
deleted file mode 100755
index 0fbae4ad2..000000000
--- a/scripts/docs/typescript-package/mocks/readTypeScriptModules/publicModule.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export { x as y} from './privateModule';
-
-export abstract class AbstractClass {}
\ No newline at end of file
diff --git a/scripts/docs/typescript-package/mocks/tsParser/importedSrc.ts b/scripts/docs/typescript-package/mocks/tsParser/importedSrc.ts
deleted file mode 100755
index 74a115e5f..000000000
--- a/scripts/docs/typescript-package/mocks/tsParser/importedSrc.ts
+++ /dev/null
@@ -1 +0,0 @@
-export var x = 100;
\ No newline at end of file
diff --git a/scripts/docs/typescript-package/mocks/tsParser/testSrc.ts b/scripts/docs/typescript-package/mocks/tsParser/testSrc.ts
deleted file mode 100755
index 7b6d3f18d..000000000
--- a/scripts/docs/typescript-package/mocks/tsParser/testSrc.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * @module
- * @description
- * This is the module description
- */
-
-export * from 'importedSrc';
-
-/**
- * This is some random other comment
- */
-
-/**
- * This is MyClass
- */
-export class MyClass {
- message: String;
-
- /**
- * Create a new MyClass
- * @param {String} name The name to say hello to
- */
- constructor(name) { this.message = 'hello ' + name; }
-
- /**
- * Return a greeting message
- */
- greet() { return this.message; }
-}
-
-/**
- * An exported function
- */
-export var myFn = (val: number) => return val * 2;
\ No newline at end of file
diff --git a/scripts/docs/typescript-package/processors/readTypeScriptModules.js b/scripts/docs/typescript-package/processors/readTypeScriptModules.js
deleted file mode 100755
index aa80c7a15..000000000
--- a/scripts/docs/typescript-package/processors/readTypeScriptModules.js
+++ /dev/null
@@ -1,454 +0,0 @@
-var glob = require('glob');
-var path = require('canonical-path');
-var _ = require('lodash');
-var ts = require('typescript');
-
-module.exports = function readTypeScriptModules(tsParser, modules, getFileInfo,
- getDirectiveInfo,
- getExportDocType, getContent,
- createDocMessage, log) {
-
- return {
- $runAfter: ['files-read'],
- $runBefore: ['parsing-tags'],
-
- $validate: {
- sourceFiles: {presence: true},
- basePath: {presence: true},
- hidePrivateMembers: {inclusion: [true, false]},
- sortClassMembers: {inclusion: [true, false]},
- ignoreExportsMatching: {}
- },
-
- // A collection of globs that identify those modules for which we should create docs
- sourceFiles: [],
- // The base path from which to load the source files
- basePath: '.',
- // We can ignore members of classes that are private
- hidePrivateMembers: true,
- // We leave class members sorted in order of declaration
- sortClassMembers: false,
- // We can provide a collection of strings or regexes to ignore exports whose export names match
- ignoreExportsMatching: ['___esModule'],
-
- $process: function(docs) {
-
- // Convert ignoreExportsMatching to an array of regexes
- var ignoreExportsMatching = convertToRegexCollection(this.ignoreExportsMatching);
-
- var hidePrivateMembers = this.hidePrivateMembers;
- var sortClassMembers = this.sortClassMembers;
-
- var basePath = path.resolve(this.basePath);
- var filesPaths = expandSourceFiles(this.sourceFiles, basePath);
- var parseInfo = tsParser.parse(filesPaths, this.basePath);
- var moduleSymbols = parseInfo.moduleSymbols;
-
- // Iterate through each of the modules that were parsed and generate a module doc
- // as well as docs for each module's exports.
- moduleSymbols.forEach(function(moduleSymbol) {
-
- var moduleDoc = createModuleDoc(moduleSymbol, basePath);
-
- // Add this module doc to the module lookup collection and the docs collection
- modules[moduleDoc.id] = moduleDoc;
- docs.push(moduleDoc);
-
- // Iterate through this module's exports and generate a doc for each
- moduleSymbol.exportArray.forEach(function(exportSymbol) {
-
- // Ignore exports starting with an underscore
- if (anyMatches(ignoreExportsMatching, exportSymbol.name)) return;
-
- // If the symbol is an Alias then for most things we want the original resolved symbol
- var resolvedExport = exportSymbol.resolvedSymbol || exportSymbol;
-
- // If the resolved symbol contains no declarations then it is invalid
- // (probably an abstract class)
- // For the moment we are just going to ignore such exports
- // TODO: find a way of generating docs for them
- if (!resolvedExport.declarations) return;
-
- var exportDoc = createExportDoc(exportSymbol.name, resolvedExport, moduleDoc, basePath, parseInfo.typeChecker);
- log.debug('>>>> EXPORT: ' + exportDoc.name + ' (' + exportDoc.docType + ') from ' + moduleDoc.id);
-
- // Add this export doc to its module doc
- moduleDoc.exports.push(exportDoc);
- docs.push(exportDoc);
-
- exportDoc.members = [];
- exportDoc.statics = [];
-
- // Generate docs for each of the export's members
- if (resolvedExport.flags & ts.SymbolFlags.HasMembers) {
-
- for(var memberName in resolvedExport.members) {
- // FIXME(alexeagle): why do generic type params appear in members?
- if (memberName === 'T') {
- continue;
- }
- log.silly('>>>>>> member: ' + memberName + ' from ' + exportDoc.id + ' in ' + moduleDoc.id);
- var memberSymbol = resolvedExport.members[memberName];
- var memberDoc = createMemberDoc(memberSymbol, exportDoc, basePath, parseInfo.typeChecker);
-
- // We special case the constructor and sort the other members alphabetically
- if (memberSymbol.flags & ts.SymbolFlags.Constructor) {
- exportDoc.constructorDoc = memberDoc;
- docs.push(memberDoc);
- } else if (!hidePrivateMembers || memberSymbol.name.charAt(0) !== '_') {
- docs.push(memberDoc);
- exportDoc.members.push(memberDoc);
- } else if (memberSymbol.name === '__call' && memberSymbol.flags & ts.SymbolFlags.Signature) {
- docs.push(memberDoc);
- exportDoc.callMember = memberDoc;
- } else if (memberSymbol.name === '__new' && memberSymbol.flags & ts.SymbolFlags.Signature) {
- docs.push(memberDoc);
- exportDoc.newMember = memberDoc;
- }
- }
- }
-
- if (exportDoc.docType === 'enum') {
- for(var memberName in resolvedExport.exports) {
- log.silly('>>>>>> member: ' + memberName + ' from ' + exportDoc.id + ' in ' + moduleDoc.id);
- var memberSymbol = resolvedExport.exports[memberName];
- var memberDoc = createMemberDoc(memberSymbol, exportDoc, basePath, parseInfo.typeChecker);
- docs.push(memberDoc);
- exportDoc.members.push(memberDoc);
- }
- } else if (resolvedExport.flags & ts.SymbolFlags.HasExports) {
- for (var exported in resolvedExport.exports) {
- if (exported === 'prototype') continue;
- if (hidePrivateMembers && exported.charAt(0) === '_') continue;
- var memberSymbol = resolvedExport.exports[exported];
- var memberDoc = createMemberDoc(memberSymbol, exportDoc, basePath, parseInfo.typeChecker);
- memberDoc.isStatic = true;
- docs.push(memberDoc);
- exportDoc.statics.push(memberDoc);
- }
- }
-
- if (sortClassMembers) {
- exportDoc.members.sort(function(a, b) {
- if (a.name > b.name) return 1;
- if (a.name < b.name) return -1;
- return 0;
- });
- exportDoc.statics.sort(function(a, b) {
- if (a.name > b.name) return 1;
- if (a.name < b.name) return -1;
- return 0;
- });
- }
- });
- });
- }
- };
-
-
- function createModuleDoc(moduleSymbol, basePath) {
- var id = moduleSymbol.name.replace(/^"|"$/g, '');
- var name = id.split('/').pop();
- var moduleDoc = {
- docType: 'module',
- name: name,
- id: id,
- aliases: [id, name],
- moduleTree: moduleSymbol,
- content: getContent(moduleSymbol),
- exports: [],
- fileInfo: getFileInfo(moduleSymbol, basePath),
- location: getLocation(moduleSymbol)
- };
- return moduleDoc;
- }
-
- function createExportDoc(name, exportSymbol, moduleDoc, basePath, typeChecker) {
- var typeParamString = '';
- var heritageString = '';
- var typeDefinition = '';
-
- exportSymbol.declarations.forEach(function(decl) {
- var sourceFile = ts.getSourceFileOfNode(decl);
-
- if (decl.typeParameters) {
- typeParamString = '<' + getText(sourceFile, decl.typeParameters) + '>';
- }
-
- if (decl.symbol.flags & ts.SymbolFlags.TypeAlias) {
- typeDefinition = getText(sourceFile, decl.type);
- }
-
- if (decl.heritageClauses) {
- decl.heritageClauses.forEach(function(heritage) {
-
- if (heritage.token == ts.SyntaxKind.ExtendsKeyword) {
- heritageString += " extends";
- heritage.types.forEach(function(typ, idx) {
- heritageString += (idx > 0 ? ',' : '') + typ.getFullText();
- });
- }
-
- if (heritage.token == ts.SyntaxKind.ImplementsKeyword) {
- heritageString += " implements";
- heritage.types.forEach(function(typ, idx) {
- heritageString += (idx > 0 ? ', ' : '') + typ.getFullText();
- });
- }
- });
- }
- });
-
- //Make sure duplicate aliases aren't created, so "Ambiguous link" warnings are prevented
- var aliasNames = [name, moduleDoc.id + '/' + name];
- if (typeParamString) {
- aliasNames.push(name + typeParamString);
- aliasNames.push(moduleDoc.id + '/' + name + typeParamString);
- }
-
- var exportDoc = {
- docType: getExportDocType(exportSymbol),
- exportSymbol: exportSymbol,
- name: name,
- id: moduleDoc.id + '/' + name,
- typeParams: typeParamString,
- heritage: heritageString,
- decorators: getDecorators(exportSymbol),
- aliases: aliasNames,
- moduleDoc: moduleDoc,
- content: getContent(exportSymbol),
- fileInfo: getFileInfo(exportSymbol, basePath),
- location: getLocation(exportSymbol),
- directiveInfo: getDirectiveInfo(exportSymbol)
- };
-
- if (exportDoc.docType === 'var' || exportDoc.docType === 'const' || exportDoc.docType === 'let') {
- exportDoc.symbolTypeName = exportSymbol.valueDeclaration.type &&
- exportSymbol.valueDeclaration.type.typeName &&
- exportSymbol.valueDeclaration.type.typeName.text;
- }
-
- if (exportDoc.docType === 'type-alias') {
- exportDoc.returnType = getReturnType(typeChecker, exportSymbol);
- }
-
- if(exportSymbol.flags & ts.SymbolFlags.Function) {
- exportDoc.parameters = getParameters(typeChecker, exportSymbol);
- }
- if(exportSymbol.flags & ts.SymbolFlags.Value) {
- exportDoc.returnType = getReturnType(typeChecker, exportSymbol);
- }
- if (exportSymbol.flags & ts.SymbolFlags.TypeAlias) {
- exportDoc.typeDefinition = typeDefinition;
- }
-
- // Compute the original module name from the relative file path
- exportDoc.originalModule = exportDoc.fileInfo.relativePath
- .replace(new RegExp('\.' + exportDoc.fileInfo.extension + '$'), '');
-
- return exportDoc;
- }
-
- function createMemberDoc(memberSymbol, classDoc, basePath, typeChecker) {
- var memberDoc = {
- docType: 'member',
- classDoc: classDoc,
- name: memberSymbol.name,
- decorators: getDecorators(memberSymbol),
- content: getContent(memberSymbol),
- fileInfo: getFileInfo(memberSymbol, basePath),
- location: getLocation(memberSymbol)
- };
-
- memberDoc.typeParameters = getTypeParameters(typeChecker, memberSymbol);
-
- if(memberSymbol.flags & (ts.SymbolFlags.Signature) ) {
- memberDoc.parameters = getParameters(typeChecker, memberSymbol);
- memberDoc.returnType = getReturnType(typeChecker, memberSymbol);
- switch(memberDoc.name) {
- case '__call':
- memberDoc.name = '';
- break;
- case '__new':
- memberDoc.name = 'new';
- break;
- }
- }
-
- if (memberSymbol.flags & ts.SymbolFlags.Method) {
- // NOTE: we use the property name `parameters` here so we don't conflict
- // with the `params` property that will be updated by dgeni reading the
- // `@param` tags from the docs
- memberDoc.parameters = getParameters(typeChecker, memberSymbol);
- }
-
- if (memberSymbol.flags & ts.SymbolFlags.Constructor) {
- memberDoc.parameters = getParameters(typeChecker, memberSymbol);
- memberDoc.name = 'constructor';
- }
-
- if(memberSymbol.flags & ts.SymbolFlags.Value) {
- memberDoc.returnType = getReturnType(typeChecker, memberSymbol);
- }
-
- if(memberSymbol.flags & ts.SymbolFlags.Optional) {
- memberDoc.optional = true;
- }
-
- return memberDoc;
- }
-
-
- function getDecorators(symbol) {
-
- var declaration = symbol.valueDeclaration || symbol.declarations[0];
- var sourceFile = ts.getSourceFileOfNode(declaration);
-
- var decorators = declaration.decorators && declaration.decorators.map(function(decorator) {
- decorator = decorator.expression;
- return {
- name: decorator.expression ? decorator.expression.text : decorator.text,
- arguments: decorator.arguments && decorator.arguments.map(function(argument) {
- return getText(sourceFile, argument).trim();
- }),
- argumentInfo: decorator.arguments && decorator.arguments.map(function(argument) {
- return parseArgument(argument);
- }),
- expression: decorator
- };
- });
- return decorators;
- }
-
- function parseProperties(properties) {
- var result = {};
- _.forEach(properties, function(property) {
- result[property.name.text] = parseArgument(property.initializer);
- });
- return result;
- }
-
- function parseArgument(argument) {
- if (argument.text) return argument.text;
- if (argument.properties) return parseProperties(argument.properties);
- if (argument.elements) return argument.elements.map(function(element) { return element.text; });
- var sourceFile = ts.getSourceFileOfNode(argument);
- var text = getText(sourceFile, argument).trim();
- return text;
- }
-
- function getParameters(typeChecker, symbol) {
- var declaration = symbol.valueDeclaration || symbol.declarations[0];
- var sourceFile = ts.getSourceFileOfNode(declaration);
- if (!declaration.parameters) {
- var location = getLocation(symbol);
- throw new Error('missing declaration parameters for "' + symbol.name +
- '" in ' + sourceFile.fileName +
- ' at line ' + location.start.line);
- }
- return declaration.parameters.map(function(parameter) {
- var paramText = '';
- if (parameter.dotDotDotToken) {
- paramText += '...';
- }
- paramText += getText(sourceFile, parameter.name);
- if (parameter.questionToken || parameter.initializer) {
- paramText += '?';
- }
- if (parameter.type) {
- paramText += ':' + getType(sourceFile, parameter.type);
- } else {
- paramText += ': any';
- if (parameter.dotDotDotToken) {
- paramText += '[]';
- }
- }
- return paramText.trim();
- });
- }
-
- function getTypeParameters(typeChecker, symbol) {
- var declaration = symbol.valueDeclaration || symbol.declarations[0];
- var sourceFile = ts.getSourceFileOfNode(declaration);
- if (!declaration.typeParameters) return;
- var typeParams = declaration.typeParameters.map(function(type) {
- return getText(sourceFile, type).trim();
- });
- return typeParams;
- }
-
- function getReturnType(typeChecker, symbol) {
- var declaration = symbol.valueDeclaration || symbol.declarations[0];
- var sourceFile = ts.getSourceFileOfNode(declaration);
- if (declaration.type) {
- return getType(sourceFile, declaration.type).trim();
- } else if (declaration.initializer) {
- // The symbol does not have a "type" but it is being initialized
- // so we can deduce the type of from the initializer (mostly).
- if (declaration.initializer.expression) {
- return declaration.initializer.expression.text.trim();
- } else {
- return getType(sourceFile, declaration.initializer).trim();
- }
- }
- }
-
-
- function expandSourceFiles(sourceFiles, basePath) {
- var filePaths = [];
- sourceFiles.forEach(function(sourcePattern) {
- filePaths = filePaths.concat(glob.sync(sourcePattern, { cwd: basePath }));
- });
- return filePaths;
- }
-
-
- function getText(sourceFile, node) {
- return sourceFile.text.substring(node.pos, node.end);
- }
-
-
- // Strip any local renamed imports from the front of types
- function getType(sourceFile, type) {
- var text = getText(sourceFile, type);
- while (text.indexOf(".") >= 0) {
- // Keep namespaced symbols in RxNext
- if (text.match(/^\s*RxNext\./)) break;
- // handle the case List -> List
- text = text.replace(/([^.<]*)\.([^>]*)/, "$2");
- }
- return text;
- }
-
- function getLocation(symbol) {
- var node = symbol.valueDeclaration || symbol.declarations[0];
- var sourceFile = ts.getSourceFileOfNode(node);
- var location = {
- start: ts.getLineAndCharacterOfPosition(sourceFile, node.pos),
- end: ts.getLineAndCharacterOfPosition(sourceFile, node.end)
- };
- return location;
- }
-
-};
-
-function convertToRegexCollection(items) {
- if (!items) return [];
-
- // Must be an array
- if (!_.isArray(items)) {
- items = [items];
- }
-
- // Convert string to exact matching regexes
- return items.map(function(item) {
- return _.isString(item) ? new RegExp('^' + item + '$') : item;
- });
-}
-
-function anyMatches(regexes, item) {
- for(var i=0; i']);
- expect(exportedInterface.newMember).toBeDefined();
- expect(exportedInterface.newMember.parameters).toEqual(['param: number']);
- expect(exportedInterface.newMember.returnType).toEqual('MyInterface');
- });
- });
-
-
- describe('ordering of members', function() {
- it('should order class members in order of appearance (by default)', function() {
- processor.sourceFiles = ['orderingOfMembers.ts'];
- var docs = [];
- processor.$process(docs);
- var classDoc = _.find(docs, { docType: 'class' });
- expect(classDoc.docType).toEqual('class');
- expect(getNames(classDoc.members)).toEqual([
- 'firstItem',
- 'otherMethod',
- 'doStuff',
- ]);
- });
-
-
- it('should not order class members if not sortClassMembers is false', function() {
- processor.sourceFiles = ['orderingOfMembers.ts'];
- processor.sortClassMembers = false;
- var docs = [];
- processor.$process(docs);
- var classDoc = _.find(docs, { docType: 'class' });
- expect(classDoc.docType).toEqual('class');
- expect(getNames(classDoc.members)).toEqual([
- 'firstItem',
- 'otherMethod',
- 'doStuff'
- ]);
- });
- });
-});
-
-function getNames(collection) {
- return collection.map(function(item) { return item.name; });
-}
\ No newline at end of file
diff --git a/scripts/docs/typescript-package/services/convertPrivateClassesToInterfaces.js b/scripts/docs/typescript-package/services/convertPrivateClassesToInterfaces.js
deleted file mode 100755
index 69afdea89..000000000
--- a/scripts/docs/typescript-package/services/convertPrivateClassesToInterfaces.js
+++ /dev/null
@@ -1,31 +0,0 @@
-var _ = require('lodash');
-
-module.exports = function convertPrivateClassesToInterfaces() {
- return function(exportDocs, addInjectableReference) {
- _.forEach(exportDocs, function(exportDoc) {
-
- // Search for classes with a constructor marked as `@internal`
- if (exportDoc.docType === 'class' && exportDoc.constructorDoc && exportDoc.constructorDoc.internal) {
-
- // Convert this class to an interface with no constructor
- exportDoc.docType = 'interface';
- exportDoc.constructorDoc = null;
-
- if (exportDoc.heritage) {
- // convert the heritage since interfaces use `extends` not `implements`
- exportDoc.heritage = exportDoc.heritage.replace('implements', 'extends');
- }
-
- if (addInjectableReference) {
- // Add the `declare var SomeClass extends InjectableReference` construct
- exportDocs.push({
- docType: 'var',
- name: exportDoc.name,
- id: exportDoc.id,
- returnType: 'InjectableReference'
- });
- }
- }
- });
- };
-};
diff --git a/scripts/docs/typescript-package/services/convertPrivateClassesToInterfaces.spec.js b/scripts/docs/typescript-package/services/convertPrivateClassesToInterfaces.spec.js
deleted file mode 100755
index bc4ed7411..000000000
--- a/scripts/docs/typescript-package/services/convertPrivateClassesToInterfaces.spec.js
+++ /dev/null
@@ -1,76 +0,0 @@
-var mockPackage = require('../mocks/mockPackage');
-var Dgeni = require('dgeni');
-var _ = require('lodash');
-
-describe('readTypeScriptModules', function() {
- var dgeni, injector, convertPrivateClassesToInterfaces;
-
- beforeEach(function() {
- dgeni = new Dgeni([mockPackage()]);
- injector = dgeni.configureInjector();
- convertPrivateClassesToInterfaces = injector.get('convertPrivateClassesToInterfaces');
- });
-
- it('should convert private class docs to interface docs', function() {
- var docs = [
- {
- docType: 'class',
- name: 'privateClass',
- id: 'privateClass',
- constructorDoc: { internal: true }
- }
- ];
- convertPrivateClassesToInterfaces(docs, false);
- expect(docs[0].docType).toEqual('interface');
- });
-
-
- it('should not touch non-private class docs', function() {
- var docs = [
- {
- docType: 'class',
- name: 'privateClass',
- id: 'privateClass',
- constructorDoc: { }
- }
- ];
- convertPrivateClassesToInterfaces(docs, false);
- expect(docs[0].docType).toEqual('class');
- });
-
-
- it('should convert the heritage since interfaces use `extends` not `implements`', function() {
- var docs = [
- {
- docType: 'class',
- name: 'privateClass',
- id: 'privateClass',
- constructorDoc: { internal: true },
- heritage: 'implements parentInterface'
- }
- ];
- convertPrivateClassesToInterfaces(docs, false);
- expect(docs[0].heritage).toEqual('extends parentInterface');
- });
-
-
- it('should add new injectable reference types, if specified, to the passed in collection', function() {
- var docs = [
- {
- docType: 'class',
- name: 'privateClass',
- id: 'privateClass',
- constructorDoc: { internal: true },
- heritage: 'implements parentInterface'
- }
- ];
- convertPrivateClassesToInterfaces(docs, true);
- expect(docs[1]).toEqual({
- docType : 'var',
- name : 'privateClass',
- id : 'privateClass',
- returnType : 'InjectableReference'
- });
- });
-
-});
diff --git a/scripts/docs/typescript-package/services/modules.js b/scripts/docs/typescript-package/services/modules.js
deleted file mode 100755
index 760139022..000000000
--- a/scripts/docs/typescript-package/services/modules.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = function modules() {
- return {};
-};
diff --git a/scripts/docs/typescript-package/services/tsParser/createCompilerHost.js b/scripts/docs/typescript-package/services/tsParser/createCompilerHost.js
deleted file mode 100755
index c9d3d368b..000000000
--- a/scripts/docs/typescript-package/services/tsParser/createCompilerHost.js
+++ /dev/null
@@ -1,80 +0,0 @@
-var ts = require('typescript');
-var fs = require('fs');
-var path = require('canonical-path');
-
-// We need to provide our own version of CompilerHost because we want to set the
-// base directory and specify what extensions to consider when trying to load a source
-// file
-module.exports = function createCompilerHost(log) {
-
- return function createCompilerHost(options, baseDir, extensions) {
-
- return {
- getSourceFile: function(fileName, languageVersion, onError) {
- var text, resolvedPath, resolvedPathWithExt;
-
- // Strip off the extension and resolve relative to the baseDir
- baseFilePath = fileName.replace(/\.[^.]+$/, '');
- resolvedPath = path.resolve(baseDir, baseFilePath);
-
- // Iterate through each possible extension and return the first source file that is actually found
- for(var i=0; i} Returns a promise that resolves when something happens
*/
@Cordova()
- static functionName(arg1: string, arg2: number): Promise {
+ functionName(arg1: string, arg2: number): Promise {
return; // We add return; here to avoid any IDE / Compiler errors
}
diff --git a/src/@ionic-native/core/bootstrap.ts b/src/@ionic-native/core/bootstrap.ts
new file mode 100644
index 000000000..a8557a182
--- /dev/null
+++ b/src/@ionic-native/core/bootstrap.ts
@@ -0,0 +1,23 @@
+declare var window;
+
+export function checkReady() {
+ const DEVICE_READY_TIMEOUT = 5000;
+
+ // To help developers using cordova, we listen for the device ready event and
+ // log an error if it didn't fire in a reasonable amount of time. Generally,
+ // when this happens, developers should remove and reinstall plugins, since
+ // an inconsistent plugin is often the culprit.
+ const before = Date.now();
+
+ let didFireReady = false;
+ document.addEventListener('deviceready', () => {
+ console.log(`Ionic Native: deviceready event fired after ${(Date.now() - before)} ms`);
+ didFireReady = true;
+ });
+
+ setTimeout(() => {
+ if (!didFireReady && window.cordova) {
+ console.warn(`Ionic Native: deviceready did not fire within ${DEVICE_READY_TIMEOUT}ms. This can happen when plugins are in an inconsistent state. Try removing plugins from plugins/ and reinstalling them.`);
+ }
+ }, DEVICE_READY_TIMEOUT);
+}
diff --git a/src/@ionic-native/core/decorators.ts b/src/@ionic-native/core/decorators.ts
new file mode 100644
index 000000000..797b9382d
--- /dev/null
+++ b/src/@ionic-native/core/decorators.ts
@@ -0,0 +1,344 @@
+import { instanceAvailability, checkAvailability, wrap, wrapInstance, overrideFunction } from './plugin';
+import { getPlugin, getPromise } from './util';
+import { Observable } from 'rxjs/Observable';
+
+export interface PluginConfig {
+ /**
+ * Plugin name, this should match the class name
+ */
+ pluginName: string;
+ /**
+ * Plugin NPM package name
+ */
+ plugin: string;
+ /**
+ * Plugin object reference
+ */
+ pluginRef?: string;
+ /**
+ * Github repository URL
+ */
+ repo?: string;
+ /**
+ * Custom install command
+ */
+ install?: string;
+ /**
+ * Available installation variables
+ */
+ installVariables?: string[];
+ /**
+ * Supported platforms
+ */
+ platforms?: string[];
+}
+
+export interface CordovaOptions {
+ /**
+ * Set to true if the wrapped method is a sync function
+ */
+ sync?: boolean;
+ /**
+ * Callback order. Set to reverse if the success/error callbacks are the first 2 arguments that the wrapped method takes.
+ */
+ callbackOrder?: 'reverse';
+ /**
+ * Callback style
+ */
+ callbackStyle?: 'node' | 'object';
+ /**
+ * Set a custom index for the success callback function. This doesn't work if callbackOrder or callbackStyle are set.
+ */
+ successIndex?: number;
+ /**
+ * Set a custom index for the error callback function. This doesn't work if callbackOrder or callbackStyle are set.
+ */
+ errorIndex?: number;
+ /**
+ * Success function property name. This must be set if callbackStyle is set to object.
+ */
+ successName?: string;
+ /**
+ * Error function property name. This must be set if callbackStyle is set to object.
+ */
+ errorName?: string;
+ /**
+ * Set to true to return an observable
+ */
+ observable?: boolean;
+ /**
+ * If observable is set to true, this can be set to a different function name that will cancel the observable.
+ */
+ clearFunction?: string;
+ /**
+ * This can be used if clearFunction is set. Set this to true to call the clearFunction with the same arguments used in the initial function.
+ */
+ clearWithArgs?: boolean;
+ /**
+ * Creates an observable that wraps a global event. Replaces document.addEventListener
+ */
+ eventObservable?: boolean;
+ /**
+ * Event name, this must be set if eventObservable is set to true
+ */
+ event?: string;
+ /**
+ * Element to attach the event listener to, this is optional, defaults to `window`
+ */
+ element?: any;
+ /**
+ * Set to true if the wrapped method returns a promise
+ */
+ otherPromise?: boolean;
+ /**
+ * Supported platforms
+ */
+ platforms?: string[];
+}
+
+export interface CordovaCheckOptions {
+ sync?: boolean;
+ observable?: boolean;
+}
+
+export interface CordovaFiniteObservableOptions extends CordovaOptions {
+ /**
+ * Function that gets a result returned from plugin's success callback, and decides whether it is last value and observable should complete.
+ */
+ resultFinalPredicate?: (result: any) => boolean;
+ /**
+ * Function that gets called after resultFinalPredicate, and removes service data that indicates end of stream from the result.
+ */
+ resultTransform?: (result: any) => any;
+}
+
+/**
+ * @private
+ */
+export function InstanceCheck(opts: CordovaCheckOptions = {}) {
+ return (pluginObj: Object, methodName: string, descriptor: TypedPropertyDescriptor): TypedPropertyDescriptor => {
+ return {
+ value: function(...args: any[]): any {
+ if (instanceAvailability(this)) {
+ return descriptor.value.apply(this, args);
+ } else {
+
+ if (opts.sync) {
+ return;
+ } else if (opts.observable) {
+ return new Observable(() => {});
+ }
+
+ return getPromise(() => {});
+
+ }
+ }
+ };
+ };
+}
+
+/**
+ * Executes function only if plugin is available
+ * @private
+ */
+export function CordovaCheck(opts: CordovaCheckOptions = {}) {
+ return (pluginObj: Object, methodName: string, descriptor: TypedPropertyDescriptor): TypedPropertyDescriptor => {
+ return {
+ value: function(...args: any[]): any {
+ if (checkAvailability(pluginObj) === true) {
+ return descriptor.value.apply(this, args);
+ } else {
+ if (opts.sync) {
+ return;
+ } else if (opts.observable) {
+ return new Observable(() => {});
+ }
+ return getPromise(() => {});
+ }
+ }
+ };
+ };
+}
+
+
+/**
+ * @private
+ *
+ * Class decorator specifying Plugin metadata. Required for all plugins.
+ *
+ * @usage
+ * ```typescript
+ * @Plugin({
+ * pluginName: 'MyPlugin',
+ * plugin: 'cordova-plugin-myplugin',
+ * pluginRef: 'window.myplugin'
+ * })
+ * export class MyPlugin {
+ *
+ * // Plugin wrappers, properties, and functions go here ...
+ *
+ * }
+ * ```
+ */
+export function Plugin(config: PluginConfig) {
+ return function(cls) {
+
+ // Add these fields to the class
+ for (let k in config) {
+ cls[k] = config[k];
+ }
+
+ cls['installed'] = function(printWarning?: boolean) {
+ return !!getPlugin(config.pluginRef);
+ };
+
+ cls['getPlugin'] = function() {
+ return getPlugin(config.pluginRef);
+ };
+
+ cls['checkInstall'] = function() {
+ return checkAvailability(cls) === true;
+ };
+
+ cls['getPluginName'] = function() {
+ return config.pluginName;
+ };
+ cls['getPluginRef'] = function() {
+ return config.pluginRef;
+ };
+ cls['getPluginInstallName'] = function() {
+ return config.plugin;
+ };
+ cls['getPluginRepo'] = function() {
+ return config.repo;
+ };
+ cls['getSupportedPlatforms'] = function() {
+ return config.platforms;
+ };
+
+ return cls;
+ };
+}
+
+/**
+ * @private
+ *
+ * Wrap a stub function in a call to a Cordova plugin, checking if both Cordova
+ * and the required plugin are installed.
+ */
+export function Cordova(opts: CordovaOptions = {}) {
+ return (target: Object, methodName: string, descriptor: TypedPropertyDescriptor) => {
+ return {
+ value: function(...args: any[]) {
+ return wrap(this, methodName, opts).apply(this, args);
+ }
+ };
+ };
+}
+
+/**
+ * @private
+ *
+ * Wrap an instance method
+ */
+export function CordovaInstance(opts: any = {}) {
+ return (target: Object, methodName: string) => {
+ return {
+ value: function(...args: any[]) {
+ return wrapInstance(this, methodName, opts).apply(this, args);
+ }
+ };
+ };
+}
+
+/**
+ * @private
+ *
+ *
+ * Before calling the original method, ensure Cordova and the plugin are installed.
+ */
+export function CordovaProperty(target: any, key: string) {
+ Object.defineProperty(target, key, {
+ get: () => {
+ if (checkAvailability(target, key) === true) {
+ return getPlugin(target.constructor.getPluginRef())[key];
+ } else {
+ return null;
+ }
+ },
+ set: (value) => {
+ if (checkAvailability(target, key) === true) {
+ getPlugin(target.constructor.getPluginRef())[key] = value;
+ }
+ }
+ });
+}
+
+/**
+ * @private
+ * @param target
+ * @param key
+ * @constructor
+ */
+export function InstanceProperty(target: any, key: string) {
+ Object.defineProperty(target, key, {
+ get: function(){
+ return this._objectInstance[key];
+ },
+ set: function(value){
+ this._objectInstance[key] = value;
+ }
+ });
+}
+
+/**
+ * @private
+ *
+ * Wrap a stub function in a call to a Cordova plugin, checking if both Cordova
+ * and the required plugin are installed.
+ */
+export function CordovaFunctionOverride(opts: any = {}) {
+ return (target: Object, methodName: string, descriptor: TypedPropertyDescriptor) => {
+ return {
+ value: function(...args: any[]) {
+ return overrideFunction(this, methodName, opts);
+ }
+ };
+ };
+}
+
+
+/**
+ * @private
+ *
+ * Wraps method that returns an observable that can be completed. Provided opts.resultFinalPredicate dictates when the observable completes.
+ *
+ */
+export function CordovaFiniteObservable(opts: CordovaFiniteObservableOptions = {}) {
+ if (opts.observable === false) {
+ throw new Error('CordovaFiniteObservable decorator can only be used on methods that returns observable. Please provide correct option.');
+ }
+ opts.observable = true;
+ return (target: Object, methodName: string, descriptor: TypedPropertyDescriptor) => {
+ return {
+ value: function(...args: any[]) {
+ let wrappedObservable: Observable = wrap(this, methodName, opts).apply(this, args);
+ return new Observable((observer) => {
+ let wrappedSubscription = wrappedObservable.subscribe({
+ next: (x) => {
+ observer.next(opts.resultTransform ? opts.resultTransform(x) : x);
+ if (opts.resultFinalPredicate && opts.resultFinalPredicate(x)) {
+ observer.complete();
+ }
+ },
+ error: (err) => { observer.error(err); },
+ complete: () => { observer.complete(); }
+ });
+ return () => {
+ wrappedSubscription.unsubscribe();
+ };
+ });
+ }
+ };
+ };
+}
diff --git a/src/@ionic-native/core/index.ts b/src/@ionic-native/core/index.ts
new file mode 100644
index 000000000..483a69500
--- /dev/null
+++ b/src/@ionic-native/core/index.ts
@@ -0,0 +1,3 @@
+export * from './plugin';
+export * from './decorators';
+export * from './util';
diff --git a/src/@ionic-native/core/plugin.ts b/src/@ionic-native/core/plugin.ts
new file mode 100644
index 000000000..f09f91ccf
--- /dev/null
+++ b/src/@ionic-native/core/plugin.ts
@@ -0,0 +1,309 @@
+import { get, getPlugin, getPromise, cordovaWarn, pluginWarn } from './util';
+import { checkReady } from './bootstrap';
+import { CordovaOptions } from './decorators';
+
+import { Observable } from 'rxjs/Observable';
+import 'rxjs/add/observable/fromEvent';
+
+checkReady();
+
+declare var window;
+declare var Promise;
+
+
+/**
+ * Checks if plugin/cordova is available
+ * @return {boolean | { error: string } }
+ * @private
+ */
+export function checkAvailability(pluginRef: string, methodName?: string, pluginName?: string);
+export function checkAvailability(pluginObj: any, methodName?: string, pluginName?: string);
+export function checkAvailability(plugin: any, methodName?: string, pluginName?: string): boolean | { error: string } {
+
+ let pluginRef, pluginInstance, pluginPackage;
+
+ if (typeof plugin === 'string') {
+ pluginRef = plugin;
+ } else {
+ pluginRef = plugin.constructor.getPluginRef();
+ pluginName = plugin.constructor.getPluginName();
+ pluginPackage = plugin.constructor.getPluginInstallName();
+ }
+
+ pluginInstance = getPlugin(pluginRef);
+
+ if (!pluginInstance || (!!methodName && pluginInstance[methodName] === 'undefined')) {
+ if (!window.cordova) {
+ cordovaWarn(pluginName, methodName);
+ return {
+ error: 'cordova_not_available'
+ };
+ }
+
+ pluginWarn(pluginName, pluginPackage, methodName);
+ return {
+ error: 'plugin_not_installed'
+ };
+ }
+
+ return true;
+}
+
+/**
+ * Checks if _objectInstance exists and has the method/property
+ * @private
+ */
+export function instanceAvailability(pluginObj: any, methodName?: string): boolean {
+ return pluginObj._objectInstance && (!methodName || pluginObj._objectInstance[methodName] !== 'undefined');
+}
+
+function setIndex(args: any[], opts: any = {}, resolve?: Function, reject?: Function): any {
+ // ignore resolve and reject in case sync
+ if (opts.sync) {
+ return args;
+ }
+
+ // If the plugin method expects myMethod(success, err, options)
+ if (opts.callbackOrder === 'reverse') {
+ // Get those arguments in the order [resolve, reject, ...restOfArgs]
+ args.unshift(reject);
+ args.unshift(resolve);
+ } else if (opts.callbackStyle === 'node') {
+ args.push((err, result) => {
+ if (err) {
+ reject(err);
+ } else {
+ resolve(result);
+ }
+ });
+ } else if (opts.callbackStyle === 'object' && opts.successName && opts.errorName) {
+ let obj: any = {};
+ obj[opts.successName] = resolve;
+ obj[opts.errorName] = reject;
+ args.push(obj);
+ } else if (typeof opts.successIndex !== 'undefined' || typeof opts.errorIndex !== 'undefined') {
+ const setSuccessIndex = () => {
+ // If we've specified a success/error index
+ if (opts.successIndex > args.length) {
+ args[opts.successIndex] = resolve;
+ } else {
+ args.splice(opts.successIndex, 0, resolve);
+ }
+ };
+
+ const setErrorIndex = () => {
+ // We don't want that the reject cb gets spliced into the position of an optional argument that has not been defined and thus causing non expected behaviour.
+ if (opts.errorIndex > args.length) {
+ args[opts.errorIndex] = reject; // insert the reject fn at the correct specific index
+ } else {
+ args.splice(opts.errorIndex, 0, reject); // otherwise just splice it into the array
+ }
+ };
+
+ if (opts.successIndex > opts.errorIndex) {
+ setErrorIndex();
+ setSuccessIndex();
+ } else {
+ setSuccessIndex();
+ setErrorIndex();
+ }
+
+
+ } else {
+ // Otherwise, let's tack them on to the end of the argument list
+ // which is 90% of cases
+ args.push(resolve);
+ args.push(reject);
+ }
+ return args;
+}
+
+function callCordovaPlugin(pluginObj: any, methodName: string, args: any[], opts: any = {}, resolve?: Function, reject?: Function) {
+ // Try to figure out where the success/error callbacks need to be bound
+ // to our promise resolve/reject handlers.
+ args = setIndex(args, opts, resolve, reject);
+
+ const availabilityCheck = checkAvailability(pluginObj, methodName);
+
+ if (availabilityCheck === true) {
+ const pluginInstance = getPlugin(pluginObj.constructor.getPluginRef());
+ return pluginInstance[methodName].apply(pluginInstance, args);
+ } else {
+ return availabilityCheck;
+ }
+
+}
+
+function wrapPromise(pluginObj: any, methodName: string, args: any[], opts: any = {}) {
+ let pluginResult, rej;
+ const p = getPromise((resolve, reject) => {
+ pluginResult = callCordovaPlugin(pluginObj, methodName, args, opts, resolve, reject);
+ rej = reject;
+ });
+ // Angular throws an error on unhandled rejection, but in this case we have already printed
+ // a warning that Cordova is undefined or the plugin is uninstalled, so there is no reason
+ // to error
+ if (pluginResult && pluginResult.error) {
+ p.catch(() => { });
+ rej(pluginResult.error);
+ }
+ return p;
+}
+
+function wrapOtherPromise(pluginObj: any, methodName: string, args: any[], opts: any= {}) {
+ return getPromise((resolve, reject) => {
+ let pluginResult = callCordovaPlugin(pluginObj, methodName, args, opts);
+ if (pluginResult && pluginResult.error) {
+ reject(pluginResult.error);
+ }
+ pluginResult.then(resolve).catch(reject);
+ });
+}
+
+function wrapObservable(pluginObj: any, methodName: string, args: any[], opts: any = {}) {
+ return new Observable(observer => {
+ let pluginResult = callCordovaPlugin(pluginObj, methodName, args, opts, observer.next.bind(observer), observer.error.bind(observer));
+ if (pluginResult && pluginResult.error) {
+ observer.error(pluginResult.error);
+ observer.complete();
+ }
+ return () => {
+ try {
+ if (opts.clearFunction) {
+ if (opts.clearWithArgs) {
+ return callCordovaPlugin(pluginObj, opts.clearFunction, args, opts, observer.next.bind(observer), observer.error.bind(observer));
+ }
+ return get(window, pluginObj.constructor.getPluginRef())[opts.clearFunction].call(pluginObj, pluginResult);
+ }
+ } catch (e) {
+ console.warn('Unable to clear the previous observable watch for', pluginObj.constructor.getPluginName(), methodName);
+ console.error(e);
+ }
+ };
+ });
+}
+
+function callInstance(pluginObj: any, methodName: string, args: any[], opts: any = {}, resolve?: Function, reject?: Function) {
+
+ args = setIndex(args, opts, resolve, reject);
+
+ if (instanceAvailability(pluginObj, methodName)) {
+ return pluginObj._objectInstance[methodName].apply(pluginObj._objectInstance, args);
+ }
+
+}
+
+/**
+ * Wrap the event with an observable
+ * @private
+ * @param event even name
+ * @param element The element to attach the event listener to
+ * @returns {Observable}
+ */
+export function wrapEventObservable(event: string, element: any = window): Observable {
+ return Observable.fromEvent(element, event);
+}
+
+/**
+ * Certain plugins expect the user to override methods in the plugin. For example,
+ * window.cordova.plugins.backgroundMode.onactivate = function() { ... }.
+ *
+ * Unfortunately, this is brittle and would be better wrapped as an Observable. overrideFunction
+ * does just this.
+ * @private
+ */
+export function overrideFunction(pluginObj: any, methodName: string, args: any[], opts: any = {}): Observable {
+ return new Observable(observer => {
+
+ const availabilityCheck = checkAvailability(pluginObj, methodName);
+
+ if (availabilityCheck === true) {
+ const pluginInstance = getPlugin(pluginObj.constructor.getPluginRef());
+ pluginInstance[methodName] = observer.next.bind(observer);
+ return () => pluginInstance[methodName] = () => {};
+ } else {
+ observer.error(availabilityCheck);
+ observer.complete();
+ }
+
+ });
+}
+
+
+/**
+ * @private
+ */
+export const wrap = function(pluginObj: any, methodName: string, opts: CordovaOptions = {}) {
+ return (...args) => {
+ if (opts.sync) {
+ // Sync doesn't wrap the plugin with a promise or observable, it returns the result as-is
+ return callCordovaPlugin(pluginObj, methodName, args, opts);
+ } else if (opts.observable) {
+ return wrapObservable(pluginObj, methodName, args, opts);
+ } else if (opts.eventObservable && opts.event) {
+ return wrapEventObservable(opts.event, opts.element);
+ } else if (opts.otherPromise) {
+ return wrapOtherPromise(pluginObj, methodName, args, opts);
+ } else {
+ return wrapPromise(pluginObj, methodName, args, opts);
+ }
+ };
+};
+
+/**
+ * @private
+ */
+export function wrapInstance(pluginObj: any, methodName: string, opts: any = {}) {
+ return (...args) => {
+ if (opts.sync) {
+
+ return callInstance(pluginObj, methodName, args, opts);
+
+ } else if (opts.observable) {
+
+ return new Observable(observer => {
+ let pluginResult = callInstance(pluginObj, methodName, args, opts, observer.next.bind(observer), observer.error.bind(observer));
+
+ if (pluginResult && pluginResult.error) {
+ observer.error(pluginResult.error);
+ observer.complete();
+ }
+
+ return () => {
+ try {
+ if (opts.clearWithArgs) {
+ return pluginObj._objectInstance[opts.clearFunction].apply(pluginObj._objectInstance, args);
+ }
+ return pluginObj._objectInstance[opts.clearFunction].call(pluginObj, pluginResult);
+ } catch (e) {
+ console.warn('Unable to clear the previous observable watch for', pluginObj.constructor.getPluginName(), methodName);
+ console.error(e);
+ }
+ };
+ });
+
+ } else if (opts.otherPromise) {
+
+ return getPromise((resolve, reject) => {
+ let result = callInstance(pluginObj, methodName, args, opts, resolve, reject);
+ if (result && !result.error) {
+ result.then(resolve, reject);
+ }
+ });
+
+ } else {
+
+ let pluginResult, rej;
+ const p = getPromise((resolve, reject) => {
+ pluginResult = callInstance(pluginObj, methodName, args, opts, resolve, reject);
+ rej = reject;
+ });
+ if (pluginResult && pluginResult.error) {
+ p.catch(() => { });
+ rej(pluginResult.error);
+ }
+ return p;
+
+ }
+ };
+}
diff --git a/src/@ionic-native/core/util.ts b/src/@ionic-native/core/util.ts
new file mode 100644
index 000000000..cfc43e5f1
--- /dev/null
+++ b/src/@ionic-native/core/util.ts
@@ -0,0 +1,68 @@
+declare var window: any;
+
+/**
+ * @private
+ */
+export function get(obj, path) {
+ path = path.split('.');
+ for (let i = 0; i < path.length; i++) {
+ if (!obj) { return null; }
+ obj = obj[path[i]];
+ }
+ return obj;
+}
+
+
+/**
+ * @private
+ */
+export function getPromise(cb) {
+
+ const tryNativePromise = () => {
+ if (window.Promise) {
+ return new Promise((resolve, reject) => {
+ cb(resolve, reject);
+ });
+ } else {
+ console.error('No Promise support or polyfill found. To enable Ionic Native support, please add the es6-promise polyfill before this script, or run with a library like Angular 2 or on a recent browser.');
+ }
+ };
+
+ return tryNativePromise();
+}
+
+/**
+ * @private
+ * @param pluginRef
+ * @returns {null|*}
+ */
+export function getPlugin(pluginRef: string): any {
+ return get(window, pluginRef);
+};
+
+/**
+ * @private
+ */
+export const pluginWarn = function(pluginName: string, plugin?: string, method?: string) {
+ if (method) {
+ console.warn('Native: tried calling ' + pluginName + '.' + method + ', but the ' + pluginName + ' plugin is not installed.');
+ } else {
+ console.warn('Native: tried accessing the ' + pluginName + ' plugin but it\'s not installed.');
+ }
+ if (plugin) {
+ console.warn('Install the ' + pluginName + ' plugin: \'ionic plugin add ' + plugin + '\'');
+ }
+};
+
+/**
+ * @private
+ * @param pluginName
+ * @param method
+ */
+export const cordovaWarn = function(pluginName: string, method?: string) {
+ if (method) {
+ console.warn('Native: tried calling ' + pluginName + '.' + method + ', but Cordova is not available. Make sure to include cordova.js or run in a device/simulator');
+ } else {
+ console.warn('Native: tried accessing the ' + pluginName + ' plugin but Cordova is not available. Make sure to include cordova.js or run in a device/simulator');
+ }
+};
diff --git a/src/plugins/actionsheet.ts b/src/@ionic-native/plugins/action-sheet/index.ts
similarity index 66%
rename from src/plugins/actionsheet.ts
rename to src/@ionic-native/plugins/action-sheet/index.ts
index aaff5808a..fda207bb5 100644
--- a/src/plugins/actionsheet.ts
+++ b/src/@ionic-native/plugins/action-sheet/index.ts
@@ -1,4 +1,5 @@
-import { Cordova, Plugin } from './plugin';
+import { Injectable } from '@angular/core';
+import { Cordova, Plugin, CordovaProperty } from '@ionic-native/core';
export interface ActionSheetOptions {
@@ -53,15 +54,24 @@ export interface ActionSheetOptions {
*
* @usage
* ```typescript
- * import { ActionSheet } from 'ionic-native';
+ * import { ActionSheet, ActionSheetOptions } from '@ionic-native/action-sheet';
+ *
+ * constructor(private actionSheet: ActionSheet) { }
+ *
+ * ...
+ *
*
* let buttonLabels = ['Share via Facebook', 'Share via Twitter'];
- * ActionSheet.show({
- * 'title': 'What do you want with this image?',
- * 'buttonLabels': buttonLabels,
- * 'addCancelButtonWithLabel': 'Cancel',
- * 'addDestructiveButtonWithLabel' : 'Delete'
- * }).then((buttonIndex: number) => {
+ *
+ * const options: ActionSheetOptions = {
+ * title: 'What do you want with this image?',
+ * buttonLabels: buttonLabels,
+ * addCancelButtonWithLabel: 'Cancel',
+ * addDestructiveButtonWithLabel: 'Delete',
+ * androidTheme: this.actionSheet.ANDROID_THEMES.THEME_HOLO_DARK
+ * };
+ *
+ * this.actionSheet.show(options).then((buttonIndex: number) => {
* console.log('Button pressed: ' + buttonIndex);
* });
* ```
@@ -75,8 +85,18 @@ export interface ActionSheetOptions {
repo: 'https://github.com/EddyVerbruggen/cordova-plugin-actionsheet',
platforms: ['Android', 'iOS', 'Windows Phone 8']
})
+@Injectable()
export class ActionSheet {
+ @CordovaProperty
+ ANDROID_THEMES: {
+ THEME_TRADITIONAL: number;
+ THEME_HOLO_DARK: number;
+ THEME_HOLO_LIGHT: number;
+ THEME_DEVICE_DEFAULT_DARK: number;
+ THEME_DEVICE_DEFAULT_LIGHT: number;
+ };
+
/**
* Show a native ActionSheet component. See below for options.
* @param options {ActionSheetOptions} Options See table below
@@ -84,7 +104,7 @@ export class ActionSheet {
* button pressed (1 based, so 1, 2, 3, etc.)
*/
@Cordova()
- static show(options?: ActionSheetOptions): Promise { return; }
+ show(options?: ActionSheetOptions): Promise { return; }
/**
@@ -92,6 +112,5 @@ export class ActionSheet {
* @returns {Promise} Returns a Promise that resolves when the actionsheet is closed
*/
@Cordova()
- static hide(options?: any): Promise { return; }
-
+ hide(options?: any): Promise { return; }
}
diff --git a/src/plugins/admob.ts b/src/@ionic-native/plugins/ad-mob/index.ts
similarity index 75%
rename from src/plugins/admob.ts
rename to src/@ionic-native/plugins/ad-mob/index.ts
index 930f6addf..6eebf66ee 100644
--- a/src/plugins/admob.ts
+++ b/src/@ionic-native/plugins/ad-mob/index.ts
@@ -1,7 +1,8 @@
-import { Cordova, Plugin } from './plugin';
+import { Injectable } from '@angular/core';
+import { Cordova, Plugin } from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
-export type AdMobAdSize = 'SMART_BANNER' | 'BANNER' | 'MEDIUM_RECTANGLE' | 'FULL_BANNER' | 'LEADERBOARD' | 'SKYSCRAPER' | 'CUSTOM';
+export type AdSize = 'SMART_BANNER' | 'BANNER' | 'MEDIUM_RECTANGLE' | 'FULL_BANNER' | 'LEADERBOARD' | 'SKYSCRAPER' | 'CUSTOM';
export interface AdMobOptions {
@@ -13,7 +14,7 @@ export interface AdMobOptions {
/**
* Banner Ad Size, defaults to `SMART_BANNER`. IT can be: `SMART_BANNER`, `BANNER`, `MEDIUM_RECTANGLE`, `FULL_BANNER`, `LEADERBOARD`, `SKYSCRAPER`, or `CUSTOM`
*/
- adSize?: AdMobAdSize;
+ adSize?: AdSize;
/**
* Banner width, valid when `adSize` is set to `CUSTOM`
@@ -63,11 +64,11 @@ export interface AdMobOptions {
/**
* Set extra color style for Ad
*/
- adExtras?: AdMobAdExtras;
+ adExtras?: AdExtras;
}
-export interface AdMobAdExtras {
+export interface AdExtras {
color_bg: string;
@@ -89,23 +90,25 @@ export interface AdMobAdExtras {
* Plugin for Google Ads, including AdMob / DFP (doubleclick for publisher) and mediations to other Ad networks.
* @usage
* ```typescript
- * import { AdMob } from 'ionic-native';
+ * import { AdMob, AdMobOptions, AdSize, AdExtras } from '@ionic-native/ad-mob';
+ *
+ * constructor(private admob: AdMob){}
*
* ionViewDidLoad() {
- * AdMob.onAdDismiss()
+ * this.admob.onAdDismiss()
* .subscribe(() => { console.log('User dismissed ad'); });
* }
*
* onClick() {
- * AdMob.prepareInterstitial('YOUR_ADID')
- * .then(() => { AdMob.showInterstitial(); });
+ * this.admob.prepareInterstitial('YOUR_ADID')
+ * .then(() => { this.admob.showInterstitial(); });
* }
*
* ```
*
* @interfaces
* AdMobOptions
- * AdMobAdExtras
+ * AdExtras
*/
@Plugin({
pluginName: 'AdMob',
@@ -114,12 +117,22 @@ export interface AdMobAdExtras {
repo: 'https://github.com/floatinghotpot/cordova-admob-pro',
platforms: ['Android', 'iOS', 'Windows Phone 8']
})
+@Injectable()
export class AdMob {
- /**
- * @private
- */
- static AD_POSITION = {
+ AD_POSITION: {
+ NO_CHANGE: number;
+ TOP_LEFT: number;
+ TOP_CENTER: number;
+ TOP_RIGHT: number;
+ LEFT: number;
+ CENTER: number;
+ RIGHT: number;
+ BOTTOM_LEFT: number;
+ BOTTOM_CENTER: number;
+ BOTTOM_RIGHT: number;
+ POS_XY: number;
+ } = {
NO_CHANGE: 0,
TOP_LEFT: 1,
TOP_CENTER: 2,
@@ -139,7 +152,7 @@ export class AdMob {
* @returns {Promise} Returns a Promise that resolves when the banner is created
*/
@Cordova()
- static createBanner(adIdOrOptions: string | AdMobOptions): Promise { return; }
+ createBanner(adIdOrOptions: string | AdMobOptions): Promise { return; }
/**
* Destroy the banner, remove it from screen.
@@ -147,7 +160,7 @@ export class AdMob {
@Cordova({
sync: true
})
- static removeBanner(): void { }
+ removeBanner(): void { }
/**
* Show banner at position
@@ -156,7 +169,7 @@ export class AdMob {
@Cordova({
sync: true
})
- static showBanner(position: number): void { }
+ showBanner(position: number): void { }
/**
* Show banner at custom position
@@ -166,7 +179,7 @@ export class AdMob {
@Cordova({
sync: true
})
- static showBannerAtXY(x: number, y: number): void { }
+ showBannerAtXY(x: number, y: number): void { }
/**
* Hide the banner, remove it from screen, but can show it later
@@ -174,7 +187,7 @@ export class AdMob {
@Cordova({
sync: true
})
- static hideBanner(): void { }
+ hideBanner(): void { }
/**
* Prepare interstitial banner
@@ -182,7 +195,7 @@ export class AdMob {
* @returns {Promise} Returns a Promise that resolves when interstitial is prepared
*/
@Cordova()
- static prepareInterstitial(adIdOrOptions: string | AdMobOptions): Promise { return; }
+ prepareInterstitial(adIdOrOptions: string | AdMobOptions): Promise { return; }
/**
* Show interstitial ad when it's ready
@@ -190,7 +203,7 @@ export class AdMob {
@Cordova({
sync: true
})
- static showInterstitial(): void { }
+ showInterstitial(): void { }
/**
* Prepare a reward video ad
@@ -198,7 +211,7 @@ export class AdMob {
* @returns {Promise} Returns a Promise that resolves when the ad is prepared
*/
@Cordova()
- static prepareRewardVideoAd(adIdOrOptions: string | AdMobOptions): Promise { return; }
+ prepareRewardVideoAd(adIdOrOptions: string | AdMobOptions): Promise { return; }
/**
* Show a reward video ad
@@ -206,7 +219,7 @@ export class AdMob {
@Cordova({
sync: true
})
- static showRewardVideoAd(): void { }
+ showRewardVideoAd(): void { }
/**
* Sets the values for configuration and targeting
@@ -214,14 +227,14 @@ export class AdMob {
* @returns {Promise} Returns a Promise that resolves when the options have been set
*/
@Cordova()
- static setOptions(options: AdMobOptions): Promise { return; }
+ setOptions(options: AdMobOptions): Promise { return; }
/**
* Get user ad settings
* @returns {Promise} Returns a promise that resolves with the ad settings
*/
@Cordova()
- static getAdSettings(): Promise { return; }
+ getAdSettings(): Promise { return; }
/**
* Triggered when failed to receive Ad
@@ -231,7 +244,7 @@ export class AdMob {
eventObservable: true,
event: 'onAdFailLoad'
})
- static onAdFailLoad(): Observable { return; }
+ onAdFailLoad(): Observable { return; }
/**
* Triggered when Ad received
@@ -241,7 +254,7 @@ export class AdMob {
eventObservable: true,
event: 'onAdLoaded'
})
- static onAdLoaded(): Observable { return; }
+ onAdLoaded(): Observable { return; }
/**
* Triggered when Ad will be showed on screen
@@ -251,7 +264,7 @@ export class AdMob {
eventObservable: true,
event: 'onAdPresent'
})
- static onAdPresent(): Observable { return; }
+ onAdPresent(): Observable { return; }
/**
* Triggered when user click the Ad, and will jump out of your App
@@ -261,7 +274,7 @@ export class AdMob {
eventObservable: true,
event: 'onAdLeaveApp'
})
- static onAdLeaveApp(): Observable { return; }
+ onAdLeaveApp(): Observable { return; }
/**
* Triggered when dismiss the Ad and back to your App
@@ -271,6 +284,6 @@ export class AdMob {
eventObservable: true,
event: 'onAdDismiss'
})
- static onAdDismiss(): Observable { return; }
+ onAdDismiss(): Observable { return; }
}
diff --git a/src/plugins/alipay.ts b/src/@ionic-native/plugins/alipay/index.ts
similarity index 79%
rename from src/plugins/alipay.ts
rename to src/@ionic-native/plugins/alipay/index.ts
index f81800f63..74fd39d21 100644
--- a/src/plugins/alipay.ts
+++ b/src/@ionic-native/plugins/alipay/index.ts
@@ -1,9 +1,6 @@
-import { Plugin, Cordova } from './plugin';
-/**
- * @link https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.wlOhAE&treeId=193&articleId=105465&docType=1
- *
- * All values need be urlencoded.
- */
+import { Plugin, Cordova } from '@ionic-native/core';
+import { Injectable } from '@angular/core';
+
export interface AlipayOrder {
/**
* appId assigned by Alipay
@@ -42,7 +39,7 @@ export interface AlipayOrder {
sign: string;
/**
- * Timestamp, formated like "yyyy-MM-dd HH:mm:ss", e.g. 2014-07-24 03:07:50
+ * Timestamp, formated like "yyyy-MM-dd HH:mm:ss", e.g. 2014-07-24 03:07:50
*/
timestamp: string;
@@ -65,20 +62,23 @@ export interface AlipayOrder {
/**
* @name Alipay
* @description
- * This plugin is used for Alipay APP support. Integrated with the latest SDK.
+ * This plugin is used for Alipay APP support. Integrated with the latest SDK.
*
* Requires Cordova plugin: `cordova-alipay-base`. For more info, please see the [Alipay plugin docs](https://github.com/xueron/cordova-alipay-base).
*
* @usage
* ```
- * import { Alipay } from 'ionic-native';
- *
+ * import { Alipay, AlipayOrder } from '@ionic-native/alipay';
+ *
+ * constructor(private alipay: Alipay) {
+ *
* // Should get from server side with sign.
- * let alipayOrder = {
- ...
+ * const alipayOrder: AlipayOrder = {
+ * ...
* };
*
- * Alipay.pay(alipayOrder)
+ *
+ * this.alipay.pay(alipayOrder)
* .then(result => {
* console.log(result); // Success
* })
@@ -86,6 +86,9 @@ export interface AlipayOrder {
* console.log(error); // Failed
* });
*
+ * }
+ *
+ *
* ```
*
* @interfaces
@@ -99,6 +102,7 @@ export interface AlipayOrder {
platforms: ['Android', 'iOS'],
install: 'ionic plugin add https://github.com/xueron/cordova-alipay-base --variable APP_ID=your_app_id'
})
+@Injectable()
export class Alipay {
/**
* Open Alipay to perform App pay
@@ -106,6 +110,6 @@ export class Alipay {
* @returns {Promise} Returns a Promise that resolves with the success return, or rejects with an error.
*/
@Cordova()
- static pay(order: AlipayOrder): Promise { return; }
+ pay(order: AlipayOrder): Promise { return; }
}
diff --git a/src/plugins/android-fingerprint-auth.ts b/src/@ionic-native/plugins/android-fingerprint-auth/index.ts
similarity index 69%
rename from src/plugins/android-fingerprint-auth.ts
rename to src/@ionic-native/plugins/android-fingerprint-auth/index.ts
index 31083f83e..8ba69e5dc 100644
--- a/src/plugins/android-fingerprint-auth.ts
+++ b/src/@ionic-native/plugins/android-fingerprint-auth/index.ts
@@ -1,6 +1,8 @@
-import { Cordova, Plugin } from './plugin';
+import { Injectable } from '@angular/core';
+import { Cordova, Plugin } from '@ionic-native/core';
-export interface AndroidFingerprintAuthOptions {
+
+export interface AFAAuthOptions {
/**
* Required
@@ -63,20 +65,56 @@ export interface AndroidFingerprintAuthOptions {
}
+export interface AFADecryptOptions {
+ /**
+ * Biometric authentication
+ */
+ withFingerprint: boolean;
+ /**
+ * Authentication using backup credential activity
+ */
+ withBackup: boolean;
+ /**
+ * FingerprintAuth.CipherMode.DECRYPT
+ * Decrypted password
+ */
+ password: string;
+}
+
+export interface AFAEncryptResponse {
+ /**
+ * Biometric authentication
+ */
+ withFingerprint: boolean;
+ /**
+ * Authentication using backup credential activity
+ */
+ withBackup: boolean;
+ /**
+ * base64encoded string representation of user credentials
+ */
+ token: string;
+}
+
/**
* @name Android Fingerprint Auth
* @description
* This plugin will open a native dialog fragment prompting the user to authenticate using their fingerprint. If the device has a secure lockscreen (pattern, PIN, or password), the user may opt to authenticate using that method as a backup.
* @usage
* ```typescript
- * import { AndroidFingerprintAuth } from 'ionic-native';
+ * import { AndroidFingerprintAuth, AFAAuthOptions } from '@ionic-native/android-fingerprint-auth';
*
- * AndroidFingerprintAuth.isAvailable()
+ * constructor(private androidFingerprintAuth: AndroidFingerprintAuth) { }
+ *
+ * ...
+ *
+ *
+ * this.androidFingerprintAuth.isAvailable()
* .then((result)=> {
* if(result.isAvailable){
* // it is available
*
- * AndroidFingerprintAuth.encrypt({ clientId: "myAppName", username: "myUsername", password: "myPassword" })
+ * this.androidFingerprintAuth.encrypt({ clientId: "myAppName", username: "myUsername", password: "myPassword" })
* .then(result => {
* if (result.withFingerprint) {
* console.log("Successfully encrypted credentials.");
@@ -98,7 +136,9 @@ export interface AndroidFingerprintAuthOptions {
* .catch(error => console.error(error));
* ```
* @interfaces
- * AndroidFingerprintAuthOptions
+ * AFAAuthOptions
+ * AFAEncryptResponse
+ * AFADecryptOptions
*/
@Plugin({
pluginName: 'AndroidFingerprintAuth',
@@ -106,62 +146,36 @@ export interface AndroidFingerprintAuthOptions {
pluginRef: 'FingerprintAuth',
repo: 'https://github.com/mjwheatley/cordova-plugin-android-fingerprint-auth'
})
+@Injectable()
export class AndroidFingerprintAuth {
/**
* Opens a native dialog fragment to use the device hardware fingerprint scanner to authenticate against fingerprints registered for the device.
- * @param options {AndroidFingerprintAuthOptions} Options
+ * @param options {AFAAuthOptions} Options
* @returns {Promise}
*/
@Cordova()
- static encrypt(options: AndroidFingerprintAuthOptions): Promise<{
- /**
- * Biometric authentication
- */
- withFingerprint: boolean;
- /**
- * Authentication using backup credential activity
- */
- withBackup: boolean;
- /**
- * base64encoded string representation of user credentials
- */
- token: string;
- }> {return; }
+ encrypt(options: AFAAuthOptions): Promise {return; }
/**
* Opens a native dialog fragment to use the device hardware fingerprint scanner to authenticate against fingerprints registered for the device.
- * @param options {AndroidFingerprintAuthOptions} Options
+ * @param options {AFAAuthOptions} Options
* @returns {Promise}
*/
@Cordova()
- static decrypt(options: AndroidFingerprintAuthOptions): Promise<{
- /**
- * Biometric authentication
- */
- withFingerprint: boolean;
- /**
- * Authentication using backup credential activity
- */
- withBackup: boolean;
- /**
- * FingerprintAuth.CipherMode.DECRYPT
- * Decrypted password
- */
- password: string;
- }> {return; }
+ decrypt(options: AFAAuthOptions): Promise {return; }
/**
* Check if service is available
* @returns {Promise} Returns a Promise that resolves if fingerprint auth is available on the device
*/
@Cordova()
- static isAvailable(): Promise<{isAvailable: boolean}> { return; }
+ isAvailable(): Promise<{isAvailable: boolean}> { return; }
/**
* Delete the cipher used for encryption and decryption by username
* @returns {Promise} Returns a Promise that resolves if the cipher was successfully deleted
*/
@Cordova()
- static delete(options: {clientId: string; username: string; }): Promise<{deleted: boolean}> { return; }
+ delete(options: {clientId: string; username: string; }): Promise<{deleted: boolean}> { return; }
}
diff --git a/src/plugins/appavailability.ts b/src/@ionic-native/plugins/app-availability/index.ts
similarity index 68%
rename from src/plugins/appavailability.ts
rename to src/@ionic-native/plugins/app-availability/index.ts
index 0b96b1d72..f31230a04 100644
--- a/src/plugins/appavailability.ts
+++ b/src/@ionic-native/plugins/app-availability/index.ts
@@ -1,4 +1,5 @@
-import { Cordova, Plugin } from './plugin';
+import { Injectable } from '@angular/core';
+import { Cordova, Plugin } from '@ionic-native/core';
/**
* @name App Availability
@@ -9,18 +10,22 @@ import { Cordova, Plugin } from './plugin';
*
* @usage
* ```typescript
- * import { AppAvailability, Device } from 'ionic-native';
+ * import { AppAvailability } from '@ionic-native/app-availability';
+ * import { Platform } from 'ionic-angular';
*
+ * constructor(private appAvailability: AppAvailability, private platform: Platform) { }
+ *
+ * ...
*
* let app;
*
- * if (Device.platform === 'iOS') {
+ * if (this.platform.is('ios')) {
* app = 'twitter://';
- * } else if (Device.platform === 'Android') {
+ * } else if (this.platform.is('android')) {
* app = 'com.twitter.android';
* }
*
- * AppAvailability.check(app)
+ * this.appAvailability.check(app)
* .then(
* (yes: string) => console.log(app + ' is available'),
* (no: string) => console.log(app + ' is NOT available')
@@ -34,6 +39,7 @@ import { Cordova, Plugin } from './plugin';
repo: 'https://github.com/ohh2ahh/AppAvailability',
platforms: ['Android', 'iOS']
})
+@Injectable()
export class AppAvailability {
/**
@@ -42,6 +48,6 @@ export class AppAvailability {
* @returns {Promise}
*/
@Cordova()
- static check(app: string): Promise { return; }
+ check(app: string): Promise { return; }
}
diff --git a/src/plugins/apppreferences.ts b/src/@ionic-native/plugins/app-preferences/index.ts
similarity index 75%
rename from src/plugins/apppreferences.ts
rename to src/@ionic-native/plugins/app-preferences/index.ts
index fee70060d..69242fa80 100644
--- a/src/plugins/apppreferences.ts
+++ b/src/@ionic-native/plugins/app-preferences/index.ts
@@ -1,18 +1,23 @@
-import { Cordova, Plugin } from './plugin';
+import { Cordova, Plugin } from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
+import { Injectable } from '@angular/core';
/**
- * @name AppPreferences
+ * @name App Preferences
* @description
* This plugin allows you to read and write app preferences
*
* @usage
+ * ```typescript
+ * import { AppPreferences } from '@ionic-native/app-preferences';
+ *
+ * constructor(private appPreferences: AppPreferences) {
+ *
+ * this.appPreferences.fetch('key').then((res) => { console.log(res); });
+ *
+ * }
* ```
- * import { AppPreferences } from 'ionic-native';
*
- * AppPreferences.fetch('key').then((res) => { console.log(res); });
- *
- *```
*/
@Plugin({
pluginName: 'AppPreferences',
@@ -20,6 +25,7 @@ import { Observable } from 'rxjs/Observable';
pluginRef: 'plugins.appPreferences', // the variable reference to call the plugin, example: navigator.geolocation
repo: 'https://github.com/apla/me.apla.cordova.app-preferences', // the github repository URL for the plugin
})
+@Injectable()
export class AppPreferences {
/**
@@ -33,7 +39,7 @@ export class AppPreferences {
sync: true,
callbackOrder: 'reverse'
})
- static fetch(dict: string, key?: string): Promise { return; }
+ fetch(dict: string, key?: string): Promise { return; }
/**
* Set a preference value
@@ -46,7 +52,7 @@ export class AppPreferences {
@Cordova({
callbackOrder: 'reverse'
})
- static store(dict: string, key: string, value?: string): Promise {
+ store(dict: string, key: string, value?: string): Promise {
return;
}
@@ -60,7 +66,7 @@ export class AppPreferences {
@Cordova({
callbackOrder: 'reverse'
})
- static remove(dict: string, key?: string): Promise { return; }
+ remove(dict: string, key?: string): Promise { return; }
/**
* Clear preferences
@@ -70,7 +76,7 @@ export class AppPreferences {
@Cordova({
callbackOrder: 'reverse'
})
- static clearAll(): Promise { return; }
+ clearAll(): Promise { return; }
/**
* Show native preferences interface
@@ -80,7 +86,7 @@ export class AppPreferences {
@Cordova({
callbackOrder: 'reverse'
})
- static show(): Promise { return; }
+ show(): Promise { return; }
/**
* Show native preferences interface
@@ -91,7 +97,7 @@ export class AppPreferences {
@Cordova({
observable: true
})
- static watch(subscribe: boolean): Observable { return; }
+ watch(subscribe: boolean): Observable { return; }
/**
* Return named configuration context
@@ -103,12 +109,12 @@ export class AppPreferences {
@Cordova({
platforms: ['Android']
})
- static suite(suiteName: string): Object { return; }
+ suite(suiteName: string): Object { return; }
@Cordova({
platforms: ['iOS']
})
- static iosSuite(suiteName: string): Object { return; }
+ iosSuite(suiteName: string): Object { return; }
/**
* Return cloud synchronized configuration context
@@ -118,7 +124,7 @@ export class AppPreferences {
@Cordova({
platforms: ['iOS', 'Windows', 'Windows Phone 8']
})
- static cloudSync(): Object { return; }
+ cloudSync(): Object { return; }
/**
* Return default configuration context
@@ -128,6 +134,6 @@ export class AppPreferences {
@Cordova({
platforms: ['iOS', 'Windows', 'Windows Phone 8']
})
- static defaults(): Object { return; }
+ defaults(): Object { return; }
}
diff --git a/src/plugins/apprate.ts b/src/@ionic-native/plugins/app-rate/index.ts
similarity index 84%
rename from src/plugins/apprate.ts
rename to src/@ionic-native/plugins/app-rate/index.ts
index 46ae11df1..cb1b57c70 100644
--- a/src/plugins/apprate.ts
+++ b/src/@ionic-native/plugins/app-rate/index.ts
@@ -1,4 +1,6 @@
-import { Cordova, CordovaProperty, Plugin } from './plugin';
+import { Injectable } from '@angular/core';
+import { Cordova, CordovaProperty, Plugin } from '@ionic-native/core';
+
declare var window;
@@ -47,7 +49,7 @@ export interface AppRatePreferences {
/**
* App Store URLS
*/
- storeAppURL?: AppRateStoreAppUrls;
+ storeAppURL?: AppUrls;
}
@@ -65,7 +67,7 @@ export interface AppRateCallbacks {
}
-export interface AppRateStoreAppUrls {
+export interface AppUrls {
/**
* application id in AppStore
@@ -103,20 +105,24 @@ export interface AppRateStoreAppUrls {
*
* @usage
* ```typescript
- * import { AppRate } from 'ionic-native';
+ * import { AppRate } from '@ionic-native/app-rate';
*
- * AppRate.preferences.storeAppURL = {
+ * constructor(private appRate: AppRate) { }
+ *
+ * ...
+ *
+ * this.appRate.preferences.storeAppURL = {
* ios: '',
* android: 'market://details?id=',
* windows: 'ms-windows-store://review/?ProductId='
* };
*
- * AppRate.promptForRating(false);
+ * this.appRate.promptForRating(false);
* ```
*
* @interfaces
* AppRatePreferences
- * AppRateStoreAppUrls
+ * AppUrls
* AppRateCallbacks
*
*/
@@ -127,6 +133,7 @@ export interface AppRateStoreAppUrls {
repo: 'https://github.com/pushandplay/cordova-plugin-apprate',
platforms: ['Android', 'iOS', 'Windows (experimental)']
})
+@Injectable()
export class AppRate {
/**
@@ -134,13 +141,13 @@ export class AppRate {
* See table below for options
*/
@CordovaProperty
- static preferences: AppRatePreferences;
+ preferences: AppRatePreferences;
/**
* Prompts the user for rating
* @param {boolean} immediately Show the rating prompt immediately.
*/
@Cordova()
- static promptForRating(immediately: boolean): void { };
+ promptForRating(immediately: boolean): void { };
}
diff --git a/src/plugins/app-update.ts b/src/@ionic-native/plugins/app-update/index.ts
similarity index 68%
rename from src/plugins/app-update.ts
rename to src/@ionic-native/plugins/app-update/index.ts
index 181075216..05e4080f8 100644
--- a/src/plugins/app-update.ts
+++ b/src/@ionic-native/plugins/app-update/index.ts
@@ -1,7 +1,8 @@
-import { Plugin, Cordova } from './plugin';
+import { Plugin, Cordova } from '@ionic-native/core';
+import { Injectable } from '@angular/core';
/**
- * @name AppUpdate
+ * @name App Update
* @description
* This plugin does self-update for android
*
@@ -19,11 +20,16 @@ import { Plugin, Cordova } from './plugin';
* Then use the following code:
*
* ```
- * import { AppUpdate } from 'ionic-native';
+ * import { AppUpdate } from '@ionic-native/app-update';
+ *
+ * constructor(private appUpdate: AppUpdate) {
+ *
+ * const updateUrl = 'http://your-remote-api.com/update.xml';
+ * this.appUpdate.checkAppUpdate(updateUrl);
+ *
+ * }
*
- * let updateUrl = 'http://your-remote-api.com/update.xml';
*
- * AppUpdate.checkAppUpdate(updateUrl);
* ```
*
* The plugin will compare the app version and update it automatically if the API has a newer version to install.
@@ -35,6 +41,7 @@ import { Plugin, Cordova } from './plugin';
repo: 'https://github.com/vaenow/cordova-plugin-app-update',
platforms: ['Android']
})
+@Injectable()
export class AppUpdate {
/**
* Check and update
@@ -44,6 +51,6 @@ export class AppUpdate {
@Cordova({
callbackOrder: 'reverse'
})
- static checkAppUpdate(updateUrl: string): Promise { return; }
+ checkAppUpdate(updateUrl: string): Promise { return; }
}
diff --git a/src/plugins/appversion.ts b/src/@ionic-native/plugins/app-version/index.ts
similarity index 62%
rename from src/plugins/appversion.ts
rename to src/@ionic-native/plugins/app-version/index.ts
index 130715719..2c09da5f2 100644
--- a/src/plugins/appversion.ts
+++ b/src/@ionic-native/plugins/app-version/index.ts
@@ -1,4 +1,7 @@
-import { Cordova, Plugin } from './plugin';
+import { Injectable } from '@angular/core';
+import { Cordova, Plugin } from '@ionic-native/core';
+
+
/**
* @name App Version
@@ -9,13 +12,18 @@ import { Cordova, Plugin } from './plugin';
*
* @usage
* ```typescript
- * import { AppVersion } from 'ionic-native';
+ * import { AppVersion } from '@ionic-native/app-version';
+ *
+ * constructor(private appVersion: AppVersion) { }
+ *
+ * ...
*
*
- * AppVersion.getAppName();
- * AppVersion.getPackageName();
- * AppVersion.getVersionCode();
- * AppVersion.getVersionNumber();
+ * this.appVersion.getAppName();
+ * this.appVersion.getPackageName();
+ * this.appVersion.getVersionCode();
+ * this.appVersion.getVersionNumber();
+ *
* ```
*/
@Plugin({
@@ -25,6 +33,7 @@ import { Cordova, Plugin } from './plugin';
repo: 'https://github.com/whiteoctober/cordova-plugin-app-version',
platforms: ['Android', 'iOS']
})
+@Injectable()
export class AppVersion {
/**
@@ -32,27 +41,27 @@ export class AppVersion {
* @returns {Promise}
*/
@Cordova()
- static getAppName(): Promise { return; }
+ getAppName(): Promise { return; }
/**
* Returns the package name of the app
* @returns {Promise}
*/
@Cordova()
- static getPackageName(): Promise { return; }
+ getPackageName(): Promise { return; }
/**
* Returns the build identifier of the app
* @returns {Promise}
*/
@Cordova()
- static getVersionCode(): Promise { return; }
+ getVersionCode(): Promise { return; }
/**
* Returns the version of the app
* @returns {Promise}
*/
@Cordova()
- static getVersionNumber(): Promise { return; }
+ getVersionNumber(): Promise { return; }
}
diff --git a/src/@ionic-native/plugins/appodeal/index.ts b/src/@ionic-native/plugins/appodeal/index.ts
new file mode 100644
index 000000000..37c41ff27
--- /dev/null
+++ b/src/@ionic-native/plugins/appodeal/index.ts
@@ -0,0 +1,519 @@
+import { Plugin, Cordova } from '@ionic-native/core';
+import { Observable } from 'rxjs';
+import { Injectable } from '@angular/core';
+
+/**
+ * @name Appodeal
+ * @description
+ * Plugin to serve ads through native Appodeal SDKs
+ *
+ * @usage
+ * ```
+ * import { Appodeal } from '@ionic-native/appodeal';
+ *
+ * constructor(private appodeal: Appodeal) {
+ *
+ * const appKey = '';
+ * appodeal.initialize(appKey, appodeal.AD_TYPES.REWARDED_VIDEO);
+ * appodeal.show(appodeal.AD_TYPES.REWARDED_VIDEO);
+ *
+ * }
+ *
+ *
+ *
+ * ```
+ */
+@Plugin({
+ pluginName: 'Appodeal',
+ plugin: 'https://github.com/appodeal/appodeal-cordova-plugin',
+ pluginRef: 'Appodeal',
+ repo: 'https://github.com/appodeal/appodeal-cordova-plugin.git',
+ platforms: [ 'ios', 'android' ]
+})
+@Injectable()
+export class Appodeal {
+ // available types of advertisements
+ readonly AD_TYPES = {
+ INTERSTITIAL: 1,
+ SKIPPABLE_VIDEO: 2,
+ BANNER: 4,
+ BANNER_BOTTOM: 8,
+ BANNER_TOP: 16,
+ REWARDED_VIDEO: 128,
+ NON_SKIPPABLE_VIDEO: 256
+ };
+
+ /**
+ * initialize Appodeal SDK
+ * @param {string} appKey
+ * @param {number} adType
+ */
+ @Cordova()
+ initialize(appKey: string, adType: number): void {};
+
+ /**
+ * check if SDK has been initialized
+ * @returns {Promise}
+ */
+ @Cordova()
+ isInitialized(): Promise { return; };
+
+ /**
+ * show ad of specified type
+ * @param {number} adType
+ * @returns {Promise}
+ */
+ @Cordova()
+ show(adType: number): Promise { return; };
+
+ /**
+ * show ad of specified type with placement options
+ * @param {number} adType
+ * @param {any} placement
+ * @returns {Promise}
+ */
+ @Cordova()
+ showWithPlacement(
+ adType: number,
+ placement: any
+ ): Promise { return; };
+
+ /**
+ * hide ad of specified type
+ * @param {number} adType
+ */
+ @Cordova()
+ hide(adType: number): void {};
+
+ /**
+ * confirm use of ads of specified type
+ * @param {number} adType
+ */
+ @Cordova()
+ confirm(adType: number): void {};
+
+ /**
+ * check if ad of specified type has been loaded
+ * @param {number} adType
+ * @returns {Promise}
+ */
+ @Cordova()
+ isLoaded(adType: number): Promise { return; };
+
+ /**
+ * check if ad of specified
+ * @param {number} adType
+ * @returns {Promise}
+ */
+ @Cordova()
+ isPrecache(adType: number): Promise { return; };
+
+ /**
+ *
+ * @param {number} adType
+ * @param autoCache
+ */
+ @Cordova()
+ setAutoCache(adType: number, autoCache: any): void {};
+
+ /**
+ * forcefully cache an ad by type
+ * @param {number} adType
+ */
+ @Cordova()
+ cache(adType: number): void {};
+
+ /**
+ *
+ * @param {boolean} set
+ */
+ @Cordova()
+ setOnLoadedTriggerBoth(set: boolean): void {};
+
+ /**
+ * enable or disable Smart Banners
+ * @param {boolean} enabled
+ */
+ @Cordova()
+ setSmartBanners(enabled: boolean): void {};
+
+ /**
+ * enable or disable banner backgrounds
+ * @param {boolean} enabled
+ */
+ @Cordova()
+ setBannerBackground(enabled: boolean): void {};
+
+ /**
+ * enable or disable banner animations
+ * @param {boolean} enabled
+ */
+ @Cordova()
+ setBannerAnimation(enabled: boolean): void {};
+
+ /**
+ *
+ * @param value
+ */
+ @Cordova()
+ set728x90Banners(value: any): void {};
+
+ /**
+ * enable or disable logging
+ * @param {boolean} logging
+ */
+ @Cordova()
+ setLogging(logging: boolean): void {};
+
+ /**
+ * enable or disable testing mode
+ * @param {boolean} testing
+ */
+ @Cordova()
+ setTesting(testing: boolean): void {};
+
+ /**
+ * reset device ID
+ */
+ @Cordova()
+ resetUUID(): void {};
+
+ /**
+ * get version of Appdeal SDK
+ */
+ @Cordova()
+ getVersion(): Promise { return; };
+
+ /**
+ *
+ * @param {string} network
+ * @param {number} adType
+ */
+ @Cordova()
+ disableNetwork(network?: string, adType?: number): void {};
+
+ /**
+ *
+ * @param {string} network
+ * @param {number} adType
+ */
+ @Cordova()
+ disableNetworkType(network?: string, adType?: number): void {};
+
+ /**
+ * disable Location permissions for Appodeal SDK
+ */
+ @Cordova()
+ disableLocationPermissionCheck(): void {};
+
+ /**
+ * disable Storage permissions for Appodeal SDK
+ */
+ @Cordova()
+ disableWriteExternalStoragePermissionCheck(): void {};
+
+ /**
+ * enable event listeners
+ * @param {boolean} enabled
+ */
+ @Cordova()
+ enableInterstitialCallbacks(enabled: boolean): void {};
+
+ /**
+ * enable event listeners
+ * @param {boolean} enabled
+ */
+ @Cordova()
+ enableSkippableVideoCallbacks(enabled: boolean): void {};
+
+ /**
+ * enable event listeners
+ * @param {boolean} enabled
+ */
+ @Cordova()
+ enableNonSkippableVideoCallbacks(enabled: boolean): void {};
+
+ /**
+ * enable event listeners
+ * @param {boolean} enabled
+ */
+ @Cordova()
+ enableBannerCallbacks(enabled: boolean): void {};
+
+ /**
+ * enable event listeners
+ * @param {boolean} enabled
+ */
+ @Cordova()
+ enableRewardedVideoCallbacks(enabled: boolean): void {};
+
+ /**
+ *
+ * @param {string} name - name of rule
+ * @param {boolean} value
+ */
+ @Cordova()
+ setCustomBooleanRule(name: string, value: boolean): void {};
+
+ /**
+ *
+ * @param {string} name - name of rule
+ * @param {number} value
+ */
+ @Cordova()
+ setCustomIntegerRule(name: string, value: number): void {};
+
+ /**
+ * set rule with float value
+ * @param {string} name
+ * @param {number} value
+ */
+ @Cordova()
+ setCustomDoubleRule(name: string, value: number): void {};
+
+ /**
+ * set rule with string value
+ * @param {string} name - name of rule
+ * @param {string} value
+ */
+ @Cordova()
+ setCustomStringRule(name: string, value: string): void {};
+
+ /**
+ * set ID preference in Appodeal for current user
+ * @param id
+ */
+ @Cordova()
+ setUserId(id: any): void {};
+
+ /**
+ * set Email preference in Appodeal for current user
+ * @param email
+ */
+ @Cordova()
+ setEmail(email: any): void {};
+
+ /**
+ * set Birthday preference in Appodeal for current user
+ * @param birthday
+ */
+ @Cordova()
+ setBirthday(birthday: any): void {};
+
+ /**
+ * et Age preference in Appodeal for current user
+ * @param age
+ */
+ @Cordova()
+ setAge(age: any): void {};
+
+ /**
+ * set Gender preference in Appodeal for current user
+ * @param gender
+ */
+ @Cordova()
+ setGender(gender: any): void {};
+
+ /**
+ * set Occupation preference in Appodeal for current user
+ * @param occupation
+ */
+ @Cordova()
+ setOccupation(occupation: any): void {};
+
+ /**
+ * set Relation preference in Appodeal for current user
+ * @param relation
+ */
+ @Cordova()
+ setRelation(relation: any): void {};
+
+ /**
+ * set Smoking preference in Appodeal for current user
+ * @param smoking
+ */
+ @Cordova()
+ setSmoking(smoking: any): void {};
+
+ /**
+ * set Alcohol preference in Appodeal for current user
+ * @param alcohol
+ */
+ @Cordova()
+ setAlcohol(alcohol: any): void {};
+
+ /**
+ * set Interests preference in Appodeal for current user
+ * @param interests
+ */
+ @Cordova()
+ setInterests(interests: any): void {};
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onInterstitialLoaded',
+ element: document
+ })
+ onInterstitialLoaded(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onInterstitialFailedToLoad',
+ element: document
+ })
+ onInterstitialFailedToLoad(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onInterstitialShown',
+ element: document
+ })
+ onInterstitialShown(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onInterstitialClicked',
+ element: document
+ })
+ onInterstitialClicked(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onInterstitialClosed',
+ element: document
+ })
+ onInterstitialClosed(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onSkippableVideoLoaded',
+ element: document
+ })
+ onSkippableVideoLoaded(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onSkippableVideoFailedToLoad',
+ element: document
+ })
+ onSkippableVideoFailedToLoad(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onSkippableVideoShown',
+ element: document
+ })
+ onSkippableVideoShown(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onSkippableVideoFinished',
+ element: document
+ })
+ onSkippableVideoFinished(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onSkippableVideoClosed',
+ element: document
+ })
+ onSkippableVideoClosed(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onRewardedVideoLoaded',
+ element: document
+ })
+ onRewardedVideoLoaded(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onRewardedVideoFailedToLoad',
+ element: document
+ })
+ onRewardedVideoFailedToLoad(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onRewardedVideoShown',
+ element: document
+ })
+ onRewardedVideoShown(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onRewardedVideoFinished',
+ element: document
+ })
+ onRewardedVideoFinished(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onRewardedVideoClosed',
+ element: document
+ })
+ onRewardedVideoClosed(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onNonSkippableVideoLoaded',
+ element: document
+ })
+ onNonSkippableVideoLoaded(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onNonSkippableVideoFailedToLoad',
+ element: document
+ })
+ onNonSkippableVideoFailedToLoad(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onNonSkippableVideoShown',
+ element: document
+ })
+ onNonSkippableVideoShown(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onNonSkippableVideoFinished',
+ element: document
+ })
+ onNonSkippableVideoFinished(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onNonSkippableVideoClosed',
+ element: document
+ })
+ onNonSkippableVideoClosed(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onBannerClicked',
+ element: document
+ })
+ onBannerClicked(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onBannerFailedToLoad',
+ element: document
+ })
+ onBannerFailedToLoad(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onBannerLoaded',
+ element: document
+ })
+ onBannerLoaded(): Observable { return; }
+
+ @Cordova({
+ eventObservable: true,
+ event: 'onBannerShown',
+ element: document
+ })
+ onBannerShown(): Observable { return; }
+}
diff --git a/src/plugins/background-fetch.ts b/src/@ionic-native/plugins/background-fetch/index.ts
similarity index 59%
rename from src/plugins/background-fetch.ts
rename to src/@ionic-native/plugins/background-fetch/index.ts
index 8bb71ef9e..c91bc6ae8 100644
--- a/src/plugins/background-fetch.ts
+++ b/src/@ionic-native/plugins/background-fetch/index.ts
@@ -1,4 +1,5 @@
-import {Cordova, Plugin} from './plugin';
+import { Cordova, Plugin } from '@ionic-native/core';
+import { Injectable } from '@angular/core';
declare var window;
@@ -13,7 +14,7 @@ export interface BackgroundFetchConfig {
/**
- * @name BackgroundFetch
+ * @name Background Fetch
* @description
* iOS Background Fetch Implementation. See: https://developer.apple.com/reference/uikit/uiapplication#1657399
* iOS Background Fetch is basically an API which wakes up your app about every 15 minutes (during the user's prime-time hours) and provides your app exactly 30s of background running-time. This plugin will execute your provided callbackFn whenever a background-fetch event occurs. There is no way to increase the rate which a fetch-event occurs and this plugin sets the rate to the most frequent possible value of UIApplicationBackgroundFetchIntervalMinimum -- iOS determines the rate automatically based upon device usage and time-of-day (ie: fetch-rate is about ~15min during prime-time hours; less frequently when the user is presumed to be sleeping, at 3am for example).
@@ -22,35 +23,32 @@ export interface BackgroundFetchConfig {
* @usage
*
* ```typescript
- * import { BackgroundFetch } from 'ionic-native';
+ * import { BackgroundFetch, BackgroundFetchConfig } from '@ionic-native/background-fetch';
*
*
- * // When device is ready :
- * platform.ready().then(() => {
+ * constructor(private backgroundFetch: BackgroundFetch) {
*
- * let config = {
+ * const config: BackgroundFetchConfig = {
* stopOnTerminate: false, // Set true to cease background-fetch from operating after user "closes" the app. Defaults to true.
* };
*
- * BackgroundFetch.configure(() => {
- console.log('[js] BackgroundFetch initiated');
-
- // perform some ajax request to server here
-
- You MUST called #finish so that native-side can signal completion of the background-thread to the os.
- BackgroundFetch.finish();
-
- * }, (error) => {
- * console.log('- BackgroundFetch failed', error);
- * }, config);
+ * backgroundFetch.configure(config)
+ * .then(() => {
+ * console.log('Background Fetch initialized');
*
- * });
+ * this.backgroundFetch.finish();
*
- * // Start the background-fetch API. Your callbackFn provided to #configure will be executed each time a background-fetch event occurs. NOTE the #configure method automatically calls #start. You do not have to call this method after you #configure the plugin
- * BackgroundFetch.start();
+ * })
+ * .catch(e => console.log('Error initializing background fetch', e));
*
- * // Stop the background-fetch API from firing fetch events. Your callbackFn provided to #configure will no longer be executed.
- * BackgroundFetch.stop();
+ * // Start the background-fetch API. Your callbackFn provided to #configure will be executed each time a background-fetch event occurs. NOTE the #configure method automatically calls #start. You do not have to call this method after you #configure the plugin
+ * backgroundFetch.start();
+ *
+ * // Stop the background-fetch API from firing fetch events. Your callbackFn provided to #configure will no longer be executed.
+ * backgroundFetch.stop();
+ *
+ *
+ * }
*
* ```
* @interfaces
@@ -64,25 +62,20 @@ export interface BackgroundFetchConfig {
repo: 'https://github.com/transistorsoft/cordova-plugin-background-fetch',
platforms: ['iOS']
})
+@Injectable()
export class BackgroundFetch {
/**
* Configures the plugin's fetch callbackFn
*
- * @param {Function} callbackFn This callback will fire each time an iOS background-fetch event occurs (typically every 15 min).
- * @param {Function} errorCallback The failureFn will be called if the device doesn't support background-fetch.
* @param {BackgroundFetchConfig} config Configuration for plugin
- * @return Location object, which tries to mimic w3c Coordinates interface.
- * See http://dev.w3.org/geo/api/spec-source.html#coordinates_interface
- * Callback to be executed every time a geolocation is recorded in the background.
+ * @return {Promise}
*/
@Cordova({
- sync: true
+ callbackOrder: 'reverse'
})
- static configure(callbackFn: Function, errorCallback: Function, config: BackgroundFetchConfig): any { return; }
-
-
+ configure(config: BackgroundFetchConfig): Promise { return; }
/**
* Start the background-fetch API.
@@ -90,18 +83,21 @@ export class BackgroundFetch {
* @returns {Promise}
*/
@Cordova()
- static start(): Promise { return; }
+ start(): Promise { return; }
/**
* Stop the background-fetch API from firing fetch events. Your callbackFn provided to #configure will no longer be executed.
* @returns {Promise}
*/
@Cordova()
- static stop(): Promise { return; }
+ stop(): Promise { return; }
/**
* You MUST call this method in your fetch callbackFn provided to #configure in order to signal to iOS that your fetch action is complete. iOS provides only 30s of background-time for a fetch-event -- if you exceed this 30s, iOS will kill your app.
*/
- @Cordova()
- static finish() { }
+ @Cordova({
+ sync: true
+ })
+ finish(): void { }
+
}
diff --git a/src/plugins/background-geolocation.ts b/src/@ionic-native/plugins/background-geolocation/index.ts
similarity index 83%
rename from src/plugins/background-geolocation.ts
rename to src/@ionic-native/plugins/background-geolocation/index.ts
index 73ab534b3..c6126306f 100644
--- a/src/plugins/background-geolocation.ts
+++ b/src/@ionic-native/plugins/background-geolocation/index.ts
@@ -1,4 +1,5 @@
-import { Cordova, Plugin } from './plugin';
+import { Injectable } from '@angular/core';
+import { Cordova, Plugin } from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
declare var window;
@@ -255,23 +256,23 @@ export interface BackgroundGeolocationConfig {
}
/**
- * @name BackgroundGeolocation
+ * @name Background Geolocation
* @description
* This plugin provides foreground and background geolocation with battery-saving "circular region monitoring" and "stop detection". For
* more detail, please see https://github.com/mauron85/cordova-plugin-background-geolocation
*
* @usage
*
+ * BackgroundGeolocation must be called within app.ts and or before Geolocation. Otherwise the platform will not ask you for background tracking permission.
+ *
* ```typescript
- * import { BackgroundGeolocation } from 'ionic-native';
+ * import { BackgroundGeolocation, BackgroundGeolocationConfig } from '@ionic-native/background-geolocation';
*
+ * constructor(private backgroundGeolocation: BackgroundGeolocation) { }
*
- * // When device is ready :
- * platform.ready().then(() => {
- * // IMPORTANT: BackgroundGeolocation must be called within app.ts and or before Geolocation. Otherwise the platform will not ask you for background tracking permission.
+ * ...
*
- * // BackgroundGeolocation is highly configurable. See platform specific configuration options
- * let config = {
+ * const config: BackgroundGeolocationConfig = {
* desiredAccuracy: 10,
* stationaryRadius: 20,
* distanceFilter: 30,
@@ -279,24 +280,23 @@ export interface BackgroundGeolocationConfig {
* stopOnTerminate: false, // enable this to clear background location settings when the app terminates
* };
*
- * BackgroundGeolocation.configure((location) => {
- console.log('[js] BackgroundGeolocation callback: ' + location.latitude + ',' + location.longitude);
-
- // IMPORTANT: You must execute the finish method here to inform the native plugin that you're finished,
- // and the background-task may be completed. You must do this regardless if your HTTP request is successful or not.
- // IF YOU DON'T, ios will CRASH YOUR APP for spending too much time in the background.
- BackgroundGeolocation.finish(); // FOR IOS ONLY
-
- * }, (error) => {
- * console.log('BackgroundGeolocation error');
- * }, config);
+ * this.backgroundGeolocation.configure(config)
+ * .subscribe((location: BackgroundGeolocationResponse) => {
*
- * // Turn ON the background-geolocation system. The user will be tracked whenever they suspend the app.
- * BackgroundGeolocation.start();
- * })
+ * console.log(location);
+ *
+ * // IMPORTANT: You must execute the finish method here to inform the native plugin that you're finished,
+ * // and the background-task may be completed. You must do this regardless if your HTTP request is successful or not.
+ * // IF YOU DON'T, ios will CRASH YOUR APP for spending too much time in the background.
+ * BackgroundGeolocation.finish(); // FOR IOS ONLY
+ *
+ * });
+ *
+ * // start recording location
+ * this.backgroundGeolocation.start();
*
* // If you wish to turn OFF background-tracking, call the #stop method.
- * BackgroundGeolocation.stop();
+ * this.backgroundGeolocation.stop();
*
* ```
* @interfaces
@@ -310,6 +310,7 @@ export interface BackgroundGeolocationConfig {
repo: 'https://github.com/mauron85/cordova-plugin-background-geolocation',
platforms: ['iOS', 'Android', 'Windows Phone 8']
})
+@Injectable()
export class BackgroundGeolocation {
/**
@@ -321,7 +322,7 @@ export class BackgroundGeolocation {
*
* @enum {number}
*/
- static LocationProvider: any = {
+ LocationProvider: any = {
ANDROID_DISTANCE_FILTER_PROVIDER: 0,
ANDROID_ACTIVITY_PROVIDER: 1
};
@@ -339,7 +340,7 @@ export class BackgroundGeolocation {
*
* enum {number}
*/
- static Accuracy: any = {
+ Accuracy: any = {
HIGH: 0,
MEDIUM: 10,
LOW: 100,
@@ -355,7 +356,7 @@ export class BackgroundGeolocation {
*
* @enum {number}
*/
- static Mode: any = {
+ Mode: any = {
BACKGROUND: 0,
FOREGROUND: 1
};
@@ -364,13 +365,13 @@ export class BackgroundGeolocation {
* Configure the plugin.
*
* @param options {BackgroundGeolocationConfig} options An object of type Config
- * @return {Observable}
+ * @return {Observable}
*/
@Cordova({
callbackOrder: 'reverse',
observable: true
})
- static configure(options: BackgroundGeolocationConfig): Observable { return; }
+ configure(options: BackgroundGeolocationConfig): Observable { return; }
/**
* Turn ON the background-geolocation system.
@@ -378,14 +379,14 @@ export class BackgroundGeolocation {
* @returns {Promise}
*/
@Cordova()
- static start(): Promise { return; }
+ start(): Promise { return; }
/**
* Turn OFF background-tracking
* @returns {Promise}
*/
@Cordova()
- static stop(): Promise { return; }
+ stop(): Promise { return; }
/**
* Inform the native plugin that you're finished, the background-task may be completed
@@ -394,7 +395,7 @@ export class BackgroundGeolocation {
@Cordova({
platforms: ['iOS', 'Windows Phone']
})
- static finish(): Promise { return; }
+ finish(): Promise { return; }
/**
* Force the plugin to enter "moving" or "stationary" state
@@ -404,7 +405,7 @@ export class BackgroundGeolocation {
@Cordova({
platforms: ['iOS', 'Windows Phone']
})
- static changePace(isMoving: boolean): Promise { return; }
+ changePace(isMoving: boolean): Promise { return; }
/**
* Setup configuration
@@ -414,7 +415,7 @@ export class BackgroundGeolocation {
@Cordova({
callbackOrder: 'reverse'
})
- static setConfig(options: BackgroundGeolocationConfig): Promise { return; }
+ setConfig(options: BackgroundGeolocationConfig): Promise { return; }
/**
* Returns current stationaryLocation if available. null if not
@@ -423,7 +424,7 @@ export class BackgroundGeolocation {
@Cordova({
platforms: ['iOS', 'Windows Phone']
})
- static getStationaryLocation(): Promise { return; }
+ getStationaryLocation(): Promise { return; }
/**
* Add a stationary-region listener. Whenever the devices enters "stationary-mode",
@@ -433,7 +434,7 @@ export class BackgroundGeolocation {
@Cordova({
platforms: ['iOS', 'Windows Phone']
})
- static onStationary(): Promise { return; }
+ onStationary(): Promise { return; }
/**
* Check if location is enabled on the device
@@ -442,19 +443,19 @@ export class BackgroundGeolocation {
@Cordova({
platforms: ['Android']
})
- static isLocationEnabled(): Promise { return; }
+ isLocationEnabled(): Promise { return; }
/**
* Display app settings to change permissions
*/
@Cordova({sync: true})
- static showAppSettings(): void { }
+ showAppSettings(): void { }
/**
* Display device location settings
*/
@Cordova({sync: true})
- static showLocationSettings(): void { }
+ showLocationSettings(): void { }
/**
* Method can be used to detect user changes in location services settings.
@@ -465,7 +466,7 @@ export class BackgroundGeolocation {
@Cordova({
platforms: ['Android']
})
- static watchLocationMode(): Promise { return; }
+ watchLocationMode(): Promise { return; }
/**
* Stop watching for location mode changes.
@@ -474,7 +475,7 @@ export class BackgroundGeolocation {
@Cordova({
platforms: ['Android']
})
- static stopWatchingLocationMode(): Promise { return; }
+ stopWatchingLocationMode(): Promise { return; }
/**
* Method will return all stored locations.
@@ -488,14 +489,14 @@ export class BackgroundGeolocation {
@Cordova({
platforms: ['Android']
})
- static getLocations(): Promise { return; }
+ getLocations(): Promise { return; }
/**
* Method will return locations, which has not been yet posted to server. NOTE: Locations does contain locationId.
* @returns {Promise}
*/
@Cordova()
- static getValidLocations(): Promise { return; }
+ getValidLocations(): Promise { return; }
/**
* Delete stored location by given locationId.
@@ -505,7 +506,7 @@ export class BackgroundGeolocation {
@Cordova({
platforms: ['Android']
})
- static deleteLocation(locationId: number): Promise { return; }
+ deleteLocation(locationId: number): Promise { return; }
/**
* Delete all stored locations.
@@ -514,7 +515,7 @@ export class BackgroundGeolocation {
@Cordova({
platforms: ['Android']
})
- static deleteAllLocations(): Promise { return; }
+ deleteAllLocations(): Promise { return; }
/**
* Normally plugin will handle switching between BACKGROUND and FOREGROUND mode itself.
@@ -532,7 +533,7 @@ export class BackgroundGeolocation {
@Cordova({
platforms: ['iOS']
})
- static switchMode(modeId: number): Promise { return; }
+ switchMode(modeId: number): Promise { return; }
/**
* Return all logged events. Useful for plugin debugging. Parameter limit limits number of returned entries.
@@ -542,6 +543,6 @@ export class BackgroundGeolocation {
* @returns {Promise}
*/
@Cordova()
- static getLogEntries(limit: number): Promise { return; }
+ getLogEntries(limit: number): Promise { return; }
}
diff --git a/src/plugins/backgroundmode.ts b/src/@ionic-native/plugins/background-mode/index.ts
similarity index 54%
rename from src/plugins/backgroundmode.ts
rename to src/@ionic-native/plugins/background-mode/index.ts
index eecea9120..4b28ddca0 100644
--- a/src/plugins/backgroundmode.ts
+++ b/src/@ionic-native/plugins/background-mode/index.ts
@@ -1,6 +1,8 @@
-import { Cordova, Plugin } from './plugin';
+import { Injectable } from '@angular/core';
+import { Cordova, Plugin } from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
+
/**
* Configurations items that can be updated.
*/
@@ -34,20 +36,24 @@ export interface BackgroundModeConfiguration {
}
/**
-* @name Background Mode
-* @description
-* Cordova plugin to prevent the app from going to sleep while in background.
-* Requires Cordova plugin: cordova-plugin-background-mode. For more info about plugin, vist: https://github.com/katzer/cordova-plugin-background-mode
-*@usage
-* ```typescript
-* import { BackgroundMode } from 'ionic-native';
-*
-* BackgroundMode.enable();
-* ```
+ * @name Background Mode
+ * @description
+ * Cordova plugin to prevent the app from going to sleep while in background.
+ * Requires Cordova plugin: cordova-plugin-background-mode. For more info about plugin, vist: https://github.com/katzer/cordova-plugin-background-mode
+ *@usage
+ * ```typescript
+ * import { BackgroundMode } from '@ionic-native/background-mode';
+ *
+ * constructor(private backgroundMode: BackgroundMode) { }
+ *
+ * ...
+ *
+ * this.backgroundMode.enable();
+ * ```
*
* @interfaces
* BackgroundModeConfiguration
-*/
+ */
@Plugin({
pluginName: 'BackgroundMode',
plugin: 'cordova-plugin-background-mode',
@@ -55,61 +61,62 @@ export interface BackgroundModeConfiguration {
repo: 'https://github.com/katzer/cordova-plugin-background-mode',
platforms: ['Android', 'iOS', 'Windows Phone 8']
})
+@Injectable()
export class BackgroundMode {
/**
- * Enable the background mode.
- * Once called, prevents the app from being paused while in background.
- */
+ * Enable the background mode.
+ * Once called, prevents the app from being paused while in background.
+ */
@Cordova({
sync: true
})
- static enable(): void { }
+ enable(): void { }
/**
- * Disable the background mode.
- * Once the background mode has been disabled, the app will be paused when in background.
- */
+ * Disable the background mode.
+ * Once the background mode has been disabled, the app will be paused when in background.
+ */
@Cordova()
- static disable(): Promise { return; }
+ disable(): Promise { return; }
/**
- * Checks if background mode is enabled or not.
- * @returns {boolean} returns a boolean that indicates if the background mode is enabled.
- */
+ * Checks if background mode is enabled or not.
+ * @returns {boolean} returns a boolean that indicates if the background mode is enabled.
+ */
@Cordova({
sync: true
})
- static isEnabled(): boolean { return; }
+ isEnabled(): boolean { return; }
/**
- * Can be used to get the information if the background mode is active.
- * @returns {boolean} returns a boolean that indicates if the background mode is active.
- */
+ * Can be used to get the information if the background mode is active.
+ * @returns {boolean} returns a boolean that indicates if the background mode is active.
+ */
@Cordova({
sync: true
})
- static isActive(): boolean { return; }
+ isActive(): boolean { return; }
/**
- * Override the default title, ticker and text.
- * Available only for Android platform.
- * @param {Configure} options List of option to configure. See table below
- */
+ * Override the default title, ticker and text.
+ * Available only for Android platform.
+ * @param {Configure} options List of option to configure. See table below
+ */
@Cordova({
platforms: ['Android']
})
- static setDefaults(options?: BackgroundModeConfiguration): Promise { return; }
+ setDefaults(options?: BackgroundModeConfiguration): Promise { return; }
/**
- * Modify the displayed information.
- * Available only for Android platform.
- * @param {Configure} options Any options you want to update. See table below.
- */
+ * Modify the displayed information.
+ * Available only for Android platform.
+ * @param {Configure} options Any options you want to update. See table below.
+ */
@Cordova({
platforms: ['Android']
})
- static configure(options?: BackgroundModeConfiguration): Promise { return; }
+ configure(options?: BackgroundModeConfiguration): Promise { return; }
/**
* Listen for events that the plugin fires. Available events are `enable`, `disable`, `activate`, `deactivate` and `failure`.
@@ -121,7 +128,7 @@ export class BackgroundMode {
clearFunction: 'un',
clearWithArgs: true
})
- static on(event: string): Observable { return; }
+ on(event: string): Observable { return; }
/**
* Android allows to programmatically move from foreground to background.
@@ -130,7 +137,7 @@ export class BackgroundMode {
platforms: ['Android'],
sync: true
})
- static moveToBackground(): void {}
+ moveToBackground(): void {}
/**
* Android allows to programmatically move from background to foreground.
@@ -139,7 +146,7 @@ export class BackgroundMode {
platforms: ['Android'],
sync: true
})
- static moveToForeground(): void {}
+ moveToForeground(): void {}
/**
* Override the back button on Android to go to background instead of closing the app.
@@ -148,7 +155,7 @@ export class BackgroundMode {
platforms: ['Android'],
sync: true
})
- static overrideBackButton(): void {}
+ overrideBackButton(): void {}
/**
* Exclude the app from the recent task list works on Android 5.0+.
@@ -157,7 +164,7 @@ export class BackgroundMode {
platforms: ['Android'],
sync: true
})
- static excludeFromTaskList(): void {}
+ excludeFromTaskList(): void {}
/**
* The method works async instead of isActive() or isEnabled().
@@ -165,7 +172,7 @@ export class BackgroundMode {
@Cordova({
platforms: ['Android']
})
- static isScreenOff(): Promise { return; }
+ isScreenOff(): Promise { return; }
/**
* Turn screen on
@@ -174,7 +181,7 @@ export class BackgroundMode {
platforms: ['Android'],
sync: true
})
- static wakeUp(): void {}
+ wakeUp(): void {}
/**
* Turn screen on and show app even locked
@@ -183,6 +190,6 @@ export class BackgroundMode {
platforms: ['Android'],
sync: true
})
- static unlock(): void {}
+ unlock(): void {}
}
diff --git a/src/plugins/backlight.ts b/src/@ionic-native/plugins/backlight/index.ts
similarity index 63%
rename from src/plugins/backlight.ts
rename to src/@ionic-native/plugins/backlight/index.ts
index ec1c55746..31f3ccd30 100644
--- a/src/plugins/backlight.ts
+++ b/src/@ionic-native/plugins/backlight/index.ts
@@ -1,4 +1,6 @@
-import { Plugin, Cordova } from './plugin';
+import { Injectable } from '@angular/core';
+import { Plugin, Cordova } from '@ionic-native/core';
+
/**
* @beta
@@ -8,13 +10,17 @@ import { Plugin, Cordova } from './plugin';
*
* @usage
* ```
- * import { Backlight } from 'ionic-native';
+ * import { Backlight } from '@ionic-native/backlight';
+ *
+ * constructor(private backlight: Backlight) { }
+ *
+ * ...
*
* // Turn backlight on
- * Backlight.on().then(() => console.log('backlight on'));
+ * this.backlight.on().then(() => console.log('backlight on'));
*
* // Turn backlight off
- * Backlight.off().then(() => console.log('backlight off'));
+ * this.backlight.off().then(() => console.log('backlight off'));
*
* ```
*/
@@ -25,6 +31,7 @@ import { Plugin, Cordova } from './plugin';
repo: 'https://github.com/mebibou/cordova-plugin-backlight',
platforms: ['Android']
})
+@Injectable()
export class Backlight {
/**
@@ -32,13 +39,13 @@ export class Backlight {
* @return {Promise} Returns a promise that resolves when the backlight is on
*/
@Cordova()
- static on(): Promise { return; }
+ on(): Promise { return; }
/**
* This function turns backlight off
* @return {Promise} Returns a promise that resolves when the backlight is off
*/
@Cordova()
- static off(): Promise { return; }
+ off(): Promise { return; }
}
diff --git a/src/plugins/badge.ts b/src/@ionic-native/plugins/badge/index.ts
similarity index 72%
rename from src/plugins/badge.ts
rename to src/@ionic-native/plugins/badge/index.ts
index 675d60486..225046978 100644
--- a/src/plugins/badge.ts
+++ b/src/@ionic-native/plugins/badge/index.ts
@@ -1,4 +1,6 @@
-import { Cordova, Plugin } from './plugin';
+import { Injectable } from '@angular/core';
+import { Cordova, Plugin } from '@ionic-native/core';
+
/**
* @name Badge
@@ -9,12 +11,15 @@ import { Cordova, Plugin } from './plugin';
*
* @usage
* ```typescript
- * import { Badge } from 'ionic-native';
+ * import { Badge } from '@ionic-native/badge';
*
+ * constructor(private badge: Badge) { }
*
- * Badge.set(10);
- * Badge.increase(1);
- * Badge.clear();
+ * ...
+ *
+ * this.badge.set(10);
+ * this.badge.increase(1);
+ * this.badge.clear();
* ```
*/
@Plugin({
@@ -24,6 +29,7 @@ import { Cordova, Plugin } from './plugin';
repo: 'https://github.com/katzer/cordova-plugin-badge',
platforms: ['Android', 'iOS', 'Browser', 'Windows', 'Amazon FireOS', 'Windows Phone 8']
})
+@Injectable()
export class Badge {
/**
@@ -31,7 +37,7 @@ export class Badge {
* @returns {Promise}
*/
@Cordova()
- static clear(): Promise { return; }
+ clear(): Promise { return; }
/**
* Set the badge of the app icon.
@@ -39,14 +45,14 @@ export class Badge {
* @returns {Promise}
*/
@Cordova()
- static set(badgeNumber: number): Promise { return; }
+ set(badgeNumber: number): Promise { return; }
/**
* Get the badge of the app icon.
* @returns {Promise}
*/
@Cordova()
- static get(): Promise { return; }
+ get(): Promise { return; }
/**
* Increase the badge number.
@@ -54,7 +60,7 @@ export class Badge {
* @returns {Promise}
*/
@Cordova()
- static increase(increaseBy: number): Promise { return; }
+ increase(increaseBy: number): Promise { return; }
/**
* Decrease the badge number.
@@ -62,20 +68,20 @@ export class Badge {
* @returns {Promise}
*/
@Cordova()
- static decrease(decreaseBy: number): Promise { return; }
+ decrease(decreaseBy: number): Promise { return; }
/**
* Determine if the app has permission to show badges.
* @returns {Promise}
*/
@Cordova()
- static hasPermission(): Promise { return; }
+ hasPermission(): Promise { return; }
/**
* Register permission to set badge notifications
* @returns {Promise}
*/
@Cordova()
- static registerPermission(): Promise { return; }
+ registerPermission(): Promise { return; }
}
diff --git a/src/plugins/barcodescanner.ts b/src/@ionic-native/plugins/barcode-scanner/index.ts
similarity index 83%
rename from src/plugins/barcodescanner.ts
rename to src/@ionic-native/plugins/barcode-scanner/index.ts
index caa68153c..13ba7908c 100644
--- a/src/plugins/barcodescanner.ts
+++ b/src/@ionic-native/plugins/barcode-scanner/index.ts
@@ -1,4 +1,6 @@
-import { Cordova, Plugin } from './plugin';
+import { Injectable } from '@angular/core';
+import { Cordova, Plugin } from '@ionic-native/core';
+
export interface BarcodeScannerOptions {
@@ -63,10 +65,14 @@ export interface BarcodeScannerOptions {
*
* @usage
* ```typescript
- * import { BarcodeScanner } from 'ionic-native';
+ * import { BarcodeScanner } from '@ionic-native/barcode-scanner';
+ *
+ * constructor(private barcodeScanner: BarcodeScanner) { }
+ *
+ * ...
*
*
- * BarcodeScanner.scan().then((barcodeData) => {
+ * this.barcodeScanner.scan().then((barcodeData) => {
* // Success! Barcode data is here
* }, (err) => {
* // An error occurred
@@ -82,12 +88,15 @@ export interface BarcodeScannerOptions {
repo: 'https://github.com/phonegap/phonegap-plugin-barcodescanner',
platforms: ['Android', 'iOS', 'Windows Phone 8', 'Windows 10', 'Windows 8', 'BlackBerry 10', 'Browser']
})
+@Injectable()
export class BarcodeScanner {
- /**
- * @private
- */
- static Encode: any = {
+ Encode: {
+ TEXT_TYPE: string;
+ EMAIL_TYPE: string;
+ PHONE_TYPE: string;
+ SMS_TYPE: string;
+ } = {
TEXT_TYPE: 'TEXT_TYPE',
EMAIL_TYPE: 'EMAIL_TYPE',
PHONE_TYPE: 'PHONE_TYPE',
@@ -102,7 +111,7 @@ export class BarcodeScanner {
@Cordova({
callbackOrder: 'reverse'
})
- static scan(options?: BarcodeScannerOptions): Promise { return; }
+ scan(options?: BarcodeScannerOptions): Promise { return; }
/**
* Encodes data into a barcode.
@@ -112,6 +121,6 @@ export class BarcodeScanner {
* @returns {Promise}
*/
@Cordova()
- static encode(type: string, data: any): Promise { return; }
+ encode(type: string, data: any): Promise { return; }
}
diff --git a/src/plugins/base64togallery.ts b/src/@ionic-native/plugins/base64-to-gallery/index.ts
similarity index 72%
rename from src/plugins/base64togallery.ts
rename to src/@ionic-native/plugins/base64-to-gallery/index.ts
index 4038e8402..0e78238a2 100644
--- a/src/plugins/base64togallery.ts
+++ b/src/@ionic-native/plugins/base64-to-gallery/index.ts
@@ -1,14 +1,20 @@
-import { Cordova, Plugin } from './plugin';
+import { Injectable } from '@angular/core';
+import { Cordova, Plugin } from '@ionic-native/core';
/**
* @name Base64 To Gallery
* @description This plugin allows you to save base64 data as a png image into the device
* @usage
* ```typescript
- * import { Base64ToGallery } from 'ionic-native';
+ * import { Base64ToGallery } from '@ionic-native/base64-to-gallery';
+ *
+ * constructor(private base64ToGallery: Base64ToGallery) { }
*
*
- * Base64ToGallery.base64ToGallery(base64Data, 'img_').then(
+ * ...
+ *
+ *
+ * this.base64ToGallery.base64ToGallery(base64Data, { prefix: '_img' }).then(
* res => console.log('Saved image to gallery ', res),
* err => console.log('Error saving image to gallery ', err)
* );
@@ -21,6 +27,7 @@ import { Cordova, Plugin } from './plugin';
repo: 'https://github.com/Nexxa/cordova-base64-to-gallery',
platforms: ['Android', 'iOS', 'Windows Phone 8']
})
+@Injectable()
export class Base64ToGallery {
/**
@@ -33,7 +40,7 @@ export class Base64ToGallery {
successIndex: 2,
errorIndex: 3
})
- static base64ToGallery(data: string, options?: {prefix?: string; mediaScanner?: boolean}): Promise {
+ base64ToGallery(data: string, options?: {prefix?: string; mediaScanner?: boolean}): Promise {
return;
}
diff --git a/src/plugins/batterystatus.ts b/src/@ionic-native/plugins/battery-status/index.ts
similarity index 78%
rename from src/plugins/batterystatus.ts
rename to src/@ionic-native/plugins/battery-status/index.ts
index d8d90ced2..72fbf385f 100644
--- a/src/plugins/batterystatus.ts
+++ b/src/@ionic-native/plugins/battery-status/index.ts
@@ -1,4 +1,5 @@
-import { Cordova, Plugin } from './plugin';
+import { Injectable } from '@angular/core';
+import { Cordova, Plugin } from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
export interface BatteryStatusResponse {
@@ -22,11 +23,15 @@ export interface BatteryStatusResponse {
*
* @usage
* ```typescript
- * import { BatteryStatus } from 'ionic-native';
+ * import { BatteryStatus } from '@ionic-native/battery-status';
+ *
+ * constructor(private batteryStatus: BatteryStatus) { }
+ *
+ * ...
*
*
* // watch change in battery status
- * let subscription = BatteryStatus.onChange().subscribe(
+ * let subscription = this.batteryStatus.onChange().subscribe(
* (status: StatusObject) => {
* console.log(status.level, status.isPlugged);
* }
@@ -46,6 +51,7 @@ export interface BatteryStatusResponse {
repo: 'https://github.com/apache/cordova-plugin-battery-status',
platforms: ['Amazon Fire OS', 'iOS', 'Android', 'BlackBerry 10', 'Windows Phone 7', 'Windows Phone 8', 'Windows', 'Firefox OS', 'Browser']
})
+@Injectable()
export class BatteryStatus {
/**
@@ -56,7 +62,7 @@ export class BatteryStatus {
eventObservable: true,
event: 'batterystatus'
})
- static onChange(): Observable { return; }
+ onChange(): Observable { return; }
/**
* Watch when the battery level goes low
@@ -66,7 +72,7 @@ export class BatteryStatus {
eventObservable: true,
event: 'batterylow'
})
- static onLow(): Observable { return; }
+ onLow(): Observable { return; }
/**
* Watch when the battery level goes to critial
@@ -76,6 +82,6 @@ export class BatteryStatus {
eventObservable: true,
event: 'batterycritical'
})
- static onCritical(): Observable { return; }
+ onCritical(): Observable { return; }
}
diff --git a/src/plugins/ble.ts b/src/@ionic-native/plugins/ble/index.ts
similarity index 93%
rename from src/plugins/ble.ts
rename to src/@ionic-native/plugins/ble/index.ts
index 99882d67b..3a9d45db6 100644
--- a/src/plugins/ble.ts
+++ b/src/@ionic-native/plugins/ble/index.ts
@@ -1,4 +1,5 @@
-import { Cordova, Plugin } from './plugin';
+import { Injectable } from '@angular/core';
+import { Cordova, Plugin } from '@ionic-native/core';
import { Observable } from 'rxjs/Observable';
/**
@@ -20,6 +21,14 @@ import { Observable } from 'rxjs/Observable';
*
* @usage
*
+ * ```typescript
+ *
+ * import { BLE } from '@ionic-native/ble';
+ *
+ * constructor(private ble: BLE) { }
+ *
+ * ```
+ *
* ## Peripheral Data
*
* Peripheral Data is passed to the success callback when scanning and connecting. Limited data is passed when scanning.
@@ -166,6 +175,7 @@ import { Observable } from 'rxjs/Observable';
repo: 'https://github.com/don/cordova-plugin-ble-central',
platforms: ['iOS', 'Android']
})
+@Injectable()
export class BLE {
/**
@@ -184,7 +194,7 @@ export class BLE {
@Cordova({
observable: true
})
- static scan(services: string[], seconds: number): Observable { return; }
+ scan(services: string[], seconds: number): Observable { return; }
/**
* Scan and discover BLE peripherals until `stopScan` is called.
@@ -207,7 +217,7 @@ export class BLE {
clearFunction: 'stopScan',
clearWithArgs: false
})
- static startScan(services: string[]): Observable { return; }
+ startScan(services: string[]): Observable { return; }
/**
* Scans for BLE devices. This function operates similarly to the `startScan` function, but allows you to specify extra options (like allowing duplicate device reports).
@@ -220,7 +230,7 @@ export class BLE {
clearFunction: 'stopScan',
clearWithArgs: false
})
- static startScanWithOptions(services: string[], options: {reportDuplicates?: boolean} | any): Observable { return; }
+ startScanWithOptions(services: string[], options: {reportDuplicates?: boolean} | any): Observable { return; }
/**
* Stop a scan started by `startScan`.
@@ -237,7 +247,7 @@ export class BLE {
* @return returns a Promise.
*/
@Cordova()
- static stopScan(): Promise { return; }
+ stopScan(): Promise { return; }
/**
* Connect to a peripheral.
@@ -258,7 +268,7 @@ export class BLE {
clearFunction: 'disconnect',
clearWithArgs: true
})
- static connect(deviceId: string): Observable { return; }
+ connect(deviceId: string): Observable { return; }
/**
* Disconnect from a peripheral.
@@ -272,7 +282,7 @@ export class BLE {
* @return Returns a Promise
*/
@Cordova()
- static disconnect(deviceId: string): Promise { return; }
+ disconnect(deviceId: string): Promise { return; }
/**
* Read the value of a characteristic.
@@ -283,7 +293,7 @@ export class BLE {
* @return Returns a Promise
*/
@Cordova()
- static read(
+ read(
deviceId: string,
serviceUUID: string,
characteristicUUID: string
@@ -318,7 +328,7 @@ export class BLE {
* @return Returns a Promise
*/
@Cordova()
- static write(
+ write(
deviceId: string,
serviceUUID: string,
characteristicUUID: string,
@@ -335,7 +345,7 @@ export class BLE {
* @return Returns a Promise
*/
@Cordova()
- static writeWithoutResponse(
+ writeWithoutResponse(
deviceId: string,
serviceUUID: string,
characteristicUUID: string,
@@ -362,7 +372,7 @@ export class BLE {
clearFunction: 'stopNotification',
clearWithArgs: true
})
- static startNotification(
+ startNotification(
deviceId: string,
serviceUUID: string,
characteristicUUID: string
@@ -377,7 +387,7 @@ export class BLE {
* @returns {Promise}
*/
@Cordova()
- static stopNotification(
+ stopNotification(
deviceId: string,
serviceUUID: string,
characteristicUUID: string
@@ -397,7 +407,7 @@ export class BLE {
* @returns {Promise}
*/
@Cordova()
- static isConnected(deviceId: string): Promise { return; }
+ isConnected(deviceId: string): Promise { return; }
/**
* Report if bluetooth is enabled.
@@ -405,7 +415,7 @@ export class BLE {
* @returns {Promise} Returns a Promise that resolves if Bluetooth is enabled, and rejects if disabled.
*/
@Cordova()
- static isEnabled(): Promise { return; }
+ isEnabled(): Promise { return; }
/**
* Open System Bluetooth settings (Android only).
@@ -413,7 +423,7 @@ export class BLE {
* @returns {Promise}
*/
@Cordova()
- static showBluetoothSettings(): Promise { return; }
+ showBluetoothSettings(): Promise { return; }
/**
* Enable Bluetooth on the device (Android only).
@@ -421,7 +431,7 @@ export class BLE {
* @returns {Promise}
*/
@Cordova()
- static enable(): Promise