spree_vpago 0.1.0.pre.beta → 2.0.4.pre.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test_and_publish_gem.yml +2 -0
  3. data/Gemfile.lock +25 -23
  4. data/app/assets/javascripts/vpago/vpago_payments/user_informers/firebase.js +1686 -1426
  5. data/app/controllers/spree/admin/payment_methods_controller_decorator.rb +9 -1
  6. data/app/controllers/spree/vpago_payments_controller.rb +12 -2
  7. data/app/javascripts/queue_processor.js +33 -0
  8. data/app/javascripts/queue_processor.test.js +88 -0
  9. data/app/javascripts/vpago/vpago_payments/user_informers/firebase.js +92 -13
  10. data/app/jobs/vpago/payment_capturer_job.rb +11 -0
  11. data/app/jobs/vpago/payment_processor_job.rb +3 -0
  12. data/app/models/vpago/address_decorator.rb +10 -0
  13. data/app/models/vpago/order_decorator.rb +13 -1
  14. data/app/models/vpago/payment_decorator.rb +18 -1
  15. data/app/overrides/spree/admin/payment_methods/index/payment_methods_tabs.html.erb.deface +7 -1
  16. data/app/overrides/spree/admin/payment_methods/index/tenant_body.html.erb.deface +5 -0
  17. data/app/overrides/spree/admin/payment_methods/index/tenant_header.html.erb.deface +5 -0
  18. data/app/serializers/spree/v2/storefront/payment_serializer_decorator.rb +1 -1
  19. data/app/services/vpago/payment_processable.rb +54 -0
  20. data/app/services/vpago/payment_processor.rb +58 -41
  21. data/app/services/vpago/payment_url_constructor.rb +1 -1
  22. data/app/services/vpago/user_informers/firebase.rb +21 -16
  23. data/app/views/spree/admin/shared/_payment_methods_tabs.html.erb +7 -0
  24. data/app/views/spree/vpago_payments/processing.html.erb +36 -23
  25. data/lib/spree_vpago/version.rb +1 -1
  26. data/lib/vpago/payway_v2/base.rb +8 -8
  27. data/lib/vpago/payway_v2/checkout.rb +2 -2
  28. data/node_modules/.yarn-integrity +93 -2
  29. data/package.json +6 -1
  30. data/yarn.lock +556 -2
  31. metadata +9 -2
@@ -9,35 +9,40 @@ module Vpago
9
9
  @order = order
10
10
  end
11
11
 
12
- def payment_is_processing(processing:, log_message: nil) = notify(:payment_is_processing, processing, log_message)
13
- def order_is_processing(processing:, log_message: nil) = notify(:order_is_processing, processing, log_message)
14
- def order_is_completed(processing:, log_message: nil) = notify(:order_is_completed, processing, log_message)
15
- def order_process_failed(processing:, log_message: nil) = notify(:order_process_failed, processing, log_message)
16
- def payment_is_refunded(processing:, log_message: nil) = notify(:payment_is_refunded, processing, log_message)
17
- def payment_process_failed(processing:, log_message: nil) = notify(:payment_process_failed, processing, log_message)
18
-
19
- def notify(message, processing, log_message = nil)
12
+ def payment_is_processing(processing:) = notify(:payment_is_processing, processing)
13
+ def order_is_processing(processing:) = notify(:order_is_processing, processing)
14
+ def order_is_completed(processing:) = notify(:order_is_completed, processing)
15
+ def order_process_failed(processing:, reason_code:, reason_message: nil) = notify(:order_process_failed, processing, reason_code, reason_message)
16
+ def payment_is_refunded(processing:, reason_code:, reason_message: nil) = notify(:payment_is_refunded, processing, reason_code, reason_message)
17
+ def payment_process_failed(processing:, reason_code:, reason_message: nil) = notify(:payment_process_failed, processing, reason_code, reason_message)
18
+
19
+ def notify(message_code, processing, reason_code = nil, reason_message = nil)
20
20
  order.reload
21
21
 
22
22
  data = {
23
23
  processing: processing,
24
- message_code: message,
25
- log_message: log_message,
24
+ message_code: message_code,
25
+ reason_code: reason_code,
26
+ reason_message: reason_message,
26
27
  order_state: order.state,
27
28
  payment_state: order.payment_state,
28
29
  updated_at: Time.current
29
30
  }.compact
