Compare commits
22 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4dc72591ee | ||
|
|
1de7e2d5f5 | ||
|
|
3e6b70dba7 | ||
|
|
42ee53b9e9 | ||
|
|
8177ea902e | ||
|
|
cbdd6cd3d1 | ||
|
|
ba52ad27a7 | ||
|
|
92a9cc577b | ||
|
|
3d78e43388 | ||
|
|
fff731c9e3 | ||
|
|
7afc399a3a | ||
|
|
03dc4f65bb | ||
|
|
87ffe30dd3 | ||
|
|
fdae1613eb | ||
|
|
b56e720048 | ||
|
|
8ae80d457c | ||
|
|
247413e97d | ||
|
|
9c482f9782 | ||
|
|
2495048e3b | ||
|
|
1384a7d8c1 | ||
|
|
6152a9fcd2 | ||
|
|
538f749c1b |
2
.npmrc
2
.npmrc
@@ -1,2 +1,4 @@
|
||||
git-tag-version = false
|
||||
tag-version-prefix =
|
||||
save-exact = true
|
||||
progress = false
|
||||
|
||||
41
README.md
41
README.md
@@ -1,27 +1,47 @@
|
||||
# Cordova base64ToGallery Plugin
|
||||
This plugin (based on [devgeeks/Canvas2ImagePlugin](http://github.com/devgeeks/Canvas2ImagePlugin)) allows you to save base64 data as a png image into the device (iOS Photo Library, Android Gallery or WindowsPhone 8 Photo Album).
|
||||
|
||||
The plugin is a kind of fork of the [solderzzc/Base64ImageSaverPlugin](https://github.com/solderzzc/Base64ImageSaverPlugin) but with a cleaner history (a.k.a: no tags from Canvas2ImagePlugin repo).
|
||||
The plugin is a kind of fork of the [solderzzc/Base64ImageSaverPlugin](https://github.com/solderzzc/Base64ImageSaverPlugin) but with a cleaner history (a.k.a: no tags from Canvas2ImagePlugin repo) and a newer iOS implementation.
|
||||
|
||||
## Alert
|
||||
In order to be more consistent with the cordova naming convention, since version 2.0 the repository name and the cordova plugin id have changed to **cordova-base64-to-gallery** (issue #1).
|
||||
## Alerts
|
||||
|
||||
### Plugin id - [issue #1](https://github.com/Nexxa/cordova-base64-to-gallery/issues/1)
|
||||
In order to be more consistent with the cordova naming convention, since version 2.0 the repository name and the cordova plugin id have changed to **cordova-base64-to-gallery**.
|
||||
|
||||
Please uninstall the old version and reinstall the new one.
|
||||
|
||||
### cordova-ios > 3.8.0 - [issue #3](https://github.com/Nexxa/cordova-base64-to-gallery/issues/3)
|
||||
According to the [documentation](https://github.com/apache/cordova-ios/blob/master/guides/API%20changes%20in%204.0.md#nsdatabase64h-removed), `NSData+Base64.h` class was removed starting from version 4.0.0 of the **cordova-ios platform** (and it was already deprecated from version 3.8.0).
|
||||
|
||||
So, cordova-base64-to-gallery plugin **from version 3.0.0** has changed the iOS implementation in order to support the changes in cordova-ios platform.
|
||||
|
||||
If you need to support cordova-ios < 3.8.0 please refer to [cordova-base64-to-gallery@2.0.2](https://github.com/Nexxa/cordova-base64-to-gallery/tree/2.0.2). There is also an "**old**" branch that might have some updates in the future (Android/WP8 fixes or something like that).
|
||||
|
||||
## Usage
|
||||
Call the `cordova.base64ToGallery()` method using success and error callbacks and the id attribute or the element object of the canvas to save:
|
||||
Call the `cordova.base64ToGallery()` method using success and error callbacks and the passing the image's base64 string (`options` is optional):
|
||||
|
||||
### Methods
|
||||
#### `cordova.base64ToGallery(data, [prefix, success, fail])`
|
||||
#### `cordova.base64ToGallery(data, [options, success, fail])`
|
||||
|
||||
Param | Type | Default | Description
|
||||
----------- | ---------- | ----------------- | ------------------
|
||||
**data** | *string* | | base64 string
|
||||
**prefix** | *string* | **img_** | file's name prefix
|
||||
**options** | *object* | \*see below | options
|
||||
**success** | *function* | **console.log** | success callback
|
||||
**fail** | *function* | **console.error** | fail callback
|
||||
|
||||
#### Available options *
|
||||
|
||||
##### `prefix`
|
||||
Saved file name prefix. Only works in Android and WP8.
|
||||
|
||||
**Default**: "img_"
|
||||
|
||||
##### `mediaScanner`
|
||||
Android Media Scanner after file creation enabled or not. Only works in Android.
|
||||
|
||||
**Default**: true
|
||||
|
||||
### Example
|
||||
|
||||
```javascript
|
||||
@@ -29,13 +49,16 @@ function onDeviceReady() {
|
||||
cordova.base64ToGallery(
|
||||
base64Data,
|
||||
|
||||
'img_',
|
||||
{
|
||||
prefix: 'img_',
|
||||
mediaScanner: true
|
||||
},
|
||||
|
||||
function(msg){
|
||||
function(msg) {
|
||||
console.log(msg);
|
||||
},
|
||||
|
||||
function(err){
|
||||
function(err) {
|
||||
console.error(err);
|
||||
}
|
||||
);
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"name": "cordova-base64-to-gallery",
|
||||
"version": "2.0.2",
|
||||
"version": "4.0.0",
|
||||
"description": "Cordova plugin to save base64 data as a png image into the device",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"update": "node ./scripts/update_version",
|
||||
"bump": "node ./scripts/bump_version",
|
||||
"lint": "eslint www/base64ToGallery.js",
|
||||
"test": "npm run lint",
|
||||
"prepublish": "npm test"
|
||||
@@ -21,7 +21,7 @@
|
||||
"cordova": ">=3.0.0"
|
||||
},
|
||||
{
|
||||
"node": ">=0.10"
|
||||
"node": ">=0.12"
|
||||
}
|
||||
],
|
||||
"cordova": {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<plugin xmlns:android="http://schemas.android.com/apk/res/android" xmlns="http://www.phonegap.com/ns/plugins/1.0" id="cordova-base64-to-gallery" version="2.0.2">
|
||||
<plugin xmlns:android="http://schemas.android.com/apk/res/android" xmlns="http://www.phonegap.com/ns/plugins/1.0" id="cordova-base64-to-gallery" version="4.0.0">
|
||||
|
||||
<engines>
|
||||
<engine name="cordova-ios" version="<3.8.0" />
|
||||
<engine name="cordova-ios" version=">=3.8.0" />
|
||||
</engines>
|
||||
|
||||
<name>base64ToGallery</name>
|
||||
@@ -15,6 +15,9 @@
|
||||
|
||||
<license>MIT</license>
|
||||
|
||||
<js-module name="object.assign-polyfill" src="www/object.assign-polyfill.js">
|
||||
</js-module>
|
||||
|
||||
<js-module name="base64ToGallery" src="www/base64ToGallery.js">
|
||||
<clobbers target="cordova.base64ToGallery"/>
|
||||
</js-module>
|
||||
|
||||
@@ -30,119 +30,109 @@ import android.util.Log;
|
||||
*/
|
||||
public class Base64ToGallery extends CordovaPlugin {
|
||||
|
||||
// Consts
|
||||
public static final String ACTION = "saveImageDataToLibrary";
|
||||
public static final String DEFAULT_FILE_PREFIX = "img_";
|
||||
public static final String EMPTY_STR = "";
|
||||
// Consts
|
||||
public static final String EMPTY_STR = "";
|
||||
|
||||
@Override
|
||||
public boolean execute(String action, JSONArray args,
|
||||
CallbackContext callbackContext) throws JSONException {
|
||||
@Override
|
||||
public boolean execute(String action, JSONArray args,
|
||||
CallbackContext callbackContext) throws JSONException {
|
||||
|
||||
if (action.equals(ACTION)) {
|
||||
String base64 = args.optString(0);
|
||||
String filePrefix = args.optString(1);
|
||||
boolean mediaScannerEnabled = args.optBoolean(2);
|
||||
|
||||
String base64 = args.optString(0);
|
||||
String filePrefix = args.optString(1);
|
||||
// isEmpty() requires API level 9
|
||||
if (base64.equals(EMPTY_STR)) {
|
||||
callbackContext.error("Missing base64 string");
|
||||
}
|
||||
|
||||
// isEmpty() requires API level 9
|
||||
if (base64.equals(EMPTY_STR)) {
|
||||
callbackContext.error("Missing base64 string");
|
||||
}
|
||||
// Create the bitmap from the base64 string
|
||||
byte[] decodedString = Base64.decode(base64, Base64.DEFAULT);
|
||||
Bitmap bmp = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
|
||||
|
||||
if (filePrefix.equals(EMPTY_STR)) {
|
||||
filePrefix = DEFAULT_FILE_PREFIX;
|
||||
}
|
||||
if (bmp == null) {
|
||||
callbackContext.error("The image could not be decoded");
|
||||
|
||||
// Create the bitmap from the base64 string
|
||||
byte[] decodedString = Base64.decode(base64, Base64.DEFAULT);
|
||||
Bitmap bmp = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
|
||||
} else {
|
||||
|
||||
if (bmp == null) {
|
||||
callbackContext.error("The image could not be decoded");
|
||||
// Save the image
|
||||
File imageFile = savePhoto(bmp, filePrefix);
|
||||
|
||||
} else {
|
||||
if (imageFile == null) {
|
||||
callbackContext.error("Error while saving image");
|
||||
}
|
||||
|
||||
// Save the image
|
||||
File imageFile = savePhoto(bmp, filePrefix);
|
||||
// Update image gallery
|
||||
if (mediaScannerEnabled) {
|
||||
scanPhoto(imageFile);
|
||||
}
|
||||
|
||||
if (imageFile == null) {
|
||||
callbackContext.error("Error while saving image");
|
||||
}
|
||||
callbackContext.success(imageFile.toString());
|
||||
}
|
||||
|
||||
// Update image gallery
|
||||
scanPhoto(imageFile);
|
||||
return true;
|
||||
}
|
||||
|
||||
callbackContext.success(imageFile.toString());
|
||||
}
|
||||
private File savePhoto(Bitmap bmp, String prefix) {
|
||||
File retVal = null;
|
||||
|
||||
return true;
|
||||
try {
|
||||
String deviceVersion = Build.VERSION.RELEASE;
|
||||
Calendar c = Calendar.getInstance();
|
||||
String date = EMPTY_STR
|
||||
+ c.get(Calendar.YEAR)
|
||||
+ c.get(Calendar.MONTH)
|
||||
+ c.get(Calendar.DAY_OF_MONTH)
|
||||
+ c.get(Calendar.HOUR_OF_DAY)
|
||||
+ c.get(Calendar.MINUTE)
|
||||
+ c.get(Calendar.SECOND);
|
||||
|
||||
} else {
|
||||
int check = deviceVersion.compareTo("2.3.3");
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
File folder;
|
||||
|
||||
private File savePhoto(Bitmap bmp, String prefix) {
|
||||
File retVal = null;
|
||||
/*
|
||||
* File path = Environment.getExternalStoragePublicDirectory(
|
||||
* Environment.DIRECTORY_PICTURES ); //this throws error in Android
|
||||
* 2.2
|
||||
*/
|
||||
if (check >= 1) {
|
||||
folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
|
||||
|
||||
try {
|
||||
String deviceVersion = Build.VERSION.RELEASE;
|
||||
Calendar c = Calendar.getInstance();
|
||||
String date = EMPTY_STR
|
||||
+ c.get(Calendar.YEAR)
|
||||
+ c.get(Calendar.MONTH)
|
||||
+ c.get(Calendar.DAY_OF_MONTH)
|
||||
+ c.get(Calendar.HOUR_OF_DAY)
|
||||
+ c.get(Calendar.MINUTE)
|
||||
+ c.get(Calendar.SECOND);
|
||||
if (!folder.exists()) {
|
||||
folder.mkdirs();
|
||||
}
|
||||
|
||||
int check = deviceVersion.compareTo("2.3.3");
|
||||
} else {
|
||||
folder = Environment.getExternalStorageDirectory();
|
||||
}
|
||||
|
||||
File folder;
|
||||
File imageFile = new File(folder, prefix + date + ".png");
|
||||
|
||||
/*
|
||||
* File path = Environment.getExternalStoragePublicDirectory(
|
||||
* Environment.DIRECTORY_PICTURES ); //this throws error in Android
|
||||
* 2.2
|
||||
*/
|
||||
if (check >= 1) {
|
||||
folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
|
||||
FileOutputStream out = new FileOutputStream(imageFile);
|
||||
bmp.compress(Bitmap.CompressFormat.PNG, 100, out);
|
||||
out.flush();
|
||||
out.close();
|
||||
|
||||
if (!folder.exists()) {
|
||||
folder.mkdirs();
|
||||
}
|
||||
retVal = imageFile;
|
||||
|
||||
} else {
|
||||
folder = Environment.getExternalStorageDirectory();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.e("Base64ToGallery", "An exception occured while saving image: " + e.toString());
|
||||
}
|
||||
|
||||
File imageFile = new File(folder, prefix + date + ".png");
|
||||
return retVal;
|
||||
}
|
||||
|
||||
FileOutputStream out = new FileOutputStream(imageFile);
|
||||
bmp.compress(Bitmap.CompressFormat.PNG, 100, out);
|
||||
out.flush();
|
||||
out.close();
|
||||
|
||||
retVal = imageFile;
|
||||
|
||||
} catch (Exception e) {
|
||||
Log.e("Base64ToGallery", "An exception occured while saving image: " + e.toString());
|
||||
}
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke the system's media scanner to add your photo to the Media Provider's database,
|
||||
* making it available in the Android Gallery application and to other apps.
|
||||
*/
|
||||
private void scanPhoto(File imageFile) {
|
||||
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
|
||||
/**
|
||||
* Invoke the system's media scanner to add your photo to the Media Provider's database,
|
||||
* making it available in the Android Gallery application and to other apps.
|
||||
*/
|
||||
private void scanPhoto(File imageFile) {
|
||||
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
|
||||
Uri contentUri = Uri.fromFile(imageFile);
|
||||
|
||||
mediaScanIntent.setData(contentUri);
|
||||
|
||||
cordova.getActivity().sendBroadcast(mediaScanIntent);
|
||||
}
|
||||
cordova.getActivity().sendBroadcast(mediaScanIntent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,20 +2,20 @@
|
||||
// Base64ToGallery.h
|
||||
// Base64ToGallery PhoneGap/Cordova plugin
|
||||
//
|
||||
// Created by Tommy-Carlos Williams on 29/03/12.
|
||||
// Copyright (c) 2012 Tommy-Carlos Williams. All rights reserved.
|
||||
// Copyright (c) 2016 StefanoMagrassi <stefano.magrassi@gmail.com>
|
||||
//
|
||||
// Based on Tommy-Carlos Williams "Canvas2ImagePlugin.h"
|
||||
//
|
||||
// MIT Licensed
|
||||
//
|
||||
|
||||
#import <Cordova/CDVPlugin.h>
|
||||
#import <Cordova/CDV.h>
|
||||
|
||||
@interface Base64ToGallery : CDVPlugin
|
||||
{
|
||||
NSString* callbackId;
|
||||
}
|
||||
|
||||
@property (nonatomic, copy) NSString* callbackId;
|
||||
@property (nonatomic, copy) NSString* callbackId;
|
||||
@property (nonatomic, assign) CDVPluginResult* result;
|
||||
|
||||
- (void)saveImageDataToLibrary:(CDVInvokedUrlCommand*)command;
|
||||
- (void)saveImageDataToLibrary:(CDVInvokedUrlCommand*)command;
|
||||
|
||||
@end
|
||||
|
||||
@@ -2,8 +2,10 @@
|
||||
// Base64ToGallery.m
|
||||
// Base64ToGallery PhoneGap/Cordova plugin
|
||||
//
|
||||
// Created by Tommy-Carlos Williams on 29/03/12.
|
||||
// Copyright (c) 2012 Tommy-Carlos Williams. All rights reserved.
|
||||
// Copyright (c) 2016 StefanoMagrassi <stefano.magrassi@gmail.com>
|
||||
//
|
||||
// Based on Tommy-Carlos Williams "Canvas2ImagePlugin.m"
|
||||
//
|
||||
// MIT Licensed
|
||||
//
|
||||
|
||||
@@ -11,49 +13,46 @@
|
||||
#import <Cordova/CDV.h>
|
||||
|
||||
@implementation Base64ToGallery
|
||||
@synthesize callbackId;
|
||||
|
||||
//-(CDVPlugin*) initWithWebView:(UIWebView*)theWebView
|
||||
//{
|
||||
// self = (Base64ToGallery*)[super initWithWebView:theWebView];
|
||||
// return self;
|
||||
//}
|
||||
- (void)saveImageDataToLibrary:(CDVInvokedUrlCommand*)command
|
||||
{
|
||||
[self.commandDelegate runInBackground:^{
|
||||
self.callbackId = command.callbackId;
|
||||
self.result = nil;
|
||||
|
||||
- (void)saveImageDataToLibrary:(CDVInvokedUrlCommand*)command
|
||||
{
|
||||
self.callbackId = command.callbackId;
|
||||
NSData* imageData = [NSData dataFromBase64String:[command.arguments objectAtIndex:0]];
|
||||
NSString* base64String = [command.arguments objectAtIndex:0];
|
||||
|
||||
UIImage* image = [[[UIImage alloc] initWithData:imageData] autorelease];
|
||||
if (base64String != nil && [base64String length] > 0) {
|
||||
|
||||
UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
|
||||
}
|
||||
NSData* imageData = [[[NSData alloc] initWithBase64EncodedString:base64String options:0] autorelease];
|
||||
UIImage* image = [[[UIImage alloc] initWithData:imageData] autorelease];
|
||||
|
||||
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
|
||||
{
|
||||
CDVPluginResult* result = nil;
|
||||
UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
|
||||
|
||||
// Was there an error?
|
||||
if (error != NULL) {
|
||||
NSLog(@"ERROR: %@", error);
|
||||
} else {
|
||||
self.result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
|
||||
|
||||
result = [CDVPluginResult resultWithStatus: CDVCommandStatus_ERROR messageAsString:error.description];
|
||||
[self.commandDelegate sendPluginResult:self.result callbackId:self.callbackId];
|
||||
}
|
||||
|
||||
[self.webView stringByEvaluatingJavaScriptFromString:[result toErrorCallbackString: self.callbackId]];
|
||||
|
||||
// No errors
|
||||
} else {
|
||||
|
||||
result = [CDVPluginResult resultWithStatus: CDVCommandStatus_OK];
|
||||
|
||||
[self.webView stringByEvaluatingJavaScriptFromString:[result toSuccessCallbackString: self.callbackId]];
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[callbackId release];
|
||||
[super dealloc];
|
||||
}
|
||||
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
|
||||
{
|
||||
// With errors
|
||||
if (error != NULL) {
|
||||
NSLog(@"ERROR: %@", error);
|
||||
|
||||
self.result = [CDVPluginResult resultWithStatus: CDVCommandStatus_ERROR messageAsString:error.description];
|
||||
|
||||
// No errors
|
||||
} else {
|
||||
|
||||
self.result = [CDVPluginResult resultWithStatus: CDVCommandStatus_OK];
|
||||
}
|
||||
|
||||
[self.commandDelegate sendPluginResult:self.result callbackId:self.callbackId];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -22,11 +22,6 @@ public class Base64ToGallery : BaseCommand
|
||||
string prefix = options[1];
|
||||
byte[] imageBytes = Convert.FromBase64String(imageData);
|
||||
|
||||
if (String.IsNullOrEmpty(prefix))
|
||||
{
|
||||
prefix = "img_";
|
||||
}
|
||||
|
||||
using (var imageStream = new MemoryStream(imageBytes))
|
||||
{
|
||||
imageStream.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
@@ -7,48 +7,52 @@
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
/*globals cordova*/
|
||||
var exec = require('cordova/exec');
|
||||
var assign = require('./object.assign-polyfill');
|
||||
|
||||
// Consts
|
||||
// ------
|
||||
var SERVICE = 'Base64ToGallery';
|
||||
var ACTION = 'saveImageDataToLibrary';
|
||||
var SERVICE = 'Base64ToGallery';
|
||||
var ACTION = 'saveImageDataToLibrary';
|
||||
var ARGS = ['data', 'prefix', 'mediaScanner'];
|
||||
var DEFAULTS = { prefix: 'img_', mediaScanner: true };
|
||||
|
||||
/**
|
||||
* @property indexFromArgs - Partially applied "indexFrom" method with ARGS constant.
|
||||
* @private
|
||||
*/
|
||||
var indexFromArgs = indexFrom.bind(null, ARGS);
|
||||
|
||||
// Exports
|
||||
// -------
|
||||
/**
|
||||
* Saves base64 data as image.
|
||||
* @public
|
||||
* @param {string} data
|
||||
* @param {string} [prefix]
|
||||
* @param {function} [success]
|
||||
* @param {function} [fail]
|
||||
* @return {undefined}
|
||||
*/
|
||||
module.exports = function(data, prefix, success, fail) {
|
||||
// Handle method call with 3 or 4 parameters (prefix optional)
|
||||
if (arguments.length < 4) {
|
||||
prefix = '';
|
||||
success = arguments[1];
|
||||
fail = arguments[2];
|
||||
}
|
||||
module.exports = function(data, options, success, fail) {
|
||||
var spec = assign(DEFAULTS, options);
|
||||
var actionArgs = prepareArgs(spec);
|
||||
|
||||
// Prepare base64 string
|
||||
data = data.replace(/data:image\/png;base64,/, '');
|
||||
|
||||
return cordova.exec(ok(success), error(fail), SERVICE, ACTION, [data, prefix]);
|
||||
// And add it to the Service's Action arguments
|
||||
actionArgs.unshift(data);
|
||||
|
||||
return exec(ok(success), error(fail), SERVICE, ACTION, actionArgs);
|
||||
};
|
||||
|
||||
// Private methods
|
||||
// ---------------
|
||||
/**
|
||||
* Gets success callback if it is defined and not null.
|
||||
* Otherwise returns a simple console.log.
|
||||
*
|
||||
* @private
|
||||
* @param {[function|undefined|null]} success
|
||||
* @return {function}
|
||||
*/
|
||||
function ok(success) {
|
||||
if (typeof success === 'undefined' || success === null) {
|
||||
if (typeof success !== 'function') {
|
||||
return console.log;
|
||||
}
|
||||
|
||||
@@ -58,14 +62,53 @@ function ok(success) {
|
||||
/**
|
||||
* Gets fail callback if it is defined and not null.
|
||||
* Otherwise returns a simple console.error.
|
||||
*
|
||||
* @private
|
||||
* @param {[function|undefined|null]} fail
|
||||
* @return {function}
|
||||
*/
|
||||
function error(fail) {
|
||||
if (typeof fail === 'undefined' || fail === null) {
|
||||
if (typeof fail !== 'function') {
|
||||
return console.error;
|
||||
}
|
||||
|
||||
return fail;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets index of item from array.
|
||||
* @private
|
||||
* @param {array} fromArr - Source array
|
||||
* @param {*} item - Item
|
||||
* @return {number} Index of item in array
|
||||
*/
|
||||
function indexFrom(fromArr, item) {
|
||||
return fromArr.indexOf(item);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets value of property with specified key from object.
|
||||
* @private
|
||||
* @param {object} fromObj - Source object
|
||||
* @param {string} key - Property key
|
||||
* @return {*} Property value
|
||||
*/
|
||||
function valueFrom(fromObj, key) {
|
||||
return fromObj[key];
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepares parameter to pass to Service's Action.<br/>
|
||||
* Sort options value in order to match "arguments" proto.
|
||||
* @private
|
||||
* @param {object} opts - Options object
|
||||
* @return {array} Arguments array
|
||||
*/
|
||||
function prepareArgs(opts) {
|
||||
var valueFromOpts = valueFrom.bind(null, opts);
|
||||
|
||||
return Object.keys(opts).reduce(function(acc, item) {
|
||||
acc.splice(indexFromArgs(item), 0, valueFromOpts(item));
|
||||
|
||||
return acc;
|
||||
}, []);
|
||||
}
|
||||
|
||||
34
www/object.assign-polyfill.js
Normal file
34
www/object.assign-polyfill.js
Normal file
@@ -0,0 +1,34 @@
|
||||
if (!Object.assign) {
|
||||
Object.defineProperty(Object, 'assign', {
|
||||
enumerable: false,
|
||||
configurable: true,
|
||||
writable: true,
|
||||
value: function(target) {
|
||||
'use strict';
|
||||
if (target === undefined || target === null) {
|
||||
throw new TypeError('Cannot convert first argument to object');
|
||||
}
|
||||
|
||||
var to = Object(target);
|
||||
for (var i = 1; i < arguments.length; i++) {
|
||||
var nextSource = arguments[i];
|
||||
if (nextSource === undefined || nextSource === null) {
|
||||
continue;
|
||||
}
|
||||
nextSource = Object(nextSource);
|
||||
|
||||
var keysArray = Object.keys(Object(nextSource));
|
||||
for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) {
|
||||
var nextKey = keysArray[nextIndex];
|
||||
var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
|
||||
if (desc !== undefined && desc.enumerable) {
|
||||
to[nextKey] = nextSource[nextKey];
|
||||
}
|
||||
}
|
||||
}
|
||||
return to;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = Object.assign;
|
||||
Reference in New Issue
Block a user