From 02e4563957722712bbf2c4b5bc24999e7a48192a Mon Sep 17 00:00:00 2001
From: nobody42 <5514211-nobody42@users.noreply.gitlab.com>
Date: Tue, 5 May 2020 11:52:32 +0200
Subject: [PATCH] Angular Stripe Checkout v5.1.0 (#71)
---
core/files.js | 3 +
core/mappings.js | 1 +
core/resources.js | 5 +
modules/internal/helpers.js | 4 +
pages/updates/updates.html | 1 +
.../5.1.0/angular-stripe-checkout.jsm | 216 ++++++++++++++++++
6 files changed, 230 insertions(+)
create mode 100644 resources/angular-stripe-checkout/5.1.0/angular-stripe-checkout.jsm
diff --git a/core/files.js b/core/files.js
index de09bc19..215ed4d1 100644
--- a/core/files.js
+++ b/core/files.js
@@ -42,6 +42,9 @@ var files = {
// Angular Payments
'resources/angular-payments/1.0.7/angular-payments.jsm': true,
+ // Angular Stripe Checkout
+ 'resources/angular-stripe-checkout/5.1.0/angular-stripe-checkout.jsm': true,
+
// AngularJS
'resources/angularjs/1.7.9/angular-animate.min.jsm': true,
'resources/angularjs/1.7.9/angular-aria.min.jsm': true,
diff --git a/core/mappings.js b/core/mappings.js
index 4b821d58..c942110b 100644
--- a/core/mappings.js
+++ b/core/mappings.js
@@ -193,6 +193,7 @@ var mappings = {
'angular@{version}/angular.': resources.angular,
'angular@{version}/angular.min.': resources.angular,
'angular-payments@{version}/lib/angular-payments.js': resources.angularPayments,
+ 'angular-stripe-checkout@{version}/angular-stripe-checkout.js': resources.angularStripeCheckout,
'animate.css@{version}/animate.min.css': resources.animateCSS,
'backbone@{version}/backbone.': resources.backbone,
'backbone@{version}/backbone-min.': resources.backbone,
diff --git a/core/resources.js b/core/resources.js
index d6d773f7..69a523cc 100644
--- a/core/resources.js
+++ b/core/resources.js
@@ -126,6 +126,11 @@ var resources = {
'path': 'resources/angular-payments/{version}/angular-payments.jsm',
'type': 'application/javascript'
},
+ // Angular Stripe Checkout
+ 'angularStripeCheckout': {
+ 'path': 'resources/angular-stripe-checkout/{version}/angular-stripe-checkout.jsm',
+ 'type': 'application/javascript'
+ },
// Animate CSS
'animateCSS': {
'path': 'resources/animate.css/{version}/animate.min.css',
diff --git a/modules/internal/helpers.js b/modules/internal/helpers.js
index caff95b2..ebe66768 100644
--- a/modules/internal/helpers.js
+++ b/modules/internal/helpers.js
@@ -250,6 +250,8 @@ helpers.determineResourceName = function (filename) {
return 'Angular UI Router';
case 'angular-payments.jsm':
return 'Angular Payments';
+ case 'angular-stripe-checkout.jsm':
+ return 'Angular Stripe Checkout';
case 'animate.min.css':
return 'Animate CSS'
case 'backbone-min.jsm':
@@ -461,6 +463,8 @@ helpers.setLastVersion = function (type, version) {
version = '0.4.18';
} else if (type.includes('/angular-payments@1.')) {
version = '1.0.7';
+ } else if (type.includes('/angular-stripe-checkout@5.')) {
+ version = '5.1.0';
} else if (type.includes('/angular-ui-bootstrap/0.')) {
version = '0.14.3';
} else if (type.includes('/angular-ui-bootstrap/1.')) {
diff --git a/pages/updates/updates.html b/pages/updates/updates.html
index 16edd8f5..72bce147 100644
--- a/pages/updates/updates.html
+++ b/pages/updates/updates.html
@@ -38,6 +38,7 @@
Added AngularJS v1.4.14 (#71)
Fixed typo in AngularUI Bootstrap (#71)
Added Angular Payments v1.0.7 (#71)
+ Added Angular Stripe Checkout v5.1.0 (#71)
Please update your uBlock/uMatrix rules
diff --git a/resources/angular-stripe-checkout/5.1.0/angular-stripe-checkout.jsm b/resources/angular-stripe-checkout/5.1.0/angular-stripe-checkout.jsm
new file mode 100644
index 00000000..1e63ecad
--- /dev/null
+++ b/resources/angular-stripe-checkout/5.1.0/angular-stripe-checkout.jsm
@@ -0,0 +1,216 @@
+(function() {
+/* global StripeCheckout */
+'use strict';
+
+var MODULE_NAME = 'stripe.checkout';
+var STRIPE_CHECKOUT_URL = 'https://checkout.stripe.com/checkout.js';
+
+var OPTIONS = {
+ address: ['data-address', 'boolean'],
+ alipay: ['data-alipay', 'boolean-or-auto'],
+ alipayReusable: ['data-alipay-reusable', 'boolean'],
+ allowRememberMe: ['data-allow-remember-me', 'boolean'],
+ amount: ['data-amount', 'number'],
+ billingAddress: ['data-billing-address', 'boolean'],
+ bitcoin: ['data-bitcoin', 'boolean'],
+ currency: ['data-currency', 'string'],
+ description: ['data-description', 'string'],
+ email: ['data-email', 'string'],
+ image: ['data-image', 'string'],
+ key: ['data-key', 'string'],
+ label: ['data-label', 'string'],
+ locale: ['data-locale', 'string'],
+ name: ['data-name', 'string'],
+ color: ['data-color', 'string'],
+ panelLabel: ['data-panel-label', 'string'],
+ shippingAddress: ['data-shipping-address', 'boolean'],
+ zipCode: ['data-zip-code', 'boolean']
+};
+
+
+var angular;
+
+if (typeof module !== 'undefined' && typeof module.exports === 'object') {
+ angular = require('angular');
+ module.exports = MODULE_NAME;
+} else {
+ angular = window.angular;
+}
+
+var extend = angular.extend;
+
+angular.module(MODULE_NAME,[])
+ .directive('stripeCheckout',StripeCheckoutDirective)
+ .provider('StripeCheckout',StripeCheckoutProvider);
+
+
+StripeCheckoutDirective.$inject = ['$parse', 'StripeCheckout'];
+
+function StripeCheckoutDirective($parse, StripeCheckout) {
+ return { link: link };
+
+ function link(scope, el, attrs) {
+ var handler;
+
+ StripeCheckout.load()
+ .then(function() {
+ handler = StripeCheckout.configure(getOptions(el));
+ });
+
+ el.on('click',function() {
+ if (handler)
+ handler.open(getOptions(el)).then(function(result) {
+ var callback = $parse(attrs.stripeCheckout)(scope);
+ if (typeof callback === 'function')
+ callback.apply(null,result);
+ });
+ });
+ }
+}
+
+
+function StripeCheckoutProvider() {
+ var defaults = {};
+
+ this.defaults = function(options) {
+ extend(defaults,options);
+ };
+
+
+ this.load = function(StripeCheckout) {
+ return StripeCheckout.load();
+ };
+
+ this.load.$inject = ['StripeCheckout'];
+
+
+ this.$get = function($document, $q) {
+ return new StripeCheckoutService($document,$q,defaults);
+ };
+
+ this.$get.$inject = ['$document', '$q'];
+}
+
+
+function StripeCheckoutService($document, $q, providerDefaults) {
+ var defaults = {};
+ var promise;
+
+ this.configure = function(options) {
+ return new StripeHandlerWrapper($q,extend({},
+ providerDefaults,
+ defaults,
+ options
+ ));
+ };
+
+ this.load = function() {
+ if (!promise)
+ promise = loadLibrary($document,$q);
+
+ return promise;
+ };
+
+ this.defaults = function(options) {
+ extend(defaults,options);
+ };
+}
+
+
+function StripeHandlerWrapper($q, options) {
+ var deferred, success;
+
+ var handler = StripeCheckout.configure(extend({},options,{
+ token: function(token, args) {
+ if (options.token) options.token(token,args);
+
+ success = true;
+ deferred.resolve([token, args]);
+ },
+
+ closed: function() {
+ if (options.closed) options.closed();
+ if (!success) deferred.reject();
+ }
+ }));
+
+ this.open = function(openOptions) {
+ deferred = $q.defer();
+ success = false;
+
+ handler.open(openOptions);
+
+ return deferred.promise;
+ };
+
+ this.close = function() {
+ success = false;
+
+ handler.close();
+
+ if (options.closed) options.closed();
+ if (deferred) deferred.reject();
+ };
+}
+
+
+function getOptions(el) {
+ var opt, def, val, options = {};
+
+ for (opt in OPTIONS) {
+ if (!OPTIONS.hasOwnProperty(opt))
+ continue;
+
+ def = OPTIONS[opt];
+ val = parseValue(el.attr(def[0]),def[1]);
+
+ if (val != null)
+ options[opt] = val;
+ }
+
+ return options;
+}
+
+function loadLibrary($document, $q) {
+ var deferred = $q.defer();
+
+ var doc = $document[0];
+ var script = doc.createElement('script');
+ script.src = STRIPE_CHECKOUT_URL;
+
+ script.onload = function () {
+ deferred.resolve();
+ };
+
+ script.onreadystatechange = function () {
+ var rs = this.readyState;
+ if (rs === 'loaded' || rs === 'complete')
+ deferred.resolve();
+ };
+
+ script.onerror = function () {
+ deferred.reject(new Error('Unable to load checkout.js'));
+ };
+
+ var container = doc.getElementsByTagName('head')[0];
+ container.appendChild(script);
+
+ return deferred.promise;
+}
+
+function parseValue(value, type) {
+ if (type === 'boolean') {
+ return value && value !== 'false';
+ } else if (type === 'number') {
+ return value && Number(value);
+ } else if (type === 'boolean-or-auto') {
+ if (value === 'auto')
+ return value;
+ else
+ return parseValue(value,'boolean');
+ } else {
+ return value;
+ }
+}
+
+})();