30
31
 
31
32
  firestore_reference.set(data, merge: true)
32
- firestore_reference.col('histories').doc(message).set(data)
33
+ firestore_reference.col('histories').doc(message_code).set(data)
33
34
  end
34
35
 
35
36
  def firestore_reference
36
- current_date = Time.current.strftime('%Y-%m-%d')
37
- firestore.col('statuses')
38
- .doc('cart')
39
- .col(current_date)
40
- .doc(order.number)
37
+ order_created_date = order.created_at.strftime('%Y-%m-%d')
38
+ @firestore_reference ||= firestore.col('statuses')
39
+ .doc('cart')
40
+ .col(order_created_date)
41
+ .doc(order.number)
42
+ end
43
+
44
+ def document_reference_path
45
+ firestore_reference.path.split('/documents').last
41
46
  end
42
47
 
43
48
  def firestore
@@ -12,4 +12,11 @@
12
12
  admin_payment_methods_url(tab: :vendors),
13
13
  class: "nav-link #{'active' if params[:tab] == 'vendors' }" %>
14
14
  <% end if can?(:admin, Spree::PaymentMethod) %>
15
+
16
+ <%= content_tag :li, class: 'nav-item' do %>
17
+ <%= link_to_with_icon 'building.svg',
18
+ Spree.t(:tenants),
19
+ admin_payment_methods_url(tab: :tenants),
20
+ class: "nav-link #{'active' if params[:tab] == 'tenants' }" %>
21
+ <% end if can?(:admin, Spree::PaymentMethod) %>
15
22
  <% end %>
@@ -1,49 +1,62 @@
1
1
  <h1 id="status">THIS IS CURRENT STATE</h1>
2
- <p id="message"></p>
2
+ <p id="reason_code"></p>
3
+ <p id="processing"></p>
4
+ <p id="reason_message"></p>
3
5
 
4
6
  <script>
