diff --git a/.gitignore b/.gitignore index 4d08210..8f1faee 100644 --- a/.gitignore +++ b/.gitignore @@ -1,18 +1 @@ -*.js -*.js.map -*.log -!scripts/*.js -demo/app/*.js -!demo/karma.conf.js -!demo/app/tests/*.js -demo/*.d.ts -!demo/references.d.ts -demo/lib -demo/platforms -demo/node_modules -demo-angular/app/*.js -demo-angular/*.d.ts -demo-angular/platforms -demo-angular/node_modules -src/node_modules -/.vscode/ \ No newline at end of file +/.vscode/ diff --git a/README.md b/README.md index 24689cd..abadc35 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ NativeScript : Facebook SDK ![apple](https://cdn3.iconfinder.com/data/icons/pico - [Login](#login) - [Facebook Login Button](#facebook-login-button) - [Custom Login Button](#custom-login-button) -- [NativeScript + Angular](#nativescript--angular) +- [NativeScript Angular](#nativescript--angular) - [Initialization](#initialization-1) - [Login](#login-1) - [Facebook Login Button](#facebook-login-button-1) @@ -144,13 +144,13 @@ export class HelloWorldModel extends Observable { } ``` -## NativeScript + Angular +## NativeScript Angular ### Initialization Call init of nativescript-facebook module on application launch. -main.ts +app.module.ts ```TypeScript -import { platformNativeScriptDynamic } from "nativescript-angular/platform"; +... import * as application from 'application'; var nsFacebook = require('nativescript-facebook'); @@ -159,8 +159,7 @@ import { AppModule } from "./app.module"; application.on(application.launchEvent, function (args) { nsFacebook.init("{facebook_app_id}"); }); - -platformNativeScriptDynamic().bootstrapModule(AppModule); +... ``` ### Login diff --git a/demo-angular/.gitignore b/demo-angular/.gitignore new file mode 100644 index 0000000..6b1e5df --- /dev/null +++ b/demo-angular/.gitignore @@ -0,0 +1,4 @@ +platforms +node_modules +hooks +app/**/*.js diff --git a/demo-angular/app/app.component.html b/demo-angular/app/app.component.html index a0b9786..c4ea399 100644 --- a/demo-angular/app/app.component.html +++ b/demo-angular/app/app.component.html @@ -1,4 +1,4 @@ - + - \ No newline at end of file + diff --git a/demo-angular/app/app.module.ts b/demo-angular/app/app.module.ts index 600763a..bd14153 100644 --- a/demo-angular/app/app.module.ts +++ b/demo-angular/app/app.module.ts @@ -2,21 +2,22 @@ import { NgModule, NO_ERRORS_SCHEMA } from "@angular/core"; import { NativeScriptModule } from "nativescript-angular/nativescript.module"; import { AppComponent } from "./app.component"; -import { NativescriptFacebookModule } from "nativescript-facebook/angular"; +import { NativeScriptFacebookModule } from "nativescript-facebook/angular"; + +import * as application from 'application'; +var nsFacebook = require('nativescript-facebook'); + +application.on(application.launchEvent, function (args) { + nsFacebook.init("1771472059772879"); +}); @NgModule({ - bootstrap: [ - AppComponent - ], + bootstrap: [ AppComponent ], imports: [ NativeScriptModule, - NativescriptFacebookModule - ], - declarations: [ - AppComponent + NativeScriptFacebookModule ], - schemas: [ - NO_ERRORS_SCHEMA - ] + declarations: [ AppComponent ], + schemas: [ NO_ERRORS_SCHEMA ] }) export class AppModule { } diff --git a/demo-angular/app/main.aot.ts b/demo-angular/app/main.aot.ts index 8f033e9..98bf134 100644 --- a/demo-angular/app/main.aot.ts +++ b/demo-angular/app/main.aot.ts @@ -1,6 +1,4 @@ -// this import should be first in order to load some required settings (like globals and reflect-metadata) import { platformNativeScript } from "nativescript-angular/platform-static"; - import { AppModuleNgFactory } from "./app.module.ngfactory"; platformNativeScript().bootstrapModuleFactory(AppModuleNgFactory); diff --git a/demo-angular/app/main.ts b/demo-angular/app/main.ts index 66aa42f..639bfd5 100644 --- a/demo-angular/app/main.ts +++ b/demo-angular/app/main.ts @@ -1,12 +1,4 @@ -// this import should be first in order to load some required settings (like globals and reflect-metadata) import { platformNativeScriptDynamic } from "nativescript-angular/platform"; -import * as application from 'application'; -var nsFacebook = require('nativescript-facebook'); - import { AppModule } from "./app.module"; -application.on(application.launchEvent, function (args) { - nsFacebook.init("1771472059772879"); -}); - platformNativeScriptDynamic().bootstrapModule(AppModule); diff --git a/demo-angular/app/vendor-platform.android.ts b/demo-angular/app/vendor-platform.android.ts new file mode 100644 index 0000000..ba9742f --- /dev/null +++ b/demo-angular/app/vendor-platform.android.ts @@ -0,0 +1,25 @@ +// Resolve JavaScript classes that extend a Java class, and need to resolve +// their JavaScript module from a bundled script. For example: +// NativeScriptApplication, NativeScriptActivity, etc. +// +// This module gets bundled together with the rest of the app code and the +// `require` calls get resolved to the correct bundling import call. +// +// At runtime the module gets loaded *before* the rest of the app code, so code +// placed here needs to be careful about its dependencies. + +require("application"); +require("ui/frame"); +require("ui/frame/activity"); + +if (global.TNS_WEBPACK) { + global.__requireOverride = function (name, dir) { + if (name === "./tns_modules/application/application.js") { + return require("application"); + } else if (name === "./tns_modules/ui/frame/frame.js") { + return require("ui/frame"); + } else if (name === "./tns_modules/ui/frame/activity.js") { + return require("ui/frame/activity"); + } + }; +} diff --git a/demo-angular/app/vendor-platform.ios.ts b/demo-angular/app/vendor-platform.ios.ts new file mode 100644 index 0000000..e69de29 diff --git a/demo-angular/app/vendor.ts b/demo-angular/app/vendor.ts new file mode 100644 index 0000000..0d96965 --- /dev/null +++ b/demo-angular/app/vendor.ts @@ -0,0 +1,13 @@ +require("./vendor-platform"); + +require("reflect-metadata"); +require("@angular/platform-browser"); +require("@angular/core"); +require("@angular/common"); +require("@angular/forms"); +require("@angular/http"); +require("@angular/router"); + +require("nativescript-angular/platform-static"); +require("nativescript-angular/forms"); +require("nativescript-angular/router"); diff --git a/demo-angular/package.json b/demo-angular/package.json index cadce01..d94bc6c 100644 --- a/demo-angular/package.json +++ b/demo-angular/package.json @@ -9,34 +9,54 @@ "version": "3.0.0-rc.1" }, "tns-ios": { - "version": "3.0.0-rc.1-2017-3-28-2" + "version": "3.0.0-rc.1" } }, "dependencies": { - "@angular/common": "4.0.0", - "@angular/compiler": "4.0.0", - "@angular/core": "4.0.0", - "@angular/forms": "4.0.0", - "@angular/http": "4.0.0", - "@angular/platform-browser": "4.0.0", - "@angular/platform-browser-dynamic": "4.0.0", - "@angular/router": "4.0.0", - "nativescript-facebook": "file:///../src", + "@angular/common": "~4.0.0", + "@angular/compiler": "~4.0.0", + "@angular/core": "~4.0.0", + "@angular/forms": "~4.0.0", + "@angular/http": "~4.0.0", + "@angular/platform-browser": "~4.0.0", + "@angular/platform-browser-dynamic": "~4.0.0", + "@angular/router": "~4.0.0", + "nativescript-angular": "^3.0.0 || ^2.0.0-rc.1", + "nativescript-facebook": "../src", "nativescript-theme-core": "^1.0.2", "nativescript-unit-test-runner": "^0.3.4", - "tns-core-modules": "rc" + "rxjs": "~5.3.0", + "tns-core-modules": "^3.0.0 || ^3.0.0-rc.1", + "zone.js": "^0.8.4" }, "devDependencies": { + "@angular/compiler-cli": "~4.0.0", + "@ngtools/webpack": "1.3.0", "babel-traverse": "6.12.0", "babel-types": "6.11.1", "babylon": "6.8.4", + "copy-webpack-plugin": "~4.0.1", + "extract-text-webpack-plugin": "~2.1.0", "filewalker": "0.1.2", "jasmine-core": "^2.5.2", "karma": "^1.3.0", "karma-jasmine": "^1.0.2", "karma-nativescript-launcher": "^0.4.0", "lazy": "1.0.11", - "nativescript-dev-typescript": "0.4", - "typescript": "2.2.2" + "nativescript-css-loader": "~0.26.0", + "nativescript-dev-typescript": "^0.4.0", + "nativescript-dev-webpack": "^0.4.0", + "raw-loader": "~0.5.1", + "resolve-url-loader": "~2.0.2", + "typescript": "~2.2.2", + "webpack": "~2.3.3", + "webpack-sources": "~0.2.3" + }, + "scripts": { + "ns-bundle": "ns-bundle", + "start-android-bundle": "npm run ns-bundle --android --start-app", + "start-ios-bundle": "npm run ns-bundle --ios --start-app", + "build-android-bundle": "npm run ns-bundle --android --build-app", + "build-ios-bundle": "npm run ns-bundle --ios --build-app" } } diff --git a/demo-angular/tsconfig.aot.json b/demo-angular/tsconfig.aot.json new file mode 100644 index 0000000..23e3021 --- /dev/null +++ b/demo-angular/tsconfig.aot.json @@ -0,0 +1,39 @@ +{ + "extends": "./tsconfig", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "ui/*": ["node_modules/tns-core-modules/ui/*"], + "platform": ["node_modules/tns-core-modules/platform"], + "image-source": ["node_modules/tns-core-modules/image-source"], + "xml": ["node_modules/tns-core-modules/xml"], + "xhr": ["node_modules/tns-core-modules/xhr"], + "text": ["node_modules/tns-core-modules/text"], + "data": ["node_modules/tns-core-modules/data"], + "fetch": ["node_modules/tns-core-modules/fetch"], + "trace": ["node_modules/tns-core-modules/trace"], + "fps-meter": ["node_modules/tns-core-modules/fps-meter"], + "color": ["node_modules/tns-core-modules/color"], + "application-settings": ["node_modules/tns-core-modules/application-settings"], + "http": ["node_modules/tns-core-modules/http"], + "camera": ["node_modules/tns-core-modules/camera"], + "console": ["node_modules/tns-core-modules/console"], + "timer": ["node_modules/tns-core-modules/timer"], + "utils": ["node_modules/tns-core-modules/utils"], + "location": ["node_modules/tns-core-modules/location"], + "file-system": ["node_modules/tns-core-modules/file-system"], + "application": ["node_modules/tns-core-modules/application"], + "image-asset": ["node_modules/tns-core-modules/image-asset"], + "connectivity": ["node_modules/tns-core-modules/connectivity"], + "globals": ["node_modules/tns-core-modules/globals"] + } + }, + "exclude": [ + "node_modules", + "platforms" + ], + "angularCompilerOptions": { + "skipMetadataEmit": true, + "genDir": "./" + } +} diff --git a/demo-angular/tsconfig.json b/demo-angular/tsconfig.json index 069dc21..145cbfc 100644 --- a/demo-angular/tsconfig.json +++ b/demo-angular/tsconfig.json @@ -9,7 +9,8 @@ "experimentalDecorators": true, "lib": [ "es6", - "dom" + "dom", + "es2015.iterable" ], "baseUrl": ".", "paths": { diff --git a/demo-angular/webpack.android.js b/demo-angular/webpack.android.js new file mode 100644 index 0000000..968e93b --- /dev/null +++ b/demo-angular/webpack.android.js @@ -0,0 +1,2 @@ +var makeConfig = require("./webpack.common"); +module.exports = makeConfig("android"); diff --git a/demo-angular/webpack.common.js b/demo-angular/webpack.common.js new file mode 100644 index 0000000..0d017eb --- /dev/null +++ b/demo-angular/webpack.common.js @@ -0,0 +1,151 @@ +var webpack = require("webpack"); +var nsWebpack = require("nativescript-dev-webpack"); +var nativescriptTarget = require("nativescript-dev-webpack/nativescript-target"); +var path = require("path"); +var CopyWebpackPlugin = require("copy-webpack-plugin"); +var ExtractTextPlugin = require("extract-text-webpack-plugin"); +var AotPlugin = require("@ngtools/webpack").AotPlugin; + +module.exports = function (platform, destinationApp) { + if (!destinationApp) { + //Default destination inside platforms//... + destinationApp = nsWebpack.getAppPath(platform); + } + var entry = {}; + // Discover entry module from package.json + entry.bundle = "./" + nsWebpack.getEntryModule(); + //Vendor entry with third party libraries. + entry.vendor = "./vendor"; + // app.css bundle + entry["app.css"] = "./app.css"; + + var plugins = [ + new ExtractTextPlugin("app.css"), + // Vendor libs go to the vendor.js chunk + new webpack.optimize.CommonsChunkPlugin({ + name: ["vendor"] + }), + // Define useful constants like TNS_WEBPACK + new webpack.DefinePlugin({ + "global.TNS_WEBPACK": "true", + }), + // Copy assets to out dir. Add your own globs as needed. + new CopyWebpackPlugin([ + { from: "app.css" }, + { from: "css/**" }, + { from: "fonts/**" }, + { from: "**/*.jpg" }, + { from: "**/*.png" }, + { from: "**/*.xml" }, + ], { ignore: ["App_Resources/**"] }), + // Generate a bundle starter script and activate it in package.json + new nsWebpack.GenerateBundleStarterPlugin([ + "./vendor", + "./bundle", + ]), + + // Angular AOT compiler + new AotPlugin({ + tsConfigPath: "tsconfig.aot.json", + entryModule: path.resolve(__dirname, "app/app.module#AppModule"), + typeChecking: false + }), + new nsWebpack.StyleUrlResolvePlugin({platform}), + ]; + + if (process.env.npm_config_uglify) { + plugins.push(new webpack.LoaderOptionsPlugin({ + minimize: true + })); + + // Work around an Android issue by setting compress = false + var compress = platform !== "android"; + plugins.push(new webpack.optimize.UglifyJsPlugin({ + mangle: { + except: nsWebpack.uglifyMangleExcludes, + }, + compress: compress, + })); + } + + return { + context: path.resolve("./app"), + target: nativescriptTarget, + entry: entry, + output: { + pathinfo: true, + path: path.resolve(destinationApp), + libraryTarget: "commonjs2", + filename: "[name].js", + }, + resolve: { + // Resolve platform-specific modules like module.android.js + extensions: [ + ".aot.ts", + ".ts", + ".js", + ".css", + "." + platform + ".ts", + "." + platform + ".js", + "." + platform + ".css", + ], + // Resolve {N} system modules from tns-core-modules + modules: [ + "node_modules/tns-core-modules", + "node_modules", + ] + }, + node: { + // Disable node shims that conflict with NativeScript + "http": false, + "timers": false, + "setImmediate": false, + "fs": "empty", + }, + module: { + loaders: [ + { + test: /\.html$|\.xml$/, + loaders: [ + "raw-loader", + ] + }, + // Root app.css file gets extracted with bundled dependencies + { + test: /app\.css$/, + loader: ExtractTextPlugin.extract([ + "resolve-url-loader", + "nativescript-css-loader", + "nativescript-dev-webpack/platform-css-loader", + ]), + }, + // Other CSS files get bundled using the raw loader + { + test: /\.css$/, + exclude: /app\.css$/, + loaders: [ + "raw-loader", + ] + }, + // Compile TypeScript files with ahead-of-time compiler. + { + test: /\.ts$/, + loaders: [ + "nativescript-dev-webpack/tns-aot-loader", + "@ngtools/webpack", + ] + }, + // SASS support + { + test: /\.scss$/, + loaders: [ + "raw-loader", + "resolve-url-loader", + "sass-loader", + ] + }, + ] + }, + plugins: plugins, + }; +}; diff --git a/demo-angular/webpack.ios.js b/demo-angular/webpack.ios.js new file mode 100644 index 0000000..806f3ef --- /dev/null +++ b/demo-angular/webpack.ios.js @@ -0,0 +1,2 @@ +var makeConfig = require("./webpack.common"); +module.exports = makeConfig("ios"); diff --git a/demo/.gitignore b/demo/.gitignore new file mode 100644 index 0000000..5c1c079 --- /dev/null +++ b/demo/.gitignore @@ -0,0 +1,4 @@ +node_modules +platforms +hooks +app/**/*.js diff --git a/demo/app/app.ts b/demo/app/app.ts index 81b6356..50313e5 100644 --- a/demo/app/app.ts +++ b/demo/app/app.ts @@ -1,8 +1,10 @@ -import * as application from 'application'; -var nsFacebook = require('nativescript-facebook'); +import "./bundle-config"; + +import * as application from 'application'; +import { init } from "nativescript-facebook"; application.on(application.launchEvent, function (args) { - nsFacebook.init("1771472059772879"); + init("1771472059772879"); }); application.start({ moduleName: "main-page" }); diff --git a/demo/app/bundle-config.ts b/demo/app/bundle-config.ts new file mode 100644 index 0000000..a88fa89 --- /dev/null +++ b/demo/app/bundle-config.ts @@ -0,0 +1,8 @@ +if ((global).TNS_WEBPACK) { + require("bundle-entry-points"); + + global.registerModule("main-page", () => require("./main-page")); + + // register application modules + global.registerModule("nativescript-facebook", () => require("nativescript-facebook")); +} diff --git a/demo/app/main-page.ts b/demo/app/main-page.ts index 231d655..dca878e 100644 --- a/demo/app/main-page.ts +++ b/demo/app/main-page.ts @@ -1,10 +1,10 @@ -import * as observable from 'data/observable'; -import * as pages from 'ui/page'; -import {HelloWorldModel} from './main-view-model'; +import { EventData } from 'data/observable'; +import { Page } from 'ui/page'; +import { HelloWorldModel } from './main-view-model'; // Event handler for Page 'loaded' event attached in main-page.xml -export function pageLoaded(args: observable.EventData) { +export function pageLoaded(args: EventData) { // Get the event sender - let page = args.object; + let page = args.object; page.bindingContext = new HelloWorldModel(); -} \ No newline at end of file +} diff --git a/demo/app/main-page.xml b/demo/app/main-page.xml index ecf6aca..2fddc4f 100644 --- a/demo/app/main-page.xml +++ b/demo/app/main-page.xml @@ -3,7 +3,7 @@ loaded="pageLoaded" class="page"> - \ No newline at end of file + diff --git a/demo/app/main-view-model.ts b/demo/app/main-view-model.ts index 8edd917..b1cb8c7 100644 --- a/demo/app/main-view-model.ts +++ b/demo/app/main-view-model.ts @@ -1,9 +1,7 @@ import { Observable } from 'data/observable'; -let Facebook = require('nativescript-facebook'); -// Facebook Authentication CODE -import * as application from "application"; -var view = require("ui/core/view"); +import { login } from "nativescript-facebook"; +// Facebook Authentication CODE export class HelloWorldModel extends Observable { public onLogin(error, data) { @@ -11,8 +9,6 @@ export class HelloWorldModel extends Observable { } public testAction() { - Facebook.login((error, data) => { - console.log("Success!"); - }); + login((error, data) => console.log("Success!")); } -} \ No newline at end of file +} diff --git a/demo/app/vendor-platform.android.ts b/demo/app/vendor-platform.android.ts new file mode 100644 index 0000000..ba9742f --- /dev/null +++ b/demo/app/vendor-platform.android.ts @@ -0,0 +1,25 @@ +// Resolve JavaScript classes that extend a Java class, and need to resolve +// their JavaScript module from a bundled script. For example: +// NativeScriptApplication, NativeScriptActivity, etc. +// +// This module gets bundled together with the rest of the app code and the +// `require` calls get resolved to the correct bundling import call. +// +// At runtime the module gets loaded *before* the rest of the app code, so code +// placed here needs to be careful about its dependencies. + +require("application"); +require("ui/frame"); +require("ui/frame/activity"); + +if (global.TNS_WEBPACK) { + global.__requireOverride = function (name, dir) { + if (name === "./tns_modules/application/application.js") { + return require("application"); + } else if (name === "./tns_modules/ui/frame/frame.js") { + return require("ui/frame"); + } else if (name === "./tns_modules/ui/frame/activity.js") { + return require("ui/frame/activity"); + } + }; +} diff --git a/demo/app/vendor-platform.ios.ts b/demo/app/vendor-platform.ios.ts new file mode 100644 index 0000000..e69de29 diff --git a/demo/app/vendor.ts b/demo/app/vendor.ts new file mode 100644 index 0000000..5c562b3 --- /dev/null +++ b/demo/app/vendor.ts @@ -0,0 +1,3 @@ +require("./vendor-platform"); + +require("bundle-entry-points"); diff --git a/demo/package.json b/demo/package.json index efd4abe..f17746e 100644 --- a/demo/package.json +++ b/demo/package.json @@ -9,22 +9,38 @@ } }, "dependencies": { - "nativescript-facebook": "file:///../src", + "nativescript-facebook": "../src", "nativescript-theme-core": "^1.0.2", "nativescript-unit-test-runner": "^0.3.4", - "tns-core-modules": "rc" + "tns-core-modules": "^3.0.0 || ^3.0.0-rc.2" }, "devDependencies": { + "awesome-typescript-loader": "~3.1.2", "babel-traverse": "6.12.0", "babel-types": "6.11.1", "babylon": "6.8.4", + "copy-webpack-plugin": "~4.0.1", + "extract-text-webpack-plugin": "~2.1.0", "filewalker": "0.1.2", "jasmine-core": "^2.5.2", "karma": "^1.3.0", "karma-jasmine": "^1.0.2", "karma-nativescript-launcher": "^0.4.0", "lazy": "1.0.11", - "nativescript-dev-typescript": "0.4", - "typescript": "2.2.2" + "nativescript-css-loader": "~0.26.0", + "nativescript-dev-typescript": "^0.4.0", + "nativescript-dev-webpack": "^0.4.0", + "raw-loader": "~0.5.1", + "resolve-url-loader": "~2.0.2", + "typescript": "~2.2.2", + "webpack": "~2.3.3", + "webpack-sources": "~0.2.3" + }, + "scripts": { + "ns-bundle": "ns-bundle", + "start-android-bundle": "npm run ns-bundle --android --start-app", + "start-ios-bundle": "npm run ns-bundle --ios --start-app", + "build-android-bundle": "npm run ns-bundle --android --build-app", + "build-ios-bundle": "npm run ns-bundle --ios --build-app" } } diff --git a/demo/webpack.android.js b/demo/webpack.android.js new file mode 100644 index 0000000..968e93b --- /dev/null +++ b/demo/webpack.android.js @@ -0,0 +1,2 @@ +var makeConfig = require("./webpack.common"); +module.exports = makeConfig("android"); diff --git a/demo/webpack.common.js b/demo/webpack.common.js new file mode 100644 index 0000000..8427c54 --- /dev/null +++ b/demo/webpack.common.js @@ -0,0 +1,138 @@ +var webpack = require("webpack"); +var nsWebpack = require("nativescript-dev-webpack"); +var nativescriptTarget = require("nativescript-dev-webpack/nativescript-target"); +var path = require("path"); +var CopyWebpackPlugin = require("copy-webpack-plugin"); +var ExtractTextPlugin = require("extract-text-webpack-plugin"); + +module.exports = function (platform, destinationApp) { + if (!destinationApp) { + // Default destination inside platforms//... + destinationApp = nsWebpack.getAppPath(platform); + } + var entry = {}; + // Discover entry module from package.json + entry.bundle = "./" + nsWebpack.getEntryModule(); + // Vendor entry with third party libraries. + entry.vendor = "./vendor"; + // app.css bundle + entry["app.css"] = "./app.css"; + + var plugins = [ + new ExtractTextPlugin("app.css"), + // Vendor libs go to the vendor.js chunk + new webpack.optimize.CommonsChunkPlugin({ + name: ["vendor"] + }), + // Define useful constants like TNS_WEBPACK + new webpack.DefinePlugin({ + "global.TNS_WEBPACK": "true", + }), + // Copy assets to out dir. Add your own globs as needed. + new CopyWebpackPlugin([ + { from: "app.css" }, + { from: "css/**" }, + { from: "fonts/**" }, + { from: "**/*.jpg" }, + { from: "**/*.png" }, + { from: "**/*.xml" }, + ], { ignore: ["App_Resources/**"] }), + // Generate a bundle starter script and activate it in package.json + new nsWebpack.GenerateBundleStarterPlugin([ + "./vendor", + "./bundle", + ]), + ]; + + if (process.env.npm_config_uglify) { + plugins.push(new webpack.LoaderOptionsPlugin({ + minimize: true + })); + + // Work around an Android issue by setting compress = false + var compress = platform !== "android"; + plugins.push(new webpack.optimize.UglifyJsPlugin({ + mangle: { + except: nsWebpack.uglifyMangleExcludes, + }, + compress: compress, + })); + } + + return { + context: path.resolve("./app"), + target: nativescriptTarget, + entry: entry, + output: { + pathinfo: true, + path: path.resolve(destinationApp), + libraryTarget: "commonjs2", + filename: "[name].js", + }, + resolve: { + // Resolve platform-specific modules like module.android.js + extensions: [ + ".ts", + ".js", + ".css", + "." + platform + ".ts", + "." + platform + ".js", + "." + platform + ".css", + ], + // Resolve {N} system modules from tns-core-modules + modules: [ + "node_modules/tns-core-modules", + "node_modules", + ] + }, + node: { + // Disable node shims that conflict with NativeScript + "http": false, + "timers": false, + "setImmediate": false, + "fs": "empty", + }, + module: { + loaders: [ + { + test: /\.html$/, + loader: "raw-loader" + }, + // Root app.css file gets extracted with bundled dependencies + { + test: /app\.css$/, + loader: ExtractTextPlugin.extract([ + "resolve-url-loader", + "nativescript-css-loader", + "nativescript-dev-webpack/platform-css-loader", + ]), + }, + // Other CSS files get bundled using the raw loader + { + test: /\.css$/, + exclude: /app\.css$/, + loaders: [ + "raw-loader", + ] + }, + // Compile TypeScript files, replace templateUrl and styleUrls. + { + test: /\.ts$/, + loaders: [ + "awesome-typescript-loader", + ] + }, + // SASS support + { + test: /\.scss$/, + loaders: [ + "raw-loader", + "resolve-url-loader", + "sass-loader", + ] + }, + ] + }, + plugins: plugins, + }; +}; diff --git a/demo/webpack.ios.js b/demo/webpack.ios.js new file mode 100644 index 0000000..806f3ef --- /dev/null +++ b/demo/webpack.ios.js @@ -0,0 +1,2 @@ +var makeConfig = require("./webpack.common"); +module.exports = makeConfig("ios"); diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 0000000..1f1f02c --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,2 @@ +node_modules +**/*.js diff --git a/src/.npmignore b/src/.npmignore new file mode 100644 index 0000000..fbfd1e9 --- /dev/null +++ b/src/.npmignore @@ -0,0 +1,10 @@ +*.ts +*.tgz + +*.ts +!*.d.ts + +*.js.map + +tsconfig.json +.npmignore diff --git a/src/angular/index.metadata.json b/src/angular/index.metadata.json new file mode 100644 index 0000000..ad233f0 --- /dev/null +++ b/src/angular/index.metadata.json @@ -0,0 +1 @@ +[{"__symbolic":"module","version":3,"metadata":{},"exports":[{"from":"./nativescript-facebook-module"}]},{"__symbolic":"module","version":1,"metadata":{},"exports":[{"from":"./nativescript-facebook-module"}]}] \ No newline at end of file diff --git a/src/angular/nativescript-facebook-directives.metadata.json b/src/angular/nativescript-facebook-directives.metadata.json new file mode 100644 index 0000000..eb2e731 --- /dev/null +++ b/src/angular/nativescript-facebook-directives.metadata.json @@ -0,0 +1 @@ +[{"__symbolic":"module","version":3,"metadata":{"FacebookLoginButtonDirective":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive"},"arguments":[{"selector":"FacebookLoginButton"}]}]},"DIRECTIVES":[{"__symbolic":"reference","name":"FacebookLoginButtonDirective"}]}},{"__symbolic":"module","version":1,"metadata":{"FacebookLoginButtonDirective":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive"},"arguments":[{"selector":"FacebookLoginButton"}]}]},"DIRECTIVES":[{"__symbolic":"reference","name":"FacebookLoginButtonDirective"}]}}] \ No newline at end of file diff --git a/src/angular/nativescript-facebook-directives.ts b/src/angular/nativescript-facebook-directives.ts index 114ab9e..52a4667 100644 --- a/src/angular/nativescript-facebook-directives.ts +++ b/src/angular/nativescript-facebook-directives.ts @@ -1,10 +1,8 @@ -import { Directive } from '@angular/core'; // TODO: check require .Directive without hacks +import { Directive } from "@angular/core"; // TODO: check require .Directive without hacks @Directive({ selector: "FacebookLoginButton" }) -export class FacebookLoginButtonDirective { - constructor() { } -} +export class FacebookLoginButtonDirective { } -export const DIRECTIVES = [FacebookLoginButtonDirective]; \ No newline at end of file +export const DIRECTIVES = [FacebookLoginButtonDirective]; diff --git a/src/angular/nativescript-facebook-module.d.ts b/src/angular/nativescript-facebook-module.d.ts index b2baf6b..633c5dd 100644 --- a/src/angular/nativescript-facebook-module.d.ts +++ b/src/angular/nativescript-facebook-module.d.ts @@ -1,2 +1,2 @@ -export declare class NativescriptFacebookModule { +export declare class NativeScriptFacebookModule { } diff --git a/src/angular/nativescript-facebook-module.metadata.json b/src/angular/nativescript-facebook-module.metadata.json new file mode 100644 index 0000000..09d9f00 --- /dev/null +++ b/src/angular/nativescript-facebook-module.metadata.json @@ -0,0 +1 @@ +[{"__symbolic":"module","version":3,"metadata":{"NativeScriptFacebookModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule"},"arguments":[{"declarations":[{"__symbolic":"reference","module":"./nativescript-facebook-directives","name":"DIRECTIVES"}],"exports":[{"__symbolic":"reference","module":"./nativescript-facebook-directives","name":"DIRECTIVES"}]}]}]}}},{"__symbolic":"module","version":1,"metadata":{"NativeScriptFacebookModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule"},"arguments":[{"declarations":[{"__symbolic":"reference","module":"./nativescript-facebook-directives","name":"DIRECTIVES"}],"exports":[{"__symbolic":"reference","module":"./nativescript-facebook-directives","name":"DIRECTIVES"}]}]}]}}}] \ No newline at end of file diff --git a/src/angular/nativescript-facebook-module.ts b/src/angular/nativescript-facebook-module.ts index b6c8f58..f780d7a 100644 --- a/src/angular/nativescript-facebook-module.ts +++ b/src/angular/nativescript-facebook-module.ts @@ -7,6 +7,6 @@ import { DIRECTIVES } from "./nativescript-facebook-directives"; declarations: [DIRECTIVES], exports: [DIRECTIVES], }) -export class NativescriptFacebookModule { } +export class NativeScriptFacebookModule { } -registerElement("FacebookLoginButton", () => require("../").LoginButton); \ No newline at end of file +registerElement("FacebookLoginButton", () => require("../").LoginButton); diff --git a/src/index.android.metadata.json b/src/index.android.metadata.json new file mode 100644 index 0000000..6f9ff5a --- /dev/null +++ b/src/index.android.metadata.json @@ -0,0 +1 @@ +[{"__symbolic":"module","version":3,"metadata":{},"exports":[{"from":"./login-manager"},{"from":"./login-button"}]},{"__symbolic":"module","version":1,"metadata":{},"exports":[{"from":"./login-manager"},{"from":"./login-button"}]}] \ No newline at end of file diff --git a/src/index.ios.metadata.json b/src/index.ios.metadata.json new file mode 100644 index 0000000..6d119d6 --- /dev/null +++ b/src/index.ios.metadata.json @@ -0,0 +1 @@ +[{"__symbolic":"module","version":3,"metadata":{},"exports":[{"from":"./login-button"},{"from":"./login-manager"}]},{"__symbolic":"module","version":1,"metadata":{},"exports":[{"from":"./login-button"},{"from":"./login-manager"}]}] \ No newline at end of file diff --git a/src/login-button.android.metadata.json b/src/login-button.android.metadata.json new file mode 100644 index 0000000..16ddc8f --- /dev/null +++ b/src/login-button.android.metadata.json @@ -0,0 +1 @@ +[{"__symbolic":"module","version":3,"metadata":{"LoginButton":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"./login-button.common","name":"LoginButtonBase"},"members":{"createNativeView":[{"__symbolic":"method"}]}}}},{"__symbolic":"module","version":1,"metadata":{"LoginButton":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"./login-button.common","name":"LoginButtonBase"},"members":{"createNativeView":[{"__symbolic":"method"}]}}}}] \ No newline at end of file diff --git a/src/login-button.android.ts b/src/login-button.android.ts index f5f6ed2..8932988 100644 --- a/src/login-button.android.ts +++ b/src/login-button.android.ts @@ -1,6 +1,6 @@ //NativeScript modules import * as applicationModule from "application"; -import { LoginButton as LoginButtonBase } from './login-button.common'; +import { LoginButtonBase } from './login-button.common'; declare let com: any; @@ -8,4 +8,4 @@ export class LoginButton extends LoginButtonBase { public createNativeView() { return new com.facebook.login.widget.LoginButton(this._context); } -} \ No newline at end of file +} diff --git a/src/login-button.common.metadata.json b/src/login-button.common.metadata.json new file mode 100644 index 0000000..ed28586 --- /dev/null +++ b/src/login-button.common.metadata.json @@ -0,0 +1 @@ +[{"__symbolic":"module","version":3,"metadata":{"LoginButtonBase":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"ui/core/view","name":"View"},"members":{"onLoginPropertyChanged":[{"__symbolic":"method"}]}},"onLoginProperty":{"__symbolic":"error","message":"Function call not supported","line":10,"character":31}}},{"__symbolic":"module","version":1,"metadata":{"LoginButtonBase":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"ui/core/view","name":"View"},"members":{"onLoginPropertyChanged":[{"__symbolic":"method"}]}},"onLoginProperty":{"__symbolic":"error","message":"Function call not supported","line":10,"character":31}}}] \ No newline at end of file diff --git a/src/login-button.common.ts b/src/login-button.common.ts index 81cf836..6f31f12 100644 --- a/src/login-button.common.ts +++ b/src/login-button.common.ts @@ -1,15 +1,15 @@ import { View, Property } from "ui/core/view" import * as loginManager from './login-manager'; -export abstract class LoginButton extends View { +export abstract class LoginButtonBase extends View { onLoginPropertyChanged(callback: any) { loginManager._registerLoginCallback(callback); } } -export const onLoginProperty = new Property({ - name: "onLogin", defaultValue: undefined, valueChanged: (btn, oldV, newV) => { +export const onLoginProperty = new Property({ + name: "login", valueChanged: (btn, oldV, newV) => { btn.onLoginPropertyChanged(newV); } }); -onLoginProperty.register(LoginButton); \ No newline at end of file +onLoginProperty.register(LoginButtonBase); diff --git a/src/login-button.ios.metadata.json b/src/login-button.ios.metadata.json new file mode 100644 index 0000000..7ca141a --- /dev/null +++ b/src/login-button.ios.metadata.json @@ -0,0 +1 @@ +[{"__symbolic":"module","version":3,"metadata":{"LoginButton":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"./login-button.common","name":"LoginButtonBase"},"members":{"__ctor__":[{"__symbolic":"constructor"}],"onLoaded":[{"__symbolic":"method"}],"onUnloaded":[{"__symbolic":"method"}]}}}},{"__symbolic":"module","version":1,"metadata":{"LoginButton":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"./login-button.common","name":"LoginButtonBase"},"members":{"__ctor__":[{"__symbolic":"constructor"}],"onLoaded":[{"__symbolic":"method"}],"onUnloaded":[{"__symbolic":"method"}]}}}}] \ No newline at end of file diff --git a/src/login-button.ios.ts b/src/login-button.ios.ts index 1e25737..4076269 100644 --- a/src/login-button.ios.ts +++ b/src/login-button.ios.ts @@ -1,5 +1,5 @@ import * as applicationModule from "application"; -import { LoginButton as LoginButtonBase } from './login-button.common'; +import { LoginButtonBase } from './login-button.common'; import * as loginManager from './login-manager'; declare let FBSDKLoginButton: any; @@ -43,4 +43,4 @@ class LoginButtonDelegate extends NSObject implements FBSDKLoginButtonDelegate { loginButtonWillLogin(loginButton: any) { return true; } -} \ No newline at end of file +} diff --git a/src/login-manager.android.metadata.json b/src/login-manager.android.metadata.json new file mode 100644 index 0000000..94aa44b --- /dev/null +++ b/src/login-manager.android.metadata.json @@ -0,0 +1 @@ +[{"__symbolic":"module","version":3,"metadata":{"init":{"__symbolic":"function"},"_registerLoginCallback":{"__symbolic":"function"},"requestPublishPermissions":{"__symbolic":"function"},"requestReadPermissions":{"__symbolic":"function"},"login":{"__symbolic":"function"}}},{"__symbolic":"module","version":1,"metadata":{"init":{"__symbolic":"function"},"_registerLoginCallback":{"__symbolic":"function"},"requestPublishPermissions":{"__symbolic":"function"},"requestReadPermissions":{"__symbolic":"function"},"login":{"__symbolic":"function"}}}] \ No newline at end of file diff --git a/src/login-manager.android.ts b/src/login-manager.android.ts index 10148f7..67b7269 100644 --- a/src/login-manager.android.ts +++ b/src/login-manager.android.ts @@ -89,6 +89,7 @@ export function requestReadPermissions(permissions: string[], callback: Function } export function login(callback: Function) { + console.log("requesting read permissions .... .") requestReadPermissions(LOGIN_PERMISSIONS, callback); } diff --git a/src/login-manager.d.ts b/src/login-manager.d.ts index f8dc9be..9983021 100644 --- a/src/login-manager.d.ts +++ b/src/login-manager.d.ts @@ -1,24 +1,24 @@ export declare function _registerLoginCallback(callback: Function): void; export declare let _onLoginCallback: Function; -/** +/** * Sets the Facebook application Id for the current app and init the native facebook sdk. * @param {string} fbAppId the application Id */ export declare function init(fbId: string): void; -/** +/** * Request the specified publish permissions. * @param {string[]} permissions Array of the requested publish permissions. * @param {Function} callback Function reference to be executed when the requested permissions are granted or denied. */ export declare function requestPublishPermissions(permissions: string[], callback: Function): void; -/** +/** * Request the specified read permissions. * @param {string[]} permissions Array of the requested read permissions. * @param {Function} callback Function reference to be executed when the requested permissions are granted or denied. */ export declare function requestReadPermissions(permissions: string[], callback: Function): void; -/** +/** * Trigger a login procedure by requesting the "public_profile" and "email" read permissions. * @param {Function} callback Function reference to be executed when the requested permissions are granted or denied. */ diff --git a/src/login-manager.ios.metadata.json b/src/login-manager.ios.metadata.json new file mode 100644 index 0000000..c17bbf0 --- /dev/null +++ b/src/login-manager.ios.metadata.json @@ -0,0 +1 @@ +[{"__symbolic":"module","version":3,"metadata":{"onLoginCallback":{"__symbolic":"error","message":"Variable not initialized","line":15,"character":11},"init":{"__symbolic":"function"},"_registerLoginCallback":{"__symbolic":"function"},"requestPublishPermissions":{"__symbolic":"function"},"requestReadPermissions":{"__symbolic":"function"},"login":{"__symbolic":"function"}}},{"__symbolic":"module","version":1,"metadata":{"onLoginCallback":{"__symbolic":"error","message":"Variable not initialized","line":15,"character":11},"init":{"__symbolic":"function"},"_registerLoginCallback":{"__symbolic":"function"},"requestPublishPermissions":{"__symbolic":"function"},"requestReadPermissions":{"__symbolic":"function"},"login":{"__symbolic":"function"}}}] \ No newline at end of file diff --git a/src/login-response.metadata.json b/src/login-response.metadata.json new file mode 100644 index 0000000..980b460 --- /dev/null +++ b/src/login-response.metadata.json @@ -0,0 +1 @@ +[{"__symbolic":"module","version":3,"metadata":{"LoginResponse":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"string"},{"__symbolic":"reference","name":"string"}]}]}}}},{"__symbolic":"module","version":1,"metadata":{"LoginResponse":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"string"},{"__symbolic":"reference","name":"string"}]}]}}}}] \ No newline at end of file diff --git a/src/package.json b/src/package.json index de1cdab..e6d898b 100644 --- a/src/package.json +++ b/src/package.json @@ -9,7 +9,9 @@ } }, "scripts": { - "build": "tsc", + "tsc": "tsc", + "ngc": "node --max-old-space-size=8192 ./node_modules/.bin/ngc", + "build": "tsc && ngc", "demo.ios": "npm run preparedemo && cd ../demo && tns run ios --emulator", "demo.ios.device": "npm run preparedemo && cd ../demo && tns run ios", "demo.android": "npm run preparedemo && cd ../demo && tns debug android --justlaunch", @@ -45,16 +47,19 @@ "license": "MIT", "homepage": "https://github.com/angeltsvetkov/nativescript-facebook", "readmeFilename": "README.md", - "dependencies": { - "nativescript-angular": "rc", - "tns-core-modules": "rc", - "tns-platform-declarations": "rc", - "typescript": "2.2.2", - "@angular/core": "4.0.1", - "@angular/common": "4.0.1", - "@angular/compiler": "4.0.1", - "rxjs": "5.2.0", - "reflect-metadata": "0.1.8", - "zone.js": "0.8.4" + "devDependencies": { + "tns-core-modules": "^3.0.0 || ^3.0.0-rc.2", + "tns-platform-declarations": "^3.0.0 || ^3.0.0-rc.2", + "typescript": "~2.2.2", + "nativescript-angular": "^3.0.0 || ^2.0.0-rc.1", + "@angular/core": "~4.0.1", + "@angular/common": "~4.0.1", + "@angular/compiler": "~4.0.1", + "@angular/compiler-cli": "~4.0.1", + "rxjs": "~5.3.0", + "zone.js": "~0.8.4" + }, + "peerDependencies": { + "tns-core-modules": "^3.0.0 || ^3.0.0-rc.2" } -} \ No newline at end of file +} diff --git a/src/tsconfig.json b/src/tsconfig.json index e7b4ab6..02b09bb 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -17,9 +17,15 @@ "pretty": true }, "exclude": [ - "demo", - "demo-angular", - "node_modules" + "node_modules", + "platforms", + "hooks" ], - "compileOnSave": false -} \ No newline at end of file + "compileOnSave": false, + "angularCompilerOptions": { + "annotateForClosureCompiler": true, + "strictMetadataEmit": true, + "skipTemplateCodegen": true, + "genDir": "." + } +}