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; + } +} + +})();