5
7
  document.addEventListener("DOMContentLoaded", function() {
6
8
  let firebaseConfigs = <%= Rails.application.credentials.firebase_web_config.to_json.html_safe %>;
7
- let orderNumber = "<%= @order.number %>";
9
+
10
+ window.requestProcessPayment({
11
+ url: "<%= @payment.process_payment_url %>",
12
+ params: <%= params.except(:action, :controller, :amp).to_json.html_safe %>,
13
+ maxRetries: 5,
14
+ retryDelayMs: 1000,
15
+ })
8
16
 
9
17
  window.listenToProcessingState({
10
18
  firebaseConfigs: firebaseConfigs,
11
- orderNumber: orderNumber,
12
- onPaymentIsProcessing: function (orderState, paymentState, logMessage) {
19
+ documentReferencePath: "<%= payment.user_informer.document_reference_path %>",
20
+ onPaymentIsProcessing: function (orderState, paymentState, processing, reasonCode, reasonMessage) {
13
21
  document.getElementById("status").innerText = "Payment is processing";
14
- document.getElementById("message").innerText = logMessage;
22
+ document.getElementById("reason_code").innerText = reasonCode;
23
+ document.getElementById("processing").innerText = processing ? "Processing..." : "No more process.";
24
+ document.getElementById("reason_message").innerText = reasonMessage;
15
25
  },
16
- onOrderIsProcessing: function (orderState, paymentState, logMessage) {
26
+ onOrderIsProcessing: function (orderState, paymentState, processing, reasonCode, reasonMessage) {
17
27
  document.getElementById("status").innerText = "Order is processing";
18
- document.getElementById("message").innerText = logMessage;
28
+ document.getElementById("reason_code").innerText = reasonCode;
29
+ document.getElementById("processing").innerText = processing ? "Processing..." : "No more process.";
30
+ document.getElementById("reason_message").innerText = reasonMessage;
19
31
  },
20
- onOrderIsCompleted: function (orderState, paymentState, logMessage) {
32
+ onOrderIsCompleted: function (orderState, paymentState, processing, reasonCode, reasonMessage) {
21
33
  document.getElementById("status").innerText = "Order is completed";
22
- document.getElementById("message").innerText = logMessage;
34
+ document.getElementById("reason_code").innerText = reasonCode;
35
+ document.getElementById("processing").innerText = processing ? "Processing..." : "No more process.";
36
+ document.getElementById("reason_message").innerText = reasonMessage;
23
37
  },
24
- onOrderProcessFailed: function (orderState, paymentState, logMessage) {
38
+ onOrderProcessFailed: function (orderState, paymentState, processing, reasonCode, reasonMessage) {
25
39
  document.getElementById("status").innerText = "Order process failed";
26
- document.getElementById("message").innerText = logMessage;
40
+ document.getElementById("reason_code").innerText = reasonCode;
41
+ document.getElementById("processing").innerText = processing ? "Processing..." : "No more process.";
42
+ document.getElementById("reason_message").innerText = reasonMessage;
27
43
  },
28
- onPaymentIsRefunded: function (orderState, paymentState, logMessage) {
44
+ onPaymentIsRefunded: function (orderState, paymentState, processing, reasonCode, reasonMessage) {
29
45
  document.getElementById("status").innerText = "Payment is refunded";
30
- document.getElementById("message").innerText = logMessage
46
+ document.getElementById("reason_code").innerText = reasonCode;
47
+ document.getElementById("processing").innerText = processing ? "Processing..." : "No more process.";
48
+ document.getElementById("reason_message").innerText = reasonMessage
31
49
  },
32
- onPaymentProcessFailed: function (orderState, paymentState, logMessage) {
50
+ onPaymentProcessFailed: function (orderState, paymentState, processing, reasonCode, reasonMessage) {
33
51
  document.getElementById("status").innerText = "Payment process failed";
34
- document.getElementById("message").innerText = logMessage;
52
+ document.getElementById("reason_code").innerText = reasonCode;
53
+ document.getElementById("processing").innerText = processing ? "Processing..." : "No more process.";
54
+ document.getElementById("reason_message").innerText = reasonMessage;
35
55
  },
36
- onCompleted: function (orderState, paymentState, logMessage) {
56
+ onCompleted: function (orderState, paymentState, processing, reasonCode, reasonMessage) {
37
57
  let successPath = "<%= @payment.success_url %>";
38
58
  window.location.href = successPath;
39
59
  },
40
60
  });
41
61
  });
42
-
43
- window.requestProcessPayment({
44
- url: "<%= @payment.process_payment_url %>",
45
- params: <%= params.except(:action, :controller, :amp).to_json.html_safe %>,
46
- maxRetries: 5,
47
- retryDelayMs: 1000,
48
- })
49
62
  </script>
@@ -1,7 +1,7 @@
1
1
  module SpreeVpago
2
2
  module_function
3
3
 
4
- VERSION = '0.1.0-beta'.freeze
4
+ VERSION = '2.0.4-beta1'.freeze
5
5
 
6
6
  def version
7
7
  Gem::Version.new VERSION
@@ -46,16 +46,17 @@ module Vpago
46
46
  @payment.number
47
47
  end
48
48
 
49
+ # optional
49
50
  def email
50
51
  @payment.order.email.presence || ENV.fetch('DEFAULT_EMAIL_FOR_PAYMENT', nil)
51
52
  end
52
53
 
53
54
  def first_name
54
- @payment.order.billing_address.first_name.strip
55
+ @payment.order.billing_address&.first_name&.strip
55
56
  end
56
57
 
57
58
  def last_name
58
- @payment.order.billing_address.last_name.strip
59
+ @payment.order.billing_address&.last_name&.strip
59
60
  end
60
61
 
61
62
  def return_url
@@ -79,12 +80,9 @@ module Vpago
79
80
  Vpago::Payway::CARD_TYPES.index(card_option).nil? ? Vpago::Payway::CARD_TYPE_ABAPAY : card_option
80
81
  end
81
82
 
82
- def phone_country_code
83
- '+855'
84
- end
85
-
83
+ # optional
86
84
  def phone
87
- @payment.order.billing_address.phone
85
+ @payment.order.billing_address&.phone
88
86
  end
89
87
 
90
88
  def api_key
@@ -128,8 +126,10 @@ module Vpago
128
126
  end
129
127
 
130
128
  def hash_data
131
- result = "#{req_time}#{merchant_id}#{transaction_id}#{amount}#{first_name}#{last_name}#{email}#{phone}"
129
+ result = "#{req_time}#{merchant_id}#{transaction_id}#{amount}#{first_name}#{last_name}"
132
130
 
131
+ result += email if email.present?
132
+ result += phone if phone.present?
133
133
  result += type if type.present?
134
134
  result += payment_option if payment_option.present?
135
135
  result += return_url if return_url.present?
@@ -10,8 +10,6 @@ module Vpago
10
10
  type: type,
11
11
  firstname: first_name,
12
12
  lastname: last_name,
13
- email: email,
14
- phone: phone,
15
13
  payment_option: payment_option,
16
14
  return_url: return_url,
17
15
  continue_success_url: continue_success_url,
@@ -19,6 +17,8 @@ module Vpago
19
17
  hash: hash_hmac
20
18
  }
21
19
 
20
+ result[:email] = email unless email.nil?
21
+ result[:phone] = phone unless phone.nil?
22
22
  result[:return_deeplink] = return_deeplink unless return_deeplink.nil?
23
23
  result[:view_type] = view_type unless view_type.nil?
24
24
  result[:payout] = payout unless payout.nil?
@@ -7,8 +7,10 @@
7
7
  "linkedModules": [],
8
8
  "topLevelPatterns": [
9
9
  "@spree/dashboard@^0.2.1",
10
+ "chai@^5.2.0",
10
11
  "esbuild@^0.24.2",
11
- "firebase@^11.2.0"
12
+ "firebase@^11.2.0",
13
+ "mocha@^11.1.0"
12
14
  ],
13
15
  "lockfileEntries": {
14
16
  "@esbuild/aix-ppc64@0.24.2": "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz#38848d3e25afe842a7943643cbcd387cc6e13461",
@@ -85,6 +87,8 @@
85
87
  "@hotwired/stimulus@^3.0.1": "https://registry.yarnpkg.com/@hotwired/stimulus/-/stimulus-3.2.2.tgz#071aab59c600fed95b97939e605ff261a4251608",
86
88
  "@hotwired/turbo-rails@^7.1.3": "https://registry.yarnpkg.com/@hotwired/turbo-rails/-/turbo-rails-7.3.0.tgz#422c21752509f3edcd6c7b2725bbe9e157815f51",
87
89
  "@hotwired/turbo@^7.3.0": "https://registry.yarnpkg.com/@hotwired/turbo/-/turbo-7.3.0.tgz#2226000fff1aabda9fd9587474565c9929dbf15d",
90
+ "@isaacs/cliui@^8.0.2": "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550",
91
+ "@pkgjs/parseargs@^0.11.0": "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33",
88
92
  "@protobufjs/aspromise@^1.1.1": "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf",
89
93
  "@protobufjs/aspromise@^1.1.2": "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf",
90
94
  "@protobufjs/base64@^1.1.2": "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735",
@@ -102,45 +106,132 @@
102
106
  "@spree/dashboard@^0.2.1": "https://registry.yarnpkg.com/@spree/dashboard/-/dashboard-0.2.1.tgz#6a799c6e6c696b72a88fa67f9edb4a55dca31d1a",
103
107
  "@types/node@>=12.12.47": "https://registry.yarnpkg.com/@types/node/-/node-22.13.5.tgz#23add1d71acddab2c6a4d31db89c0f98d330b511",
104
108
  "@types/node@>=13.7.0": "https://registry.yarnpkg.com/@types/node/-/node-22.13.5.tgz#23add1d71acddab2c6a4d31db89c0f98d330b511",
109
+ "ansi-colors@^4.1.3": "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b",
105
110
  "ansi-regex@^5.0.1": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304",
111
+ "ansi-regex@^6.0.1": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654",
106
112
  "ansi-styles@^4.0.0": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937",
113
+ "ansi-styles@^4.1.0": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937",
114
+ "ansi-styles@^6.1.0": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5",
115
+ "anymatch@~3.1.2": "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e",
116
+ "argparse@^2.0.1": "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38",
117
+ "assertion-error@^2.0.1": "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7",
118
+ "balanced-match@^1.0.0": "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee",
119
+ "binary-extensions@^2.0.0": "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522",
107
120
  "bootstrap@4.6.1": "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.6.1.tgz#bc25380c2c14192374e8dec07cf01b2742d222a2",
121
+ "brace-expansion@^2.0.1": "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae",
122
+ "braces@~3.0.2": "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789",
123
+ "browser-stdout@^1.3.1": "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60",
124
+ "camelcase@^6.0.0": "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a",
125
+ "chai@^5.2.0": "https://registry.yarnpkg.com/chai/-/chai-5.2.0.tgz#1358ee106763624114addf84ab02697e411c9c05",
126
+ "chalk@^4.1.0": "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01",
127
+ "check-error@^2.1.1": "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc",
128
+ "chokidar@^3.5.3": "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b",
108
129
  "cliui@^8.0.1": "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa",
109
130
  "color-convert@^2.0.1": "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3",
110
131
  "color-name@~1.1.4": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2",
132
+ "cross-spawn@^7.0.6": "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f",
133
+ "debug@^4.3.5": "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a",
134
+ "decamelize@^4.0.0": "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837",
135
+ "deep-eql@^5.0.1": "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341",
136
+ "diff@^5.2.0": "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531",
137
+ "eastasianwidth@^0.2.0": "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb",
111
138
  "emoji-regex@^8.0.0": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37",
139
+ "emoji-regex@^9.2.2": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72",
112
140
  "esbuild@^0.24.2": "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.2.tgz#b5b55bee7de017bff5fb8a4e3e44f2ebe2c3567d",
113
141
  "escalade@^3.1.1": "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5",
142
+ "escape-string-regexp@^4.0.0": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34",
114
143
  "faye-websocket@0.11.4": "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da",
144
+ "fill-range@^7.1.1": "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292",
145
+ "find-up@^5.0.0": "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc",
115
146
  "firebase@^11.2.0": "https://registry.yarnpkg.com/firebase/-/firebase-11.3.1.tgz#1507b2b1e3af17418fbe009e82d7bc30a6b5117c",
147
+ "flat@^5.0.2": "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241",
116
148
  "flatpickr@4.6.9": "https://registry.yarnpkg.com/flatpickr/-/flatpickr-4.6.9.tgz#9a13383e8a6814bda5d232eae3fcdccb97dc1499",
149
+ "foreground-child@^3.1.0": "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f",
150
+ "fsevents@~2.3.2": "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6",
117
151
  "get-caller-file@^2.0.5": "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e",
152
+ "glob-parent@~5.1.2": "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4",
153
+ "glob@^10.4.5": "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956",
154
+ "has-flag@^4.0.0": "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b",
155
+ "he@^1.2.0": "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f",
118
156
  "http-parser-js@>=0.5.1": "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.9.tgz#b817b3ca0edea6236225000d795378707c169cec",
119
157
  "idb@7.1.1": "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b",
158
+ "is-binary-path@~2.1.0": "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09",
159
+ "is-extglob@^2.1.1": "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2",
120
160
  "is-fullwidth-code-point@^3.0.0": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d",
161
+ "is-glob@^4.0.1": "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084",
162
+ "is-glob@~4.0.1": "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084",
163
+ "is-number@^7.0.0": "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b",
164
+ "is-plain-obj@^2.1.0": "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287",
165
+ "is-unicode-supported@^0.1.0": "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7",
166
+ "isexe@^2.0.0": "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10",
167
+ "jackspeak@^3.1.2": "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a",
121
168
  "jquery@3.5.1": "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5",
169
+ "js-yaml@^4.1.0": "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602",
170
+ "locate-path@^6.0.0": "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286",
122
171
  "lodash.camelcase@^4.3.0": "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6",
172
+ "log-symbols@^4.1.0": "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503",
123
173
  "long@^5.0.0": "https://registry.yarnpkg.com/long/-/long-5.3.1.tgz#9d4222d3213f38a5ec809674834e0f0ab21abe96",
174
+ "loupe@^3.1.0": "https://registry.yarnpkg.com/loupe/-/loupe-3.1.3.tgz#042a8f7986d77f3d0f98ef7990a2b2fef18b0fd2",
175
+ "lru-cache@^10.2.0": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119",
176
+ "minimatch@^5.1.6": "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96",
177
+ "minimatch@^9.0.4": "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5",
178
+ "minipass@^5.0.0 || ^6.0.2 || ^7.0.0": "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707",
179
+ "minipass@^7.1.2": "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707",
180
+ "mocha@^11.1.0": "https://registry.yarnpkg.com/mocha/-/mocha-11.1.0.tgz#20d7c6ac4d6d6bcb60a8aa47971fca74c65c3c66",
181
+ "ms@^2.1.3": "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2",
182
+ "normalize-path@^3.0.0": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65",
183
+ "normalize-path@~3.0.0": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65",
184
+ "p-limit@^3.0.2": "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b",
185
+ "p-locate@^5.0.0": "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834",
186
+ "package-json-from-dist@^1.0.0": "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505",
187
+ "path-exists@^4.0.0": "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3",
188
+ "path-key@^3.1.0": "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375",
189
+ "path-scurry@^1.11.1": "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2",
190
+ "pathval@^2.0.0": "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25",
191
+ "picomatch@^2.0.4": "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42",
192
+ "picomatch@^2.2.1": "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42",
124
193
  "popper.js@1.16.1": "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b",
125
194
  "protobufjs@^7.2.5": "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a",
195
+ "randombytes@^2.1.0": "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a",
196
+ "readdirp@~3.6.0": "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7",
126
197
  "require-directory@^2.1.1": "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42",
127
198
  "safe-buffer@>=5.1.0": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6",
199
+ "safe-buffer@^5.1.0": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6",
200
+ "serialize-javascript@^6.0.2": "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2",
201
+ "shebang-command@^2.0.0": "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea",
202
+ "shebang-regex@^3.0.0": "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172",
203
+ "signal-exit@^4.0.1": "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04",
128
204
  "sortablejs@^1.14.0": "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.15.6.tgz#ff93699493f5b8ab8d828f933227b4988df1d393",
129
205
  "stimulus-sortable@^3.1.0": "https://registry.yarnpkg.com/stimulus-sortable/-/stimulus-sortable-3.3.0.tgz#92b4ef4697fcd7a10cc4f898dccc45e9065fb0a0",
206
+ "string-width-cjs@npm:string-width@^4.2.0": "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010",
130
207
  "string-width@^4.1.0": "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010",
131
208
  "string-width@^4.2.0": "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010",
132
209
  "string-width@^4.2.3": "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010",
210
+ "string-width@^5.0.1": "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794",
211
+ "string-width@^5.1.2": "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794",
212
+ "strip-ansi-cjs@npm:strip-ansi@^6.0.1": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9",
133
213
  "strip-ansi@^6.0.0": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9",
134
214
  "strip-ansi@^6.0.1": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9",
215
+ "strip-ansi@^7.0.1": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45",
216
+ "strip-json-comments@^3.1.1": "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006",
217
+ "supports-color@^7.1.0": "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da",
218
+ "supports-color@^8.1.1": "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c",
219
+ "to-regex-range@^5.0.1": "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4",
135
220
  "tslib@^2.1.0": "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f",
136
221
  "undici-types@~6.20.0": "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433",
137
222
  "web-vitals@^4.2.4": "https://registry.yarnpkg.com/web-vitals/-/web-vitals-4.2.4.tgz#1d20bc8590a37769bd0902b289550936069184b7",
138
223
  "websocket-driver@>=0.5.1": "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760",
139
224
  "websocket-extensions@>=0.1.1": "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42",
225
+ "which@^2.0.1": "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1",
226
+ "workerpool@^6.5.1": "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544",
227
+ "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43",
140
228
  "wrap-ansi@^7.0.0": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43",
229
+ "wrap-ansi@^8.1.0": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214",
141
230
  "y18n@^5.0.5": "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55",
142
231
  "yargs-parser@^21.1.1": "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35",
143
- "yargs@^17.7.2": "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
232
+ "yargs-unparser@^2.0.0": "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb",
233
+ "yargs@^17.7.2": "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269",
234
+ "yocto-queue@^0.1.0": "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
144
235
  },
145
236
  "files": [],
146
237
  "artifacts": {}
data/package.json CHANGED
@@ -5,6 +5,11 @@
5
5
  "firebase": "^11.2.0"
6
6
  },
7
7
  "scripts": {
8
- "build": "node build.js"
8
+ "build": "node build.js",
9
+ "test": "mocha **/*.test.js --timeout 5000"
10
+ },
11
+ "devDependencies": {
12
+ "chai": "^5.2.0",
13
+ "mocha": "^11.1.0"
9
14
  }
10
15
  }