From 3ed6bd851f04a9008bfd8a20b14bba61335f4b7e Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Sat, 7 Nov 2020 17:42:04 +0300 Subject: [PATCH 01/98] chore: init beta --- index.js | 3 - package-lock.json | 6583 ++++++++++++++--- package.json | 66 +- src/.DS_Store | Bin 0 -> 6148 bytes src/admin/API.ts | 89 + src/admin/Graph.d.ts | 1 + src/admin/Rels.d.ts | 1 + src/admin/index.ts | 5 + src/admin/types.d.ts | 9 + src/core/API/API.ts | 98 + src/core/API/AuthError.ts | 41 + src/core/API/Node.ts | 240 + src/core/API/ResolutionError.ts | 15 + src/core/API/Response.ts | 125 + src/core/API/index.ts | 1 + src/core/Graph.d.ts | 7 + src/core/Query/Fields.d.ts | 6 + src/core/Query/Order.d.ts | 13 + src/core/Query/Query.d.ts | 14 + src/core/Query/Zoom.d.ts | 12 + src/core/Query/index.d.ts | 1 + src/core/Resource/Child.d.ts | 32 + src/core/Resource/Embeds.d.ts | 33 + src/core/Resource/Links.d.ts | 23 + src/core/Resource/Props.d.ts | 14 + src/core/Resource/Resource.d.ts | 10 + src/core/Resource/Zooms.d.ts | 23 + src/core/Resource/index.d.ts | 1 + src/core/defaults.d.ts | 25 + src/core/index.ts | 4 + src/core/utils.d.ts | 53 + src/customer/API.ts | 84 + src/customer/Graph/attribute.d.ts | 7 + src/customer/Graph/attributes.d.ts | 8 + .../Graph/default_billing_address.d.ts | 7 + .../Graph/default_payment_method.d.ts | 7 + .../Graph/default_shipping_address.d.ts | 7 + src/customer/Graph/index.d.ts | 32 + src/customer/Graph/item.d.ts | 7 + src/customer/Graph/items.d.ts | 8 + src/customer/Graph/subscription.d.ts | 18 + src/customer/Graph/subscriptions.d.ts | 8 + src/customer/Graph/transaction.d.ts | 10 + src/customer/Graph/transaction_template.d.ts | 11 + src/customer/Graph/transactions.d.ts | 8 + src/customer/Rels.d.ts | 12 + src/customer/index.ts | 5 + src/customer/types.d.ts | 20 + src/index.ts | 4 + src/integration/API.ts | 110 + .../Graph/admin_email_template.d.ts | 8 + .../Graph/applied_coupon_code.d.ts | 31 + .../Graph/applied_coupon_codes.d.ts | 10 + src/integration/Graph/applied_tax.d.ts | 40 + src/integration/Graph/applied_taxes.d.ts | 10 + src/integration/Graph/attribute.d.ts | 23 + src/integration/Graph/attributes.d.ts | 10 + src/integration/Graph/billing_address.d.ts | 58 + src/integration/Graph/billing_addresses.d.ts | 10 + src/integration/Graph/cache.d.ts | 5 + src/integration/Graph/capture.d.ts | 5 + src/integration/Graph/cart.d.ts | 139 + .../Graph/cart_include_template.d.ts | 32 + .../Graph/cart_include_templates.d.ts | 10 + src/integration/Graph/cart_template.d.ts | 32 + src/integration/Graph/cart_templates.d.ts | 10 + src/integration/Graph/carts.d.ts | 10 + src/integration/Graph/checkout_template.d.ts | 35 + src/integration/Graph/checkout_templates.d.ts | 10 + src/integration/Graph/checkout_types.d.ts | 20 + src/integration/Graph/client.d.ts | 42 + src/integration/Graph/countries.d.ts | 54 + src/integration/Graph/coupon.d.ts | 64 + src/integration/Graph/coupon_code.d.ts | 30 + .../Graph/coupon_code_transaction.d.ts | 29 + .../Graph/coupon_code_transactions.d.ts | 10 + src/integration/Graph/coupon_codes.d.ts | 10 + src/integration/Graph/coupon_detail.d.ts | 40 + src/integration/Graph/coupon_details.d.ts | 10 + .../Graph/coupon_item_categories.d.ts | 10 + .../Graph/coupon_item_category.d.ts | 30 + src/integration/Graph/coupons.d.ts | 10 + src/integration/Graph/create_client.d.ts | 8 + src/integration/Graph/create_session.d.ts | 12 + src/integration/Graph/create_user.d.ts | 8 + src/integration/Graph/custom_field.d.ts | 29 + src/integration/Graph/custom_fields.d.ts | 10 + src/integration/Graph/customer.d.ts | 77 + src/integration/Graph/customer_address.d.ts | 51 + src/integration/Graph/customer_addresses.d.ts | 10 + .../Graph/customer_email_template.d.ts | 22 + .../Graph/customer_password_hash_types.d.ts | 27 + .../Graph/customer_portal_settings.d.ts | 66 + src/integration/Graph/customers.d.ts | 10 + .../Graph/default_billing_address.d.ts | 8 + .../Graph/default_payment_method.d.ts | 35 + .../Graph/default_shipping_address.d.ts | 8 + src/integration/Graph/default_store.d.ts | 8 + src/integration/Graph/default_templates.d.ts | 33 + src/integration/Graph/discount.d.ts | 44 + src/integration/Graph/discount_detail.d.ts | 32 + src/integration/Graph/discount_details.d.ts | 10 + src/integration/Graph/discounts.d.ts | 10 + src/integration/Graph/downloadable.d.ts | 40 + .../Graph/downloadable_item_categories.d.ts | 10 + .../Graph/downloadable_purchase.d.ts | 38 + src/integration/Graph/downloadables.d.ts | 10 + src/integration/Graph/email_template.d.ts | 36 + src/integration/Graph/email_templates.d.ts | 10 + src/integration/Graph/encode.d.ts | 5 + src/integration/Graph/error_entries.d.ts | 10 + src/integration/Graph/error_entry.d.ts | 38 + src/integration/Graph/fraud_protection.d.ts | 31 + src/integration/Graph/fraud_protections.d.ts | 10 + src/integration/Graph/generate_codes.d.ts | 14 + .../Graph/hosted_payment_gateway.d.ts | 8 + .../Graph/hosted_payment_gateways.d.ts | 10 + src/integration/Graph/index.d.ts | 34 + src/integration/Graph/integration.d.ts | 48 + src/integration/Graph/item.d.ts | 96 + src/integration/Graph/item_categories.d.ts | 10 + src/integration/Graph/item_category.d.ts | 72 + src/integration/Graph/item_option.d.ts | 34 + src/integration/Graph/item_options.d.ts | 10 + src/integration/Graph/items.d.ts | 10 + src/integration/Graph/language_override.d.ts | 32 + src/integration/Graph/language_overrides.d.ts | 10 + src/integration/Graph/language_strings.d.ts | 24 + src/integration/Graph/languages.d.ts | 20 + src/integration/Graph/last_transaction.d.ts | 9 + src/integration/Graph/locale_codes.d.ts | 20 + src/integration/Graph/native_integration.d.ts | 24 + .../Graph/native_integrations.d.ts | 10 + .../Graph/original_transaction.d.ts | 9 + src/integration/Graph/payment.d.ts | 49 + src/integration/Graph/payment_gateway.d.ts | 48 + src/integration/Graph/payment_gateways.d.ts | 10 + .../Graph/payment_method_expiring.d.ts | 48 + src/integration/Graph/payment_method_set.d.ts | 40 + .../payment_method_set_fraud_protection.d.ts | 30 + .../payment_method_set_fraud_protections.d.ts | 10 + ...ent_method_set_hosted_payment_gateway.d.ts | 30 + ...nt_method_set_hosted_payment_gateways.d.ts | 10 + .../Graph/payment_method_sets.d.ts | 10 + src/integration/Graph/payments.d.ts | 10 + .../Graph/process_subscription_webhook.d.ts | 5 + src/integration/Graph/process_webhook.d.ts | 5 + src/integration/Graph/property_helpers.d.ts | 57 + src/integration/Graph/receipt.d.ts | 5 + src/integration/Graph/receipt_template.d.ts | 35 + src/integration/Graph/receipt_templates.d.ts | 10 + src/integration/Graph/refund.d.ts | 5 + src/integration/Graph/regions.d.ts | 35 + src/integration/Graph/reporting.d.ts | 21 + .../Graph/reporting_email_exists.d.ts | 21 + .../Graph/reporting_store_domain_exists.d.ts | 21 + src/integration/Graph/send_emails.d.ts | 5 + src/integration/Graph/shipment.d.ts | 69 + src/integration/Graph/shipments.d.ts | 10 + .../Graph/shipping_address_types.d.ts | 20 + src/integration/Graph/shipping_container.d.ts | 33 + .../Graph/shipping_containers.d.ts | 10 + src/integration/Graph/shipping_drop_type.d.ts | 33 + .../Graph/shipping_drop_types.d.ts | 10 + src/integration/Graph/shipping_method.d.ts | 36 + src/integration/Graph/shipping_methods.d.ts | 10 + src/integration/Graph/shipping_service.d.ts | 32 + src/integration/Graph/shipping_services.d.ts | 10 + src/integration/Graph/store.d.ts | 174 + .../Graph/store_shipping_method.d.ts | 73 + .../Graph/store_shipping_service.d.ts | 36 + .../Graph/store_shipping_services.d.ts | 10 + src/integration/Graph/store_version.d.ts | 39 + src/integration/Graph/store_versions.d.ts | 10 + src/integration/Graph/stores.d.ts | 10 + src/integration/Graph/sub_token_url.d.ts | 5 + src/integration/Graph/subscription.d.ts | 66 + .../Graph/subscription_settings.d.ts | 42 + src/integration/Graph/subscriptions.d.ts | 10 + src/integration/Graph/tax.d.ts | 48 + .../Graph/tax_item_categories.d.ts | 10 + src/integration/Graph/tax_item_category.d.ts | 30 + src/integration/Graph/taxes.d.ts | 10 + src/integration/Graph/template_config.d.ts | 27 + src/integration/Graph/template_set.d.ts | 68 + src/integration/Graph/template_sets.d.ts | 10 + src/integration/Graph/timezones.d.ts | 28 + src/integration/Graph/token.d.ts | 18 + src/integration/Graph/transaction.d.ts | 125 + src/integration/Graph/transaction_log.d.ts | 34 + .../Graph/transaction_log_detail.d.ts | 25 + .../Graph/transaction_log_details.d.ts | 10 + src/integration/Graph/transaction_logs.d.ts | 10 + .../Graph/transaction_template.d.ts | 9 + src/integration/Graph/transactions.d.ts | 10 + src/integration/Graph/user.d.ts | 44 + src/integration/Graph/user_access.d.ts | 29 + src/integration/Graph/user_accesses.d.ts | 10 + src/integration/Graph/users.d.ts | 10 + src/integration/Graph/void.d.ts | 5 + src/integration/Rels.d.ts | 149 + src/integration/Signer.ts | 481 ++ src/integration/createSSOURL.ts | 81 + src/integration/index.ts | 9 + src/integration/sanitizers.ts | 80 + src/integration/verifyWebhookSignature.ts | 44 + src/ministorage.d.ts | 3 + tsconfig.json | 18 + webpack.config.js | 45 + 209 files changed, 11902 insertions(+), 874 deletions(-) delete mode 100644 index.js create mode 100644 src/.DS_Store create mode 100644 src/admin/API.ts create mode 100644 src/admin/Graph.d.ts create mode 100644 src/admin/Rels.d.ts create mode 100644 src/admin/index.ts create mode 100644 src/admin/types.d.ts create mode 100644 src/core/API/API.ts create mode 100644 src/core/API/AuthError.ts create mode 100644 src/core/API/Node.ts create mode 100644 src/core/API/ResolutionError.ts create mode 100644 src/core/API/Response.ts create mode 100644 src/core/API/index.ts create mode 100644 src/core/Graph.d.ts create mode 100644 src/core/Query/Fields.d.ts create mode 100644 src/core/Query/Order.d.ts create mode 100644 src/core/Query/Query.d.ts create mode 100644 src/core/Query/Zoom.d.ts create mode 100644 src/core/Query/index.d.ts create mode 100644 src/core/Resource/Child.d.ts create mode 100644 src/core/Resource/Embeds.d.ts create mode 100644 src/core/Resource/Links.d.ts create mode 100644 src/core/Resource/Props.d.ts create mode 100644 src/core/Resource/Resource.d.ts create mode 100644 src/core/Resource/Zooms.d.ts create mode 100644 src/core/Resource/index.d.ts create mode 100644 src/core/defaults.d.ts create mode 100644 src/core/index.ts create mode 100644 src/core/utils.d.ts create mode 100644 src/customer/API.ts create mode 100644 src/customer/Graph/attribute.d.ts create mode 100644 src/customer/Graph/attributes.d.ts create mode 100644 src/customer/Graph/default_billing_address.d.ts create mode 100644 src/customer/Graph/default_payment_method.d.ts create mode 100644 src/customer/Graph/default_shipping_address.d.ts create mode 100644 src/customer/Graph/index.d.ts create mode 100644 src/customer/Graph/item.d.ts create mode 100644 src/customer/Graph/items.d.ts create mode 100644 src/customer/Graph/subscription.d.ts create mode 100644 src/customer/Graph/subscriptions.d.ts create mode 100644 src/customer/Graph/transaction.d.ts create mode 100644 src/customer/Graph/transaction_template.d.ts create mode 100644 src/customer/Graph/transactions.d.ts create mode 100644 src/customer/Rels.d.ts create mode 100644 src/customer/index.ts create mode 100644 src/customer/types.d.ts create mode 100644 src/index.ts create mode 100644 src/integration/API.ts create mode 100644 src/integration/Graph/admin_email_template.d.ts create mode 100644 src/integration/Graph/applied_coupon_code.d.ts create mode 100644 src/integration/Graph/applied_coupon_codes.d.ts create mode 100644 src/integration/Graph/applied_tax.d.ts create mode 100644 src/integration/Graph/applied_taxes.d.ts create mode 100644 src/integration/Graph/attribute.d.ts create mode 100644 src/integration/Graph/attributes.d.ts create mode 100644 src/integration/Graph/billing_address.d.ts create mode 100644 src/integration/Graph/billing_addresses.d.ts create mode 100644 src/integration/Graph/cache.d.ts create mode 100644 src/integration/Graph/capture.d.ts create mode 100644 src/integration/Graph/cart.d.ts create mode 100644 src/integration/Graph/cart_include_template.d.ts create mode 100644 src/integration/Graph/cart_include_templates.d.ts create mode 100644 src/integration/Graph/cart_template.d.ts create mode 100644 src/integration/Graph/cart_templates.d.ts create mode 100644 src/integration/Graph/carts.d.ts create mode 100644 src/integration/Graph/checkout_template.d.ts create mode 100644 src/integration/Graph/checkout_templates.d.ts create mode 100644 src/integration/Graph/checkout_types.d.ts create mode 100644 src/integration/Graph/client.d.ts create mode 100644 src/integration/Graph/countries.d.ts create mode 100644 src/integration/Graph/coupon.d.ts create mode 100644 src/integration/Graph/coupon_code.d.ts create mode 100644 src/integration/Graph/coupon_code_transaction.d.ts create mode 100644 src/integration/Graph/coupon_code_transactions.d.ts create mode 100644 src/integration/Graph/coupon_codes.d.ts create mode 100644 src/integration/Graph/coupon_detail.d.ts create mode 100644 src/integration/Graph/coupon_details.d.ts create mode 100644 src/integration/Graph/coupon_item_categories.d.ts create mode 100644 src/integration/Graph/coupon_item_category.d.ts create mode 100644 src/integration/Graph/coupons.d.ts create mode 100644 src/integration/Graph/create_client.d.ts create mode 100644 src/integration/Graph/create_session.d.ts create mode 100644 src/integration/Graph/create_user.d.ts create mode 100644 src/integration/Graph/custom_field.d.ts create mode 100644 src/integration/Graph/custom_fields.d.ts create mode 100644 src/integration/Graph/customer.d.ts create mode 100644 src/integration/Graph/customer_address.d.ts create mode 100644 src/integration/Graph/customer_addresses.d.ts create mode 100644 src/integration/Graph/customer_email_template.d.ts create mode 100644 src/integration/Graph/customer_password_hash_types.d.ts create mode 100644 src/integration/Graph/customer_portal_settings.d.ts create mode 100644 src/integration/Graph/customers.d.ts create mode 100644 src/integration/Graph/default_billing_address.d.ts create mode 100644 src/integration/Graph/default_payment_method.d.ts create mode 100644 src/integration/Graph/default_shipping_address.d.ts create mode 100644 src/integration/Graph/default_store.d.ts create mode 100644 src/integration/Graph/default_templates.d.ts create mode 100644 src/integration/Graph/discount.d.ts create mode 100644 src/integration/Graph/discount_detail.d.ts create mode 100644 src/integration/Graph/discount_details.d.ts create mode 100644 src/integration/Graph/discounts.d.ts create mode 100644 src/integration/Graph/downloadable.d.ts create mode 100644 src/integration/Graph/downloadable_item_categories.d.ts create mode 100644 src/integration/Graph/downloadable_purchase.d.ts create mode 100644 src/integration/Graph/downloadables.d.ts create mode 100644 src/integration/Graph/email_template.d.ts create mode 100644 src/integration/Graph/email_templates.d.ts create mode 100644 src/integration/Graph/encode.d.ts create mode 100644 src/integration/Graph/error_entries.d.ts create mode 100644 src/integration/Graph/error_entry.d.ts create mode 100644 src/integration/Graph/fraud_protection.d.ts create mode 100644 src/integration/Graph/fraud_protections.d.ts create mode 100644 src/integration/Graph/generate_codes.d.ts create mode 100644 src/integration/Graph/hosted_payment_gateway.d.ts create mode 100644 src/integration/Graph/hosted_payment_gateways.d.ts create mode 100644 src/integration/Graph/index.d.ts create mode 100644 src/integration/Graph/integration.d.ts create mode 100644 src/integration/Graph/item.d.ts create mode 100644 src/integration/Graph/item_categories.d.ts create mode 100644 src/integration/Graph/item_category.d.ts create mode 100644 src/integration/Graph/item_option.d.ts create mode 100644 src/integration/Graph/item_options.d.ts create mode 100644 src/integration/Graph/items.d.ts create mode 100644 src/integration/Graph/language_override.d.ts create mode 100644 src/integration/Graph/language_overrides.d.ts create mode 100644 src/integration/Graph/language_strings.d.ts create mode 100644 src/integration/Graph/languages.d.ts create mode 100644 src/integration/Graph/last_transaction.d.ts create mode 100644 src/integration/Graph/locale_codes.d.ts create mode 100644 src/integration/Graph/native_integration.d.ts create mode 100644 src/integration/Graph/native_integrations.d.ts create mode 100644 src/integration/Graph/original_transaction.d.ts create mode 100644 src/integration/Graph/payment.d.ts create mode 100644 src/integration/Graph/payment_gateway.d.ts create mode 100644 src/integration/Graph/payment_gateways.d.ts create mode 100644 src/integration/Graph/payment_method_expiring.d.ts create mode 100644 src/integration/Graph/payment_method_set.d.ts create mode 100644 src/integration/Graph/payment_method_set_fraud_protection.d.ts create mode 100644 src/integration/Graph/payment_method_set_fraud_protections.d.ts create mode 100644 src/integration/Graph/payment_method_set_hosted_payment_gateway.d.ts create mode 100644 src/integration/Graph/payment_method_set_hosted_payment_gateways.d.ts create mode 100644 src/integration/Graph/payment_method_sets.d.ts create mode 100644 src/integration/Graph/payments.d.ts create mode 100644 src/integration/Graph/process_subscription_webhook.d.ts create mode 100644 src/integration/Graph/process_webhook.d.ts create mode 100644 src/integration/Graph/property_helpers.d.ts create mode 100644 src/integration/Graph/receipt.d.ts create mode 100644 src/integration/Graph/receipt_template.d.ts create mode 100644 src/integration/Graph/receipt_templates.d.ts create mode 100644 src/integration/Graph/refund.d.ts create mode 100644 src/integration/Graph/regions.d.ts create mode 100644 src/integration/Graph/reporting.d.ts create mode 100644 src/integration/Graph/reporting_email_exists.d.ts create mode 100644 src/integration/Graph/reporting_store_domain_exists.d.ts create mode 100644 src/integration/Graph/send_emails.d.ts create mode 100644 src/integration/Graph/shipment.d.ts create mode 100644 src/integration/Graph/shipments.d.ts create mode 100644 src/integration/Graph/shipping_address_types.d.ts create mode 100644 src/integration/Graph/shipping_container.d.ts create mode 100644 src/integration/Graph/shipping_containers.d.ts create mode 100644 src/integration/Graph/shipping_drop_type.d.ts create mode 100644 src/integration/Graph/shipping_drop_types.d.ts create mode 100644 src/integration/Graph/shipping_method.d.ts create mode 100644 src/integration/Graph/shipping_methods.d.ts create mode 100644 src/integration/Graph/shipping_service.d.ts create mode 100644 src/integration/Graph/shipping_services.d.ts create mode 100644 src/integration/Graph/store.d.ts create mode 100644 src/integration/Graph/store_shipping_method.d.ts create mode 100644 src/integration/Graph/store_shipping_service.d.ts create mode 100644 src/integration/Graph/store_shipping_services.d.ts create mode 100644 src/integration/Graph/store_version.d.ts create mode 100644 src/integration/Graph/store_versions.d.ts create mode 100644 src/integration/Graph/stores.d.ts create mode 100644 src/integration/Graph/sub_token_url.d.ts create mode 100644 src/integration/Graph/subscription.d.ts create mode 100644 src/integration/Graph/subscription_settings.d.ts create mode 100644 src/integration/Graph/subscriptions.d.ts create mode 100644 src/integration/Graph/tax.d.ts create mode 100644 src/integration/Graph/tax_item_categories.d.ts create mode 100644 src/integration/Graph/tax_item_category.d.ts create mode 100644 src/integration/Graph/taxes.d.ts create mode 100644 src/integration/Graph/template_config.d.ts create mode 100644 src/integration/Graph/template_set.d.ts create mode 100644 src/integration/Graph/template_sets.d.ts create mode 100644 src/integration/Graph/timezones.d.ts create mode 100644 src/integration/Graph/token.d.ts create mode 100644 src/integration/Graph/transaction.d.ts create mode 100644 src/integration/Graph/transaction_log.d.ts create mode 100644 src/integration/Graph/transaction_log_detail.d.ts create mode 100644 src/integration/Graph/transaction_log_details.d.ts create mode 100644 src/integration/Graph/transaction_logs.d.ts create mode 100644 src/integration/Graph/transaction_template.d.ts create mode 100644 src/integration/Graph/transactions.d.ts create mode 100644 src/integration/Graph/user.d.ts create mode 100644 src/integration/Graph/user_access.d.ts create mode 100644 src/integration/Graph/user_accesses.d.ts create mode 100644 src/integration/Graph/users.d.ts create mode 100644 src/integration/Graph/void.d.ts create mode 100644 src/integration/Rels.d.ts create mode 100644 src/integration/Signer.ts create mode 100644 src/integration/createSSOURL.ts create mode 100644 src/integration/index.ts create mode 100755 src/integration/sanitizers.ts create mode 100755 src/integration/verifyWebhookSignature.ts create mode 100644 src/ministorage.d.ts create mode 100755 tsconfig.json create mode 100644 webpack.config.js diff --git a/index.js b/index.js deleted file mode 100644 index 1a39415..0000000 --- a/index.js +++ /dev/null @@ -1,3 +0,0 @@ -throw new Error( - "@foxy.io/sdk has not reached version 1 yet. If you'd like to preview what this SDK will offer in the future, please use the beta distribution channel or build the package from source using the beta branch of our GitHub repo." -); diff --git a/package-lock.json b/package-lock.json index 3db6e90..d413bdf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,594 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@aws-amplify/auth": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/@aws-amplify/auth/-/auth-3.4.10.tgz", + "integrity": "sha512-SEne3/8cen2J85QvXHR7KfWw9eRAlCBekkfGUCeEfp4S9sWhWAoA5FVEVeOOK8arEHupRanjPZk/fKp6povYNg==", + "requires": { + "@aws-amplify/cache": "^3.1.35", + "@aws-amplify/core": "^3.8.2", + "amazon-cognito-identity-js": "^4.5.3", + "crypto-js": "^3.3.0" + }, + "dependencies": { + "crypto-js": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", + "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" + } + } + }, + "@aws-amplify/cache": { + "version": "3.1.35", + "resolved": "https://registry.npmjs.org/@aws-amplify/cache/-/cache-3.1.35.tgz", + "integrity": "sha512-PBpEjINpmDJ5HflaAHJ1EpiT7JT22lehO+BuYRE9Wj9xLN3u/l4RSFgHMJVacJfWEQy7yscsIxNQccN+VTs8xw==", + "requires": { + "@aws-amplify/core": "^3.8.2" + } + }, + "@aws-amplify/core": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@aws-amplify/core/-/core-3.8.2.tgz", + "integrity": "sha512-Dzfgkda+2wShw30GljitL8nu02XdeXfxD8C0KpbCOA+aoPY3f1np/6ExvPYW7y/oMP5MN8lEMc+wCwYhWB0e8A==", + "requires": { + "@aws-crypto/sha256-js": "1.0.0-alpha.0", + "@aws-sdk/client-cognito-identity": "1.0.0-gamma.8", + "@aws-sdk/credential-provider-cognito-identity": "1.0.0-gamma.8", + "@aws-sdk/node-http-handler": "1.0.0-gamma.7", + "@aws-sdk/types": "1.0.0-gamma.6", + "@aws-sdk/util-hex-encoding": "1.0.0-gamma.6", + "@aws-sdk/util-user-agent-browser": "1.0.0-gamma.7", + "universal-cookie": "^4.0.4", + "url": "^0.11.0", + "zen-observable-ts": "0.8.19" + } + }, + "@aws-crypto/ie11-detection": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-1.0.0.tgz", + "integrity": "sha512-kCKVhCF1oDxFYgQrxXmIrS5oaWulkvRcPz+QBDMsUr2crbF4VGgGT6+uQhSwJFdUAQ2A//Vq+uT83eJrkzFgXA==", + "requires": { + "tslib": "^1.11.1" + } + }, + "@aws-crypto/sha256-browser": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-1.0.0.tgz", + "integrity": "sha512-uSufui4ZktC5lYX6bDxgBgNboxGyw9V9V+rlcNsNTxh4YPhOdCslwJMGntiWOBRGAgXhhvWi7FqnTS2SaT3cpg==", + "requires": { + "@aws-crypto/ie11-detection": "^1.0.0", + "@aws-crypto/sha256-js": "^1.0.0", + "@aws-crypto/supports-web-crypto": "^1.0.0", + "@aws-sdk/types": "^1.0.0-rc.1", + "@aws-sdk/util-locate-window": "^1.0.0-rc.1", + "@aws-sdk/util-utf8-browser": "^1.0.0-rc.1", + "tslib": "^1.11.1" + }, + "dependencies": { + "@aws-crypto/sha256-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.0.0.tgz", + "integrity": "sha512-89kqtFs/tdHBFHEBXZ4UXlCISswvEor3BVVOriR68Tbk1Qe1zBOZtfbSOt3CDT69z88x5uM558YW9k8I1xei5A==", + "requires": { + "@aws-sdk/types": "^1.0.0-rc.1", + "@aws-sdk/util-utf8-browser": "^1.0.0-rc.1", + "tslib": "^1.11.1" + } + }, + "@aws-sdk/types": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-1.0.0-rc.3.tgz", + "integrity": "sha512-pKKR2SXG8IHbWcmVgFwLUrHqqqFOEuf5JiQmP7dEBjUXqavzDnqFUY7g9PGuM8928IQqL7IXrRsK7R+VbLgodQ==" + } + } + }, + "@aws-crypto/sha256-js": { + "version": "1.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.0.0-alpha.0.tgz", + "integrity": "sha512-GidX2lccEtHZw8mXDKJQj6tea7qh3pAnsNSp1eZNxsN4MMu2OvSraPSqiB1EihsQkZBMg0IiZPpZHoACUX/QMQ==", + "requires": { + "@aws-sdk/types": "^1.0.0-alpha.0", + "@aws-sdk/util-utf8-browser": "^1.0.0-alpha.0", + "tslib": "^1.9.3" + } + }, + "@aws-crypto/supports-web-crypto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-1.0.0.tgz", + "integrity": "sha512-IHLfv+WmVH89EW4n6a5eE8/hUlz6qkWGMn/v4r5ZgzcXdTC5nolii2z3k46y01hWRiC2PPhOdeSLzMUCUMco7g==", + "requires": { + "tslib": "^1.11.1" + } + }, + "@aws-sdk/abort-controller": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-1.0.0-gamma.7.tgz", + "integrity": "sha512-21RG318IO6905SClJuHAxRuIiuCcg9uoCDnuGXXdNmLEOpmjeTWf1N4AESs3p+HyAflIdpHVWnJGsEeWgEGghA==", + "requires": { + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/client-cognito-identity": { + "version": "1.0.0-gamma.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-1.0.0-gamma.8.tgz", + "integrity": "sha512-N/xAm36p8N8IRWJFSQqodrGxSd9/XapBZH1Dc26rL8eVKdhxjTdQ3Gi7ga/xrv9WYd9kYUg9ONVQrYtet4Ej/g==", + "requires": { + "@aws-crypto/sha256-browser": "^1.0.0-alpha.0", + "@aws-crypto/sha256-js": "^1.0.0-alpha.0", + "@aws-sdk/config-resolver": "1.0.0-gamma.7", + "@aws-sdk/credential-provider-node": "1.0.0-gamma.7", + "@aws-sdk/fetch-http-handler": "1.0.0-gamma.8", + "@aws-sdk/hash-node": "1.0.0-gamma.7", + "@aws-sdk/invalid-dependency": "1.0.0-gamma.5", + "@aws-sdk/middleware-content-length": "1.0.0-gamma.7", + "@aws-sdk/middleware-host-header": "1.0.0-gamma.7", + "@aws-sdk/middleware-logger": "1.0.0-gamma.1", + "@aws-sdk/middleware-retry": "1.0.0-gamma.7", + "@aws-sdk/middleware-serde": "1.0.0-gamma.6", + "@aws-sdk/middleware-signing": "1.0.0-gamma.7", + "@aws-sdk/middleware-stack": "1.0.0-gamma.7", + "@aws-sdk/middleware-user-agent": "1.0.0-gamma.7", + "@aws-sdk/node-config-provider": "1.0.0-gamma.2", + "@aws-sdk/node-http-handler": "1.0.0-gamma.7", + "@aws-sdk/protocol-http": "1.0.0-gamma.7", + "@aws-sdk/smithy-client": "1.0.0-gamma.7", + "@aws-sdk/types": "1.0.0-gamma.6", + "@aws-sdk/url-parser-browser": "1.0.0-gamma.7", + "@aws-sdk/url-parser-node": "1.0.0-gamma.7", + "@aws-sdk/util-base64-browser": "1.0.0-gamma.6", + "@aws-sdk/util-base64-node": "1.0.0-gamma.6", + "@aws-sdk/util-body-length-browser": "1.0.0-gamma.6", + "@aws-sdk/util-body-length-node": "1.0.0-gamma.6", + "@aws-sdk/util-user-agent-browser": "1.0.0-gamma.7", + "@aws-sdk/util-user-agent-node": "1.0.0-gamma.7", + "@aws-sdk/util-utf8-browser": "1.0.0-gamma.6", + "@aws-sdk/util-utf8-node": "1.0.0-gamma.6", + "tslib": "^2.0.0" + }, + "dependencies": { + "@aws-sdk/util-utf8-browser": { + "version": "1.0.0-gamma.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-1.0.0-gamma.6.tgz", + "integrity": "sha512-JIT2wPZKdOGynAD6V5ZhGT1XlHJbOWAYn0zQUgf4fkfcwwsfjXp9MALptdavKG/N7plq6p7z5JxMUP/VGKXyYA==", + "requires": { + "tslib": "^1.8.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } + } + }, + "@aws-sdk/config-resolver": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-1.0.0-gamma.7.tgz", + "integrity": "sha512-X8Zg11VY4E1TCcIckbCwQuL1wStN2Mi3Oxm3kdON5lO8cx9Fka/zICBSee0gEiAkbcwcUgKy51NA0teMPqFZqg==", + "requires": { + "@aws-sdk/signature-v4": "1.0.0-gamma.7", + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/credential-provider-cognito-identity": { + "version": "1.0.0-gamma.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-1.0.0-gamma.8.tgz", + "integrity": "sha512-tMnysEykVbrVE20zeKae0hYW9RDw9CSGIZ469Y7GnyGK7sTzh35OHZgZ2XrUPjN7GKJuV2wh5cJ0da/tnGgWCA==", + "requires": { + "@aws-sdk/client-cognito-identity": "1.0.0-gamma.8", + "@aws-sdk/property-provider": "1.0.0-gamma.7", + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/credential-provider-env": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-1.0.0-gamma.7.tgz", + "integrity": "sha512-xc1Beg0KZ9jiy7LqgywlsYUu3U+9H46foO0uuoBJI9a1AOgG0wuRBNf6/4h5McOQTdTgqfrQgsamkwki5lV44Q==", + "requires": { + "@aws-sdk/property-provider": "1.0.0-gamma.7", + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/credential-provider-imds": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-1.0.0-gamma.7.tgz", + "integrity": "sha512-TkvcSiqY0/XIsJrlPx6tOkN0iNq86Twmkk9D4YbGU9BK3awX0Hb9HIBLk5DptVURWZxDnOyUM+eHktAS/bUEOQ==", + "requires": { + "@aws-sdk/property-provider": "1.0.0-gamma.7", + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-1.0.0-gamma.7.tgz", + "integrity": "sha512-pBR8WXmt4SW5Efm9DrapnAhl5xUzG5QwnPqnoSFTFwg9NnzCo2ispfJ27hc7Yx9VPtYTv4IUYuayQUIsojiC/w==", + "requires": { + "@aws-sdk/property-provider": "1.0.0-gamma.7", + "@aws-sdk/shared-ini-file-loader": "1.0.0-gamma.6", + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-1.0.0-gamma.7.tgz", + "integrity": "sha512-SW9HD3OYjiFkj4HVPkheSEyK2FG9QPzGup9BodPwlnAmSbLrvsLNKzJfA5lwBPAXSoI/IuNK95aCF6mO3ldP3A==", + "requires": { + "@aws-sdk/credential-provider-env": "1.0.0-gamma.7", + "@aws-sdk/credential-provider-imds": "1.0.0-gamma.7", + "@aws-sdk/credential-provider-ini": "1.0.0-gamma.7", + "@aws-sdk/credential-provider-process": "1.0.0-gamma.7", + "@aws-sdk/property-provider": "1.0.0-gamma.7", + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/credential-provider-process": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-1.0.0-gamma.7.tgz", + "integrity": "sha512-Je2aLOVstN8mq/ipuVqRlLC1Vg9KDSju4HWRWmHX/hqkxZZoPFo8fSEe7/lkNqLAu/I9kG0dXvcO/xCbzZ3geg==", + "requires": { + "@aws-sdk/credential-provider-ini": "1.0.0-gamma.7", + "@aws-sdk/property-provider": "1.0.0-gamma.7", + "@aws-sdk/shared-ini-file-loader": "1.0.0-gamma.6", + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/fetch-http-handler": { + "version": "1.0.0-gamma.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-1.0.0-gamma.8.tgz", + "integrity": "sha512-63MMgxLxtC70x/0dH1BeYscJk+xiaKCZKWy+3s7rCxTVDxdkWL60FhE620bhF5fUD6J+5fPKxjBtawojun5xCA==", + "requires": { + "@aws-sdk/protocol-http": "1.0.0-gamma.7", + "@aws-sdk/querystring-builder": "1.0.0-gamma.7", + "@aws-sdk/types": "1.0.0-gamma.6", + "@aws-sdk/util-base64-browser": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/hash-node": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-1.0.0-gamma.7.tgz", + "integrity": "sha512-FLpwEXd36dGWOwrjANzOl+0ase7VK+Mubd8Xi5w2VLfv3+94iMtdQllYpyl0uJdBm9IV5Hz291B/9BhCutTeVA==", + "requires": { + "@aws-sdk/types": "1.0.0-gamma.6", + "@aws-sdk/util-buffer-from": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/invalid-dependency": { + "version": "1.0.0-gamma.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-1.0.0-gamma.5.tgz", + "integrity": "sha512-oQznDe4+m3xBRZq9NbEtaZqdpEqcNAExJbfwfF9DQHmUiRZdoEhU36v87Buxv8a3UMa5a0QvMrzSQJhIhfSBZw==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/is-array-buffer": { + "version": "1.0.0-gamma.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-1.0.0-gamma.6.tgz", + "integrity": "sha512-F80N+xct+ZFhtvwVCAq2IugjL5KrhzkYLl/q/A3qGLTTCsDsh4sbL8KxRbp8OQZyuq8OCcrlRPlt1fvFBjQJ9w==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/middleware-content-length": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-1.0.0-gamma.7.tgz", + "integrity": "sha512-VvmnYedZk09loKqZ6wQYjIqFzXAw0my5wsRpLkgBXVAcuQ9O4hzm2TyB7vRK0WnNTi2Q0Fr1BSPlKSQaxVZang==", + "requires": { + "@aws-sdk/protocol-http": "1.0.0-gamma.7", + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/middleware-host-header": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-1.0.0-gamma.7.tgz", + "integrity": "sha512-1w8HQ8CQuDK0dOT31cQ/JT1iPTlEM3nLFZWXigeCY0Rhq0oZiZjwWy1htZzi7UNmxOC2Ff+HN73EoiKoXFTfFg==", + "requires": { + "@aws-sdk/protocol-http": "1.0.0-gamma.7", + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/middleware-logger": { + "version": "1.0.0-gamma.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-1.0.0-gamma.1.tgz", + "integrity": "sha512-54b+6SHBSa/oazUoqRqimkp4x/jnA3PQJu3uPuZJ9NvmCeovX0dobW6323TVY/7Hn5DzV/vSTj0WW76f/c12gw==", + "requires": { + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/middleware-retry": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-1.0.0-gamma.7.tgz", + "integrity": "sha512-VCs/woQIF5VvYOc/HEvpHYa/SpKqqWhDhh44mo2G5D+qjdvlGNWjD4bi7ad1+d5Uczf4r7DlKz/wHbUP5pBKbA==", + "requires": { + "@aws-sdk/protocol-http": "1.0.0-gamma.7", + "@aws-sdk/service-error-classification": "1.0.0-gamma.7", + "@aws-sdk/types": "1.0.0-gamma.6", + "react-native-get-random-values": "^1.4.0", + "tslib": "^1.8.0", + "uuid": "^3.0.0" + } + }, + "@aws-sdk/middleware-serde": { + "version": "1.0.0-gamma.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-1.0.0-gamma.6.tgz", + "integrity": "sha512-pTOjbgLNQlZ9ck27D5aCg+7UfLlFOQqrihRrXXSf4Dc4zt5mS99rbToSzbY3m9Bfo7DmIG4epn+gERFr/cz5dg==", + "requires": { + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/middleware-signing": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-1.0.0-gamma.7.tgz", + "integrity": "sha512-WnUH2ysHUb/sYvuWrn5M96O4ViNwA6xVaK2g0UmzEspkYri/xcbGwvZhmiSxgp5QUeZAbgMR9lzwiLCI5Ft5Jg==", + "requires": { + "@aws-sdk/protocol-http": "1.0.0-gamma.7", + "@aws-sdk/signature-v4": "1.0.0-gamma.7", + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/middleware-stack": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-1.0.0-gamma.7.tgz", + "integrity": "sha512-lv1HDQVM6ulVnhAB+5DmGLTJfToxapM4AvbWk2lNVJeWiv7AGyDJV+B+kby240T2u+DdcTPtLbQ35usDexiVXw==", + "requires": { + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-1.0.0-gamma.7.tgz", + "integrity": "sha512-BNSEx+iuEpuIFWiCwtecGQyBG8bk0m5NrztlTlpvgX3cq9Ks4atIXQAfrUn6WzJ1OEhvwFpHizzMdwRhK00tZg==", + "requires": { + "@aws-sdk/protocol-http": "1.0.0-gamma.7", + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/node-config-provider": { + "version": "1.0.0-gamma.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-1.0.0-gamma.2.tgz", + "integrity": "sha512-ByKHCZPZ5X/mPiTf6ruPdis2IxPvOHcgrgFiaHI0b1Pc61u7VsTDc0k8ydMZPUnuSi3MyRTC/WqhT4IdySFQxw==", + "requires": { + "@aws-sdk/property-provider": "1.0.0-gamma.7", + "@aws-sdk/shared-ini-file-loader": "1.0.0-gamma.6", + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/node-http-handler": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-1.0.0-gamma.7.tgz", + "integrity": "sha512-/qHRR8l0q8ALah+dNX0vd6rZFmdzNxmhdZDwifeYu9qo7W3ZPRBYC8u1uFrNTZKEbWCcGb25tnLvkAyQeBmYKQ==", + "requires": { + "@aws-sdk/abort-controller": "1.0.0-gamma.7", + "@aws-sdk/protocol-http": "1.0.0-gamma.7", + "@aws-sdk/querystring-builder": "1.0.0-gamma.7", + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/property-provider": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-1.0.0-gamma.7.tgz", + "integrity": "sha512-WKsV7RVkHy/uoc/BIwQm8lFwks1/kEE/U1qcO/diefQLeNK99aAxuOH7wahZUvD6Mb0iEI/0joTG2xe9CMqZyw==", + "requires": { + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/protocol-http": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-1.0.0-gamma.7.tgz", + "integrity": "sha512-KJsseiQd9ZckiC0TSbMckzclVY5QSL+5VkNlf0dSVmXMv2JzaSpJUt9SviNS9EVviNmzbyRHjaQy4/O6JN+Svg==", + "requires": { + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/querystring-builder": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-1.0.0-gamma.7.tgz", + "integrity": "sha512-eOb1z8DtSD3/z9bbAEcRvVI4a1H/Jnv+PlsBarUo6skonlRbyK/wH73DsIJg4tZCGc87mFJq+8e2z1V7w3Isbw==", + "requires": { + "@aws-sdk/types": "1.0.0-gamma.6", + "@aws-sdk/util-uri-escape": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/querystring-parser": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-1.0.0-gamma.7.tgz", + "integrity": "sha512-L1J8+rc+dlDr/+FW4j5iwZRWC16syP2bRpAEinQkqWWlSc5a4OoQNG0rk/Kxw1HZTc2hQKpuWkwLb5RFlnksCg==", + "requires": { + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/service-error-classification": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-1.0.0-gamma.7.tgz", + "integrity": "sha512-PtZ4GNqccq0re3PoFRSyysPSuk91oTpz8FLBaesz7K8FJ6Zp21/+QfAGoatU4YOGV1crdtwCSZhClVq875FfwA==" + }, + "@aws-sdk/shared-ini-file-loader": { + "version": "1.0.0-gamma.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-1.0.0-gamma.6.tgz", + "integrity": "sha512-K5FHebfLt4zqeIM88ndfuVXnpDa5GTHINy/AcqYW/wkjk5+gxahMChYtvRBJaX/9sbf1g7YYhGXGuuCednWiQg==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/signature-v4": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-1.0.0-gamma.7.tgz", + "integrity": "sha512-t5TMlyTwOqzkNJ1aBS7E5SgqMqO6MDssdn0hpes1l+6H1n9FXpRSBhTC9Dy5ZEA+v59WoS8p0IUnheHn8t1pGA==", + "requires": { + "@aws-sdk/is-array-buffer": "1.0.0-gamma.6", + "@aws-sdk/types": "1.0.0-gamma.6", + "@aws-sdk/util-hex-encoding": "1.0.0-gamma.6", + "@aws-sdk/util-uri-escape": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/smithy-client": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-1.0.0-gamma.7.tgz", + "integrity": "sha512-gTvR+cFYv94/1ijHQWgwi0upx+mumERR8ymrl/q8nrjOWJsf02j3FD7Tu10QlA1Hk6qCx43MWeEv86kD6sO0rw==", + "requires": { + "@aws-sdk/middleware-stack": "1.0.0-gamma.7", + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/types": { + "version": "1.0.0-gamma.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-1.0.0-gamma.6.tgz", + "integrity": "sha512-5mQGLqXw269oXH4bxA3iK+Pnhy72wjIa6ccsLJVypyk1ZYiJq8Xk/ratosvZ4CDAnSwnUS1BibtxP8zrY14HnA==" + }, + "@aws-sdk/url-parser-browser": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser-browser/-/url-parser-browser-1.0.0-gamma.7.tgz", + "integrity": "sha512-LKcNpxTENDMPu70wFKB/S3QVtOzJz+liorRiRq07JtkH0ct4ScvFFL0CIVu3DXCkhmaL6nk9Ez6pv2+r6+goWw==", + "requires": { + "@aws-sdk/querystring-parser": "1.0.0-gamma.7", + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/url-parser-node": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser-node/-/url-parser-node-1.0.0-gamma.7.tgz", + "integrity": "sha512-akR4BFHD47mNeT3jsN11LrHsCf4QmtVmbOlnmSezdic96cnPkfPnK/VtGElsjrLeklHeKNAC0xacu24Zp4n1qA==", + "requires": { + "@aws-sdk/querystring-parser": "1.0.0-gamma.7", + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0", + "url": "^0.11.0" + } + }, + "@aws-sdk/util-base64-browser": { + "version": "1.0.0-gamma.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-1.0.0-gamma.6.tgz", + "integrity": "sha512-8c1K6rXLEIu0sOqj8ynFFsD9LB0SNZ/WgBS58Vt9Q+U4UZ14OQMfoK2f1VmFvgSv+w8ztz/fcwXs2aJpld6oBw==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-base64-node": { + "version": "1.0.0-gamma.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-1.0.0-gamma.6.tgz", + "integrity": "sha512-Rlhui8eN3x5Iyt52+K5A67hZAFUEjDI612+cCgOWrgc2lWx/H4byva5HlND9V/ac3302QqBPDpx9DSh65CFY+Q==", + "requires": { + "@aws-sdk/util-buffer-from": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-body-length-browser": { + "version": "1.0.0-gamma.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-1.0.0-gamma.6.tgz", + "integrity": "sha512-ovrZJoSCS87nt+Mncd29gMWxZp2UDDeDbCgoFxAzO2P45k4DSHO6311SNz+zNJQ90SWZpy971WNRKUJlzvR+qw==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-body-length-node": { + "version": "1.0.0-gamma.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-1.0.0-gamma.6.tgz", + "integrity": "sha512-BiTFGEoOpXkCsdCJcZgCWpwUiX+hO7/VvqtEoImu/hJkUiDB9fkTXqWVWN+PHk8ao4DdJ9KDkp4eEwy9/+sqew==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-buffer-from": { + "version": "1.0.0-gamma.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-1.0.0-gamma.6.tgz", + "integrity": "sha512-VRfP8B1Uduf9fpnUynVA9D61RZWLoy8cWcZheuLaR2CWLEzh3Sq9NeHmybMeSEFXWrgrMNkZ8TccRH3qL3goDA==", + "requires": { + "@aws-sdk/is-array-buffer": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-hex-encoding": { + "version": "1.0.0-gamma.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-1.0.0-gamma.6.tgz", + "integrity": "sha512-bIRIhdAfQH94dWp6lE8OAu4+ghGuRFRDWfIm5id+ekwwPeCI82kxnXUxbI/U3zeQqj/PX96ZD64/SPYd1+cklg==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-locate-window": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-1.0.0-rc.3.tgz", + "integrity": "sha512-ioJ+/wneV6Q0ulOz7SLzacISHAMTwSGzhxBiuD/OMtiyoErZch2oc5h+PNh5Vc5jLV33R1jW01jz1pP1SVY+jQ==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-uri-escape": { + "version": "1.0.0-gamma.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-1.0.0-gamma.6.tgz", + "integrity": "sha512-U11YFhWSwyobmWF03Q5QRxLjG6sN/mfss58ue0KTKFhuTJxdrQ/Y+Aj/7TNSnVBNfHZqz7aETGz5HHD4ccgSAA==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-1.0.0-gamma.7.tgz", + "integrity": "sha512-9T86rQBzulki2F7WF0MWCpe8lv764luBpM4RY1oP+aeCF5zU7Q0XsGm1UeSBKupQBMN4v0OV1LHTvXqWGcEkbA==", + "requires": { + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "1.0.0-gamma.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-1.0.0-gamma.7.tgz", + "integrity": "sha512-dLQfS9ADWBgBNMQ2+IWPuqkJ+RoqV4zBeyDd2ECNu2w7WsfcfeuiGR0VPQDFUJbGS+y+cY21NBRO1IXGMIzhfg==", + "requires": { + "@aws-sdk/types": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-utf8-browser": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-1.0.0-rc.3.tgz", + "integrity": "sha512-ypEJ2zsfm844dPSnES5lvS80Jb6hQ7D9iu0TUKQfIVu0LernJaAiSM05UEbktN+bEAoQBi9S64l8JjHVKFWu1Q==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-utf8-node": { + "version": "1.0.0-gamma.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-1.0.0-gamma.6.tgz", + "integrity": "sha512-mci/TC5dFV8SXMsfVwra3ktFWlzXEFFFXaFcNFMZmcbTakzerjpbTp6KHfOC3/seXPf8ErsDgY4X2ZxT4ue8aw==", + "requires": { + "@aws-sdk/util-buffer-from": "1.0.0-gamma.6", + "tslib": "^1.8.0" + } + }, "@babel/code-frame": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", @@ -28,6 +616,38 @@ "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@babel/runtime": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/runtime-corejs3": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.12.5.tgz", + "integrity": "sha512-roGr54CsTmNPPzZoCP1AmDXuBoNao7tnSA83TXTwt+UK5QVyh1DIJnrgYRPWKCF2flqZQXwa7Yr8v7VmLzF0YQ==", + "dev": true, + "requires": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.4" } }, "@commitlint/execute-rule": { @@ -53,16 +673,12 @@ "resolve-from": "^5.0.0" }, "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "optional": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } + "optional": true } } }, @@ -77,6 +693,15 @@ "lodash": "^4.17.19", "resolve-from": "^5.0.0", "resolve-global": "^1.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "optional": true + } } }, "@commitlint/types": { @@ -86,6 +711,49 @@ "dev": true, "optional": true }, + "@eslint/eslintrc": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz", + "integrity": "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "@foxy.io/eslint-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@foxy.io/eslint-config/-/eslint-config-1.0.0.tgz", + "integrity": "sha512-CkyA5/F5IvCV8TK+DRhoHucO0YrQYIdcYglElKwsaQ9+gQm9K3IXWt8dEugMG5yGrxHBb8Df/1ZYfbN03PsSHA==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "^4.6.0", + "@typescript-eslint/parser": "^4.6.0", + "eslint-config-prettier": "^6.15.0", + "eslint-plugin-html": "^6.1.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jsdoc": "^30.7.3", + "eslint-plugin-lit-a11y": "^1.0.1", + "eslint-plugin-sort-class-members": "^1.8.0", + "eslint-plugin-typescript-sort-keys": "^1.5.0" + } + }, "@nodelib/fs.scandir": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", @@ -290,111 +958,42 @@ "import-from": "^3.0.0", "lodash": "^4.17.4", "micromatch": "^4.0.2" + } + }, + "@semantic-release/error": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-2.2.0.tgz", + "integrity": "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==", + "dev": true + }, + "@semantic-release/github": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-7.1.1.tgz", + "integrity": "sha512-w8CLCvGVKNe2FPOYQ68OFxFVNNha7YRzptnwTZYdjXYtgTDKw0XVfnMSd9NlJeQPYGfQmIhIVPNBU/cA6zUY0A==", + "dev": true, + "requires": { + "@octokit/rest": "^17.0.0", + "@semantic-release/error": "^2.2.0", + "aggregate-error": "^3.0.0", + "bottleneck": "^2.18.1", + "debug": "^4.0.0", + "dir-glob": "^3.0.0", + "fs-extra": "^9.0.0", + "globby": "^11.0.0", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "issue-parser": "^6.0.0", + "lodash": "^4.17.4", + "mime": "^2.4.3", + "p-filter": "^2.0.0", + "p-retry": "^4.0.0", + "url-join": "^4.0.0" }, "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "@semantic-release/error": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-2.2.0.tgz", - "integrity": "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==", - "dev": true - }, - "@semantic-release/github": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-7.1.1.tgz", - "integrity": "sha512-w8CLCvGVKNe2FPOYQ68OFxFVNNha7YRzptnwTZYdjXYtgTDKw0XVfnMSd9NlJeQPYGfQmIhIVPNBU/cA6zUY0A==", - "dev": true, - "requires": { - "@octokit/rest": "^17.0.0", - "@semantic-release/error": "^2.2.0", - "aggregate-error": "^3.0.0", - "bottleneck": "^2.18.1", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^9.0.0", - "globby": "^11.0.0", - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^5.0.0", - "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^2.4.3", - "p-filter": "^2.0.0", - "p-retry": "^4.0.0", - "url-join": "^4.0.0" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "fs-extra": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -421,12 +1020,6 @@ } } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "universalify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", @@ -486,6 +1079,42 @@ } } }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + }, "universalify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", @@ -512,20 +1141,82 @@ "read-pkg-up": "^7.0.0" }, "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "ms": "2.1.2" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } } } }, @@ -535,6 +1226,69 @@ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, + "@types/cookie": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz", + "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==" + }, + "@types/crypto-js": { + "version": "3.1.47", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-3.1.47.tgz", + "integrity": "sha512-eI6gvpcGHLk3dAuHYnRCAjX+41gMv1nz/VP55wAe5HtmAKDOoPSfr3f6vkMc08ov1S0NsjvUBxDtHHxqQY1LGA==" + }, + "@types/eslint": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.4.tgz", + "integrity": "sha512-YCY4kzHMsHoyKspQH+nwSe+70Kep7Vjt2X+dZe5Vs2vkRudqtoFoUIv1RlJmZB8Hbp7McneupoZij4PadxsK5Q==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", + "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.45", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz", + "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==", + "dev": true + }, + "@types/jsdom": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.5.tgz", + "integrity": "sha512-k/ZaTXtReAjwWu0clU0KLS53dyqZnA8mm+jwKFeFrvufXgICp+VNbskETFxKKAguv0pkaEKTax5MaRmvalM+TA==", + "requires": { + "@types/node": "*", + "@types/parse5": "*", + "@types/tough-cookie": "*" + } + }, + "@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==" + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, "@types/minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", @@ -544,8 +1298,7 @@ "@types/node": { "version": "14.14.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz", - "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==", - "dev": true + "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==" }, "@types/normalize-package-data": { "version": "2.4.0", @@ -559,98 +1312,487 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" + }, "@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "@types/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==" + }, + "@types/traverse": { + "version": "0.6.32", + "resolved": "https://registry.npmjs.org/@types/traverse/-/traverse-0.6.32.tgz", + "integrity": "sha512-RBz2uRZVCXuMg93WD//aTS5B120QlT4lR/gL+935QtGsKHLS6sCtZBaKfWjIfk7ZXv/r8mtGbwjVIee6/3XTow==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.6.1.tgz", + "integrity": "sha512-SNZyflefTMK2JyrPfFFzzoy2asLmZvZJ6+/L5cIqg4HfKGiW2Gr1Go1OyEVqne/U4QwmoasuMwppoBHWBWF2nA==", "dev": true, "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "@typescript-eslint/experimental-utils": "4.6.1", + "@typescript-eslint/scope-manager": "4.6.1", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } } }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "@typescript-eslint/experimental-utils": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.6.1.tgz", + "integrity": "sha512-qyPqCFWlHZXkEBoV56UxHSoXW2qnTr4JrWVXOh3soBP3q0o7p4pUEMfInDwIa0dB/ypdtm7gLOS0hg0a73ijfg==", "dev": true, "requires": { - "debug": "4" + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.6.1", + "@typescript-eslint/types": "4.6.1", + "@typescript-eslint/typescript-estree": "4.6.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.6.1.tgz", + "integrity": "sha512-lScKRPt1wM9UwyKkGKyQDqf0bh6jm8DQ5iN37urRIXDm16GEv+HGEmum2Fc423xlk5NUOkOpfTnKZc/tqKZkDQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.6.1", + "@typescript-eslint/types": "4.6.1", + "@typescript-eslint/typescript-estree": "4.6.1", + "debug": "^4.1.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.6.1.tgz", + "integrity": "sha512-f95+80r6VdINYscJY1KDUEDcxZ3prAWHulL4qRDfNVD0I5QAVSGqFkwHERDoLYJJWmEAkUMdQVvx7/c2Hp+Bjg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.6.1", + "@typescript-eslint/visitor-keys": "4.6.1" + } + }, + "@typescript-eslint/types": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.6.1.tgz", + "integrity": "sha512-k2ZCHhJ96YZyPIsykickez+OMHkz06xppVLfJ+DY90i532/Cx2Z+HiRMH8YZQo7a4zVd/TwNBuRCdXlGK4yo8w==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.6.1.tgz", + "integrity": "sha512-/J/kxiyjQQKqEr5kuKLNQ1Finpfb8gf/NpbwqFFYEBjxOsZ621r9AqwS9UDRA1Rrr/eneX/YsbPAIhU2rFLjXQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.6.1", + "@typescript-eslint/visitor-keys": "4.6.1", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" }, "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true } } }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "@typescript-eslint/visitor-keys": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.6.1.tgz", + "integrity": "sha512-owABze4toX7QXwOLT3/D5a8NecZEjEWU1srqxENTfqsY3bwVnl3YYbOh6s1rp2wQKO9RTHFGjKes08FgE7SVMw==", "dev": true, "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "@typescript-eslint/types": "4.6.1", + "eslint-visitor-keys": "^2.0.0" } }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", "dev": true }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", "dev": true }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "@webassemblyjs/wast-printer": "1.9.0" } }, - "ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", "dev": true }, - "argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=", - "dev": true + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", "dev": true }, - "arr-flatten": { + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/info": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.1.0.tgz", + "integrity": "sha512-uNWSdaYHc+f3LdIZNwhdhkjjLDDl3jP2+XBqAq9H8DjrJUvlOKdP8TNruy1yEaDfgpAIgbSAN7pye4FEHg9tYQ==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.1.0.tgz", + "integrity": "sha512-7RfnMXCpJ/NThrhq4gYQYILB18xWyoQcBey81oIyVbmgbc6m5ZHHyFK+DyH7pLHJf0p14MxL4mTsoPAgBSTpIg==", + "dev": true + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + }, + "amazon-cognito-identity-js": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-4.5.3.tgz", + "integrity": "sha512-BqVEb1kNPzgmpy/pcTmBVcRjLRbSE8521urbpfJUwFteoOF/T8Zq7RF27vAiGW4TjKwi4PKtMTs85i6u99kSqg==", + "requires": { + "buffer": "4.9.1", + "crypto-js": "^3.3.0", + "fast-base64-decode": "^1.0.0", + "isomorphic-unfetch": "^3.0.0", + "js-cookie": "^2.2.1" + }, + "dependencies": { + "crypto-js": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", + "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" + } + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "argv-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", + "integrity": "sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=", + "dev": true + }, + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", @@ -662,12 +1804,29 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, + "array-back": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.1.tgz", + "integrity": "sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg==", + "dev": true + }, "array-ify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", "dev": true }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -680,18 +1839,52 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -704,6 +1897,49 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "axe-core": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.0.2.tgz", + "integrity": "sha512-arU1h31OGFu+LPrOLGZ7nB45v940NMDMEJeNmbutu57P+UFDVnkZg3e+J1I2HJRZ9hT7gO8J91dn/PMrAiKakA==", + "dev": true + }, + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true + }, + "babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "requires": { + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + } + }, + "backbone": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.4.0.tgz", + "integrity": "sha512-RLmDrRXkVdouTg38jcgHhyQ/2zjg7a8E6sz2zxfz21Hh17xDJYUHBZimVIt5fUyS8vbfpeSmTL3gUjTEvUV3qQ==", + "dev": true, + "requires": { + "underscore": ">=1.8.3" + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -765,12 +2001,30 @@ } } }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, "before-after-hook": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz", "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==", "dev": true }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, "bottleneck": { "version": "2.19.5", "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", @@ -788,34 +2042,47 @@ } }, "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "browserslist": { + "version": "4.14.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.6.tgz", + "integrity": "sha512-zeFYcUo85ENhc/zxHbiIp0LGzzTrE2Pv2JhxvS7kpUb9Q9D38kUX6Bie7pGutJ/5iF5rOxE7CepAuWD56xJ33A==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001154", + "electron-to-chromium": "^1.3.585", + "escalade": "^3.1.1", + "node-releases": "^1.1.65" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -839,6 +2106,16 @@ "integrity": "sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ==", "dev": true }, + "call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -862,6 +2139,12 @@ "quick-lru": "^4.0.1" } }, + "caniuse-lite": { + "version": "1.0.30001156", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001156.tgz", + "integrity": "sha512-z7qztybA2eFZTB6Z3yvaQBIoJpQtsewRD74adw2UbRWwsRq3jIPvgrQGawBMbfafekQaD21FWuXNcywtTDGGCw==", + "dev": true + }, "cardinal": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", @@ -872,54 +2155,58 @@ "redeyed": "~2.1.0" } }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "dependencies": { "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" } }, "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } } } @@ -930,6 +2217,15 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, "ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -983,6 +2279,82 @@ "colors": "1.0.3" } }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + } + } + }, "cli-width": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", @@ -1000,10 +2372,10 @@ "wrap-ansi": "^6.2.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "is-fullwidth-code-point": { @@ -1022,18 +2394,15 @@ "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } } } }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -1045,18 +2414,24 @@ } }, "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "color-name": "~1.1.4" + "color-name": "1.1.3" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", "dev": true }, "colors": { @@ -1065,6 +2440,51 @@ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", "dev": true }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "command-line-usage": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.0.tgz", + "integrity": "sha512-Ew1clU4pkUeo6AFVDFxCbnN7GIZfXl48HIOQeFQnkO3oOqvpI7wdqtLRwv9iOCZ/7A+z4csVZeiDdEcj8g6Wiw==", + "dev": true, + "requires": { + "array-back": "^4.0.0", + "chalk": "^2.4.2", + "table-layout": "^1.0.0", + "typical": "^5.2.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "commander": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", + "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", + "dev": true + }, + "comment-parser": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.6.tgz", + "integrity": "sha512-GKNxVA7/iuTnAqGADlTWX4tkhzxZKXp5fLJqKTlQLHkE65XDUKutZ3BHaJC5IGcper2tT3QRD1xr4o3jNpgXXg==", + "dev": true + }, "commitizen": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.2.2.tgz", @@ -1085,8 +2505,41 @@ "minimist": "1.2.5", "strip-bom": "4.0.0", "strip-json-comments": "3.0.1" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + } } }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, "compare-func": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", @@ -1115,6 +2568,17 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "consola": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.0.tgz", + "integrity": "sha512-vlcSGgdYS26mPf7qNi+dCisbhiyDnrN1zaRbw3CSuc2wGOMEGGPsp46PdRG5gqXwgtJfjxDkxRNAgRPr1B77vQ==" + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, "conventional-changelog-angular": { "version": "5.0.12", "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz", @@ -1143,11 +2607,40 @@ "through2": "^4.0.0" }, "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "requires": { + "readable-stream": "3" + } } } }, @@ -1180,19 +2673,83 @@ "split2": "^2.0.0", "through2": "^4.0.0", "trim-off-newlines": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "requires": { + "readable-stream": "3" + } + } } }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "copyfiles": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.0.tgz", + "integrity": "sha512-yGjpR3yjQdxccW8EcJ4a7ZCA6wGER6/Q2Y+b7bXbVxGeSHBf93i9d7MzTsx+VV1CpMKQa3v4ThZfXBcltMzl0w==", + "dev": true, + "requires": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "untildify": "^4.0.0", + "yargs": "^15.3.1" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "core-js-pure": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", + "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==", + "dev": true + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { "version": "7.0.0", @@ -1205,35 +2762,72 @@ "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.10.0" + }, + "dependencies": { + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + } + } + }, + "cross-fetch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.6.tgz", + "integrity": "sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==", + "requires": { + "node-fetch": "2.6.1" } }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, + "crypto-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.0.0.tgz", + "integrity": "sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg==" + }, "crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } + } + }, "cz-conventional-changelog": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz", @@ -1247,6 +2841,37 @@ "lodash.map": "^4.5.1", "longest": "^2.0.1", "word-wrap": "^1.0.3" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" } }, "dateformat": { @@ -1256,12 +2881,12 @@ "dev": true }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "2.1.2" } }, "decamelize": { @@ -1288,6 +2913,11 @@ } } }, + "decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==" + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -1306,6 +2936,20 @@ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -1347,6 +2991,11 @@ } } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, "deprecation": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", @@ -1374,30 +3023,180 @@ "path-type": "^4.0.0" } }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { - "is-obj": "^2.0.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dom-serializer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.1.0.tgz", + "integrity": "sha512-ox7bvGXt2n+uLWtCRLybYx60IrOlWL/aCebWJk1T0d4m3y2tzf4U3ij9wBMUb6YJZpz06HCCYuyCDveE2xXmzQ==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "entities": "^2.0.0" + } + }, + "dom5": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.1.tgz", + "integrity": "sha512-JPFiouQIr16VQ4dX6i0+Hpbg3H2bMKPmZ+WZgBOSSvOPx9QHwwY8sPzeM2baUtViESYto6wC2nuZOMC/6gulcA==", + "dev": true, + "requires": { + "@types/parse5": "^2.2.34", + "clone": "^2.1.0", + "parse5": "^4.0.0" + }, + "dependencies": { + "@types/parse5": { + "version": "2.2.34", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz", + "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + } + } + }, + "domelementtype": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", + "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==", + "dev": true + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" + } + } + }, + "domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1" + } + }, + "domutils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.4.2.tgz", + "integrity": "sha512-NKbgaM8ZJOecTZsIzW5gSuplsX2IWW2mIK7xVr8hTQF2v1CJWTmLZ1HOCh5sH+IzVPAGE5IucooOkvwBRAdowA==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.0.1", + "domhandler": "^3.3.0" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + }, + "dependencies": { + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + } + } + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", "dev": true, "requires": { "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, + "electron-to-chromium": { + "version": "1.3.589", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.589.tgz", + "integrity": "sha512-rQItBTFnol20HaaLm26UgSUduX7iGerwW7pEYX17MB1tI6LzFajiLV7iZ7LVcUcsN/7HrZUoCLrBauChy/IqEg==", + "dev": true + }, "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.0.tgz", + "integrity": "sha512-DNc3KFPK18bPdElMJnf/Pkv5TXhxFU3YFDEuGLDRtPmV4rkmCjBkCSEp22u6rBHdSN9Vlp/GK7k98prmE1Jgug==", "dev": true }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -1407,6 +3206,32 @@ "once": "^1.4.0" } }, + "enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true + }, "env-ci": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.0.2.tgz", @@ -1417,6 +3242,21 @@ "java-properties": "^1.0.0" } }, + "envinfo": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz", + "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -1426,16 +3266,546 @@ "is-arrayish": "^0.2.1" } }, + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "eslint": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.12.1.tgz", + "integrity": "sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.2.1", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.0", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + } + } + }, + "eslint-config-prettier": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", + "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-html": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-6.1.0.tgz", + "integrity": "sha512-xcqithhnjUxoEDRL0hYci4RSS8EZ1NGr3/H8x3BxJvxgbu4R3YaEUea9i93j95NuAgoAbOUfNmybta8fqi4UbA==", + "dev": true, + "requires": { + "htmlparser2": "^4.1.0" + } + }, + "eslint-plugin-import": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-jsdoc": { + "version": "30.7.7", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-30.7.7.tgz", + "integrity": "sha512-DmVMJC2AbpYX7X1KhnVT1a9ex1AUvG+q9G8i6hzjp3cpjW8vmKQTUmZnRS0//W+7HvMqeb+eXPANdCOzGVVZBQ==", + "dev": true, + "requires": { + "comment-parser": "^0.7.6", + "debug": "^4.2.0", + "jsdoctypeparser": "^9.0.0", + "lodash": "^4.17.20", + "regextras": "^0.7.1", + "semver": "^7.3.2", + "spdx-expression-parse": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "eslint-plugin-lit-a11y": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-lit-a11y/-/eslint-plugin-lit-a11y-1.0.1.tgz", + "integrity": "sha512-c+GgGSXb9HMgbzJGp0yl+msHk2rBXcA7KwbobbLonSXdHm6ln7zRwAEj4i7527FOaCKkhxiN6RXfOJcZT1/Bow==", + "dev": true, + "requires": { + "aria-query": "^4.2.2", + "axe-core": "^4.0.2", + "axobject-query": "^2.2.0", + "dom5": "^3.0.1", + "emoji-regex": "^9.0.0", + "eslint": "^7.6.0", + "eslint-rule-extender": "0.0.1", + "intl-list-format": "^1.0.3", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "requireindex": "~1.1.0" + } + }, + "eslint-plugin-sort-class-members": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sort-class-members/-/eslint-plugin-sort-class-members-1.8.0.tgz", + "integrity": "sha512-2DY2xgmcpHeTYgXrkAV2b7rQI1+6PhuAn/KWwU9ttiUF8V/V7dgu48Eru/67GfAPs+p6H6XDlaT2NjBpH2l+Qg==", + "dev": true + }, + "eslint-plugin-typescript-sort-keys": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-typescript-sort-keys/-/eslint-plugin-typescript-sort-keys-1.5.0.tgz", + "integrity": "sha512-Pq0geV5TbkoGyxiPUH9AZhloRbQekrprmiXpMWmtSURfWvsWtPtsEPDLVKhDN19S791zbqnw+cm7enzu6833/w==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "^2.32.0", + "json-schema": "^0.2.5", + "natural-compare-lite": "^1.4.0" + }, + "dependencies": { + "@typescript-eslint/experimental-utils": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", + "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.34.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", + "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "json-schema": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.5.tgz", + "integrity": "sha512-gWJOWYFrhQ8j7pVm0EM8Slr+EPVq1Phf6lvzvD/WCeqkrx/f2xBI0xOsRRS9xCn3I4vKtP519dvs3TP09r24wQ==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "eslint-rule-extender": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/eslint-rule-extender/-/eslint-rule-extender-0.0.1.tgz", + "integrity": "sha512-F0j1Twve3lamL3J0rRSVAynlp58sDPG39JFcQrM+u9Na7PmCgiPHNODh6YE9mduaGcsn3NBqbf6LZRj0cLr8Ng==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true + }, + "espree": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", + "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", "dev": true }, "execa": { @@ -1452,41 +3822,15 @@ "npm-run-path": "^4.0.0", "onetime": "^5.1.0", "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, + "strip-final-newline": "^2.0.0" + }, + "dependencies": { "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, "onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -1495,36 +3839,6 @@ "requires": { "mimic-fn": "^2.1.0" } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -1543,6 +3857,15 @@ "to-regex": "^3.0.1" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -1560,6 +3883,12 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -1572,6 +3901,11 @@ "homedir-polyfill": "^1.0.1" } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", @@ -1669,6 +4003,21 @@ } } }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-base64-decode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", + "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, "fast-glob": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", @@ -1681,53 +4030,18 @@ "merge2": "^1.3.0", "micromatch": "^4.0.2", "picomatch": "^2.2.1" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } } }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, "fastq": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz", @@ -1746,27 +4060,32 @@ "escape-string-regexp": "^1.0.5" } }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "to-regex-range": "^5.0.1" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" } }, "find-node-modules": { @@ -1786,13 +4105,11 @@ "dev": true }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "locate-path": "^3.0.0" } }, "find-versions": { @@ -1814,14 +4131,162 @@ "is-glob": "^4.0.0", "micromatch": "^3.0.4", "resolve-dir": "^1.0.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -1839,6 +4304,38 @@ "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "fs-extra": { @@ -1864,12 +4361,41 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-intrinsic": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", + "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, "get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -1885,6 +4411,14 @@ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, "git-log-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", @@ -1907,23 +4441,13 @@ "requires": { "through2": "~2.0.0" } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } } } }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -1943,6 +4467,12 @@ "is-glob": "^4.0.1" } }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, "global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", @@ -1975,6 +4505,26 @@ "ini": "^1.3.4", "is-windows": "^1.0.1", "which": "^1.2.14" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" } }, "globby": { @@ -2008,14 +4558,20 @@ "source-map": "^0.6.1", "uglify-js": "^3.1.4", "wordwrap": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" } }, "hard-rejection": { @@ -2034,9 +4590,15 @@ } }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, "has-value": { @@ -2060,6 +4622,26 @@ "kind-of": "^4.0.0" }, "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -2071,6 +4653,12 @@ } } }, + "highlight.js": { + "version": "9.18.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.3.tgz", + "integrity": "sha512-zBZAmhSupHIl5sITeMqIJnYCDfAEc3Gdkqj65wC1lpI468MMQeeQkhcIAvk+RylAkxrCcI9xy9piHiXeQ1BdzQ==", + "dev": true + }, "homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -2087,12 +4675,29 @@ "dev": true }, "hosted-git-info": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", - "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "htmlparser2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", + "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" } }, "http-proxy-agent": { @@ -2104,23 +4709,16 @@ "@tootallnate/once": "1", "agent-base": "6", "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "https-proxy-agent": { @@ -2131,23 +4729,6 @@ "requires": { "agent-base": "6", "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "human-signals": { @@ -2174,14 +4755,47 @@ "which-pm-runs": "^1.0.0" }, "dependencies": { - "chalk": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "find-up": "^4.0.0" } } } @@ -2190,11 +4804,15 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, "ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", @@ -2209,14 +4827,6 @@ "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } } }, "import-from": { @@ -2226,8 +4836,77 @@ "dev": true, "requires": { "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } } }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -2275,8 +4954,77 @@ "string-width": "^2.1.0", "strip-ansi": "^5.1.0", "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } + } } }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "intl-list-format": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/intl-list-format/-/intl-list-format-1.0.3.tgz", + "integrity": "sha512-VNF1Mh0K1xALXkz/5QsK1gfKRvEQO/jWaniTGAzQvbzGr5uyGDskQrRjnf6Qnbc9/JRbNE8BQtTg6iWuFrZorw==", + "dev": true + }, "into-stream": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-5.1.1.tgz", @@ -2287,6 +5035,11 @@ "p-is-promise": "^3.0.0" } }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -2319,6 +5072,12 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, "is-core-module": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", @@ -2348,6 +5107,12 @@ } } }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -2394,30 +5159,22 @@ "is-extglob": "^2.1.1" } }, + "is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true + }, "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true }, "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, "is-plain-obj": { @@ -2435,12 +5192,47 @@ "isobject": "^3.0.1" } }, + "is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=" + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", "dev": true }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, "is-text-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", @@ -2450,6 +5242,11 @@ "text-extensions": "^1.0.0" } }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -2465,8 +5262,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", @@ -2480,6 +5276,20 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "isomorphic-unfetch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", + "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", + "requires": { + "node-fetch": "^2.6.1", + "unfetch": "^4.2.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, "issue-parser": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", @@ -2499,12 +5309,105 @@ "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", "dev": true }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jquery": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", + "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==", + "dev": true + }, + "js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsdoctypeparser": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz", + "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==", + "dev": true + }, + "jsdom": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", + "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "requires": { + "abab": "^2.0.3", + "acorn": "^7.1.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.2.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.0", + "domexception": "^2.0.1", + "escodegen": "^1.14.1", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "saxes": "^5.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", + "xml-name-validator": "^3.0.0" + } + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -2517,11 +5420,34 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } }, "jsonfile": { "version": "4.0.0", @@ -2538,62 +5464,143 @@ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "lint-staged": { + "version": "10.5.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.1.tgz", + "integrity": "sha512-fTkTGFtwFIJJzn/PbUO3RXyEBHIhbfYBE7+rJyLcOXabViaO/h6OslgeK6zpeUtzkDrzkgyAYDTLAwx6JzDTHw==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "commander": "^6.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.2.0", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^4.1.0", + "listr2": "^3.2.2", + "log-symbols": "^4.0.0", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + } + }, + "listr2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.2.2.tgz", + "integrity": "sha512-AajqcZEUikF2ioph6PfH3dIuxJclhr3i3kHgTOP0xeXdWQohrvJAAmqVcV43/GI987HFY/vzT73jYXoa4esDHg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "figures": "^3.2.0", + "indent-string": "^4.0.0", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.3", + "through": "^2.3.8" }, "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "escape-string-regexp": "^1.0.5" } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + } + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } } }, + "loader-runner": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.1.0.tgz", + "integrity": "sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { - "p-locate": "^4.1.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, "lodash.capitalize": { "version": "4.2.1", @@ -2631,6 +5638,11 @@ "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", "dev": true }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, "lodash.toarray": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", @@ -2643,6 +5655,125 @@ "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", "dev": true }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, "longest": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", @@ -2658,12 +5789,27 @@ "yallist": "^4.0.0" } }, + "lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, "macos-release": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz", "integrity": "sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg==", "dev": true }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -2686,9 +5832,9 @@ } }, "marked": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.3.tgz", - "integrity": "sha512-RQuL2i6I6Gn+9n81IDNGbL0VHnta4a+8ZhqvryXEniTb/hQNtf3i26hi1XWUhzb9BgVyWHKR3UO8MaHtKoYibw==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.8.2.tgz", + "integrity": "sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw==", "dev": true }, "marked-terminal": { @@ -2714,16 +5860,6 @@ "type-fest": "^0.11.0" } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, "type-fest": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", @@ -2732,6 +5868,54 @@ } } }, + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true + }, "meow": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz", @@ -2749,6 +5933,156 @@ "trim-newlines": "^3.0.0", "type-fest": "^0.18.0", "yargs-parser": "^20.2.3" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "hosted-git-info": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "normalize-package-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", + "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.6", + "resolve": "^1.17.0", + "semver": "^7.3.2", + "validate-npm-package-license": "^3.0.1" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "type-fest": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.0.tgz", + "integrity": "sha512-fbDukFPnJBdn2eZ3RR+5mK2slHLFd6gYHY7jna1KWWy4Yr4XysHuCdXRzy+RiG/HwG4WJat00vdC2UHky5eKiQ==", + "dev": true + }, + "yargs-parser": { + "version": "20.2.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.3.tgz", + "integrity": "sha512-emOFRT9WVHw03QSvN5qor9QQT9+sw5vwxfYweivSMHTcAXPefwVae2FjO7JJjj8hCE4CzPOPeFM83VwT29HCww==", + "dev": true + } } }, "merge": { @@ -2770,24 +6104,13 @@ "dev": true }, "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, "mime": { @@ -2796,6 +6119,19 @@ "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", "dev": true }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", @@ -2820,8 +6156,7 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minimist-options": { "version": "4.1.0", @@ -2834,6 +6169,11 @@ "kind-of": "^6.0.3" } }, + "ministorage": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ministorage/-/ministorage-1.0.0.tgz", + "integrity": "sha1-Dzz5ROmVFfUfQmxNFRnIL41kEa0=" + }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -2855,6 +6195,14 @@ } } }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, "modify-values": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", @@ -2862,9 +6210,9 @@ "dev": true }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "mute-stream": { @@ -2892,6 +6240,18 @@ "to-regex": "^3.0.1" } }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha1-F7CVgZiJef3a/gIB6TG6kzyWy7Q=", + "dev": true + }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -2922,21 +6282,42 @@ "node-fetch": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "node-releases": { + "version": "1.1.65", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.65.tgz", + "integrity": "sha512-YpzJOe2WFIW0V4ZkJQd/DGR/zdVwc/pI4Nl1CZrBO19FdRcSTmsuhdttw9rsTzzJLrNcSloLiBbEYx1C4f6gpA==", "dev": true }, + "noms": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", + "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" + } + }, "normalize-package-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", - "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { - "hosted-git-info": "^3.0.6", - "resolve": "^1.17.0", - "semver": "^7.3.2", + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, "normalize-url": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-5.3.0.tgz", @@ -6460,15 +9841,146 @@ } } }, + "npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { - "path-key": "^2.0.0" + "path-key": "^3.0.0" } }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -6500,6 +10012,18 @@ } } }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -6509,6 +10033,18 @@ "isobject": "^3.0.0" } }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -6518,6 +10054,18 @@ "isobject": "^3.0.1" } }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -6542,6 +10090,19 @@ "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", "dev": true }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, "os-name": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", @@ -6571,6 +10132,14 @@ "dev": true, "requires": { "p-map": "^2.0.0" + }, + "dependencies": { + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + } } }, "p-finally": { @@ -6589,25 +10158,26 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { - "p-limit": "^2.2.0" + "p-limit": "^2.0.0" } }, "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } }, "p-reduce": { "version": "2.1.0", @@ -6628,8 +10198,7 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "parent-module": { "version": "1.0.1", @@ -6641,15 +10210,12 @@ } }, "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "error-ex": "^1.2.0" } }, "parse-passwd": { @@ -6658,6 +10224,28 @@ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -6665,10 +10253,9 @@ "dev": true }, "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", @@ -6677,9 +10264,9 @@ "dev": true }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { @@ -6694,18 +10281,28 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", "dev": true }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, "pkg-conf": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", @@ -6725,6 +10322,18 @@ "locate-path": "^2.0.0" } }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -6759,21 +10368,30 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, - "path-exists": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true } } }, "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "requires": { - "find-up": "^4.0.0" + "find-up": "^3.0.0" } }, "please-upgrade-node": { @@ -6791,12 +10409,40 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "prettier": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", + "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", + "dev": true + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -6807,18 +10453,42 @@ "once": "^1.3.1" } }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, "quick-lru": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -6839,82 +10509,124 @@ } } }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "react-native-get-random-values": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/react-native-get-random-values/-/react-native-get-random-values-1.5.0.tgz", + "integrity": "sha512-LK+Wb8dEimJkd/dub7qziDmr9Tw4chhpzVeQ6JDo4czgfG4VXbptRyOMdu8503RiMF6y9pTH6ZUTkrrpprqT7w==", + "requires": { + "fast-base64-decode": "^1.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "dependencies": { + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" }, "dependencies": { - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true } } }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" }, "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true } } }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "resolve": "^1.1.6" } }, "redent": { @@ -6936,6 +10648,18 @@ "esprima": "~4.0.0" } }, + "reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -6946,6 +10670,18 @@ "safe-regex": "^1.1.0" } }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "regextras": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz", + "integrity": "sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w==", + "dev": true + }, "registry-auth-token": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", @@ -6967,6 +10703,83 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -6979,6 +10792,12 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "requireindex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.1.0.tgz", + "integrity": "sha1-5UBLgVV+91225JxacgBIk/4D4WI=", + "dev": true + }, "resolve": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", @@ -6989,6 +10808,23 @@ "path-parse": "^1.0.6" } }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, "resolve-dir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", @@ -7000,9 +10836,9 @@ } }, "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "resolve-global": { @@ -7049,6 +10885,15 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -7071,10 +10916,9 @@ } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safe-regex": { "version": "1.1.0", @@ -7088,8 +10932,25 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } }, "semantic-release": { "version": "17.2.2", @@ -7127,15 +10988,6 @@ "yargs": "^15.0.1" }, "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, "cosmiconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", @@ -7149,15 +11001,6 @@ "yaml": "^1.7.2" } }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -7167,53 +11010,116 @@ "escape-string-regexp": "^1.0.5" } }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "to-regex-range": "^5.0.1" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "hosted-git-info": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "marked": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.3.tgz", + "integrity": "sha512-RQuL2i6I6Gn+9n81IDNGbL0VHnta4a+8ZhqvryXEniTb/hQNtf3i26hi1XWUhzb9BgVyWHKR3UO8MaHtKoYibw==", "dev": true }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" + "p-limit": "^2.2.0" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "requires": { - "is-number": "^7.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true } } }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "semver-compare": { "version": "1.0.0", @@ -7244,6 +11150,15 @@ "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", "dev": true }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -7274,20 +11189,37 @@ } }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", "dev": true }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -7303,6 +11235,19 @@ "chalk": "^2.3.2", "figures": "^2.0.0", "pkg-conf": "^2.1.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } } }, "slash": { @@ -7311,6 +11256,17 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -7327,6 +11283,15 @@ "use": "^3.1.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -7344,6 +11309,18 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -7418,12 +11395,17 @@ } } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", "dev": true }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, "source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", @@ -7437,6 +11419,16 @@ "urix": "^0.1.0" } }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", @@ -7506,18 +11498,28 @@ "dev": true, "requires": { "through2": "^2.0.2" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" } }, "static-extend": { @@ -7541,6 +11543,11 @@ } } }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, "stream-combiner2": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", @@ -7549,59 +11556,184 @@ "requires": { "duplexer2": "~0.1.0", "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { + "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "strip-ansi": "^5.1.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } } } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "string.prototype.padend": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz", + "integrity": "sha512-3aIv8Ffdp8EZj8iLwREGpQaUZiPyrWrpzMBHvkiSW/bK/EGve9np07Vwy7IJ5waydpGXzQZu/F8Oze2/IWkBaA==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "string.prototype.trimend": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz", + "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "string.prototype.trimstart": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz", + "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } } } }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, "strip-eof": { @@ -7626,18 +11758,18 @@ } }, "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "has-flag": "^3.0.0" } }, "supports-hyperlinks": { @@ -7648,8 +11780,60 @@ "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, + "table-layout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.1.tgz", + "integrity": "sha512-dEquqYNJiGwY7iPfZ3wbXDI944iqanTSchrACLL2nOB+1r+h1Nzu2eH+DuPPvWvm5Ry7iAPeFlgEtP5bIp5U7Q==", + "dev": true, + "requires": { + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" } }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, "temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -7668,12 +11852,6 @@ "unique-string": "^2.0.0" }, "dependencies": { - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, "type-fest": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", @@ -7682,12 +11860,79 @@ } } }, + "terser": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.8.tgz", + "integrity": "sha512-zVotuHoIfnYjtlurOouTazciEfL7V38QMAOhGqpXDEg6yT13cF4+fEP9b0rrCEQTn+tT46uxgFsTZzhygk+CzQ==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.0.3.tgz", + "integrity": "sha512-zFdGk8Lh9ZJGPxxPE6jwysOlATWB8GMW8HcfGULWA/nPal+3VdATflQvSBSLQJRCmYZnfFJl6vkRTiwJGNgPiQ==", + "dev": true, + "requires": { + "jest-worker": "^26.6.1", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.8" + }, + "dependencies": { + "p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, "text-extensions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", "dev": true }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -7695,23 +11940,43 @@ "dev": true }, "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": "3" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" }, "dependencies": { "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" } } } @@ -7758,20 +12023,50 @@ } }, "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, + "tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "requires": { + "punycode": "^2.1.1" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } } }, "traverse": { "version": "0.6.6", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", - "dev": true + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=" }, "trim-newlines": { "version": "3.0.0", @@ -7785,16 +12080,131 @@ "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", "dev": true }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "ts-loader": { + "version": "8.0.9", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.9.tgz", + "integrity": "sha512-rQd+iIfz5z4HSVzhhRFP4M2OQ0QmihilWWauYvvowBfnRvr4DW+gqA2om70xp/07EQj1qBkLMWobnXsgmWMbmg==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^4.0.0", + "semver": "^6.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typedoc": { + "version": "0.17.0-3", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.17.0-3.tgz", + "integrity": "sha512-DO2djkR4NHgzAWfNbJb2eQKsFMs+gOuYBXlQ8dOSCjkAK5DRI7ZywDufBGPUw7Ue9Qwi2Cw1DxLd3reDq8wFuQ==", + "dev": true, + "requires": { + "@types/minimatch": "3.0.3", + "fs-extra": "^8.1.0", + "handlebars": "^4.7.2", + "highlight.js": "^9.18.0", + "lodash": "^4.17.15", + "marked": "^0.8.0", + "minimatch": "^3.0.0", + "progress": "^2.0.3", + "shelljs": "^0.8.3", + "typedoc-default-themes": "0.8.0-0" + } + }, + "typedoc-default-themes": { + "version": "0.8.0-0", + "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.8.0-0.tgz", + "integrity": "sha512-blFWppm5aKnaPOa1tpGO9MLu+njxq7P3rtkXK4QxJBNszA+Jg7x0b+Qx0liXU1acErur6r/iZdrwxp5DUFdSXw==", + "dev": true, + "requires": { + "backbone": "^1.4.0", + "jquery": "^3.4.1", + "lunr": "^2.3.8", + "underscore": "^1.9.1" + } + }, + "typescript": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", + "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==", "dev": true }, - "type-fest": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.0.tgz", - "integrity": "sha512-fbDukFPnJBdn2eZ3RR+5mK2slHLFd6gYHY7jna1KWWy4Yr4XysHuCdXRzy+RiG/HwG4WJat00vdC2UHky5eKiQ==", + "typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true }, "uglify-js": { @@ -7804,6 +12214,17 @@ "dev": true, "optional": true }, + "underscore": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.11.0.tgz", + "integrity": "sha512-xY96SsN3NA461qIRKZ/+qox37YXPtSBswMGfiNptr+wrt6ds4HaMw23TP612fEyGekRE6LNRiLYr/aqbHXNedw==", + "dev": true + }, + "unfetch": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", + "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -7825,6 +12246,15 @@ "crypto-random-string": "^2.0.0" } }, + "universal-cookie": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-4.0.4.tgz", + "integrity": "sha512-lbRVHoOMtItjWbM7TwDLdl8wug7izB0tq3/YVKhT/ahB4VDvWMyvnADfnJI8y6fSvsjh51Ix7lTGC6Tn4rMPhw==", + "requires": { + "@types/cookie": "^0.3.3", + "cookie": "^0.4.0" + } + }, "universal-user-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz", @@ -7880,12 +12310,42 @@ } } }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true + }, + "uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, "url-join": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", @@ -7904,6 +12364,17 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "v8-compile-cache": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "dev": true + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -7914,10 +12385,247 @@ "spdx-expression-parse": "^3.0.0" } }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "watchpack": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.0.1.tgz", + "integrity": "sha512-vO8AKGX22ZRo6PiOFM9dC0re8IcKh8Kd/aH2zeqUc6w4/jBGlTy2P7fTC6ekT0NjVeGjgU2dGC5rNstKkeLEQg==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" + }, + "webpack": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.4.0.tgz", + "integrity": "sha512-udpYTyqz8toTTdaOsL2QKPLeZLt2IEm9qY7yTXuFEQhKu5bk0yQD9BtAdVQksmz4jFbbWOiWmm3NHarO0zr/ng==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.45", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^8.0.4", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.3.1", + "eslint-scope": "^5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.1.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "pkg-dir": "^4.2.0", + "schema-utils": "^3.0.0", + "tapable": "^2.0.0", + "terser-webpack-plugin": "^5.0.3", + "watchpack": "^2.0.0", + "webpack-sources": "^2.1.1" + }, + "dependencies": { + "acorn": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz", + "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==", + "dev": true + }, + "enhanced-resolve": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.3.1.tgz", + "integrity": "sha512-G1XD3MRGrGfNcf6Hg0LVZG7GIKcYkbfHa5QMxt1HDUTdYoXH0JR1xXyg+MaKLF73E9A27uWNVxvFivNRYeUB6w==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "tapable": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.0.0.tgz", + "integrity": "sha512-bjzn0C0RWoffnNdTzNi7rNDhs1Zlwk2tRXgk8EiHKAOX1Mag3d6T0Y5zNa7l9CJ+EoUne/0UHdwS8tMbkh9zDg==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.2.0.tgz", + "integrity": "sha512-EIl3k88vaF4fSxWSgtAQR+VwicfLMTZ9amQtqS4o+TDPW9HGaEpbFBbAZ4A3ZOT5SOnMxNOzROsSTPiE8tBJPA==", + "dev": true, + "requires": { + "@webpack-cli/info": "^1.1.0", + "@webpack-cli/serve": "^1.1.0", + "colorette": "^1.2.1", + "command-line-usage": "^6.1.0", + "commander": "^6.2.0", + "enquirer": "^2.3.6", + "execa": "^4.1.0", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "leven": "^3.1.0", + "rechoir": "^0.7.0", + "v8-compile-cache": "^2.2.0", + "webpack-merge": "^4.2.2" + }, + "dependencies": { + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, + "rechoir": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", + "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + } + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-node-externals": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-2.5.2.tgz", + "integrity": "sha512-aHdl/y2N7PW2Sx7K+r3AxpJO+aDMcYzMQd60Qxefq3+EwhewSbTBqNumOsCE1JsCUNoyfGj5465N0sSf6hc/5w==", + "dev": true + }, + "webpack-sources": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz", + "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==", + "dev": true, + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + } + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "whatwg-url": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" + } + }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -7944,6 +12652,19 @@ "execa": "^1.0.0" }, "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", @@ -7967,14 +12688,58 @@ "requires": { "pump": "^3.0.0" } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "wordwrap": { "version": "1.0.0", @@ -7982,6 +12747,16 @@ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, + "wordwrapjs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.0.tgz", + "integrity": "sha512-Svqw723a3R34KvsMgpjFBYCgNOSdcW3mQFK4wIfhGQhtaFVOJmdYoXgi63ne3dTlWgatVcUc7t4HtQ/+bUVIzQ==", + "dev": true, + "requires": { + "reduce-flatten": "^2.0.0", + "typical": "^5.0.0" + } + }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -7993,10 +12768,34 @@ "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "is-fullwidth-code-point": { @@ -8015,15 +12814,6 @@ "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } } } }, @@ -8033,6 +12823,30 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "ws": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -8076,55 +12890,88 @@ "yargs-parser": "^18.1.2" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "p-locate": "^4.1.0" } }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "p-limit": "^2.2.0" } }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } } } }, "yargs-parser": { - "version": "20.2.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.3.tgz", - "integrity": "sha512-emOFRT9WVHw03QSvN5qor9QQT9+sw5vwxfYweivSMHTcAXPefwVae2FjO7JJjj8hCE4CzPOPeFM83VwT29HCww==", - "dev": true + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "zen-observable": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", + "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" + }, + "zen-observable-ts": { + "version": "0.8.19", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.19.tgz", + "integrity": "sha512-u1a2rpE13G+jSzrg3aiCqXU5tN2kw41b+cBZGmnc+30YimdkKiDj9bTowcB41eL77/17RF/h+393AuVgShyheQ==", + "requires": { + "tslib": "^1.9.3", + "zen-observable": "^0.8.0" + } } } } diff --git a/package.json b/package.json index d39b6e6..0146f6f 100755 --- a/package.json +++ b/package.json @@ -2,7 +2,26 @@ "name": "@foxy.io/sdk", "version": "0.0.0", "description": "Universal SDK for a full server-side and a limited in-browser access to Foxy hAPI.", - "main": "index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "lint": "npm run lint:eslint && npm run lint:prettier", + "lint:eslint": "eslint --ext .ts,.html . --ignore-path .gitignore", + "lint:prettier": "prettier \"**/*.ts\" --check --ignore-path .gitignore", + "format": "npm run format:eslint && npm run format:prettier", + "format:eslint": "eslint --ext .ts,.html . --fix --ignore-path .gitignore", + "format:prettier": "prettier \"**/*.ts\" --write --ignore-path .gitignore", + "build:cdn": "webpack", + "build:cjs": "tsc --module commonjs --outdir \"dist/cjs\"", + "build:esm": "tsc --module es2015 --outdir \"dist/esm\"", + "build:docs": "typedoc --excludePrivate --ignoreCompilerErrors --mode library --out docs src/index.ts", + "build:types": "tsc --declarationdir \"dist/types\" --declaration --emitdeclarationonly && copyfiles --up 1 \"./src/**/*.d.ts\" \"./dist/types\"", + "prepack": "rimraf dist && run-p \"build:!(docs)\"" + }, "repository": { "type": "git", "url": "git+https://github.com/foxy/foxy-sdk.git" @@ -16,6 +35,7 @@ "api", "sdk" ], + "author": "", "license": "MIT", "bugs": { "url": "https://github.com/foxy/foxy-sdk/issues", @@ -23,13 +43,38 @@ }, "homepage": "https://sdk.foxy.dev", "devDependencies": { + "@foxy.io/eslint-config": "^1.0.0", + "copyfiles": "^2.4.0", "cz-conventional-changelog": "^3.3.0", + "eslint": "^7.12.1", "husky": "^4.3.0", - "semantic-release": "^17.2.2" + "lint-staged": "^10.4.0", + "npm-run-all": "^4.1.5", + "prettier": "^2.1.2", + "rimraf": "^3.0.2", + "semantic-release": "^17.2.2", + "ts-loader": "^8.0.9", + "typedoc": "0.17.0-3", + "typescript": "^4.0.3", + "webpack": "^5.4.0", + "webpack-cli": "^4.2.0", + "webpack-node-externals": "^2.5.2" }, "engines": { "node": ">=10 <=15" }, + "eslintConfig": { + "extends": "@foxy.io" + }, + "lint-staged": { + "{src,test}/**/*.ts": "eslint --cache --fix" + }, + "prettier": { + "quoteProps": "consistent", + "printWidth": 120, + "singleQuote": true, + "arrowParens": "avoid" + }, "config": { "commitizen": { "path": "./node_modules/cz-conventional-changelog" @@ -37,7 +82,8 @@ }, "husky": { "hooks": { - "prepare-commit-msg": "exec < /dev/tty && git cz --hook || true" + "prepare-commit-msg": "exec < /dev/tty && git cz --hook || true", + "pre-commit": "lint-staged" } }, "release": { @@ -48,5 +94,19 @@ "prerelease": true } ] + }, + "dependencies": { + "@aws-amplify/auth": "^3.4.4", + "@types/crypto-js": "^3.1.47", + "@types/jsdom": "^16.2.5", + "@types/node": "^14.11.1", + "@types/traverse": "^0.6.32", + "babel-loader": "^8.1.0", + "consola": "^2.15.0", + "cross-fetch": "^3.0.6", + "crypto-js": "^4.0.0", + "jsdom": "^16.4.0", + "ministorage": "^1.0.0", + "traverse": "^0.6.6" } } diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..8d06a7be04c381d85f0af399bc429057d63726a5 GIT binary patch literal 6148 zcmeHK!A{#i5Sp{>Bi7FaS~6gy4ZG{_hJ z0X~60;Sc&b?VH^VB9Ka)5Nda%**7~ovm-wzyB;DE{b90BCLNNZ0i}1|-xbzg|JI@(L{dftC6v-PTBC}}*?4h& zC*GqIosm(AXs!^^5wh2?$DDlPdKb6qEz%Hq8RhdT2{}J99+ju|H+UVN=2=;FyT3$Z zp}Dy9Ov<)wKW~2tkJTuwqH0+7qroSh?M2mbZ0+|-gOUZ}c`Nla^e0wf=VZ z;N<&{@z2TGg=Uuo{zF<`Se(Koj9XlM4F^T8iX(WZ8PiCIjseGjW8h&7*waHUKP=ou zIR+d9{}BUxKKM|^z+!Ds9~~HU3jl1wtp&FJ^auLv00tIogYZCvNd=lzVOtDgI|pIX zu^!m?+Mr1%p(|q_TUpo+McBqe_&S_KV9K-`Cbroj!4 Ifk$QF4_AnW9RL6T literal 0 HcmV?d00001 diff --git a/src/admin/API.ts b/src/admin/API.ts new file mode 100644 index 0000000..ed5638d --- /dev/null +++ b/src/admin/API.ts @@ -0,0 +1,89 @@ +import * as Core from '../core'; +import Auth from '@aws-amplify/auth'; +import type { Credentials } from './types'; +import type { Graph } from './Graph'; +import { fetch } from 'cross-fetch'; + +/** + * Admin API provides a common interface for the `/s/admin` endpoints, whether + * it's a default setup or a custom solution for your integration. Admin API + * is the most feature-rich subset of Integration API available from the browser. + */ +export class API extends Core.API { + private readonly __auth = Auth; + + /** + * Creates an instance of {@link AdminAPI}. + * + * @param args Client configuration (same as for {@link BrowserAPI}). + */ + constructor(...args: ConstructorParameters) { + super(...args); + + // TODO: production config + is multi-tenancy even possible with Amplify? + this.__auth.configure({ + identityPoolId: 'us-east-2:6e3cb428-0e77-495e-9960-f4ab46d4dca1', + region: 'us-east-2', + storage: args[0].storage, + userPoolId: 'us-east-2_2Vw7tMmLQ', + userPoolWebClientId: '2i58qs1u38kv605rm3v5t4dake', + }); + } + + async fetch(input: RequestInfo, init?: RequestInit): Promise { + const session = await this.__auth.currentSession().catch(() => null); + const headers = new Headers(init?.headers); + const method = init?.method?.toUpperCase() ?? 'GET'; + const url = typeof input === 'string' ? input : input.url; + + headers.set('Content-Type', 'application/json'); + if (session !== null) headers.set('Authorization', `Bearer ${session.getAccessToken().getJwtToken()}`); + + this.console.trace(`${method} ${url}`); + return fetch(input, { ...init, headers }); + } + + async signIn(credentials: Credentials): Promise { + let user: { challengeName: string; challengeParam: Record }; + + try { + user = await this.__auth.signIn(credentials.email, credentials.password); + } catch (err) { + throw new Core.API.AuthError({ + code: 'UNAUTHORIZED', + originalError: err, + }); + } + + if (user.challengeName === 'NEW_PASSWORD_REQUIRED') { + if (credentials.newPassword) { + try { + await this.__auth.completeNewPassword(user, credentials.newPassword, user.challengeParam.requiredAttributes); + } catch (err) { + throw new Core.API.AuthError({ + code: 'UNKNOWN', + originalError: err, + }); + } + } else { + throw new Core.API.AuthError({ code: 'NEW_PASSWORD_REQUIRED' }); + } + } + } + + async sendPasswordResetEmail(email: string): Promise { + try { + await this.__auth.forgotPassword(email); + } catch (err) { + throw new Core.API.AuthError({ + code: 'UNKNOWN', + originalError: err, + }); + } + } + + async signOut(): Promise { + await this.__auth.signOut(); + this.storage.clear(); + } +} diff --git a/src/admin/Graph.d.ts b/src/admin/Graph.d.ts new file mode 100644 index 0000000..2aa1f12 --- /dev/null +++ b/src/admin/Graph.d.ts @@ -0,0 +1 @@ +export type { Graph } from '../integration'; diff --git a/src/admin/Rels.d.ts b/src/admin/Rels.d.ts new file mode 100644 index 0000000..cd373d7 --- /dev/null +++ b/src/admin/Rels.d.ts @@ -0,0 +1 @@ +export type { Rels } from '../integration'; diff --git a/src/admin/index.ts b/src/admin/index.ts new file mode 100644 index 0000000..c1d8a59 --- /dev/null +++ b/src/admin/index.ts @@ -0,0 +1,5 @@ +export { API } from './API'; + +import type * as Rels from './Rels'; +export type { Graph } from './Graph'; +export type { Rels }; diff --git a/src/admin/types.d.ts b/src/admin/types.d.ts new file mode 100644 index 0000000..5cf68d7 --- /dev/null +++ b/src/admin/types.d.ts @@ -0,0 +1,9 @@ +/** User credentials for authentication. */ +export interface Credentials { + /** Email address associated with an account. */ + email: string; + /** Current password during regular sign-in, temporary password or a one-time code during access recovery. */ + password: string; + /** New password (only needed during the access recovery or force reset). */ + newPassword?: string; +} diff --git a/src/core/API/API.ts b/src/core/API/API.ts new file mode 100644 index 0000000..f7d0980 --- /dev/null +++ b/src/core/API/API.ts @@ -0,0 +1,98 @@ +import consola, { Consola, LogLevel } from 'consola'; +import { AuthError } from './AuthError'; +import { Graph } from '../Graph'; +import MemoryStorage from 'ministorage'; +import { Node } from './Node'; +import { fetch } from 'cross-fetch'; + +/** API constructor parameters. */ +type Init = { + /** + * Credentials storage implementing [Web Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API). + * Access tokens and other related info will be stored here. Defaults to in-memory storage. + */ + storage?: Storage; + + /** + * Numeric [Consola](https://github.com/nuxt-contrib/consola) log level. + * If omitted, Consola defaults will be used. + */ + level?: LogLevel; + + /** + * Request handler implementing [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API). + * This function will be called whenever a resource is requested. Defaults to native fetch or a custom implementation of Fetch API for Node. + */ + fetch?: Window['fetch']; + + /** + * Resolver cache implementing [Web Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API). + * Every resolved path will be stored here for future use. Defaults to in-memory storage. + */ + cache?: Storage; + + /** + * Bookmark [URL](https://developer.mozilla.org/en-US/docs/Web/API/URL) for this API. + * This is where the tree traversal begins. We also use this URL as a base for relative paths. + */ + base: URL; +}; + +/** + * Base API class for all custom clients in this SDK. If you're building + * your own client, consider extending this class for consistency. + */ +export class API extends Node { + static readonly AuthError = AuthError; + + static readonly Node = Node; + + /** + * [Consola](https://github.com/nuxt-contrib/consola) instance. + * If you extend this class and add logging in your code, use this instead of native console. + */ + readonly console: Consola; + + /** + * Credentials storage implementing [Web Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API). + * Access tokens and other related info will be stored here. Clearing this storage will log you out. + */ + readonly storage: Storage; + + /** + * Resolver cache implementing [Web Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API). + * Every resolved path will be stored here for future use. You can clear this cache by calling `clear()`. + */ + readonly cache: Storage; + + /** + * Bookmark [URL](https://developer.mozilla.org/en-US/docs/Web/API/URL) for this API. + * This is where the tree traversal begins. We also use this URL as a base for relative paths. + */ + readonly base: URL; + + constructor(init: Init) { + super({ + cache: init.cache ?? new MemoryStorage(), + console: consola.create({ level: init.level }).withTag('@foxy.io/sdk'), + fetch: init.fetch ?? fetch, + path: [init.base], + }); + + this.console = this._console; + this.storage = init.storage ?? new MemoryStorage(); + this.cache = this._cache; + this.base = init.base; + } + + /** + * Makes a raw and, if possible, authenticated request to the API. + * This method implements native [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API). + * + * @param args Fetch API arguments (url and request parameters). + * @returns Fetch API response. + */ + async fetch(...args: Parameters): ReturnType { + return this._fetch(...args); + } +} diff --git a/src/core/API/AuthError.ts b/src/core/API/AuthError.ts new file mode 100644 index 0000000..4f18397 --- /dev/null +++ b/src/core/API/AuthError.ts @@ -0,0 +1,41 @@ +/** Constructor parameters of the {@link UniversalAPIAuthError} class. */ +type AuthErrorParams = { + code: UniversalAPIAuthErrorCode; + originalError?: unknown; +}; + +/** Union of all possible auth error codes. */ +type UniversalAPIAuthErrorCode = + | typeof AuthError['NEW_PASSWORD_REQUIRED'] + | typeof AuthError['UNAUTHORIZED'] + | typeof AuthError['UNKNOWN']; + +/** + * Base error class for all authentication-related errors in + * the APIs that can be used both server and client-side. If you're + * building your own API client with our SDK, you should consider using + * this class for similar purposes. + */ +export class AuthError extends Error { + /** Credentials are valid, but the session can be created only after changing the current password. This usually happens after a server-side password reset has been initiated for security reasons. */ + static readonly NEW_PASSWORD_REQUIRED = 'NEW_PASSWORD_REQUIRED'; + + /** Credentials are invalid. That could mean empty or invalid email or password or otherwise incorrect auth data. */ + static readonly UNAUTHORIZED = 'UNAUTHORIZED'; + + /** Any other or internal error that interrupted authentication. */ + static readonly UNKNOWN = 'UNKNOWN'; + + /** Exception that triggered this error, if present. */ + readonly originalError?: unknown; + + /** Error code (see static constants on this class for possible values). */ + readonly code: UniversalAPIAuthErrorCode; + + constructor({ code, originalError }: AuthErrorParams) { + super(`authentication failed with code ${code}`); + + this.originalError = originalError; + this.code = code; + } +} diff --git a/src/core/API/Node.ts b/src/core/API/Node.ts new file mode 100644 index 0000000..9898d8c --- /dev/null +++ b/src/core/API/Node.ts @@ -0,0 +1,240 @@ +import { Consola } from 'consola'; +import { Graph } from '../Graph'; +import { Query } from '../Query'; +import { Request } from 'cross-fetch'; +import { ResolutionError } from './ResolutionError'; +import { Response } from './Response'; + +/** Chain of curies leading to a hAPI resource starting with a base URL. */ +type CurieChain = [URL, ...string[]]; + +/** Options of {@link APINode} constructor. */ +type NodeInit = { + /** Path to this resource node as base URL followed by a list of curies. */ + path: CurieChain; + /** Custom Fetch API implementation for making authenticated requests. */ + fetch: Window['fetch']; + /** Resolver cache implementing [Web Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API). */ + cache: Storage; + /** Shared [Consola](https://github.com/nuxt-contrib/consola) instance. */ + console: Consola; +}; + +/** + * Serializes object zoom definition using hAPI format. + * + * @param prefix Curie prefix. + * @param zoom Zoom definition as object. + * @returns Serialized zoom parameter value. + */ +function stringifyZoom(prefix: string, zoom: unknown): string { + const scope = prefix === '' ? '' : prefix + ':'; + + if (typeof zoom === 'string') return scope + zoom; + if (Array.isArray(zoom)) return zoom.map(v => stringifyZoom(prefix, v)).join(); + + return Object.entries(zoom as Record) + .map(([key, value]) => stringifyZoom(scope + key, value)) + .join(); +} + +/** + * Serializes object order definition using hAPI format. + * + * @param order Order definition as object. + * @returns Serialized order parameter value. + */ +function stringifyOrder(order: unknown): string { + if (typeof order === 'string') return order; + + if (Array.isArray(order)) { + return order.map(item => stringifyOrder(item)).join(); + } + + return Object.entries(order as Record) + .map(([key, value]) => `${key} ${value}`) + .join(); +} + +/** + * Base class representing a resource node that can be fetched, + * created, updated or deleted. You shouldn't need to create instances + * of this class unless you're building a custom API client with our SDK. + */ +export class Node { + static readonly ResolutionError = ResolutionError; + + static readonly Response = Response; + + /** Shared [Consola](https://github.com/nuxt-contrib/consola) instance. */ + protected readonly _console: Consola; + + /** Custom Fetch API implementation for making authenticated requests. */ + protected readonly _fetch: Window['fetch']; + + /** Resolver cache implementing [Web Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API). */ + protected readonly _cache: Storage; + + /** Path to this resource node as base URL followed by a list of curies. */ + protected readonly _path: CurieChain; + + constructor({ path, fetch, cache, console }: NodeInit) { + this._path = path; + this._fetch = fetch; + this._cache = cache; + this._console = console; + } + + async get(): Promise>; + + async get>(query: Q): Promise>; + + /** + * Resolves the URL of this node and sends a GET request + * using provided parameters. + * + * @param query Query parameters such as zoom, fields etc. + * @returns Instance of {@link APIResponse} representing this resource. + */ + async get(query?: Query): Promise> { + const url = await this._resolve(); + const { filters, fields, offset, limit, order, zoom } = query ?? {}; + + if (filters !== undefined) { + filters.forEach((filter: string) => { + const params = new URLSearchParams(filter); + [...params.entries()].forEach(([key, value]) => url.searchParams.append(key, value)); + }); + } + + if (fields !== undefined) url.searchParams.set('fields', fields.join(',')); + if (offset !== undefined) url.searchParams.set('offset', String(offset)); + if (limit !== undefined) url.searchParams.set('limit', String(limit)); + if (order !== undefined) url.searchParams.set('order', stringifyOrder(order)); + if (zoom !== undefined) url.searchParams.set('zoom', stringifyZoom('', zoom)); + + const response = await this._fetch(new Request(url.toString())); + const config = { cache: this._cache, console: this._console, fetch: this._fetch }; + + return new Response({ ...config, response }); + } + + /** + * Resolves the URL of this node and sends a PUT request + * with provided properties, replacing the existing resource. + * + * @param body Complete resource object. + * @returns Instance of {@link APIResponse} representing this resource. + */ + async put(body?: TGraph['props']): Promise> { + const url = await this._resolve(); + const request = new Request(url.toString(), { body: JSON.stringify(body), method: 'PUT' }); + const response = await this._fetch(request); + const config = { cache: this._cache, console: this._console, fetch: this._fetch }; + + return new Response({ ...config, response }); + } + + /** + * Resolves the URL of this node and sends a POST request + * with provided properties, creating a resource or triggering an action. + * + * @param body Complete resource object. + * @returns Instance of {@link APIResponse} representing this resource. + */ + async post(body?: TGraph['props']): Promise> { + const url = await this._resolve(); + const request = new Request(url.toString(), { body: JSON.stringify(body), method: 'POST' }); + const response = await this._fetch(request); + const config = { cache: this._cache, console: this._console, fetch: this._fetch }; + + return new Response({ ...config, response }); + } + + /** + * Resolves the URL of this node and sends a PATCH request + * with provided properties, updating this resource. + * + * @param body Partial resource object. + * @returns Instance of {@link APIResponse} representing this resource. + */ + async patch(body?: Partial): Promise> { + const url = await this._resolve(); + const request = new Request(url.toString(), { body: JSON.stringify(body), method: 'POST' }); + const response = await this._fetch(request); + const config = { cache: this._cache, console: this._console, fetch: this._fetch }; + + return new Response({ ...config, response }); + } + + /** + * Resolves the URL of this node and sends a DELETE request, + * removing this resource. + * + * @returns Instance of {@link APIResponse} representing this resource. + */ + async delete(): Promise> { + const url = await this._resolve(); + const request = new Request(url.toString(), { method: 'DELETE' }); + const response = await this._fetch(request); + const config = { cache: this._cache, console: this._console, fetch: this._fetch }; + + return new Response({ ...config, response }); + } + + /** + * Resource path builder. Calling this method instructs our + * SDK to find the provided curie in this resource's links and + * navigate to its location on request. + * + * @param curie Curie to follow. + * @returns Instance of {@link APINode} representing the resource at curie location. + */ + follow(curie: C): Node { + const config = { cache: this._cache, console: this._console, fetch: this._fetch }; + const path = this._path.concat(curie as string) as CurieChain; + + return new Node({ ...config, path }); + } + + /** + * Resolves resource URL from a curie chain. The first element in the path + * must be a [URL](https://developer.mozilla.org/en-US/docs/Web/API/URL). + * + * @returns Resolved URL. + * @throws Throws {@link APIResolutionError} when once of the resources can't be reached. + */ + protected async _resolve(): Promise { + if (this._path.length === 1) return this._path[0]; + + const [baseURL, curie] = this._path; + const key = `${baseURL.toString()} > ${curie}`; + const config = { cache: this._cache, console: this._console, fetch: this._fetch }; + + this._console.trace(`Trying to resolve ${key}...`); + const cachedURL = this._cache.getItem(key); + + if (cachedURL) { + this._console.success(`Resolved ${key} to ${cachedURL.toString()} using cache.`); + const reducedPath = [new URL(cachedURL), ...this._path.slice(2)] as CurieChain; + return new Node({ ...config, path: reducedPath })._resolve(); + } + + const response = await this._fetch(baseURL.toString()); + + if (response.ok) { + const json = await response.json(); + const url = new URL(json._links[curie].href); + const reducedPath = [url, ...this._path.slice(2)] as CurieChain; + + this._cache.setItem(key, url.toString()); + this._console.trace(`Cached ${url.toString()} for ${key}.`); + this._console.success(`Resolved ${key} to ${url.toString()} online.`); + + return new Node({ ...config, path: reducedPath })._resolve(); + } else { + this._console.error(`Failed to resolve ${key}.`); + throw new ResolutionError(response); + } + } +} diff --git a/src/core/API/ResolutionError.ts b/src/core/API/ResolutionError.ts new file mode 100644 index 0000000..d3b9290 --- /dev/null +++ b/src/core/API/ResolutionError.ts @@ -0,0 +1,15 @@ +/** + * This error is thrown when one of the requests for a resource + * in a path returns a non-2XX status code during the URL resolution process. + * If you're implementing a custom resolver, consider using this class + * to indicate resolution errors. + */ +export class ResolutionError extends Error { + /** API response object with a non-2XX status code. */ + readonly response: Response; + + constructor(response: Response) { + super(); + this.response = response; + } +} diff --git a/src/core/API/Response.ts b/src/core/API/Response.ts new file mode 100644 index 0000000..8050123 --- /dev/null +++ b/src/core/API/Response.ts @@ -0,0 +1,125 @@ +/* eslint-disable @typescript-eslint/ban-types */ +/* eslint-disable @typescript-eslint/no-unused-vars */ + +import type { Consola } from 'consola'; +import { Response as GlobalThisResponse } from 'cross-fetch'; +import type { Graph } from '../Graph'; +import { Node } from './Node'; +import type { Query } from '../Query'; +import type { Resource } from '../Resource'; + +/** Options of {@link Response} constructor. */ +type Init = { + /** Custom Fetch API implementation for making authenticated requests. */ + fetch: Window['fetch']; + /** Resolver cache implementing [Web Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API). */ + cache: Storage; + /** Shared [Consola](https://github.com/nuxt-contrib/consola) instance. */ + console: Consola; + /** Original API [Response](https://developer.mozilla.org/en-US/docs/Web/API/Response) object. */ + response: globalThis.Response; +}; + +/** + * Gets `json._links` if available. + * + * @param json Raw resource JSON. + * @returns The `_links` record or an empty object if unavailable. + */ +function getLinks(json: object) { + const links = (json as Record)._links; + return typeof links !== 'object' || !links ? {} : (links as Record); +} + +/** + * Gets `json._embedded` if available. + * + * @param json Raw resource JSON. + * @returns The `_embedded` record or an empty object if unavailable. + */ +function getEmbeds(json: object) { + const embeds = (json as Record)._embedded; + return typeof embeds !== 'object' || !embeds ? {} : (embeds as Record); +} + +/** + * Adds {@link Node} methods such as `.get()` or `.follow()` to each value in resource `_links`. + * + * @param params Response parameters and JSON. + * @returns Enriched JSON including followable links. + */ +function addFollowableLinks | undefined>( + params: Omit & { json: unknown } +): Resource { + const { json, ...nodeInit } = params; + if (typeof json !== 'object' || !json) return json as Resource; + + const _links = Object.entries(getLinks(json)).reduce((links, [curie, link]) => { + if (Array.isArray(link)) return { ...links, [curie]: link }; + + const node = new Node({ ...nodeInit, path: [new URL(link.href)] }); + const methods = { + delete: node.delete.bind(node), + follow: node.follow.bind(node), + get: node.get.bind(node), + patch: node.patch.bind(node), + post: node.post.bind(node), + put: node.put.bind(node), + }; + + return { ...links, [curie]: { ...link, ...methods } }; + }, {}); + + const _embedded = Object.entries(getEmbeds(json)).reduce( + (embeds, [embedCurie, embedJSON]) => + Object.assign(embeds, { + [embedCurie]: Array.isArray(embedJSON) + ? embedJSON.map(itemJSON => addFollowableLinks({ ...nodeInit, json: itemJSON })) + : addFollowableLinks({ ...nodeInit, json: embedJSON }), + }), + {} + ); + + return ({ ...json, _embedded, _links } as unknown) as Resource; +} + +/** + * Base class representing any response returned by API. Extends the native Response + * object of Fetch API and has all the data of the original response in addition + * to a few custom methods. You shouldn't need to construct instances of this + * class directly unless you're building a custom API client with this SDK. + */ +export class Response< + TGraph extends Graph, + TQuery extends Query | undefined = undefined +> extends GlobalThisResponse { + /** Shared [Consola](https://github.com/nuxt-contrib/consola) instance. */ + protected readonly _console: Consola; + + /** Custom Fetch API implementation for making authenticated requests. */ + protected readonly _fetch: Window['fetch']; + + /** Resolver cache implementing [Web Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API). */ + protected readonly _cache: Storage; + + constructor({ response, console, fetch, cache }: Init) { + super(response.body, response); + + this._console = console; + this._fetch = fetch; + this._cache = cache; + } + + /** + * Gets JSON data from the response body and generates + * a followable response with a number of shortcuts + * for the most common actions. + * + * @returns Followable API response. + */ + async json(): Promise> { + const json = await super.json(); + const config = { cache: this._cache, console: this._console, fetch: this._fetch }; + return addFollowableLinks({ json, ...config }); + } +} diff --git a/src/core/API/index.ts b/src/core/API/index.ts new file mode 100644 index 0000000..5fc3843 --- /dev/null +++ b/src/core/API/index.ts @@ -0,0 +1 @@ +export { API } from './API'; diff --git a/src/core/Graph.d.ts b/src/core/Graph.d.ts new file mode 100644 index 0000000..b5bd2e7 --- /dev/null +++ b/src/core/Graph.d.ts @@ -0,0 +1,7 @@ +export interface Graph { + readonly curie?: string; + readonly links?: Readonly>; + readonly props?: Readonly>; + readonly child?: Graph; + readonly zooms?: Readonly>; +} diff --git a/src/core/Query/Fields.d.ts b/src/core/Query/Fields.d.ts new file mode 100644 index 0000000..18db470 --- /dev/null +++ b/src/core/Query/Fields.d.ts @@ -0,0 +1,6 @@ +import type { Graph } from '../Graph'; +import type { With } from '../utils'; + +export type Fields = TGraph extends With + ? ReadonlyArray + : never; diff --git a/src/core/Query/Order.d.ts b/src/core/Query/Order.d.ts new file mode 100644 index 0000000..ddcd5e9 --- /dev/null +++ b/src/core/Query/Order.d.ts @@ -0,0 +1,13 @@ +import type { Graph } from '../Graph'; +import type { With } from '../utils'; + +type OrderRecord = { + readonly [Key in TPropertyKey]?: 'asc' | 'desc'; +}; + +export type Order = TGraph extends With + ? + | keyof TGraph['props'] + | ReadonlyArray> + | OrderRecord + : never; diff --git a/src/core/Query/Query.d.ts b/src/core/Query/Query.d.ts new file mode 100644 index 0000000..7cde745 --- /dev/null +++ b/src/core/Query/Query.d.ts @@ -0,0 +1,14 @@ +import type { Fields } from './Fields'; +import type { Graph } from '../Graph'; +import type { Order } from './Order'; +import type { With } from '../utils'; +import type { Zoom } from './Zoom'; + +export interface Query { + readonly zoom?: Zoom ? G['child'] : G>; + readonly order?: G extends With ? Order : never; + readonly limit?: G extends With ? number : never; + readonly fields?: Fields ? G['child'] : G>; + readonly offset?: G extends With ? number : never; + readonly filters?: G extends With ? ReadonlyArray : never; +} diff --git a/src/core/Query/Zoom.d.ts b/src/core/Query/Zoom.d.ts new file mode 100644 index 0000000..5d498af --- /dev/null +++ b/src/core/Query/Zoom.d.ts @@ -0,0 +1,12 @@ +import type { OptionalKeyOf, With } from '../utils'; +import type { Graph } from '../Graph'; + +type ZoomArray = ReadonlyArray | ZoomRecord>; +type ZoomString = OptionalKeyOf; +type ZoomRecord = { + readonly [Key in ZoomString]?: Zoom[Key]>; +}; + +export type Zoom = TGraph extends With + ? ZoomString | ZoomRecord | ZoomArray + : never; diff --git a/src/core/Query/index.d.ts b/src/core/Query/index.d.ts new file mode 100644 index 0000000..4251e17 --- /dev/null +++ b/src/core/Query/index.d.ts @@ -0,0 +1 @@ +export type { Query } from './Query'; diff --git a/src/core/Resource/Child.d.ts b/src/core/Resource/Child.d.ts new file mode 100644 index 0000000..13d85bb --- /dev/null +++ b/src/core/Resource/Child.d.ts @@ -0,0 +1,32 @@ +import type { Embeds } from './Embeds'; +import type { Graph } from '../Graph'; +import type { Links } from './Links'; +import type { Props } from './Props'; +import type { Query } from '../Query'; +import type { With } from '../utils'; + +type ChildZoom, TQuery extends Query | undefined> = TQuery extends With< + Query, + 'zoom' +> + ? { zoom: TQuery['zoom'] } + : unknown; + +type ChildFields, TQuery extends Query | undefined> = TQuery extends With< + Query, + 'fields' +> + ? { fields: TQuery['fields'] } + : unknown; + +type ChildQuery, TQuery extends Query | undefined> = Record< + string, + unknown +> & + ChildZoom & + ChildFields; + +/** Constructs a resource record for an embedded (child) graph node and query. */ +export type Child | undefined> = TGraph extends With + ? ReadonlyArray>> + : Links & Props & Embeds; diff --git a/src/core/Resource/Embeds.d.ts b/src/core/Resource/Embeds.d.ts new file mode 100644 index 0000000..d6870a4 --- /dev/null +++ b/src/core/Resource/Embeds.d.ts @@ -0,0 +1,33 @@ +import type { ExcludeNever, IntersectionValueOf, With, ZoomOn } from '../utils'; +import type { Child } from './Child'; +import type { Graph } from '../Graph'; +import type { Query } from '../Query'; +import type { Zooms } from './Zooms'; + +/** + * For each zoomed rel that has a curie, creates a record + * like `{ [curie]: APIResponseJSONChild }` and returns the intersection + * of those records. + */ +type ResourceEmbed, TQuery extends Query | undefined> = IntersectionValueOf< + { + [Rel in Zooms]: Required[Rel] extends With + ? { + [Curie in Required[Rel]['curie']]: Child< + Required[Rel], + Record<'zoom', ZoomOn> + >; + } + : never; + } +>; + +/** Constructs part of the resource record with the embedded content. */ +export type Embeds | undefined> = ExcludeNever<{ + /** Embedded resources. */ + _embedded: TGraph extends With // <---------------| When given a collection with a curie, + ? Record> // <---| create a special record like `{ [collection_curie]: APIResourceChild }`. + : TGraph extends With // <--------------------------------| If it's a single zoomable resource, + ? ResourceEmbed // <----------------------------------| construct a regular zoom record like `{ [zoomed_curie]: APIResourceChild, ... }`. + : never; // <-------------------------------------------------------------------| In any other case remove the `_embedded` property from output. +}>; diff --git a/src/core/Resource/Links.d.ts b/src/core/Resource/Links.d.ts new file mode 100644 index 0000000..9d72a37 --- /dev/null +++ b/src/core/Resource/Links.d.ts @@ -0,0 +1,23 @@ +import type { Graph } from '../Graph'; +import type { Node } from '../API/Node'; +import type { With } from '../utils'; + +/** Represents a hAPI relation link. */ +type Link = Node & { + /** True if this is a template link (example: `https://api.foxycart.com/rels/{rel}`) */ + templated?: boolean; + /** Short description of this link. */ + title?: string; + /** For named links, this property will include link name. */ + name?: string; + /** URL of the resource this link points to. */ + href: string; +}; + +/** Constructs part of the resource record that includes hAPI links. */ +export type Links = TGraph extends With + ? { + /** Links to related resources and actions. */ + _links: { [TLink in keyof TGraph['links']]: Link }; + } + : unknown; diff --git a/src/core/Resource/Props.d.ts b/src/core/Resource/Props.d.ts new file mode 100644 index 0000000..432821d --- /dev/null +++ b/src/core/Resource/Props.d.ts @@ -0,0 +1,14 @@ +import type { Graph } from '../Graph'; +import type { Query } from '../Query'; +import type { With } from '../utils'; + +/** Constructs part of the resource record with all requested properties. */ +export type Props | undefined> = TGraph extends With // <--------------------------------| If resource has props, + ? TGraph extends With // <--------------------------------| and it's a collection, + ? TGraph['props'] // <-----------------------------------------------------| then include all props. + : TQuery extends Query // <--------------------------| Otherwise, if it's a single resource fetched with a custom query, + ? TQuery['fields'] extends ReadonlyArray // <------------| which happens to have a fields array, + ? Pick> // <--| then include only selected props. + : TGraph['props'] // <---------------------------------------------------| In case there's no restrictions on fields, include all of them; + : TGraph['props'] // <-----------------------------------------------------| and when there's no query, do the same. + : unknown; // <-----------------------------------------------------------------| Finally, include nothing for resources without props diff --git a/src/core/Resource/Resource.d.ts b/src/core/Resource/Resource.d.ts new file mode 100644 index 0000000..8815b8b --- /dev/null +++ b/src/core/Resource/Resource.d.ts @@ -0,0 +1,10 @@ +import type { Embeds } from './Embeds'; +import type { Graph } from '../Graph'; +import type { Links } from './Links'; +import type { Props } from './Props'; +import type { Query } from '../Query'; + +/** Constructs a resource record for given graph node and query. */ +export type Resource | undefined> = Links & + Props & + Embeds; diff --git a/src/core/Resource/Zooms.d.ts b/src/core/Resource/Zooms.d.ts new file mode 100644 index 0000000..0e9cfc7 --- /dev/null +++ b/src/core/Resource/Zooms.d.ts @@ -0,0 +1,23 @@ +import { KeyOf, RequiredKeyOf, With } from '../utils'; +import { Graph } from '../Graph'; +import { Query } from '../Query'; + +/** Creates an intersection of relations included in the top level of the zoom query parameter. */ +export type Zooms | undefined> = Extract< + TGraph extends With + ? + | RequiredKeyOf // <----------------------------------------| include all default embeds. + | (TQuery extends Query // <---------------------------| If there are query parameters, + ? TQuery extends With, 'zoom'> // <----------| and one of them is zoom, also apply the following rules: + ? TQuery['zoom'] extends string // <-------------------------------| 1. For string values, + ? TQuery['zoom'] // <--------------------------------------------| include them as-is; + : TQuery['zoom'] extends (infer R)[] // <------------------------| 2. For values like `[foo, { bar: baz }]`, + ? Extract | KeyOf>> // <--| include `foo | bar` (top-level values and keys); + : TQuery['zoom'] extends Record // <------------| 3. For values like `{ bar: baz, qux: bat }`, + ? keyof TQuery['zoom'] // <--------------------------------------| include `bar | qux` (top-level keys). + : never // <------------------------------------------------------------| In any other case, + : never // <--------------------------------------------------------------| be it malformed input or empty query, + : never) // <---------------------------------------------------------------| include default embeds only. + : never, + string +>; diff --git a/src/core/Resource/index.d.ts b/src/core/Resource/index.d.ts new file mode 100644 index 0000000..fb825dc --- /dev/null +++ b/src/core/Resource/index.d.ts @@ -0,0 +1 @@ +export type { Resource } from './Resource'; diff --git a/src/core/defaults.d.ts b/src/core/defaults.d.ts new file mode 100644 index 0000000..71a1c93 --- /dev/null +++ b/src/core/defaults.d.ts @@ -0,0 +1,25 @@ +import { Graph } from './Graph'; + +export type CollectionGraphLinks = { + /** This collection. */ + self: TGraph; + /** First page of this collection. */ + first: TGraph; + /** Previous page of this collection. */ + prev: TGraph; + /** Next page of this collection. */ + next: TGraph; + /** Last page of this collection. */ + last: TGraph; +}; + +export type CollectionGraphProps = { + /** Total number of resources in this collection. */ + total_items: number; + /** Number of items returned with this response. */ + returned_items: number; + /** Maximum allowed number of items for this query. */ + limit: number; + /** Number of skipped items. */ + offset: number; +}; diff --git a/src/core/index.ts b/src/core/index.ts new file mode 100644 index 0000000..cdba93c --- /dev/null +++ b/src/core/index.ts @@ -0,0 +1,4 @@ +export type { Resource } from './Resource'; +export type { Query } from './Query'; +export type { Graph } from './Graph'; +export { API } from './API'; diff --git a/src/core/utils.d.ts b/src/core/utils.d.ts new file mode 100644 index 0000000..8470384 --- /dev/null +++ b/src/core/utils.d.ts @@ -0,0 +1,53 @@ +import { Graph } from './Graph'; +import { Query } from './Query'; + +/** Same as `keyof T`, but creates an alias of `never` when given `never`. */ +export type KeyOf = [T] extends [never] ? never : keyof T; + +/** Creates a union of record values. */ +export type ValueOf = T[keyof T]; + +/** Creates a union of required property keys. */ +export type RequiredKeyOf = Exclude ? K : never }>, undefined>; + +/** Creates a union of optional property keys. */ +export type OptionalKeyOf = Exclude ? never : K }>, undefined>; + +/** Converts union type to intersection type. */ +export type UnionToIntersection = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never; + +/** Creates intersection type out of a record values union. */ +export type IntersectionValueOf = UnionToIntersection>; + +/** From T, pick a set of properties whose keys are in the union K, and make them required. */ +export type With = Pick, K>; + +/** Same as `keyof T`, but omitting keys of properties with values resolving to `never`. */ +export type AvailableKeyOf = ValueOf<{ [K in keyof T]: [T[K]] extends [never] ? never : K }>; + +/** From T, pick a set of properties whose values are not `never`. */ +export type ExcludeNever = { [K in AvailableKeyOf]: T[K] }; + +/** + * Takes the existing zoom query parameter value and excludes all + * top-level zooms, zooming in on the given relation. + */ +export type ZoomIn = TZoom extends (infer Items)[] + ? ValueOf>> + : TZoom extends Record + ? NestedAPINodeQueryZoom + : never; + +/** + * Zooms in on the given rel and constructs a type + * extending `APINodeQueryZoom` for use in a query. + */ +export type ZoomOn< + TGraph extends Graph, + TQuery extends Query | undefined, + TRel extends keyof TGraph['zooms'] +> = TQuery extends With, 'zoom'> + ? ZoomIn extends Query[TRel]>['zoom'] + ? ZoomIn + : never + : never; diff --git a/src/customer/API.ts b/src/customer/API.ts new file mode 100644 index 0000000..0c8db40 --- /dev/null +++ b/src/customer/API.ts @@ -0,0 +1,84 @@ +import * as Core from '../core'; +import type { Credentials, Session } from './types'; +import type { Graph } from './Graph'; +import { fetch } from 'cross-fetch'; + +export class API extends Core.API { + static readonly AUTH_EXPIRES = 'fx.customer.expires'; + + static readonly AUTH_HEADER = 'fx.customer'; + + static readonly AUTH_TOKEN = 'fx.customer'; + + static readonly AUTH_JWT = 'fx.customer.jwt'; + + async fetch(input: RequestInfo, init?: RequestInit): Promise { + const headers = new Headers(init?.headers); + const method = init?.method?.toUpperCase() ?? 'GET'; + const token = this.storage.getItem(API.AUTH_TOKEN); + const url = typeof input === 'string' ? input : input.url; + + headers.set('Content-Type', 'application/json'); + if (token !== null) headers.set(API.AUTH_HEADER, token); + + this.console.trace(`${method} ${url}`); + const response = await fetch(input, { ...init, headers }); + const freshToken = response.headers.get(API.AUTH_HEADER); + if (freshToken !== null) this.storage.setItem(API.AUTH_TOKEN, freshToken); + + return response; + } + + async signIn(credentials: Credentials): Promise { + let response: Response; + + try { + response = await fetch(new URL('authenticate', this.base).toString(), { + headers: new Headers({ 'Content-Type': 'application/json' }), + method: 'POST', + body: JSON.stringify(credentials), + }); + } catch (err) { + throw new Core.API.AuthError({ + code: 'UNKNOWN', + originalError: err, + }); + } + + if (response.ok) { + const { jwt, cookieValue, cookieMaxAge } = (await response.json()) as Session; + const expires = new Date(Date.now() + cookieMaxAge * 1000).toISOString(); + + this.storage.setItem(API.AUTH_EXPIRES, expires); + this.storage.setItem(API.AUTH_TOKEN, cookieValue); + if (jwt) this.storage.setItem(API.AUTH_JWT, jwt); + } else { + throw new Core.API.AuthError({ + code: response.status.toString().startsWith('5') ? 'UNKNOWN' : 'UNAUTHORIZED', + }); + } + } + + async sendPasswordResetEmail(email: string): Promise { + let response: Response; + + try { + response = await fetch(new URL('forgot_password', this.base).toString(), { + headers: new Headers({ 'Content-Type': 'application/json' }), + method: 'POST', + body: JSON.stringify({ email }), + }); + } catch (err) { + throw new Core.API.AuthError({ + code: 'UNKNOWN', + originalError: err, + }); + } + + if (!response.ok) throw new Core.API.AuthError({ code: 'UNKNOWN' }); + } + + async signOut(): Promise { + this.storage.clear(); + } +} diff --git a/src/customer/Graph/attribute.d.ts b/src/customer/Graph/attribute.d.ts new file mode 100644 index 0000000..6a7306e --- /dev/null +++ b/src/customer/Graph/attribute.d.ts @@ -0,0 +1,7 @@ +import type * as Core from '../../core'; +import type * as Integration from '../../integration'; + +export interface FxAttribute extends Core.Graph { + curie: Integration.Rels.FxAttribute['curie']; + props: Integration.Rels.FxAttribute['props']; +} diff --git a/src/customer/Graph/attributes.d.ts b/src/customer/Graph/attributes.d.ts new file mode 100644 index 0000000..e9f4a6e --- /dev/null +++ b/src/customer/Graph/attributes.d.ts @@ -0,0 +1,8 @@ +import type * as Core from '../../core'; +import type * as Integration from '../../integration'; +import type { FxAttribute } from './attribute'; + +export interface FxAttributes extends Core.Graph { + curie: Integration.Rels.FxAttributes['curie']; + child: FxAttribute; +} diff --git a/src/customer/Graph/default_billing_address.d.ts b/src/customer/Graph/default_billing_address.d.ts new file mode 100644 index 0000000..9a9fa99 --- /dev/null +++ b/src/customer/Graph/default_billing_address.d.ts @@ -0,0 +1,7 @@ +import type * as Core from '../../core'; +import type * as Integration from '../../integration'; + +export interface FxDefaultBillingAddress extends Core.Graph { + curie: Integration.Rels.FxDefaultBillingAddress['curie']; + props: Integration.Rels.FxDefaultBillingAddress['props']; +} diff --git a/src/customer/Graph/default_payment_method.d.ts b/src/customer/Graph/default_payment_method.d.ts new file mode 100644 index 0000000..c051a16 --- /dev/null +++ b/src/customer/Graph/default_payment_method.d.ts @@ -0,0 +1,7 @@ +import type * as Core from '../../core'; +import type * as Integration from '../../integration'; + +export interface FxDefaultPaymentMethod extends Core.Graph { + curie: Integration.Rels.FxDefaultPaymentMethod['curie']; + props: Integration.Rels.FxDefaultPaymentMethod['props']; +} diff --git a/src/customer/Graph/default_shipping_address.d.ts b/src/customer/Graph/default_shipping_address.d.ts new file mode 100644 index 0000000..2f7d0fb --- /dev/null +++ b/src/customer/Graph/default_shipping_address.d.ts @@ -0,0 +1,7 @@ +import type * as Core from '../../core'; +import type * as Integration from '../../integration'; + +export interface FxDefaultShippingAddress extends Core.Graph { + curie: Integration.Rels.FxDefaultShippingAddress['curie']; + props: Integration.Rels.FxDefaultShippingAddress['props']; +} diff --git a/src/customer/Graph/index.d.ts b/src/customer/Graph/index.d.ts new file mode 100644 index 0000000..dc218d6 --- /dev/null +++ b/src/customer/Graph/index.d.ts @@ -0,0 +1,32 @@ +import type * as Core from '../../core'; +import type * as Integration from '../../integration'; +import type { FxAttributes } from './attributes'; +import type { FxDefaultBillingAddress } from './default_billing_address'; +import type { FxDefaultPaymentMethod } from './default_payment_method'; +import type { FxDefaultShippingAddress } from './default_shipping_address'; +import type { FxSubscriptions } from './subscriptions'; +import type { FxTransactions } from './transactions'; + +export interface Graph extends Core.Graph { + props: Pick< + Integration.Rels.FxCustomer['props'], + | 'date_created' + | 'date_modified' + | 'email' + | 'first_name' + | 'id' + | 'is_anonymous' + | 'last_login_date' + | 'last_name' + | 'tax_id' + >; + + zooms: { + default_shipping_address?: FxDefaultShippingAddress; + default_billing_address?: FxDefaultBillingAddress; + default_payment_method?: FxDefaultPaymentMethod; + subscriptions?: FxSubscriptions; + transactions?: FxTransactions; + attributes: FxAttributes; + }; +} diff --git a/src/customer/Graph/item.d.ts b/src/customer/Graph/item.d.ts new file mode 100644 index 0000000..69f472e --- /dev/null +++ b/src/customer/Graph/item.d.ts @@ -0,0 +1,7 @@ +import type * as Core from '../../core'; +import type * as Integration from '../../integration'; + +export interface FxItem extends Core.Graph { + curie: Integration.Rels.FxItem['curie']; + props: Integration.Rels.FxItem['props']; +} diff --git a/src/customer/Graph/items.d.ts b/src/customer/Graph/items.d.ts new file mode 100644 index 0000000..732b342 --- /dev/null +++ b/src/customer/Graph/items.d.ts @@ -0,0 +1,8 @@ +import type * as Core from '../../core'; +import type * as Integration from '../../integration'; +import type { FxItem } from './item'; + +export interface FxItems extends Core.Graph { + curie: Integration.Rels.FxItems['curie']; + child: FxItem; +} diff --git a/src/customer/Graph/subscription.d.ts b/src/customer/Graph/subscription.d.ts new file mode 100644 index 0000000..44b1796 --- /dev/null +++ b/src/customer/Graph/subscription.d.ts @@ -0,0 +1,18 @@ +import type * as Core from '../../core'; +import type * as Integration from '../../integration'; +import type { FxTransactionTemplate } from './transaction_template'; +import type { FxTransactions } from './transactions'; + +export interface FxSubscription extends Core.Graph { + curie: Integration.Rels.FxSubscription['curie']; + links: Pick; + props: Integration.Rels.FxSubscription['props']; + zooms: { + transaction_template: FxTransactionTemplate; + transactions: FxTransactions; + template_config: { + curie: 'template_config'; + props: Integration.Rels.FxCustomerPortalSettings['props']['subscriptions']; + }; + }; +} diff --git a/src/customer/Graph/subscriptions.d.ts b/src/customer/Graph/subscriptions.d.ts new file mode 100644 index 0000000..70960c7 --- /dev/null +++ b/src/customer/Graph/subscriptions.d.ts @@ -0,0 +1,8 @@ +import type * as Core from '../../core'; +import type * as Integration from '../../integration'; +import type { FxSubscription } from './subscription'; + +export interface FxSubscriptions extends Core.Graph { + curie: Integration.Rels.FxSubscriptions['curie']; + child: FxSubscription; +} diff --git a/src/customer/Graph/transaction.d.ts b/src/customer/Graph/transaction.d.ts new file mode 100644 index 0000000..f526a53 --- /dev/null +++ b/src/customer/Graph/transaction.d.ts @@ -0,0 +1,10 @@ +import type * as Core from '../../core'; +import type * as Integration from '../../integration'; +import type { FxItems } from './items'; + +export interface FxTransaction extends Core.Graph { + curie: Integration.Rels.FxTransaction['curie']; + links: Pick; + props: Integration.Rels.FxTransaction['props']; + zooms: { items?: FxItems }; +} diff --git a/src/customer/Graph/transaction_template.d.ts b/src/customer/Graph/transaction_template.d.ts new file mode 100644 index 0000000..c2f5afa --- /dev/null +++ b/src/customer/Graph/transaction_template.d.ts @@ -0,0 +1,11 @@ +import type * as Core from '../../core'; +import type * as Integration from '../../integration'; +import type { FxItems } from './items'; + +export interface FxTransactionTemplate extends Core.Graph { + curie: Integration.Rels.FxTransactionTemplate['curie']; + props: Integration.Rels.FxTransactionTemplate['props']; + zooms: { + items: FxItems; + }; +} diff --git a/src/customer/Graph/transactions.d.ts b/src/customer/Graph/transactions.d.ts new file mode 100644 index 0000000..820bf62 --- /dev/null +++ b/src/customer/Graph/transactions.d.ts @@ -0,0 +1,8 @@ +import type * as Core from '../../core'; +import type * as Integration from '../../integration'; +import { FxTransaction } from './transaction'; + +export interface FxTransactions extends Core.Graph { + curie: Integration.Rels.FxTransactions['curie']; + child: FxTransaction; +} diff --git a/src/customer/Rels.d.ts b/src/customer/Rels.d.ts new file mode 100644 index 0000000..6f141ac --- /dev/null +++ b/src/customer/Rels.d.ts @@ -0,0 +1,12 @@ +export * from './Graph/attribute'; +export * from './Graph/attributes'; +export * from './Graph/default_billing_address'; +export * from './Graph/default_payment_method'; +export * from './Graph/default_shipping_address'; +export * from './Graph/item'; +export * from './Graph/items'; +export * from './Graph/subscription'; +export * from './Graph/subscriptions'; +export * from './Graph/transaction'; +export * from './Graph/transaction_template'; +export * from './Graph/transactions'; diff --git a/src/customer/index.ts b/src/customer/index.ts new file mode 100644 index 0000000..c1d8a59 --- /dev/null +++ b/src/customer/index.ts @@ -0,0 +1,5 @@ +export { API } from './API'; + +import type * as Rels from './Rels'; +export type { Graph } from './Graph'; +export type { Rels }; diff --git a/src/customer/types.d.ts b/src/customer/types.d.ts new file mode 100644 index 0000000..7469c5f --- /dev/null +++ b/src/customer/types.d.ts @@ -0,0 +1,20 @@ +export interface Session { + /** The session lifetime as configured in Foxy (in seconds). */ + cookieMaxAge: number; + /** Name of the auth cookie and the respective auth header. */ + cookieName: string; + /** Value of the auth cookie and the respective auth header. */ + cookieValue: string; + /** Optional JWT string using RS256 (public/private key) signing. */ + jwt?: string; +} + +/** User credentials for authentication. */ +export interface Credentials { + /** Email address associated with an account. */ + email: string; + /** Current password during regular sign-in, temporary password or a one-time code during access recovery. */ + password: string; + /** New password (only needed during the access recovery or force reset). */ + newPassword?: string; +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..d90d10f --- /dev/null +++ b/src/index.ts @@ -0,0 +1,4 @@ +export * as Core from './core'; +export * as Integration from './integration'; +export * as Customer from './customer'; +export * as Admin from './admin'; diff --git a/src/integration/API.ts b/src/integration/API.ts new file mode 100644 index 0000000..e8931c4 --- /dev/null +++ b/src/integration/API.ts @@ -0,0 +1,110 @@ +import * as Core from '../core'; +import * as Rels from './Rels'; +import fetch, { Headers } from 'cross-fetch'; +import { Graph } from './Graph'; +import { LogLevel } from 'consola'; +import MemoryStorage from 'ministorage'; + +type LocalToken = Rels.FxToken['props'] & { date_created: string }; + +/** In order to facilitate any major, unforeseen breaking changes in the future, we require each request to include API version. We hope to rarely (never?) change it but by requiring it up front, we can ensure what you get today is what you’ll get tomorrow. */ +type IntegrationAPIVersion = '1'; + +/** Contructor parameters of the {@link IntegrationAPI} class. */ +type IntegrationAPIInit = { + refreshToken: string; + clientSecret: string; + clientId: string; + logLevel?: LogLevel; + storage?: Storage; + version?: IntegrationAPIVersion; + baseURL?: URL; // pathname ending with "/" !!! + cache?: Storage; +}; + +/** JS SDK for building integrations with [Foxy Hypermedia API](https://api.foxycart.com/docs). Hypermedia API is designed to give you complete control over all aspects of your Foxy accounts, whether working with a single store or automating the provisioning of thousands. Anything you can do within the Foxy administration, you can also do through the API. This means that you can embed Foxy into any application (CMS, LMS, CRM, etc.) and expose as much or as little of Foxy's functionality as desired. */ +export class API extends Core.API { + static readonly REFRESH_THRESHOLD = 5 * 60 * 1000; + + static readonly ACCESS_TOKEN = 'access_token'; + + static readonly BASE_URL = new URL('https://api.foxycart.com/'); + + static readonly VERSION: IntegrationAPIVersion = '1'; + + readonly refreshToken: string; + + readonly clientSecret: string; + + readonly clientId: string; + + readonly version: IntegrationAPIVersion; + + constructor(params: IntegrationAPIInit) { + super({ + level: params.logLevel, + storage: params.storage ?? new MemoryStorage(), + base: params.baseURL ?? API.BASE_URL, + fetch: (...args) => this.__fetch(...args), + cache: params.cache ?? new MemoryStorage(), + }); + + this.refreshToken = params.refreshToken; + this.clientSecret = params.clientSecret; + this.clientId = params.clientId; + this.version = params.version ?? API.VERSION; + } + + private async __fetch(input: RequestInfo, init?: RequestInit): Promise { + let token = JSON.parse(this.storage.getItem(API.ACCESS_TOKEN) ?? 'null') as LocalToken | null; + + if (token !== null) { + const expiresAt = new Date(token.date_created).getTime() + token.expires_in * 1000; + const refreshAt = Date.now() + API.REFRESH_THRESHOLD; + + if (expiresAt < refreshAt) { + this.storage.removeItem(API.ACCESS_TOKEN); + this.console.info('Removed old access token from the storage.'); + token = null; + } + } + + if (token === null) { + const headers = new Headers(); + const body = new URLSearchParams(); + const url = new URL('token', this.base).toString(); + + headers.set('FOXY-API-VERSION', this.version); + headers.set('Content-Type', 'application/x-www-form-urlencoded'); + + body.set('refresh_token', this.refreshToken); + body.set('client_secret', this.clientSecret); + body.set('grant_type', 'refresh_token'); + body.set('client_id', this.clientId); + + this.console.trace("Access token isn't present in the storage. Fetching a new one..."); + const response = await fetch(url, { method: 'POST', headers, body }); + + if (response.ok) { + const props = (await response.json()) as Rels.FxToken['props']; + token = { ...props, date_created: new Date().toISOString() }; + this.storage.setItem(API.ACCESS_TOKEN, JSON.stringify(token)); + this.console.info('Access token updated.'); + } else { + this.console.warn('Failed to fetch access token. Proceeding without authentication.'); + } + } + + const headers = new Headers(init?.headers); + const method = init?.method?.toUpperCase() ?? 'GET'; + const url = typeof input === 'string' ? input : input.url; + + headers.set('FOXY-API-VERSION', this.version); + headers.set('Content-Type', 'application/json'); + + if (token !== null) headers.set('Authorization', `Bearer ${token.access_token}`); + + this.console.trace(`${method} ${url}`); + return fetch(input, { ...init, headers }); + } +} diff --git a/src/integration/Graph/admin_email_template.d.ts b/src/integration/Graph/admin_email_template.d.ts new file mode 100644 index 0000000..796d65f --- /dev/null +++ b/src/integration/Graph/admin_email_template.d.ts @@ -0,0 +1,8 @@ +import type { FxEmailTemplate } from './email_template'; +import type { Graph } from '../../core'; + +export interface FxAdminEmailTemplate extends Graph { + curie: 'fx:admin_email_template'; + links: FxEmailTemplate['links']; + props: FxEmailTemplate['props']; +} diff --git a/src/integration/Graph/applied_coupon_code.d.ts b/src/integration/Graph/applied_coupon_code.d.ts new file mode 100644 index 0000000..2244c00 --- /dev/null +++ b/src/integration/Graph/applied_coupon_code.d.ts @@ -0,0 +1,31 @@ +import type { FxCart } from './cart'; +import type { FxCoupon } from './coupon'; +import type { FxCouponCode } from './coupon_code'; +import type { FxStore } from './store'; +import type { Graph } from '../../core'; + +export interface FxAppliedCouponCode extends Graph { + curie: 'fx:applied_coupon_code'; + + links: { + /** This resource. */ + 'self': FxAppliedCouponCode; + /** Related cart resource. */ + 'fx:cart': FxCart; + /** Related store resource. */ + 'fx:store': FxStore; + /** Related coupon resource. */ + 'fx:coupon': FxCoupon; + /** Related coupon code resource. */ + 'fx:coupon_code': FxCouponCode; + }; + + props: { + /** The coupon code applied to this cart. */ + code: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/applied_coupon_codes.d.ts b/src/integration/Graph/applied_coupon_codes.d.ts new file mode 100644 index 0000000..4bf25ac --- /dev/null +++ b/src/integration/Graph/applied_coupon_codes.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxAppliedCouponCode } from './applied_coupon_code'; +import type { Graph } from '../../core'; + +export interface FxAppliedCouponCodes extends Graph { + curie: 'fx:applied_coupon_codes'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxAppliedCouponCode; +} diff --git a/src/integration/Graph/applied_tax.d.ts b/src/integration/Graph/applied_tax.d.ts new file mode 100644 index 0000000..500d360 --- /dev/null +++ b/src/integration/Graph/applied_tax.d.ts @@ -0,0 +1,40 @@ +import type { FxStore } from './store'; +import type { FxTax } from './tax'; +import type { FxTransaction } from './transaction'; +import type { Graph } from '../../core'; + +export interface FxAppliedTax extends Graph { + curie: 'fx:applied_tax'; + + links: { + /** This resource. */ + 'self': FxAppliedTax; + /** Tax configuration. */ + 'fx:tax': FxTax; + /** Store that handled the transaction this tax applies to. */ + 'fx:store': FxStore; + /** Transaction this tax applies to. */ + 'fx:transaction': FxTransaction; + }; + + props: { + /** The tax rate as a percentage for this applied tax. As an example, a 9.75% tax rate would be displayed as 9.75. */ + rate: number; + /** The original tax name of this tax. */ + name: string; + /** The amount of tax applied to the transaction. Note, this amount is not rounded to the specific currency decimal precision. */ + amount: number; + /** Whether or not this tax was also applied to the handling fees for the transaction. */ + apply_to_handling: boolean; + /** Whether or not this tax was also applied to the shipping fees for the transaction. */ + apply_to_shipping: boolean; + /** Whether or not this applied tax is part of a subscription that is to be charged in the future based on when this transaction was processed. */ + is_future_tax: boolean; + /** If this tax only applied to a specific shipto shipment, the shipto address name will be listed here. */ + shipto: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/applied_taxes.d.ts b/src/integration/Graph/applied_taxes.d.ts new file mode 100644 index 0000000..160591a --- /dev/null +++ b/src/integration/Graph/applied_taxes.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxAppliedTax } from './applied_tax'; +import type { Graph } from '../../core'; + +export interface FxAppliedTaxes extends Graph { + curie: 'fx:applied_taxes'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxAppliedTax; +} diff --git a/src/integration/Graph/attribute.d.ts b/src/integration/Graph/attribute.d.ts new file mode 100644 index 0000000..d6566a4 --- /dev/null +++ b/src/integration/Graph/attribute.d.ts @@ -0,0 +1,23 @@ +import type { Graph } from '../../core'; + +export interface FxAttribute extends Graph { + curie: 'fx:attribute'; + + links: { + /** This resource. */ + self: FxAttribute; + }; + + props: { + /** Controls who can see this attribute. Public attributes can be shown to anyone, including customers. Private attributes are more suitable for configuration or technical details which are irrelevant to the public. Restricted attributes can only be viewed by the OAuth client who creates them. */ + visibility: 'public' | 'private' | 'restricted'; + /** The name of this attribute. */ + name: string; + /** The value of this attribute. */ + value: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/attributes.d.ts b/src/integration/Graph/attributes.d.ts new file mode 100644 index 0000000..2f9ecb3 --- /dev/null +++ b/src/integration/Graph/attributes.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxAttribute } from './attribute'; +import type { Graph } from '../../core'; + +export interface FxAttributes extends Graph { + curie: 'fx:attributes'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxAttribute; +} diff --git a/src/integration/Graph/billing_address.d.ts b/src/integration/Graph/billing_address.d.ts new file mode 100644 index 0000000..cfefb20 --- /dev/null +++ b/src/integration/Graph/billing_address.d.ts @@ -0,0 +1,58 @@ +import type { FxBillingAddresses } from './billing_addresses'; +import type { FxCustomer } from './customer'; +import type { FxCustomerAddress } from './customer_address'; +import type { FxStore } from './store'; +import type { FxTransaction } from './transaction'; +import type { Graph } from '../../core'; + +export interface FxBillingAddress extends Graph { + curie: 'fx:billing_address'; + + links: { + /** This resource. */ + 'self': FxBillingAddress; + /** Store this billing address is registered in. */ + 'fx:store': FxStore; + /** Customer this billing address belongs to. */ + 'fx:customer': FxCustomer; + /** Transaction associated with this billing address. */ + 'fx:transaction': FxTransaction; + /** Address of the customer this billing address belongs to. */ + 'fx:customer_address': FxCustomerAddress; + /** Collection of all billing addresses. */ + 'fx:billing_addresses': FxBillingAddresses; + }; + + props: { + /** The name of this address. This is also the value used as the shipto entry for a multiship item. */ + address_name: string; + /** The given name associated with this address. */ + first_name: string; + /** The surname associated with this address. */ + last_name: string; + /** The company associated with this address. */ + company: string; + /** The first line of the street address. */ + address1: string; + /** The second line of the street address. */ + address2: string; + /** The city of this address. */ + city: string; + /** The two character code for states in the United States. Other countries may call this a province. When a two character code isn't available, use the full region name. */ + region: string; + /** The postal code of this address. */ + postal_code: string; + /** The country code of this address. */ + country: string; + /** The phone of this address. */ + phone: string; + /** Specifies if this address is the default billing address for the customer. */ + is_default_billing: boolean; + /** Specifies if this address is the default shipping address for the customer. */ + is_default_shipping: boolean; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/billing_addresses.d.ts b/src/integration/Graph/billing_addresses.d.ts new file mode 100644 index 0000000..ba7d63b --- /dev/null +++ b/src/integration/Graph/billing_addresses.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxBillingAddress } from './billing_address'; +import type { Graph } from '../../core'; + +export interface FxBillingAddresses extends Graph { + curie: 'fx:billing_addresses'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxBillingAddress; +} diff --git a/src/integration/Graph/cache.d.ts b/src/integration/Graph/cache.d.ts new file mode 100644 index 0000000..c1587ab --- /dev/null +++ b/src/integration/Graph/cache.d.ts @@ -0,0 +1,5 @@ +import type { Graph } from '../../core'; + +export interface FxCache extends Graph { + curie: 'fx:cache'; +} diff --git a/src/integration/Graph/capture.d.ts b/src/integration/Graph/capture.d.ts new file mode 100644 index 0000000..b33c629 --- /dev/null +++ b/src/integration/Graph/capture.d.ts @@ -0,0 +1,5 @@ +import type { Graph } from '../../core'; + +export interface FxCapture extends Graph { + curie: 'fx:capture'; +} diff --git a/src/integration/Graph/cart.d.ts b/src/integration/Graph/cart.d.ts new file mode 100644 index 0000000..9acfa67 --- /dev/null +++ b/src/integration/Graph/cart.d.ts @@ -0,0 +1,139 @@ +import type { FxAppliedCouponCodes } from './applied_coupon_codes'; +import type { FxAttributes } from './attributes'; +import type { FxCreateSession } from './create_session'; +import type { FxCustomFields } from './custom_fields'; +import type { FxCustomer } from './customer'; +import type { FxDiscounts } from './discounts'; +import type { FxItems } from './items'; +import type { FxStore } from './store'; +import type { FxSubscription } from './subscription'; +import type { Graph } from '../../core'; + +export interface FxCart extends Graph { + curie: 'fx:cart'; + + links: { + /** This resource. */ + 'self': FxCart; + /** Store this cart was created in. */ + 'fx:store': FxStore; + /** Items in this cart. */ + 'fx:items': FxItems; + /** Customer who created this cart. */ + 'fx:customer': FxCustomer; + /** Discounts applied to the products in this cart. */ + 'fx:discounts': FxDiscounts; + /** Various attributes of this cart. */ + 'fx:attributes': FxAttributes; + /** Subscription linked to this cart. */ + 'fx:subscription': FxSubscription; + /** Custom fields applied to this cart. */ + 'fx:custom_fields': FxCustomFields; + /** POST here to create a browser session link. */ + 'fx:create_session': FxCreateSession; + /** Coupon codes applied to the items in this cart. */ + 'fx:applied_coupon_codes': FxAppliedCouponCodes; + }; + + props: { + /** + * The full API URI of the customer this cart is associated with. You can not POST a cart into a transaction (ie. charge a customer's saved payment method) unless this value is set to a valid customer with an active default payment method. + * + * Guest (ie. `is_anonymous=1` customer resources *can* be used, but be aware that guest customer payment methods are purged regularly and according to various internal criteria. As such, so you should not rely on a guest customer's saved credit card being usable indefinitely. In general, you shouldn't rely on a saved payment method persisting more than 60 days, though this value is subject to change. (And, of course, there's no guarantee for *any* saved payment method that it will work in the future, so always be sure to handle payment errors on your end.) + * + * Note that when this value is included, the customer's `shipping_*` and `billing_*` values will populate *and override* any existing values on the `cart` resource (unless the address values are PUT or PATCHed in the same request, in which case the explicitly set values will be used). + * + * Note that if you are using the `customer_uri` value, you'll likely either want to explicitly set the `use_customer_shipping_address` value. + */ + customer_uri: string; + /** + * This value will be populated when `customer_uri` is set, but can be set separately (for instance, if the customer is unknown or new. This is *not* used for pre-population on the checkout, but can be helpful in certain situations (such as cart abandonment tracking). + * + * Note that setting `customer_uri` will overwrite this value, and you will receive an error if you set both `customer_email` and `customer_uri` with a mismatched email address. + */ + customer_email: string; + /** + * The full API URI of the `fx:payments` resource, from a previous transaction. This can be used *in addition to* the `customer_uri`, to specify a specific payment method used in the past. Without this value, the customer's default saved payment method will be used instead. + * + * This can be helpful in certain situations, such as when a customer may use multiple different payment methods, but you need to use the API to charge a specific payment method. For instance, if a customer makes 3 transactions with 3 different credit cards, and you need to add a charge to the 2nd card used. Without this `payment_method_uri`, the *most recent* card would be charged. + * + * **IMPORTANT NOTES:** + * - Not all payment methods can be used this way. Current support includes: normal credit card gateways; CyberSource card-present / point-of-sale, PayPal Express Checkout Reference Transaction, Amazon Pay and Adyen Embedded. + * - Some gateways will only use the last payment method for the customer for that gateway, even if you might be using a `payment_method_uri` from a transaction that had used an earlier payment method for that gateway. These include PayPal Express Checkout Reference Transaction, Amazon Pay, Stripe Connect, Square and Adyen Embedded. + * - If you're interested in this functionality and not sure if all of your chosen payment gateways are supported, please get in touch with Foxy support. + */ + payment_method_uri: string; + /** This value determines how an attached customer's addresses should be handled in the event the cart resource is POSTed to. When `false`, the customer's billing address will be used for both the billing and shipping addresses. Defaults to `true`, so a customer's shipping address will be used if it exists. */ + use_customer_shipping_address: boolean; + /** The name of the billing address. This is also the value used as the shipto entry for a multiship item. */ + billing_address_name: string; + /** The given name associated with the billing address. */ + billing_first_name: string; + /** The surname associated with the billing address. */ + billing_last_name: string; + /** The company associated with the billing address. */ + billing_company: string; + /** The first line of billing street address. */ + billing_address1: string; + /** The second line of the billing street address. */ + billing_address2: string; + /** The city of this address. */ + billing_city: string; + /** The two character code for states in the United States. Other countries may call this a province. When a two character code isn't available, use the full region name. */ + billing_region: string; + /** The postal code of the billing address. */ + billing_postal_code: string; + /** The country code of the billing address. */ + billing_country: string; + /** The phone of the billing address. */ + billing_phone: string; + /** The name of the shipping address. This is also the value used as the shipto entry for a multiship item. */ + shipping_address_name: string; + /** The given name associated with the shipping address. */ + shipping_first_name: string; + /** The surname associated with the shipping address. */ + shipping_last_name: string; + /** The company associated with the shipping address. */ + shipping_company: string; + /** The first line of shipping street address. */ + shipping_address1: string; + /** The second line of the shipping street address. */ + shipping_address2: string; + /** The city of this address. */ + shipping_city: string; + /** The two character code for states in the United States. Other countries may call this a province. When a two character code isn't available, use the full region name. */ + shipping_region: string; + /** The postal code of the shipping address. */ + shipping_postal_code: string; + /** The country code of the shipping address. */ + shipping_country: string; + /** The phone of the shipping address. */ + shipping_phone: string; + /** The full API URI of the template set for this cart, if one has been specified. */ + template_set_uri: string; + /** The language defined by the template set being used. */ + language: string; + /** Total amount of the items in this cart. */ + total_item_price: string; + /** Total amount of the taxes for this cart. */ + total_tax: string; + /** Total amount of the shipping costs for this cart. */ + total_shipping: string; + /** If this cart has any shippable subscription items which will process in the future, this will be the total amount of shipping costs for those items. */ + total_future_shipping: string; + /** Total order amount of this cart including all items, taxes, shipping costs and discounts. */ + total_order: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; + + zooms: { + custom_fields?: FxCustomFields; + attributes: FxAttributes; + discounts?: FxDiscounts; + customer?: FxCustomer; + items?: FxItems; + }; +} diff --git a/src/integration/Graph/cart_include_template.d.ts b/src/integration/Graph/cart_include_template.d.ts new file mode 100644 index 0000000..0b32402 --- /dev/null +++ b/src/integration/Graph/cart_include_template.d.ts @@ -0,0 +1,32 @@ +import type { FxCache } from './cache'; +import type { FxStore } from './store'; +import type { FxTemplateSets } from './template_sets'; +import type { Graph } from '../../core'; + +export interface FxCartIncludeTemplate extends Graph { + curie: 'fx:cart_include_template'; + + links: { + /** This resource. */ + 'self': FxCartIncludeTemplate; + /** POST here to cache your template using the `content_html_url` and `content_text_url`. */ + 'fx:cache': FxCache; + /** Store this template belongs to. */ + 'fx:store': FxStore; + /** Template sets using this template. */ + 'fx:template_sets': FxTemplateSets; + }; + + props: { + /** The description of your cart include template. */ + description: string; + /** The content of your cart include template. Leave blank to use the default responsive template. This shouldn't be set directly unless all of your image references are already over https. If they are not, set the `content_url` to point to your template content online and then POST to the `cache` link relationship. */ + content: string; + /** The URL of your cart include template hosted on your own server online and publicly available for our server to cache. */ + content_url: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/cart_include_templates.d.ts b/src/integration/Graph/cart_include_templates.d.ts new file mode 100644 index 0000000..4655501 --- /dev/null +++ b/src/integration/Graph/cart_include_templates.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxCartIncludeTemplate } from './cart_include_template'; +import type { Graph } from '../../core'; + +export interface FxCartIncludeTemplates extends Graph { + curie: 'fx:cart_include_templates'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxCartIncludeTemplate; +} diff --git a/src/integration/Graph/cart_template.d.ts b/src/integration/Graph/cart_template.d.ts new file mode 100644 index 0000000..cfb573b --- /dev/null +++ b/src/integration/Graph/cart_template.d.ts @@ -0,0 +1,32 @@ +import type { FxCache } from './cache'; +import type { FxStore } from './store'; +import type { FxTemplateSets } from './template_sets'; +import type { Graph } from '../../core'; + +export interface FxCartTemplate extends Graph { + curie: 'fx:cart_template'; + + links: { + /** This resource. */ + 'self': FxCartTemplate; + /** POST here to cache your template using the `content_html_url` and `content_text_url`. */ + 'fx:cache': FxCache; + /** Store this template belongs to. */ + 'fx:store': FxStore; + /** Template sets using this template. */ + 'fx:template_sets': FxTemplateSets; + }; + + props: { + /** The description of your cart template. */ + description: string; + /** The content of your cart template. Leave blank to use the default responsive template. This shouldn't be set directly unless all of your image references are already over https. If they are not, set the `content_url` to point to your template content online and then POST to the `cache` link relationship. */ + content: string; + /** The URL of your cart template hosted on your own server online and publicly available for our server to cache. */ + content_url: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/cart_templates.d.ts b/src/integration/Graph/cart_templates.d.ts new file mode 100644 index 0000000..da9e372 --- /dev/null +++ b/src/integration/Graph/cart_templates.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxCartTemplate } from './cart_template'; +import type { Graph } from '../../core'; + +export interface FxCartTemplates extends Graph { + curie: 'fx:cart_templates'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxCartTemplate; +} diff --git a/src/integration/Graph/carts.d.ts b/src/integration/Graph/carts.d.ts new file mode 100644 index 0000000..2d25dd2 --- /dev/null +++ b/src/integration/Graph/carts.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxCart } from './cart'; +import type { Graph } from '../../core'; + +export interface FxCarts extends Graph { + curie: 'fx:carts'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxCart; +} diff --git a/src/integration/Graph/checkout_template.d.ts b/src/integration/Graph/checkout_template.d.ts new file mode 100644 index 0000000..7b947d2 --- /dev/null +++ b/src/integration/Graph/checkout_template.d.ts @@ -0,0 +1,35 @@ +import type { FxCache } from './cache'; +import type { FxEncode } from './encode'; +import type { FxStore } from './store'; +import type { FxTemplateSets } from './template_sets'; +import type { Graph } from '../../core'; + +export interface FxCheckoutTemplate extends Graph { + curie: 'fx:checkout_template'; + + links: { + /** This resource. */ + 'self': FxCheckoutTemplate; + /** Store this template belongs to. */ + 'fx:store': FxStore; + /** POST here to cache your template using the `content_url`. */ + 'fx:cache': FxCache; + /** POST here to encode a body of html for use with our HMAC cart encryption. */ + 'fx:encode': FxEncode; + /** Template sets using this template. */ + 'fx:template_sets': FxTemplateSets; + }; + + props: { + /** The description of your checkout template. */ + description: string; + /** The content of your checkout template. Leave blank to use the default responsive template. This shouldn't be set directly unless all of your image references are already over https. If they are not, set the `content_url` to point to your template content online and then POST to the `cache` link relationship. */ + content: string; + /** The URL of your checkout template hosted on your own server online and publicly available for our server to cache. */ + content_url: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/checkout_templates.d.ts b/src/integration/Graph/checkout_templates.d.ts new file mode 100644 index 0000000..b4c7223 --- /dev/null +++ b/src/integration/Graph/checkout_templates.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxCheckoutTemplate } from './checkout_template'; +import type { Graph } from '../../core'; + +export interface FxCheckoutTemplates extends Graph { + curie: 'fx:checkout_templates'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxCheckoutTemplate; +} diff --git a/src/integration/Graph/checkout_types.d.ts b/src/integration/Graph/checkout_types.d.ts new file mode 100644 index 0000000..7b58204 --- /dev/null +++ b/src/integration/Graph/checkout_types.d.ts @@ -0,0 +1,20 @@ +import type { FxPropertyHelpers } from './property_helpers'; +import type { Graph } from '../../core'; + +export interface FxCheckoutTypes extends Graph { + curie: 'fx:checkout_types'; + + links: { + /** This resource. */ + 'self': FxCheckoutTypes; + /** Various pre-defined property values. */ + 'fx:property_helpers': FxPropertyHelpers; + }; + + props: { + /** A small, human readable explanation of this property helper. */ + message: string; + /** JSON objects with the checkout types supported. The key values are the values you use for the Store resource's `checkout_type` property. */ + values: Record; + }; +} diff --git a/src/integration/Graph/client.d.ts b/src/integration/Graph/client.d.ts new file mode 100644 index 0000000..e81a35a --- /dev/null +++ b/src/integration/Graph/client.d.ts @@ -0,0 +1,42 @@ +import type { FxAttributes } from './attributes'; +import type { Graph } from '../../core'; + +export interface FxClient extends Graph { + curie: 'fx:client'; + + links: { + /** This resource. */ + 'self': FxClient; + /** Custom attributes of this client. */ + 'fx:attributes': FxAttributes; + }; + + props: { + /** A unique identifier for this client. If you do not supply one, one will be automatically generated for you. If you're not hosting the client integration yourself, please use a known prefix when creating your clients. This can not be modified once it is created. */ + client_id: string; + /** The password to be used with this client_id for OAuth 2.0 integration. This is generated automatically and can't be changed. */ + client_secret: string; + /** This is the redirection endpoint as described by {@link http://tools.ietf.org/html/rfc6749#section-3.1.2 OAuth 2.0} */ + redirect_uri: string; + /** The name of this project which will be using the API. This should be specific to the installation and implementation of this client. This information will be displayed on your OAuth 2.0 authentication page. */ + project_name: string; + /** A description of this project. This information will be displayed on your OAuth 2.0 authentication page. */ + project_description: string; + /** The name of the company responsible for this project. This information will be displayed on your OAuth 2.0 authentication page. */ + company_name: string; + /** The name of the company responsible for this project. This information will be displayed on your OAuth 2.0 authentication page. */ + company_url: string; + /** An image url for this company. This information will be displayed on your OAuth 2.0 authentication page. */ + company_logo: string; + /** The individual responsible for this integration. */ + contact_name: string; + /** The email address of the individual responsible for this integration. */ + contact_email: string; + /** The phone number of the individual responsible for this integration. */ + contact_phone: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/countries.d.ts b/src/integration/Graph/countries.d.ts new file mode 100644 index 0000000..8cb6bd1 --- /dev/null +++ b/src/integration/Graph/countries.d.ts @@ -0,0 +1,54 @@ +import type { FxPropertyHelpers } from './property_helpers'; +import type { Graph } from '../../core'; + +export interface FxCountries extends Graph { + curie: 'fx:countries'; + + links: { + /** This resource. */ + 'self': FxCountries; + /** Various pre-defined property values. */ + 'fx:property_helpers': FxPropertyHelpers; + }; + + props: { + /** A small, human readable explanation of this property helper. */ + message: string; + /** JSON objects with the country codes as the keys. */ + values: { + [key: string]: { + /** The default name for this country. */ + default: string; + /** The official 2 character country code. */ + cc2: string; + /** The official 3 character country code. */ + cc3: string; + /** Array of alternative names for this country. */ + alternate_values: string[]; + /** This value determines which countries will show up first in our find-as-you-type system. */ + boost: number; + /** If `include_regions` is passed in, this will be replaced with regions, an array of region information for this country. Boolean otherwise. */ + has_regions: + | boolean + | { + /** The default name for this region. */ + n: string; + /** The official region code. */ + c: string; + /** Array of alternative names for this region. */ + alt: string[]; + /** This value determines which regions will show up first in our find-as-you-type system. */ + boost: number; + /** If this region is currently recognized. */ + active: boolean; + }[]; + /** Whether this country requires regions for shipping or not. */ + regions_required: boolean; + /** What type of region this is such as state, province, etc. */ + regions_type: string; + /** If this country is currently internationally recognized. */ + active: boolean; + }; + }; + }; +} diff --git a/src/integration/Graph/coupon.d.ts b/src/integration/Graph/coupon.d.ts new file mode 100644 index 0000000..ac4e818 --- /dev/null +++ b/src/integration/Graph/coupon.d.ts @@ -0,0 +1,64 @@ +import type { FxCouponCodes } from './coupon_codes'; +import type { FxCouponItemCategories } from './coupon_item_categories'; +import type { FxGenerateCodes } from './generate_codes'; +import type { FxStore } from './store'; +import type { Graph } from '../../core'; + +export interface FxCoupon extends Graph { + curie: 'fx:coupon'; + + links: { + /** This resource. */ + 'self': FxCoupon; + /** Store this coupon belongs to. */ + 'fx:store': FxStore; + /** Codes linked to this coupon. */ + 'fx:coupon_codes': FxCouponCodes; + /** POST here to generate random coupon codes. */ + 'fx:generate_codes': FxGenerateCodes; + /** Valid item categories for this coupon. */ + 'fx:coupon_item_categories': FxCouponItemCategories; + }; + + props: { + /** The name of this coupon. This will be for your own use and displayed to the customer. */ + name: string; + /** If you want this coupon's usage to be limited by a time frame or start in the future, add a start date here. To clear it out, set an empty value or use 0000-00-00. */ + start_date: string; + /** If you want this coupon's usage to be limited by a time frame or end in the future, add an end date here. To clear it out, set an empty value or use 0000-00-00. */ + end_date: string; + /** This is the total number of times this coupon is allowed to be used. This can be helpful for promotions that involve offering a discount to the first 100 customers, as an example, even though more than 100 coupon codes were given out. Leave as 0 to ignore this feature. */ + number_of_uses_allowed: number; + /** For informational purposes, this shows you how many times this coupon has already been used. */ + number_of_uses_to_date: number; + /** If each customer is only allowed to use this coupon once, enter 1 here. This is based off of the customer email address, not a payment method, ip address, shipping address or browser cookie. Leave as 0 to ignore this feature. */ + number_of_uses_allowed_per_customer: number; + /** If you want to limit the number of uses per individual coupon code, enter that number here. If you want each code to only be used once, enter 1 here. Leave as 0 to ignore this feature. */ + number_of_uses_allowed_per_code: number; + /** If you want to limit which products can use this coupon, you can enter a comma separated listed of product codes or partial product codes using * as a wild card at the beginning or end of the value. So abc123, fun_*, *-small would match abc123, fun_ and fun_times, and example-small. It wouldn't match abc12, abc1234, fun, or good-smalls. */ + product_code_restrictions: string; + /** This specifies what type of discount will be applied. Will it be a percentage discount or an amount discount based on either the product price or the product quantity? */ + coupon_discount_type: 'quantity_amount' | 'quantity_percentage' | 'price_amount' | 'price_percentage'; + /** This is the string that determines the tiers and amounts that make up your discount. For example, 2-.50|10-3|50-5 means "between 2 and 9 is discounted by .5 per product, 10 and 49 by 3 per product and 50 and over by 5 per product. If you're doing a quantity discount, it will compare against the quantity of products in the order. If you're doing a price based discount, it will compare against the price of the products in the order. Please see the documentation for more information: {@link http://wiki.foxycart.com/v/2.0/coupons_and_discounts Coupons and Discounts} */ + coupon_discount_details: string; + /** If this coupon can be combined with other coupons, check this check box. If this box is unchecked, the coupon will not be added to the cart if another coupon is already in the cart. Similarly, if this coupon is added first, no other coupons will be able to be added to the cart. */ + combinable: boolean; + /** Set to true if you want to allow your customers to use multiple coupon codes from this coupon on the same order. If false, the customer will see an error if they try to add another coupon code if one for this coupon is already in the cart. */ + multiple_codes_allowed: boolean; + /** Set to true if you want to ensure category discounts are not applied for an order that uses this coupon. */ + exclude_category_discounts: boolean; + /** Set to true if you want to ensure line item discounts are not applied to any products for an order that uses this coupon. */ + exclude_line_item_discounts: boolean; + /** Set to true to apply taxes before this coupon's discount is applied. Check with your tax professional if you have questions about how you should calculate taxes. */ + is_taxable: boolean; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; + + zooms: { + coupon_item_categories?: FxCouponItemCategories; + coupon_codes?: FxCouponCodes; + }; +} diff --git a/src/integration/Graph/coupon_code.d.ts b/src/integration/Graph/coupon_code.d.ts new file mode 100644 index 0000000..49d1a95 --- /dev/null +++ b/src/integration/Graph/coupon_code.d.ts @@ -0,0 +1,30 @@ +import type { FxCoupon } from './coupon'; +import type { FxCouponCodeTransactions } from './coupon_code_transactions'; +import type { FxStore } from './store'; +import type { Graph } from '../../core'; + +export interface FxCouponCode extends Graph { + curie: 'fx:coupon_code'; + + links: { + /** This resource. */ + 'self': FxCouponCode; + /** Store this coupon code belongs to. */ + 'fx:store': FxStore; + /** Coupon this code corresponds to. */ + 'fx:coupon': FxCoupon; + /** Transactions using this coupon code. */ + 'fx:coupon_code_transactions': FxCouponCodeTransactions; + }; + + props: { + /** The string value of this coupon code which your customer will add to their cart to use this coupon. */ + code: string; + /** For informational purposes, this shows you how many times this coupon code has already been used. */ + number_of_uses_to_date: number; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/coupon_code_transaction.d.ts b/src/integration/Graph/coupon_code_transaction.d.ts new file mode 100644 index 0000000..8e8ba6d --- /dev/null +++ b/src/integration/Graph/coupon_code_transaction.d.ts @@ -0,0 +1,29 @@ +import type { FxCoupon } from './coupon'; +import type { FxCouponCode } from './coupon_code'; +import type { FxStore } from './store'; +import type { FxTransaction } from './transaction'; +import type { Graph } from '../../core'; + +export interface FxCouponCodeTransaction extends Graph { + curie: 'fx:coupon_code_transaction'; + + links: { + /** This resource. */ + 'self': FxCouponCodeTransaction; + /** Store this transaction was processed by. */ + 'fx:store': FxStore; + /** Coupon that was used with this transaction. */ + 'fx:coupon': FxCoupon; + /** Coupon code that was used with this transaction. */ + 'fx:coupon_code': FxCouponCode; + /** Transaction the coupon code was used with. */ + 'fx:transaction': FxTransaction; + }; + + props: { + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/coupon_code_transactions.d.ts b/src/integration/Graph/coupon_code_transactions.d.ts new file mode 100644 index 0000000..5a1022e --- /dev/null +++ b/src/integration/Graph/coupon_code_transactions.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxCouponCodeTransaction } from './coupon_code_transaction'; +import type { Graph } from '../../core'; + +export interface FxCouponCodeTransactions extends Graph { + curie: 'fx:coupon_code_transactions'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxCouponCodeTransaction; +} diff --git a/src/integration/Graph/coupon_codes.d.ts b/src/integration/Graph/coupon_codes.d.ts new file mode 100644 index 0000000..c840bfb --- /dev/null +++ b/src/integration/Graph/coupon_codes.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxCouponCode } from './coupon_code'; +import type { Graph } from '../../core'; + +export interface FxCouponCodes extends Graph { + curie: 'fx:coupon_codes'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxCouponCode; +} diff --git a/src/integration/Graph/coupon_detail.d.ts b/src/integration/Graph/coupon_detail.d.ts new file mode 100644 index 0000000..9f385b4 --- /dev/null +++ b/src/integration/Graph/coupon_detail.d.ts @@ -0,0 +1,40 @@ +import type { FxCoupon } from './coupon'; +import type { FxCouponCode } from './coupon_code'; +import type { FxItem } from './item'; +import type { FxStore } from './store'; +import type { FxTransaction } from './transaction'; +import type { Graph } from '../../core'; + +export interface FxCouponDetail extends Graph { + curie: 'fx:coupon_detail'; + + links: { + /** This resource. */ + 'self': FxCouponDetail; + /** Item the coupon was applied to. */ + 'fx:item': FxItem; + /** Store the coupon belongs to. */ + 'fx:store': FxStore; + /** Coupon this detail describes. */ + 'fx:coupon': FxCoupon; + /** Coupon code used in the coupon. */ + 'fx:coupon_code': FxCouponCode; + /** Transaction the coupon was applied to. */ + 'fx:transaction': FxTransaction; + }; + + props: { + /** The ID of this coupon detail. */ + id: string; + /** The original coupon name used for this discount. */ + name: string; + /** The original coupon code used for this discount. */ + code: string; + /** The amount of discount applied to this item. */ + amount_per: number; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/coupon_details.d.ts b/src/integration/Graph/coupon_details.d.ts new file mode 100644 index 0000000..5cb9b84 --- /dev/null +++ b/src/integration/Graph/coupon_details.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxCouponDetail } from './coupon_detail'; +import type { Graph } from '../../core'; + +export interface FxCouponDetails extends Graph { + curie: 'fx:coupon_details'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxCouponDetail; +} diff --git a/src/integration/Graph/coupon_item_categories.d.ts b/src/integration/Graph/coupon_item_categories.d.ts new file mode 100644 index 0000000..20d0b96 --- /dev/null +++ b/src/integration/Graph/coupon_item_categories.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxCouponItemCategory } from './coupon_item_category'; +import type { Graph } from '../../core'; + +export interface FxCouponItemCategories extends Graph { + curie: 'fx:coupon_item_categories'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxCouponItemCategory; +} diff --git a/src/integration/Graph/coupon_item_category.d.ts b/src/integration/Graph/coupon_item_category.d.ts new file mode 100644 index 0000000..3e2650b --- /dev/null +++ b/src/integration/Graph/coupon_item_category.d.ts @@ -0,0 +1,30 @@ +import type { FxCoupon } from './coupon'; +import type { FxItemCategory } from './item_category'; +import type { FxStore } from './store'; +import type { Graph } from '../../core'; + +export interface FxCouponItemCategory extends Graph { + curie: 'fx:coupon_item_category'; + + links: { + /** This resource. */ + 'self': FxCouponItemCategory; + /** Store the coupon belongs to. */ + 'fx:store': FxStore; + /** Coupon this category belongs to. */ + 'fx:coupon': FxCoupon; + /** Item category this resource links to. */ + 'fx:item_category': FxItemCategory; + }; + + props: { + /** The full API URI of the coupon associated with this coupon item category. */ + coupon_uri: string; + /** The full API URI of the item category associated with this coupon item category. */ + item_category_uri: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/coupons.d.ts b/src/integration/Graph/coupons.d.ts new file mode 100644 index 0000000..e1119fe --- /dev/null +++ b/src/integration/Graph/coupons.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxCoupon } from './coupon'; +import type { Graph } from '../../core'; + +export interface FxCoupons extends Graph { + curie: 'fx:coupons'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxCoupon; +} diff --git a/src/integration/Graph/create_client.d.ts b/src/integration/Graph/create_client.d.ts new file mode 100644 index 0000000..b92fbf6 --- /dev/null +++ b/src/integration/Graph/create_client.d.ts @@ -0,0 +1,8 @@ +import type { FxClient } from './client'; +import type { Graph } from '../../core'; + +export interface FxCreateClient extends Graph { + curie: 'fx:create_client'; + links: FxClient['links']; + props: FxClient['props']; +} diff --git a/src/integration/Graph/create_session.d.ts b/src/integration/Graph/create_session.d.ts new file mode 100644 index 0000000..08bd90d --- /dev/null +++ b/src/integration/Graph/create_session.d.ts @@ -0,0 +1,12 @@ +import type { Graph } from '../../core'; + +export interface FxCreateSession extends Graph { + curie: 'fx:create_session'; + + props: { + /** Unique session identifier. */ + session_id: string; + /** URL of the cart associated with this session. */ + cart_link: string; + }; +} diff --git a/src/integration/Graph/create_user.d.ts b/src/integration/Graph/create_user.d.ts new file mode 100644 index 0000000..3150b6b --- /dev/null +++ b/src/integration/Graph/create_user.d.ts @@ -0,0 +1,8 @@ +import type { FxUser } from './user'; +import type { Graph } from '../../core'; + +export interface FxCreateUser extends Graph { + curie: 'fx:create_user'; + links: FxUser['links']; + props: FxUser['props']; +} diff --git a/src/integration/Graph/custom_field.d.ts b/src/integration/Graph/custom_field.d.ts new file mode 100644 index 0000000..ffdab93 --- /dev/null +++ b/src/integration/Graph/custom_field.d.ts @@ -0,0 +1,29 @@ +import type { FxStore } from './store'; +import type { FxTransaction } from './transaction'; +import type { Graph } from '../../core'; + +export interface FxCustomField extends Graph { + curie: 'fx:custom_field'; + + links: { + /** This resource. */ + 'self': FxCustomField; + /** Store this custom field was created in. */ + 'fx:store': FxStore; + /** Transaction this custom field is linked to. */ + 'fx:transaction': FxTransaction; + }; + + props: { + /** The name of the custom field. */ + name: string; + /** The value of this custom field. */ + value: string; + /** Whether or not this custom field is visible on the receipt and email receipt. This correlates to custom fields with a "h:" prefix when added to the cart. */ + is_hidden: boolean; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/custom_fields.d.ts b/src/integration/Graph/custom_fields.d.ts new file mode 100644 index 0000000..bbc62ba --- /dev/null +++ b/src/integration/Graph/custom_fields.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxCustomField } from './custom_field'; +import type { Graph } from '../../core'; + +export interface FxCustomFields extends Graph { + curie: 'fx:custom_fields'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxCustomField; +} diff --git a/src/integration/Graph/customer.d.ts b/src/integration/Graph/customer.d.ts new file mode 100644 index 0000000..c28fcf7 --- /dev/null +++ b/src/integration/Graph/customer.d.ts @@ -0,0 +1,77 @@ +import type { FxAttributes } from './attributes'; +import type { FxCustomerAddresses } from './customer_addresses'; +import type { FxDefaultBillingAddress } from './default_billing_address'; +import type { FxDefaultPaymentMethod } from './default_payment_method'; +import type { FxDefaultShippingAddress } from './default_shipping_address'; +import type { FxStore } from './store'; +import type { FxSubscriptions } from './subscriptions'; +import type { FxTransactions } from './transactions'; +import type { Graph } from '../../core'; + +export interface FxCustomer extends Graph { + curie: 'fx:customer'; + + links: { + /** This resource. */ + 'self': FxCustomer; + /** Store this customer is registered in. */ + 'fx:store': FxStore; + /** Attributes for this customer. */ + 'fx:attributes': FxAttributes; + /** List of customer's transactions. */ + 'fx:transactions': FxTransactions; + /** List of customer's subscriptions. */ + 'fx:subscriptions': FxSubscriptions; + /** List of customer's addresses. */ + 'fx:customer_addresses': FxCustomerAddresses; + /** Customer's default payment method. */ + 'fx:default_payment_method': FxDefaultPaymentMethod; + /** Customer's default billing address. */ + 'fx:default_billing_address': FxDefaultBillingAddress; + /** Customer's default shipping address. */ + 'fx:default_shipping_address': FxDefaultShippingAddress; + }; + + props: { + /** The FoxyCart customer id, useful for Single Sign On integrations. */ + id: number; + /** The date of the last time this customer authenticated with the FoxyCart checkout. */ + last_login_date: string; + /** The customer's given name. */ + first_name: string; + /** The customer's surname. */ + last_name: string; + /** The customer's email address. This is used as the login to the FoxyCart checkout for this customer. */ + email: string; + /** A tax identification number for this customer. */ + tax_id: string; + /** Your customer's clear text password. This value is never stored, not displayed for this resource, and is not available in our system. You can, however, pass it via clear text when creating or modifying a customer. When creating a customer, if you leave this blank, a random value will be generated for you which you can modify later as needed. */ + password: string; + /** The salt for this customer's login password. If your integration syncs passwords, you will need to keep this value in sync as well. */ + password_salt: string; + /** The hash of this customer's login password. If your integration syncs passwords, you will need to keep this value in sync as well. */ + password_hash: string; + /** This will be a copy of your store's current password_hash_type at the time of creation or modificaiton. This way, if you change your store's settings, your customer will still be able to login. It will be updated automatically to match that of the store the next time the customer logs in. */ + password_hash_type: string; + /** This will be a copy of your store's current password_hash_config at the time of creation or modification. This way, if you change your store's settings, your customer will still be able to login. It will be updated automatically to match that of the store the next time the customer logs in. */ + password_hash_config: string; + /** If your customer forgot their password and requested a forgotten password, it will be set here. */ + forgot_password: string; + /** The exact time the forgot password was set. */ + forgot_password_timestamp: string; + /** If this customer checks out as a guest, this will be set to true. Once it is set, it can not be changed. */ + is_anonymous: boolean; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; + + zooms: { + default_shipping_address?: FxDefaultShippingAddress; + default_billing_address?: FxDefaultBillingAddress; + default_payment_method?: FxDefaultPaymentMethod; + customer_addresses?: FxCustomerAddresses; + attributes: FxAttributes; + }; +} diff --git a/src/integration/Graph/customer_address.d.ts b/src/integration/Graph/customer_address.d.ts new file mode 100644 index 0000000..582b47c --- /dev/null +++ b/src/integration/Graph/customer_address.d.ts @@ -0,0 +1,51 @@ +import type { FxCustomer } from './customer'; +import type { FxStore } from './store'; +import type { Graph } from '../../core'; + +export interface FxCustomerAddress extends Graph { + curie: 'fx:customer_address'; + + links: { + /** This resource. */ + 'self': FxCustomerAddress; + /** Store the customer account belongs to. */ + 'fx:store': FxStore; + /** Customer this address is linked to. */ + 'fx:customer': FxCustomer; + }; + + props: { + /** By default, the country value must be valid according to the store's location_filtering value in the template_config. For instance, if your store is configured to only allow shipping and billing to the US, attempting to set the country to CA (Canada) will error. If true is passed in, the country can be any valid values. For customer_address resources that aren't the default shipping or billing, the validation will assume the shipping restrictions. NOTE: This does not currently take the region filtering into account. Defaults to false. */ + ignore_address_restrictions: boolean; + /** The name of this address. This is also the value used as the shipto entry for a multiship item. */ + address_name: string; + /** The given name associated with this address. */ + first_name: string; + /** The surname associated with this address. */ + last_name: string; + /** The company associated with this address. */ + company: string; + /** The first line of the street address. */ + address1: string; + /** The second line of the street address. */ + address2: string; + /** The city of this address. */ + city: string; + /** The two character code for states in the United States. Other countries may call this a province. When a two character code isn't available, use the full region name. */ + region: string; + /** The postal code of this address. */ + postal_code: string; + /** The country code of this address. */ + country: string; + /** The phone of this address. */ + phone: string; + /** Specifies if this address is the default billing address for the customer. */ + is_default_billing: string; + /** Specifies if this address is the default shipping address for the customer. */ + is_default_shipping: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/customer_addresses.d.ts b/src/integration/Graph/customer_addresses.d.ts new file mode 100644 index 0000000..8e568e1 --- /dev/null +++ b/src/integration/Graph/customer_addresses.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxCustomerAddress } from './customer_address'; +import type { Graph } from '../../core'; + +export interface FxCustomerAddresses extends Graph { + curie: 'fx:customer_addresses'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxCustomerAddress; +} diff --git a/src/integration/Graph/customer_email_template.d.ts b/src/integration/Graph/customer_email_template.d.ts new file mode 100644 index 0000000..49db1dc --- /dev/null +++ b/src/integration/Graph/customer_email_template.d.ts @@ -0,0 +1,22 @@ +import type { FxCache } from './cache'; +import type { FxEmailTemplate } from './email_template'; +import type { FxStore } from './store'; +import type { FxTemplateSets } from './template_sets'; +import type { Graph } from '../../core'; + +export interface FxCustomerEmailTemplate extends Graph { + curie: 'fx:customer_email_template'; + + links: { + /** This resource. */ + 'self': FxCustomerEmailTemplate; + /** Store this template belongs to. */ + 'fx:store': FxStore; + /** POST here to cache your template using the `content_html_url` and `content_text_url`. */ + 'fx:cache': FxCache; + /** Template sets using this template. */ + 'fx:template_sets': FxTemplateSets; + }; + + props: FxEmailTemplate['props']; +} diff --git a/src/integration/Graph/customer_password_hash_types.d.ts b/src/integration/Graph/customer_password_hash_types.d.ts new file mode 100644 index 0000000..e62054c --- /dev/null +++ b/src/integration/Graph/customer_password_hash_types.d.ts @@ -0,0 +1,27 @@ +import type { FxPropertyHelpers } from './property_helpers'; +import type { Graph } from '../../core'; + +export interface FxCustomerPasswordHashTypes extends Graph { + curie: 'fx:customer_password_hash_types'; + + links: { + /** This resource. */ + 'self': FxCustomerPasswordHashTypes; + /** Various pre-defined property values. */ + 'fx:property_helpers': FxPropertyHelpers; + }; + + props: { + /** A small, human readable explanation of this property helper. */ + message: string; + /** JSON objects with the password hash type as the object key. This key is the value you use for the Store resource's `customer_password_hash_type` property and the Customer resource's `password_hash_type` property. */ + values: { + [key: string]: { + /** The human readable description of this password hashing mechanism. */ + description: string; + /** The default configuration settings specific to this hashing mechanism. */ + config: unknown; + }; + }; + }; +} diff --git a/src/integration/Graph/customer_portal_settings.d.ts b/src/integration/Graph/customer_portal_settings.d.ts new file mode 100644 index 0000000..7a2a2ae --- /dev/null +++ b/src/integration/Graph/customer_portal_settings.d.ts @@ -0,0 +1,66 @@ +import type { FxStore } from './store'; +import type { Graph } from '../../core'; + +export interface FxCustomerPortalSettings extends Graph { + curie: 'fx:customer_portal_settings'; + + links: { + /** This resource. */ + 'self': FxCustomerPortalSettings; + /** Store the customer portal of which this resource configures. */ + 'fx:store': FxStore; + }; + + props: { + /** An array of domains. No trailing slashes, must be https unless it's localhost. Can accept a port. Allow up to 10 entries. */ + allowedOrigins: string[]; + /** Object which contains "allowFrequencyModification" and "allowNextDateModification" fields. Subscription modification data. */ + subscriptions: { + /** An array that contains objects with jsonataQuery and values. Max length 10 (items). */ + allowFrequencyModification: { + /** A string that should be a valid {@link https://jsonata.org/ JSONata} query. Max length 200 chars. */ + jsonataQuery: string; + /** These strings should match the sub_frequency regex sanitization. Max array length 20, max length per string 4 characters. */ + values: string[]; + }[]; + + /** We can forbid modify subscription next date. False disables modification, true lifts all constraints, array of objects defines custom rules. */ + allowNextDateModification: + | boolean + | { + /** Beginning of the time period this rule applies to as frequency. Example: `2w` – apply to dates at least 2 weeks from now. */ + min?: string; + /** End of the time period this rules applies to as frequency. Example: `1y` – apply to dates at most 1 year from now. */ + max?: string; + /** Subscription selector that should be a valid {@link https://jsonata.org/ JSONata} query. Max length 200 chars. */ + jsonataQuery: string; + /** List of dates (YYYY-MM-DD) or ranges (YYYY-MM-DD..YYYY-MM-DD) that customers can't pick as next payment date. */ + disallowedDates?: string[]; + /** A pattern defining the days that will be available for customers to pick as the next payment date. */ + allowedDays?: + | { + /** Constraint type. If `day`, then this rule contains days of week only. */ + type: 'day'; + /** Days of week, 1-7, where 1 is Monday and 7 is Sunday. */ + days: number[]; + } + | { + /** Constraint type. If `month`, then this rule contains days of month only. */ + type: 'month'; + /** Days of month, 1-31. */ + days: number[]; + }; + }[]; + }; + /** If this field is true we get legacy API key or sso key from store and save it in settings. For false value we drop it. */ + sso: boolean; + /** Shared secret key. */ + jwtSharedSecret: string; + /** Life span of session in minutes. Maximum 40320 (4 weeks). */ + sessionLifespanInMinutes: number; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/customers.d.ts b/src/integration/Graph/customers.d.ts new file mode 100644 index 0000000..cd48c2b --- /dev/null +++ b/src/integration/Graph/customers.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxCustomer } from './customer'; +import type { Graph } from '../../core'; + +export interface FxCustomers extends Graph { + curie: 'fx:customers'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxCustomer; +} diff --git a/src/integration/Graph/default_billing_address.d.ts b/src/integration/Graph/default_billing_address.d.ts new file mode 100644 index 0000000..daef1c8 --- /dev/null +++ b/src/integration/Graph/default_billing_address.d.ts @@ -0,0 +1,8 @@ +import type { FxCustomerAddress } from './customer_address'; +import type { Graph } from '../../core'; + +export interface FxDefaultBillingAddress extends Graph { + curie: 'fx:default_billing_address'; + links: FxCustomerAddress['links']; + props: FxCustomerAddress['props']; +} diff --git a/src/integration/Graph/default_payment_method.d.ts b/src/integration/Graph/default_payment_method.d.ts new file mode 100644 index 0000000..0962dc9 --- /dev/null +++ b/src/integration/Graph/default_payment_method.d.ts @@ -0,0 +1,35 @@ +import type { FxCustomer } from './customer'; +import type { FxStore } from './store'; +import type { Graph } from '../../core'; + +export interface FxDefaultPaymentMethod extends Graph { + curie: 'fx:default_payment_method'; + + links: { + /** This resource. */ + 'self': FxDefaultPaymentMethod; + /** Store the customer is registered in. */ + 'fx:store': FxStore; + /** Customer using this payment method as default. */ + 'fx:customer': FxCustomer; + }; + + props: { + /** If the customer selected to save their payment information, this will be true. To clear out the payment information, set this to false. */ + save_cc: string; + /** The credit card or debit card type. This will be determined automatically once the payment card is saved. */ + cc_type: string; + /** The payment card number. This property will not be displayed as part of this resource, but can be used to modify this payment method. */ + cc_number: number; + /** A masked version of this payment card showing only the last 4 digits. */ + cc_number_masked: string; + /** The payment card expiration month in the MM format. */ + cc_exp_month: string; + /** The payment card expiration year in the YYYY format. */ + cc_exp_year: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/default_shipping_address.d.ts b/src/integration/Graph/default_shipping_address.d.ts new file mode 100644 index 0000000..639b626 --- /dev/null +++ b/src/integration/Graph/default_shipping_address.d.ts @@ -0,0 +1,8 @@ +import type { FxCustomerAddress } from './customer_address'; +import type { Graph } from '../../core'; + +export interface FxDefaultShippingAddress extends Graph { + curie: 'fx:default_shipping_address'; + links: FxCustomerAddress['links']; + props: FxCustomerAddress['props']; +} diff --git a/src/integration/Graph/default_store.d.ts b/src/integration/Graph/default_store.d.ts new file mode 100644 index 0000000..635d381 --- /dev/null +++ b/src/integration/Graph/default_store.d.ts @@ -0,0 +1,8 @@ +import type { FxStore } from './store'; +import type { Graph } from '../../core'; + +export interface FxDefaultStore extends Graph { + curie: 'fx:default_store'; + links: FxStore['links']; + props: FxStore['props']; +} diff --git a/src/integration/Graph/default_templates.d.ts b/src/integration/Graph/default_templates.d.ts new file mode 100644 index 0000000..9d631f5 --- /dev/null +++ b/src/integration/Graph/default_templates.d.ts @@ -0,0 +1,33 @@ +import type { FxCartIncludeTemplates } from './cart_include_templates'; +import type { FxCartTemplates } from './cart_templates'; +import type { FxCheckoutTemplates } from './checkout_templates'; +import type { FxEmailTemplates } from './email_templates'; +import type { FxPropertyHelpers } from './property_helpers'; +import type { FxReceiptTemplates } from './receipt_templates'; +import type { Graph } from '../../core'; + +export interface FxDefaultTemplates extends Graph { + curie: 'fx:default_templates'; + + links: { + /** This resource. */ + 'self': FxDefaultTemplates; + /** Default cart templates. */ + 'fx:cart_templates': FxCartTemplates; + /** Default email templates. */ + 'fx:email_templates': FxEmailTemplates; + /** Various predefined property values. */ + 'fx:property_helpers': FxPropertyHelpers; + /** Default receipt templates. */ + 'fx:receipt_templates': FxReceiptTemplates; + /** Default checkout templates. */ + 'fx:checkout_templates': FxCheckoutTemplates; + /** Default cart include templates. */ + 'fx:cart_include_templates': FxCartIncludeTemplates; + }; + + props: { + /** A small, human readable explanation of this property helper. */ + message: string; + }; +} diff --git a/src/integration/Graph/discount.d.ts b/src/integration/Graph/discount.d.ts new file mode 100644 index 0000000..e1f7a35 --- /dev/null +++ b/src/integration/Graph/discount.d.ts @@ -0,0 +1,44 @@ +import type { FxCoupon } from './coupon'; +import type { FxCouponCode } from './coupon_code'; +import type { FxCustomer } from './customer'; +import type { FxStore } from './store'; +import type { FxTransaction } from './transaction'; +import type { Graph } from '../../core'; + +export interface FxDiscount extends Graph { + curie: 'fx:discount'; + + links: { + /** This resource. */ + 'self': FxDiscount; + /** Store that provided this discount. */ + 'fx:store': FxStore; + /** Coupon that was used to get this discount. */ + 'fx:coupon': FxCoupon; + /** Customer who used this discount. */ + 'fx:customer': FxCustomer; + /** Transaction this discount was applied to. */ + 'fx:transaction': FxTransaction; + /** Coupon code that was used to get this discount. */ + 'fx:coupon_code': FxCouponCode; + }; + + props: { + /** The original coupon code used for this discount. */ + code: string; + /** The amount of the discount. */ + amount: number; + /** The original coupon name used for this discount. */ + name: string; + /** The discount displayed in the format of the currency the transaction took place in. */ + display: number; + /** Whether or not this discount was taxable. */ + is_taxable: boolean; + /** Whether or not this discount is part of a subscription that is to be charged in the future based on when this transaction was processed. */ + is_future_discount: boolean; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/discount_detail.d.ts b/src/integration/Graph/discount_detail.d.ts new file mode 100644 index 0000000..7d580b0 --- /dev/null +++ b/src/integration/Graph/discount_detail.d.ts @@ -0,0 +1,32 @@ +import type { FxItem } from './item'; +import type { FxStore } from './store'; +import type { FxTransaction } from './transaction'; +import type { Graph } from '../../core'; + +export interface FxDiscountDetail extends Graph { + curie: 'fx:discount_detail'; + + links: { + /** This resource. */ + 'self': FxDiscountDetail; + /** Item the discount was applied to. */ + 'fx:item': FxItem; + /** Store that provided the discount. */ + 'fx:store': FxStore; + /** Transaction the discount was applied to. */ + 'fx:transaction': FxTransaction; + }; + + props: { + /** The ID of this coupon detail. */ + id: string; + /** The original coupon name used for this discount. */ + name: string; + /** The amount of discount applied to this item. */ + amount_per: number; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/discount_details.d.ts b/src/integration/Graph/discount_details.d.ts new file mode 100644 index 0000000..f65dacc --- /dev/null +++ b/src/integration/Graph/discount_details.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxDiscountDetail } from './discount_detail'; +import type { Graph } from '../../core'; + +export interface FxDiscountDetails extends Graph { + curie: 'fx:discount_details'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxDiscountDetail; +} diff --git a/src/integration/Graph/discounts.d.ts b/src/integration/Graph/discounts.d.ts new file mode 100644 index 0000000..5001dda --- /dev/null +++ b/src/integration/Graph/discounts.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxDiscount } from './discount'; +import type { Graph } from '../../core'; + +export interface FxDiscounts extends Graph { + curie: 'fx:discounts'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxDiscount; +} diff --git a/src/integration/Graph/downloadable.d.ts b/src/integration/Graph/downloadable.d.ts new file mode 100644 index 0000000..1005b81 --- /dev/null +++ b/src/integration/Graph/downloadable.d.ts @@ -0,0 +1,40 @@ +import type { FxDownloadableItemCategories } from './downloadable_item_categories'; +import type { FxItemCategory } from './item_category'; +import type { FxStore } from './store'; +import type { Graph } from '../../core'; + +export interface FxDownloadable extends Graph { + curie: 'fx:downloadable'; + + links: { + /** This resource. */ + 'self': FxDownloadable; + /** Store this downloadable product belongs to. */ + 'fx:store': FxStore; + /** Item category this downloadable product belongs to. */ + 'fx:item_category': FxItemCategory; + /** List of all downloadable item categories in the store. */ + 'fx:downloadable_item_categories': FxDownloadableItemCategories; + }; + + props: { + /** The full API URI of the item category this product is part of. The item category must have an item delivery type of downloaded. */ + item_category_uri: string; + /** The name of this downloadable. This will be shown to the customer in the cart. */ + name: string; + /** The code for this downloadable. When adding this item to the cart, this is the code which will be used. */ + code: string; + /** The item total for this downloadable. This is the amount the customer will pay to purchased this downloadable item. */ + price: number; + /** The name of the file uploaded to our server. This is originally set when creating a downloadable with the `file` property. */ + file_name: string; + /** The size of the file uploaded to our server. This is originally set when creating a downloadable with the `file` property. */ + file_size: number; + /** The date this file was last uploaded. */ + upload_date: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/downloadable_item_categories.d.ts b/src/integration/Graph/downloadable_item_categories.d.ts new file mode 100644 index 0000000..ca05a02 --- /dev/null +++ b/src/integration/Graph/downloadable_item_categories.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxItemCategory } from './item_category'; +import type { Graph } from '../../core'; + +export interface FxDownloadableItemCategories extends Graph { + curie: 'fx:downloadable_item_categories'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxItemCategory; +} diff --git a/src/integration/Graph/downloadable_purchase.d.ts b/src/integration/Graph/downloadable_purchase.d.ts new file mode 100644 index 0000000..26cfda3 --- /dev/null +++ b/src/integration/Graph/downloadable_purchase.d.ts @@ -0,0 +1,38 @@ +import type { FxCustomer } from './customer'; +import type { FxDownloadable } from './downloadable'; +import type { FxItem } from './item'; +import type { FxStore } from './store'; +import type { FxTransaction } from './transaction'; +import type { Graph } from '../../core'; + +export interface FxDownloadablePurchase extends Graph { + curie: 'fx:downloadable_purchase'; + + links: { + /** This resource. */ + 'self': FxDownloadablePurchase; + /** Related cart item. */ + 'fx:item': FxItem; + /** Store that provided the downloadable product. */ + 'fx:store': FxStore; + /** Customer who purchased the downloadable product. */ + 'fx:customer': FxCustomer; + /** Related transaction. */ + 'fx:transaction': FxTransaction; + /** Downloadable product. */ + 'fx:downloadable': FxDownloadable; + }; + + props: { + /** The number of times the customer attempted to download this item. This is useful for fine tuning your downloadables settings. */ + number_of_downloads: number; + /** The time of the first download attempt by the customer. This is useful for fine tuning your downloadables settings. */ + first_download_time: string; + /** This is the passcode for downloading this item after a purchase. To construct the download link, use `https://{store_domain}.foxycart.com/dl?p={download_passcode}` */ + download_passcode: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/downloadables.d.ts b/src/integration/Graph/downloadables.d.ts new file mode 100644 index 0000000..17a0485 --- /dev/null +++ b/src/integration/Graph/downloadables.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxDownloadable } from './downloadable'; +import type { Graph } from '../../core'; + +export interface FxDownloadables extends Graph { + curie: 'fx:downloadables'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxDownloadable; +} diff --git a/src/integration/Graph/email_template.d.ts b/src/integration/Graph/email_template.d.ts new file mode 100644 index 0000000..a1b9abb --- /dev/null +++ b/src/integration/Graph/email_template.d.ts @@ -0,0 +1,36 @@ +import type { FxCache } from './cache'; +import type { FxStore } from './store'; +import type { FxTemplateSets } from './template_sets'; +import type { Graph } from '../../core'; + +export interface FxEmailTemplate extends Graph { + curie: 'fx:email_template'; + + links: { + /** This resource. */ + 'self': FxEmailTemplate; + /** POST here to cache your template using the `content_html_url` and `content_text_url`. */ + 'fx:cache': FxCache; + /** Store this template belongs to. */ + 'fx:store': FxStore; + /** Template sets using this template. */ + 'fx:template_sets': FxTemplateSets; + }; + + props: { + /** The description of your email template. */ + description: string; + /** The content of your html email template. Leave blank to use the default responsive template. You can set the content directly or set the `content_html_url` to point to your template content online and then POST to the `cache` link relationship. */ + content_html: string; + /** The URL of your html email template hosted on your own server online and publicly available for our server to cache. */ + content_html_url: string; + /** The content of your text email template. Leave blank to use the default template. You can set the content directly or set the `content_url` to point to your template content online and then POST to the `cache` link relationship. */ + content_text: string; + /** The URL of your text email template hosted on your own server online and publicly available for our server to cache. */ + content_text_url: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/email_templates.d.ts b/src/integration/Graph/email_templates.d.ts new file mode 100644 index 0000000..d9dd6f0 --- /dev/null +++ b/src/integration/Graph/email_templates.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxEmailTemplate } from './email_template'; +import type { Graph } from '../../core'; + +export interface FxEmailTemplates extends Graph { + curie: 'fx:email_templates'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxEmailTemplate; +} diff --git a/src/integration/Graph/encode.d.ts b/src/integration/Graph/encode.d.ts new file mode 100644 index 0000000..012d026 --- /dev/null +++ b/src/integration/Graph/encode.d.ts @@ -0,0 +1,5 @@ +import type { Graph } from '../../core'; + +export interface FxEncode extends Graph { + curie: 'fx:encode'; +} diff --git a/src/integration/Graph/error_entries.d.ts b/src/integration/Graph/error_entries.d.ts new file mode 100644 index 0000000..67a9dc3 --- /dev/null +++ b/src/integration/Graph/error_entries.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxErrorEntry } from './error_entry'; +import type { Graph } from '../../core'; + +export interface FxErrorEntries extends Graph { + curie: 'fx:error_entries'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxErrorEntry; +} diff --git a/src/integration/Graph/error_entry.d.ts b/src/integration/Graph/error_entry.d.ts new file mode 100644 index 0000000..336e2ab --- /dev/null +++ b/src/integration/Graph/error_entry.d.ts @@ -0,0 +1,38 @@ +import type { FxStore } from './store'; +import type { Graph } from '../../core'; + +export interface FxErrorEntry extends Graph { + curie: 'fx:error_entry'; + + links: { + /** This resource. */ + 'self': FxErrorEntry; + /** Store this error entry was created in. */ + 'fx:store': FxStore; + }; + + props: { + /** The Foxy page where the error took place. */ + url: string; + /** The error message explaining what happened. */ + error_message: string; + /** The user agent string collected at the time of the error. */ + user_agent: string; + /** The browser referrer value at the time of the error. */ + referrer: string; + /** The IP Address of the user collected at the time of the error. */ + ip_address: string; + /** The country of the user based on the IP Address at the time of the error. */ + ip_country: string; + /** All the POST data sent to the url at the time of the error. Note: secure card holder data such as the card number, csc, or password will not be included in this data. */ + post_values: string; + /** All the GET data sent to the url at the time of the error. Note: secure card holder data such as the card number, csc, or password will not be included in this data. */ + get_values: string; + /** Set this to false to hide this error entry from the Foxy administrative interface. This may be a helpful way to manage and acknowledge errors for your store. */ + hide_error: boolean; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/fraud_protection.d.ts b/src/integration/Graph/fraud_protection.d.ts new file mode 100644 index 0000000..1e7c550 --- /dev/null +++ b/src/integration/Graph/fraud_protection.d.ts @@ -0,0 +1,31 @@ +import type { FxPaymentMethodSets } from './payment_method_sets'; +import type { FxStore } from './store'; +import type { Graph } from '../../core'; + +export interface FxFraudProtection extends Graph { + curie: 'fx:fraud_protection'; + + links: { + /** This resource. */ + 'self': FxFraudProtection; + /** Store this fraud protection policy was set on. */ + 'fx:store': FxStore; + /** Payment method sets these fraud protection measures are enabled on. */ + 'fx:payment_method_sets': FxPaymentMethodSets; + }; + + props: { + /** The type of this fraud protection */ + type: 'minfraud' | 'google_recaptcha' | 'custom_precheckout_hook'; + /** Description of this fraud protection */ + description: string; + /** Configuration settings for some fraud protection systems. */ + json: string; + /** The score threshold used for minfraud. This should be set between 0 and 100. 0 will disable minFraud and 100 will turn it on for logging but still allow all transactions to go through. */ + score_threshold_reject: number; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/fraud_protections.d.ts b/src/integration/Graph/fraud_protections.d.ts new file mode 100644 index 0000000..9495d23 --- /dev/null +++ b/src/integration/Graph/fraud_protections.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxFraudProtection } from './fraud_protection'; +import type { Graph } from '../../core'; + +export interface FxFraudProtections extends Graph { + curie: 'fx:fraud_protections'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxFraudProtection; +} diff --git a/src/integration/Graph/generate_codes.d.ts b/src/integration/Graph/generate_codes.d.ts new file mode 100644 index 0000000..7621cf7 --- /dev/null +++ b/src/integration/Graph/generate_codes.d.ts @@ -0,0 +1,14 @@ +import type { Graph } from '../../core'; + +export interface FxGenerateCodes extends Graph { + curie: 'fx:generate_codes'; + + props: { + /** Optional length of the coupon code. Defaults to 6 characters. */ + length: number; + /** Optional number of coupon code variations you would like. Defaults to 10. */ + number_of_codes: number; + /** Optional number of coupon code variations you would like to generate. For example, if you would like all the coupon code variations to have a "summer_special" prefix, set that here. */ + prefix: string; + }; +} diff --git a/src/integration/Graph/hosted_payment_gateway.d.ts b/src/integration/Graph/hosted_payment_gateway.d.ts new file mode 100644 index 0000000..94c408b --- /dev/null +++ b/src/integration/Graph/hosted_payment_gateway.d.ts @@ -0,0 +1,8 @@ +import { FxPaymentGateway } from './payment_gateway'; +import type { Graph } from '../../core'; + +export interface FxHostedPaymentGateway extends Graph { + curie: 'fx:hosted_payment_gateway'; + links: FxPaymentGateway['links']; + props: FxPaymentGateway['props']; +} diff --git a/src/integration/Graph/hosted_payment_gateways.d.ts b/src/integration/Graph/hosted_payment_gateways.d.ts new file mode 100644 index 0000000..9f83d7f --- /dev/null +++ b/src/integration/Graph/hosted_payment_gateways.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxHostedPaymentGateway } from './hosted_payment_gateway'; +import type { Graph } from '../../core'; + +export interface FxHostedPaymentGateways extends Graph { + curie: 'fx:hosted_payment_gateways'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxHostedPaymentGateway; +} diff --git a/src/integration/Graph/index.d.ts b/src/integration/Graph/index.d.ts new file mode 100644 index 0000000..874260a --- /dev/null +++ b/src/integration/Graph/index.d.ts @@ -0,0 +1,34 @@ +import type * as Core from '../../core'; +import type { FxEncode } from './encode'; +import type { FxPropertyHelpers } from './property_helpers'; +import type { FxReporting } from './reporting'; +import type { FxStore } from './store'; +import type { FxStores } from './stores'; +import type { FxToken } from './token'; +import type { FxUser } from './user'; + +export interface Graph extends Core.Graph { + links: { + /** Your API starting point. */ + 'self': Graph; + /** Various helpers used for determing valid property values. */ + 'fx:property_helpers': FxPropertyHelpers; + /** Reporting API home. */ + 'fx:reporting': FxReporting; + /** POST here to encode a body of html for use with our HMAC cart encryption. */ + 'fx:encode': FxEncode; + /** Your stores. */ + 'fx:stores': FxStores; + /** The current store for your authentication token. */ + 'fx:store': FxStore; + /** The OAuth endpoint for obtaining a new access_token using an existing refresh_token. POST `www-form-url-encoded` data as follows: `grant_type=refresh_token&refresh_token={refresh_token}&client_id={client_id}&client_secret={client_secret}`. */ + 'fx:token': FxToken; + /** Your API home page. */ + 'fx:user': FxUser; + }; + + props: { + /** A small, human readable explanation of this resource. */ + message: string; + }; +} diff --git a/src/integration/Graph/integration.d.ts b/src/integration/Graph/integration.d.ts new file mode 100644 index 0000000..e1b1468 --- /dev/null +++ b/src/integration/Graph/integration.d.ts @@ -0,0 +1,48 @@ +import type { FxClient } from './client'; +import type { FxStore } from './store'; +import type { FxUser } from './user'; +import type { Graph } from '../../core'; + +export interface FxIntegration extends Graph { + curie: 'fx:integration'; + + links: { + /** This resource. */ + 'self': FxIntegration; + /** Admin user who created this integration. */ + 'fx:user': FxUser; + /** Store this integration is assigned to. */ + 'fx:store': FxStore; + /** API client details. */ + 'fx:client': FxClient; + }; + + props: { + /** A full API URI of the user resource used in this relationship. When working with hypermedia, it's important to save URIs and not just numeric ids. */ + user_uri: string; + /** A unique identifier for this client. Maps to the client_id of the {@link https://api.foxycart.com/rels/client client} resource. */ + client_id: string; + /** The OAuth scope granted to this integration. */ + scope: string; + /** When this OAuth refresh token expires. */ + expires: number; + /** Maps to the project_name of the {@link https://api.foxycart.com/rels/client client} resource. */ + project_name: string; + /** Maps to the project_description of the {@link https://api.foxycart.com/rels/client client} resource. */ + project_description: string; + /** Maps to the company_name of the {@link https://api.foxycart.com/rels/client client} resource. */ + company_name: string; + /** Maps to the company_url of the {@link https://api.foxycart.com/rels/client client} resource. */ + company_url: string; + /** Maps to the company_logo of the {@link https://api.foxycart.com/rels/client client} resource. */ + company_logo: string; + /** Maps to the contact_name of the {@link https://api.foxycart.com/rels/client client} resource. */ + contact_name: string; + /** Maps to the contact_email of the {@link https://api.foxycart.com/rels/client client} resource. */ + contact_email: string; + /** Maps to the first_name and last_name of the {@link https://api.foxycart.com/rels/user user} resource. */ + added_by_name: string; + /** Maps to the email of the {@link https://api.foxycart.com/rels/user user} resource. */ + added_by_email: string; + }; +} diff --git a/src/integration/Graph/item.d.ts b/src/integration/Graph/item.d.ts new file mode 100644 index 0000000..1137637 --- /dev/null +++ b/src/integration/Graph/item.d.ts @@ -0,0 +1,96 @@ +import type { FxAttributes } from './attributes'; +import type { FxCouponDetails } from './coupon_details'; +import type { FxDiscountDetails } from './discount_details'; +import type { FxItemCategory } from './item_category'; +import type { FxItemOptions } from './item_options'; +import type { FxShipment } from './shipment'; +import type { FxStore } from './store'; +import type { FxTransaction } from './transaction'; +import type { Graph } from '../../core'; + +export interface FxItem extends Graph { + curie: 'fx:item'; + + links: { + /** This resource. */ + 'self': FxItem; + /** Store this item belongs to. */ + 'fx:store': FxStore; + /** Related shipment info. */ + 'fx:shipment': FxShipment; + /** Custom attributes linked to this item. */ + 'fx:attributes': FxAttributes; + /** Related transaction info. */ + 'fx:transaction': FxTransaction; + /** Various custom options for this item. */ + 'fx:item_options': FxItemOptions; + /** Category this item belongs in. */ + 'fx:item_category': FxItemCategory; + /** Details about coupons linked to this item. */ + 'fx:coupon_details': FxCouponDetails; + /** Details about discounts linked to this item. */ + 'fx:discount_details': FxDiscountDetails; + }; + + props: { + /** The full API URI of the item category associated with this item. */ + item_category_uri: string; + /** The name of this item. */ + name: string; + /** The price of this item. This represents the base price of the item before any item option modifiers. */ + price: number; + /** The number of items in the cart or transaction. When adding products to the cart, if all properties are identical, the quantity will be incremented accordingly. */ + quantity: number; + /** Minimum quantity that should be allowed per product, per cart. If the quantity is less than this, the quantity will be updated automatically to this number. */ + quantity_min: number; + /** Maximum quantity that should be allowed per product, per cart. If the quantity is more than this, the quantity will be updated automatically to this amount. */ + quantity_max: number; + /** This item's per-item weight, used for shipping rate requests. */ + weight: number; + /** Item code. Can be used however you would like (internal use, product SKU, etc.). */ + code: string; + /** Parent item code. Used if this should be a child product in a bundle. */ + parent_code: string; + /** The name of the line item discount if it is included on this item. */ + discount_name: string; + /** The type of the line item discount if this item has a discount. */ + discount_type: '' | 'quantity_amount' | 'quantity_percentage' | 'price_amount' | 'price_percentage'; + /** The details of the line item discount if this item has a discount. See the cart documentation for details on how this value should be formatted. */ + discount_details: string; + /** This determines how often this subscription will be processed. The format is a number followed by a date type such as d (day), w (week), m (month), or y (year). You can also use .5m for twice a month. To modify this value for an existing subscription, you must modify the subscription directly. */ + subscription_frequency: string; + /** The original date this subscription began or will begin if set in the future. To modify this value for an existing subscription, you must modify the subscription directly. */ + subscription_start_date: string; + /** The date for when this subscription will run again. To modify this value for an existing subscription, you must modify the subscription directly. */ + subscription_next_transaction_date: string; + /** If set, the date this subscription will end. The subscription will not run on this day. */ + subscription_end_date: string; + /** If this item is part of a future subscription (or a subscription originally set up to start in the future), this will be set to true. */ + is_future_line_item: boolean; + /** Used for multiship to assign this item to a specific shipment. This value will be the address name of the shipment. */ + shipto: string; + /** The full item url for the customer to view this item online. */ + url: string; + /** The full image url for the customer to view an image of this item online. */ + image: string; + /** The length of this item. This is currently a place holder for future use. */ + length: number; + /** The width of this item. This is currently a place holder for future use. */ + width: number; + /** The width of this item. This is currently a place holder for future use. */ + height: number; + /** As a unix timestamp, this is the point in the future when this item will no longer be valid and will be removed from the cart. */ + expires: number; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; + + zooms: { + discount_details?: FxDiscountDetails; + coupon_details?: FxCouponDetails; + item_category?: FxItemCategory; + item_options?: FxItemOptions; + }; +} diff --git a/src/integration/Graph/item_categories.d.ts b/src/integration/Graph/item_categories.d.ts new file mode 100644 index 0000000..63c0df8 --- /dev/null +++ b/src/integration/Graph/item_categories.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxItemCategory } from './item_category'; +import type { Graph } from '../../core'; + +export interface FxItemCategories extends Graph { + curie: 'fx:item_categories'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxItemCategory; +} diff --git a/src/integration/Graph/item_category.d.ts b/src/integration/Graph/item_category.d.ts new file mode 100644 index 0000000..b80bc1e --- /dev/null +++ b/src/integration/Graph/item_category.d.ts @@ -0,0 +1,72 @@ +import type { FxEmailTemplates } from './email_templates'; +import type { FxStore } from './store'; +import type { FxTaxItemCategories } from './tax_item_categories'; +import type { Graph } from '../../core'; + +export interface FxItemCategory extends Graph { + curie: 'fx:item_category'; + + links: { + /** This resource. */ + 'self': FxItemCategory; + /** Store this category is registered in. */ + 'fx:store': FxStore; + /** Email templates for the store. */ + 'fx:email_templates': FxEmailTemplates; + /** Related tax item categories. */ + 'fx:tax_item_categories': FxTaxItemCategories; + }; + + props: { + /** The full API URI of the email template used by this category for sending an administrative email if send_admin_email is true. */ + admin_email_template_uri: string; + /** The full API URI of the email template used by this category for sending an additional customer email if send_customer_email is true. */ + customer_email_template_uri: string; + /** The category code used when applying this item category to the cart. */ + code: string; + /** The name of this category. */ + name: string; + /** The delivery type of the items in this category. */ + item_delivery_type: string; + /** Determines how many times the same customer can attempt to download a purchased downloadable item before they are given an error. */ + max_downloads_per_customer: number; + /** Determines how long in hours after the initial purchase a customer can attempt to download a purchased downloadable item before they are given an error. Some helpful values include: 1 day = 24 hours, 1 Week = 168 hours, 1 Month = 672 hours, 6 Months = 4032 hours */ + max_downloads_time_period: number; + /** The customs value that should be used for shipping services for items in this category. */ + customs_value: number; + /** The default weight of an item in this category if no individual item weight is given. */ + default_weight: number; + /** The weight unit of measurement that will be sent to shipping services for items in this category. */ + default_weight_unit: 'LBS' | 'KGS'; + /** The length unit of measurement that will be sent to shipping services for items in this category. */ + default_length_unit: 'IN' | 'CM'; + /** The amount to charge for flat rate shipping when the `item_delivery_type` is `flat_rate`. */ + shipping_flat_rate: number; + /** How to apply the flat rate shipping amount, either to the whole order or to each shipment in the order. */ + shipping_flat_rate_type: string; + /** Specify a handling fee type if you want items in this category to have a handling fee added to their price. */ + handling_fee_type: 'none' | 'flat_per_order' | 'flat_per_item' | 'flat_percent' | 'flat_percent_with_minimum'; + /** The handling fee amount for this category. */ + handling_fee: number; + /** The minimum fee when calculating the flat fee per shipment OR % of order total with items in this category. Whichever is greater. */ + handling_fee_minimum: number; + /** The handling fee percentage used when the `handling_fee_type` includes a percentage. */ + handling_fee_percentage: number; + /** If specified, the type of discount applied to this item category. */ + discount_type: '' | 'quantity_amount' | 'quantity_percentage' | 'price_amount' | 'price_percentage'; + /** The name of this category discount. */ + discount_name: string; + /** This is the string that determines the tiers and amounts that make up your discount. For example, 2-.50|10-3|50-5 means "between 2 and 9 is discounted by .5 per product, 10 and 49 by 3 per product and 50 and over by 5 per product. If you're doing a quantity discount, it will compare against the quantity of products in the order. If you're doing a price based discount, it will compare against the price of the products in the order. Please see the documentation for more information: {@link http://wiki.foxycart.com/v/2.0/coupons_and_discounts Coupons and Discounts} */ + discount_details: string; + /** Set to true to send an email to the customer any time an item in this category is purchased. If you set this to true, you'll also need to specify a `customer_email_template_uri` */ + send_customer_email: boolean; + /** Set to true to send an email to an administrator any time an item in this category is purchased. If you set this to true, you'll also need to specify a `admin_email_template_uri` */ + send_admin_email: boolean; + /** Email address of the administrator you'd like to send an email to every time an item in this category is purchased. */ + admin_email: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/item_option.d.ts b/src/integration/Graph/item_option.d.ts new file mode 100644 index 0000000..4fadc69 --- /dev/null +++ b/src/integration/Graph/item_option.d.ts @@ -0,0 +1,34 @@ +import type { FxItem } from './item'; +import type { FxStore } from './store'; +import type { FxTransaction } from './transaction'; +import type { Graph } from '../../core'; + +export interface FxItemOption extends Graph { + curie: 'fx:item_option'; + + links: { + /** This resource. */ + 'self': FxItemOption; + /** Item this option is attached to. */ + 'fx:item': FxItem; + /** Store the item belongs to. */ + 'fx:store': FxStore; + /** Related transaction resource. */ + 'fx:transaction': FxTransaction; + }; + + props: { + /** The name of this item option. */ + name: string; + /** The value of this item option. */ + value: string; + /** The price modifier for this item option. The price of the item in the cart will be adjusted by this amount because of this item option. */ + price_mod: number; + /** The weight modifier for this item option. The weight of the item in the cart will be adjusted by this amount because of this item option. */ + weight_mod: number; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/item_options.d.ts b/src/integration/Graph/item_options.d.ts new file mode 100644 index 0000000..e9d0ff3 --- /dev/null +++ b/src/integration/Graph/item_options.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxItemOption } from './item_option'; +import type { Graph } from '../../core'; + +export interface FxItemOptions extends Graph { + curie: 'fx:item_options'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxItemOption; +} diff --git a/src/integration/Graph/items.d.ts b/src/integration/Graph/items.d.ts new file mode 100644 index 0000000..114a8ef --- /dev/null +++ b/src/integration/Graph/items.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxItem } from './item'; +import type { Graph } from '../../core'; + +export interface FxItems extends Graph { + curie: 'fx:items'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxItem; +} diff --git a/src/integration/Graph/language_override.d.ts b/src/integration/Graph/language_override.d.ts new file mode 100644 index 0000000..efb69ba --- /dev/null +++ b/src/integration/Graph/language_override.d.ts @@ -0,0 +1,32 @@ +import type { FxLanguageOverrides } from './language_overrides'; +import type { FxStore } from './store'; +import type { FxTemplateSet } from './template_set'; +import type { Graph } from '../../core'; + +export interface FxLanguageOverride extends Graph { + curie: 'fx:language_override'; + + links: { + /** This resource. */ + 'self': FxLanguageOverride; + /** Store this language override is registered in. */ + 'fx:store': FxStore; + /** Template set this language override belongs to. */ + 'fx:template_set': FxTemplateSet; + /** List of all language overrides in the template set. */ + 'fx:language_overrides': FxLanguageOverrides; + }; + + props: { + /** The code for this language string. This is the same code you will see in the `FC.json.config.lang` array. */ + code: string; + /** For the language strings specific to a payment gateway, enter the gateway key here. */ + gateway: string; + /** Your custom string for this language code. */ + custom_value: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/language_overrides.d.ts b/src/integration/Graph/language_overrides.d.ts new file mode 100644 index 0000000..6c6064e --- /dev/null +++ b/src/integration/Graph/language_overrides.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxLanguageOverride } from './language_override'; +import type { Graph } from '../../core'; + +export interface FxLanguageOverrides extends Graph { + curie: 'fx:language_overrides'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxLanguageOverride; +} diff --git a/src/integration/Graph/language_strings.d.ts b/src/integration/Graph/language_strings.d.ts new file mode 100644 index 0000000..f026ef0 --- /dev/null +++ b/src/integration/Graph/language_strings.d.ts @@ -0,0 +1,24 @@ +import type { FxPropertyHelpers } from './property_helpers'; +import type { Graph } from '../../core'; + +interface StringRecord { + [key: string]: StringRecord; +} + +export interface FxLanguageStrings extends Graph { + curie: 'fx:language_strings'; + + links: { + /** This resource. */ + 'self': FxLanguageStrings; + /** Various predefined property values. */ + 'fx:property_helpers': FxPropertyHelpers; + }; + + props: { + /** A small, human readable explanation of this property helper. */ + message: string; + /** JSON objects with the language strings supported. The key values match the language property and each pair represents the language_override `code` and `custom_value`. */ + values: StringRecord; + }; +} diff --git a/src/integration/Graph/languages.d.ts b/src/integration/Graph/languages.d.ts new file mode 100644 index 0000000..c5e229f --- /dev/null +++ b/src/integration/Graph/languages.d.ts @@ -0,0 +1,20 @@ +import type { FxPropertyHelpers } from './property_helpers'; +import type { Graph } from '../../core'; + +export interface FxLanguages extends Graph { + curie: 'fx:languages'; + + links: { + /** This resource. */ + 'self': FxLanguages; + /** Various predefined property values. */ + 'fx:property_helpers': FxPropertyHelpers; + }; + + props: { + /** A small, human readable explanation of this property helper. */ + message: string; + /** JSON objects with the languages supported. The key values are the values you use for the Store resource's language property. */ + values: Record; + }; +} diff --git a/src/integration/Graph/last_transaction.d.ts b/src/integration/Graph/last_transaction.d.ts new file mode 100644 index 0000000..5c760ee --- /dev/null +++ b/src/integration/Graph/last_transaction.d.ts @@ -0,0 +1,9 @@ +import type { FxTransaction } from './transaction'; +import type { Graph } from '../../core'; + +export interface FxLastTransaction extends Graph { + curie: 'fx:last_transaction'; + links: FxTransaction['links']; + props: FxTransaction['props']; + zooms: FxTransaction['zooms']; +} diff --git a/src/integration/Graph/locale_codes.d.ts b/src/integration/Graph/locale_codes.d.ts new file mode 100644 index 0000000..a785b1e --- /dev/null +++ b/src/integration/Graph/locale_codes.d.ts @@ -0,0 +1,20 @@ +import type { FxPropertyHelpers } from './property_helpers'; +import type { Graph } from '../../core'; + +export interface FxLocaleCodes extends Graph { + curie: 'fx:locale_codes'; + + links: { + /** This resource. */ + 'self': FxLocaleCodes; + /** Various predefined property values. */ + 'fx:property_helpers': FxPropertyHelpers; + }; + + props: { + /** A small, human readable explanation of this property helper. */ + message: string; + /** JSON objects with the locale codes supported. The key values are the values you use for the Store resource's `locale_code` property. */ + values: Record; + }; +} diff --git a/src/integration/Graph/native_integration.d.ts b/src/integration/Graph/native_integration.d.ts new file mode 100644 index 0000000..f761728 --- /dev/null +++ b/src/integration/Graph/native_integration.d.ts @@ -0,0 +1,24 @@ +import type { FxStore } from './store'; +import type { Graph } from '../../core'; + +export interface FxNativeIntegration extends Graph { + curie: 'fx:native_integration'; + + links: { + /** This resource. */ + 'self': FxNativeIntegration; + /** Store this native integration is enabled on. */ + 'fx:store': FxStore; + }; + + props: { + /** The identifier string of this provider. */ + provider: string; + /** A JSON string containing the configuration values and credentials for this native integration. */ + config: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/native_integrations.d.ts b/src/integration/Graph/native_integrations.d.ts new file mode 100644 index 0000000..385bca7 --- /dev/null +++ b/src/integration/Graph/native_integrations.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxNativeIntegration } from './native_integration'; +import type { Graph } from '../../core'; + +export interface FxNativeIntegrations extends Graph { + curie: 'fx:native_integrations'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxNativeIntegration; +} diff --git a/src/integration/Graph/original_transaction.d.ts b/src/integration/Graph/original_transaction.d.ts new file mode 100644 index 0000000..a380a18 --- /dev/null +++ b/src/integration/Graph/original_transaction.d.ts @@ -0,0 +1,9 @@ +import type { FxTransaction } from './transaction'; +import type { Graph } from '../../core'; + +export interface FxOriginalTransaction extends Graph { + curie: 'fx:original_transaction'; + links: FxTransaction['links']; + props: FxTransaction['props']; + zooms: FxTransaction['zooms']; +} diff --git a/src/integration/Graph/payment.d.ts b/src/integration/Graph/payment.d.ts new file mode 100644 index 0000000..80467d6 --- /dev/null +++ b/src/integration/Graph/payment.d.ts @@ -0,0 +1,49 @@ +import type { FxStore } from './store'; +import type { FxTransaction } from './transaction'; +import type { Graph } from '../../core'; + +export interface FxPayment extends Graph { + curie: 'fx:payment'; + + links: { + /** This resource. */ + 'self': FxPayment; + /** Store that received this payment. */ + 'fx:store': FxStore; + /** Related transaction resource. */ + 'fx:transaction': FxTransaction; + }; + + props: { + /** The payment type for this payment. Values include plastic (for credit/debit cards), purchase_order, paypal, amazon_mws, hosted, ogone, and paypal_ec */ + type: 'plastic' | 'purchase_order' | 'paypal' | 'amazon_mws' | 'hosted' | 'ogone' | 'paypal_ec'; + /** The payment gateway type for this payment. This should correspond to a value in {@link https://api-sandbox.foxycart.com/hal-browser/browser.html#https://api-sandbox.foxycart.com/property_helpers/hosted_payment_gateways hosted_payment_gateways} or {@link https://api-sandbox.foxycart.com/hal-browser/browser.html#https://api-sandbox.foxycart.com/property_helpers/payment_gateways payment_gateways}. */ + gateway_type: string; + /** The processor response string from the payment gateway. This will include their transaction or reference number. */ + processor_response: string; + /** If supported by the payment gateway integration, this will include additional information from the payment gateway's response. */ + processor_response_details: string; + /** The PO value entered by the customer during checkout (for purchase order payment types). */ + purchase_order: string; + /** The masked credit card number used for this payment (for plastic payment types). */ + cc_number_masked: string; + /** The type of credit card such as Visa or MasterCard (for plastic payment types). */ + cc_type: string; + /** The credit card expiration month (for plastic payment types). */ + cc_exp_month: string; + /** The credit card expiration year (for plastic payment types). */ + cc_exp_year: string; + /** If this payment gateway set is configured with a fraud protection system, the fraud score for this payment will be listed here. */ + fraud_protection_score: number; + /** The payer id for this payment (for Paypal payment types). */ + paypal_payer_id: string; + /** The identifer for the third party provider for this payment (for hosted payment types). */ + third_party_id: string; + /** The total amount of this payment. */ + amount: number; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/payment_gateway.d.ts b/src/integration/Graph/payment_gateway.d.ts new file mode 100644 index 0000000..2633a27 --- /dev/null +++ b/src/integration/Graph/payment_gateway.d.ts @@ -0,0 +1,48 @@ +import type { FxPaymentMethodSets } from './payment_method_sets'; +import type { FxStore } from './store'; +import type { Graph } from '../../core'; + +export interface FxPaymentGateway extends Graph { + curie: 'fx:payment_gateway'; + + links: { + /** This resource. */ + 'self': FxPaymentGateway; + /** Store using this gateway. */ + 'fx:store': FxStore; + /** Payment method sets using this gateway. */ + 'fx:payment_method_sets': FxPaymentMethodSets; + }; + + props: { + /** Description of this payment gateway */ + description: string; + /** Valid payment gateway type. */ + type: string; + /** Your payment gateway account id. To view the specific description of this field for the given payment gateway, see {@link https://api-sandbox.foxycart.com/hal-browser/browser.html#https://api-sandbox.foxycart.com/property_helpers/payment_gateways payment_gateways} property helper `id_description` field. */ + account_id: string; + /** Your payment gateway account key. To view the specific description of this field for the given payment gateway, see {@link https://api-sandbox.foxycart.com/hal-browser/browser.html#https://api-sandbox.foxycart.com/property_helpers/payment_gateways payment_gateways} property helper `key_description` field. */ + account_key: string; + /** Your payment gateway third party key. To view the specific description of this field for the given payment gateway, see {@link https://api-sandbox.foxycart.com/hal-browser/browser.html#https://api-sandbox.foxycart.com/property_helpers/payment_gateways payment_gateways} property helper `third_party_key_description` field. */ + third_party_key: string; + /** Configuration settings for 3D Secure. */ + config_3d_secure: + | '' + | 'all_cards' + | 'maestro_only' + | 'all_cards_require_valid_response' + | 'maestro_only_require_valid_response'; + /** Additional configuration details specific to each payment gateway. */ + additional_fields: string; + /** Your test payment gateway account id. To view the specific description of this field for the given payment gateway, see {@link https://api-sandbox.foxycart.com/hal-browser/browser.html#https://api-sandbox.foxycart.com/property_helpers/payment_gateways payment_gateways} property helper `id_description` field. */ + test_account_id: string; + /** Your test payment gateway account key. To view the specific description of this field for the given payment gateway, see {@link https://api-sandbox.foxycart.com/hal-browser/browser.html#https://api-sandbox.foxycart.com/property_helpers/payment_gateways payment_gateways} property helper `key_description` field. */ + test_account_key: string; + /** Your test payment gateway third party key. To view the specific description of this field for the given payment gateway, see {@link https://api-sandbox.foxycart.com/hal-browser/browser.html#https://api-sandbox.foxycart.com/property_helpers/payment_gateways payment_gateways} property helper `third_party_key_description` field. */ + test_third_party_key: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/payment_gateways.d.ts b/src/integration/Graph/payment_gateways.d.ts new file mode 100644 index 0000000..3df2fe1 --- /dev/null +++ b/src/integration/Graph/payment_gateways.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxPaymentGateway } from './payment_gateway'; +import type { Graph } from '../../core'; + +export interface FxPaymentGateways extends Graph { + curie: 'fx:payment_gateways'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxPaymentGateway; +} diff --git a/src/integration/Graph/payment_method_expiring.d.ts b/src/integration/Graph/payment_method_expiring.d.ts new file mode 100644 index 0000000..7f5f5d7 --- /dev/null +++ b/src/integration/Graph/payment_method_expiring.d.ts @@ -0,0 +1,48 @@ +import type { FxCustomer } from './customer'; +import type { FxDefaultBillingAddress } from './default_billing_address'; +import type { FxDefaultPaymentMethod } from './default_payment_method'; +import type { FxStore } from './store'; +import type { FxSubscriptions } from './subscriptions'; +import type { Graph } from '../../core'; + +export interface FxPaymentMethodExpiring extends Graph { + curie: 'fx:payment_method_expiring'; + + links: { + /** This resource. */ + 'self': FxPaymentMethodExpiring; + /** Related store resource. */ + 'fx:store': FxStore; + /** Customer who this payment method belongs to. */ + 'fx:customer': FxCustomer; + /** List of customer's subscriptions. */ + 'fx:subscriptions': FxSubscriptions; + /** Customer's default payment method. */ + 'fx:default_payment_method': FxDefaultPaymentMethod; + /** Customer's default billing address. */ + 'fx:default_billing_address': FxDefaultBillingAddress; + }; + + props: { + /** Months from today's day before this payment card will expire. */ + months_before_expiration: number; + /** The customer's given name. */ + first_name: string; + /** The customer's surname. */ + last_name: string; + /** The customer's email address. */ + email: string; + /** The credit card or debit card type. */ + cc_type: string; + /** A masked version of this payment card showing only the last 4 digits. */ + cc_number_masked: string; + /** The payment card expiration month in the MM format. */ + cc_exp_month: string; + /** The payment card expiration year in the YYYY format. */ + cc_exp_year: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/payment_method_set.d.ts b/src/integration/Graph/payment_method_set.d.ts new file mode 100644 index 0000000..163227a --- /dev/null +++ b/src/integration/Graph/payment_method_set.d.ts @@ -0,0 +1,40 @@ +import type { FxPaymentGateway } from './payment_gateway'; +import type { FxPaymentMethodSetFraudProtections } from './payment_method_set_fraud_protections'; +import type { FxPaymentMethodSetHostedPaymentGateways } from './payment_method_set_hosted_payment_gateways'; +import type { FxPaymentMethodSets } from './payment_method_sets'; +import type { FxStore } from './store'; +import type { Graph } from '../../core'; + +export interface FxPaymentMethodSet extends Graph { + curie: 'fx:payment_method_set'; + + links: { + /** This resource. */ + 'self': FxPaymentMethodSet; + /** Store this payment method set belongs to. */ + 'fx:store': FxStore; + /** Payment gateway for this payment method set. */ + 'fx:payment_gateway': FxPaymentGateway; + /** List of payment method sets for the store. */ + 'fx:payment_method_sets': FxPaymentMethodSets; + /** Payment method set and fraud protection relationships. */ + 'fx:payment_method_set_fraud_protections': FxPaymentMethodSetFraudProtections; + /** Payment method set and hosted payment gateways relationships. */ + 'fx:payment_method_set_hosted_payment_gateways': FxPaymentMethodSetHostedPaymentGateways; + }; + + props: { + /** The full API URI of the payment_gateway associated with this payment method set. */ + gateway_uri: string; + /** The description of your payment method set. */ + description: string; + /** Set this to true to enable a live payment gateway and live hosted gateways. This can only be set to true if your store is active. If this is set to false, transactions will be processed as test transactions. */ + is_live: boolean; + /** Set this to true to enable the purchase order payment option on your store. This can only be set to true if your store is active. */ + is_purchase_order_enabled: boolean; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/payment_method_set_fraud_protection.d.ts b/src/integration/Graph/payment_method_set_fraud_protection.d.ts new file mode 100644 index 0000000..551b138 --- /dev/null +++ b/src/integration/Graph/payment_method_set_fraud_protection.d.ts @@ -0,0 +1,30 @@ +import type { FxFraudProtection } from './fraud_protection'; +import type { FxPaymentMethodSet } from './payment_method_set'; +import type { FxStore } from './store'; +import type { Graph } from '../../core'; + +export interface FxPaymentMethodSetFraudProtection extends Graph { + curie: 'fx:payment_method_set_fraud_protection'; + + links: { + /** This resource. */ + 'self': FxPaymentMethodSetFraudProtection; + /** Store this configuration belongs to. */ + 'fx:store': FxStore; + /** Fraud protection configuration. */ + 'fx:fraud_protection': FxFraudProtection; + /** Payment method set configuration. */ + 'fx:payment_method_set': FxPaymentMethodSet; + }; + + props: { + /** The full API URI of the payment method set associated with this payment method set fraud protection. */ + payment_method_set_uri: string; + /** The full API URI of the fraud protection associated with this payment method set fraud protection. */ + fraud_protection_uri: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/payment_method_set_fraud_protections.d.ts b/src/integration/Graph/payment_method_set_fraud_protections.d.ts new file mode 100644 index 0000000..01c320a --- /dev/null +++ b/src/integration/Graph/payment_method_set_fraud_protections.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxPaymentMethodSetFraudProtection } from './payment_method_set_fraud_protection'; +import type { Graph } from '../../core'; + +export interface FxPaymentMethodSetFraudProtections extends Graph { + curie: 'fx:payment_method_set_fraud_protections'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxPaymentMethodSetFraudProtection; +} diff --git a/src/integration/Graph/payment_method_set_hosted_payment_gateway.d.ts b/src/integration/Graph/payment_method_set_hosted_payment_gateway.d.ts new file mode 100644 index 0000000..cbe298e --- /dev/null +++ b/src/integration/Graph/payment_method_set_hosted_payment_gateway.d.ts @@ -0,0 +1,30 @@ +import type { FxHostedPaymentGateway } from './hosted_payment_gateway'; +import type { FxPaymentMethodSet } from './payment_method_set'; +import type { FxStore } from './store'; +import type { Graph } from '../../core'; + +export interface FxPaymentMethodSetHostedPaymentGateway extends Graph { + curie: 'fx:payment_method_set_hosted_payment_gateway'; + + links: { + /** This resource. */ + 'self': FxPaymentMethodSetHostedPaymentGateway; + /** Related store resource. */ + 'fx:store': FxStore; + /** Linked payment method set. */ + 'fx:payment_method_set': FxPaymentMethodSet; + /** Linked hosted payment gateway. */ + 'fx:hosted_payment_gateway': FxHostedPaymentGateway; + }; + + props: { + /** The full API URI of the payment method set associated with this payment method set hosted payment gateway. */ + payment_method_set_uri: string; + /** The full API URI of the hosted payment gateway associated with this payment method set hosted payment gateway. */ + hosted_payment_gateway_uri: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/payment_method_set_hosted_payment_gateways.d.ts b/src/integration/Graph/payment_method_set_hosted_payment_gateways.d.ts new file mode 100644 index 0000000..1f9b9d7 --- /dev/null +++ b/src/integration/Graph/payment_method_set_hosted_payment_gateways.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxPaymentMethodSetHostedPaymentGateway } from './payment_method_set_hosted_payment_gateway'; +import type { Graph } from '../../core'; + +export interface FxPaymentMethodSetHostedPaymentGateways extends Graph { + curie: 'fx:payment_method_set_hosted_payment_gateways'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxPaymentMethodSetHostedPaymentGateway; +} diff --git a/src/integration/Graph/payment_method_sets.d.ts b/src/integration/Graph/payment_method_sets.d.ts new file mode 100644 index 0000000..4ec785b --- /dev/null +++ b/src/integration/Graph/payment_method_sets.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxPaymentMethodSet } from './payment_method_set'; +import type { Graph } from '../../core'; + +export interface FxPaymentMethodSets extends Graph { + curie: 'fx:payment_method_sets'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxPaymentMethodSet; +} diff --git a/src/integration/Graph/payments.d.ts b/src/integration/Graph/payments.d.ts new file mode 100644 index 0000000..b4b46cd --- /dev/null +++ b/src/integration/Graph/payments.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxPayment } from './payment'; +import type { Graph } from '../../core'; + +export interface FxPayments extends Graph { + curie: 'fx:payments'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxPayment; +} diff --git a/src/integration/Graph/process_subscription_webhook.d.ts b/src/integration/Graph/process_subscription_webhook.d.ts new file mode 100644 index 0000000..d54b7c5 --- /dev/null +++ b/src/integration/Graph/process_subscription_webhook.d.ts @@ -0,0 +1,5 @@ +import type { Graph } from '../../core'; + +export interface FxProcessSubscriptionWebhook extends Graph { + curie: 'fx:process_subscription_webhook'; +} diff --git a/src/integration/Graph/process_webhook.d.ts b/src/integration/Graph/process_webhook.d.ts new file mode 100644 index 0000000..39940a4 --- /dev/null +++ b/src/integration/Graph/process_webhook.d.ts @@ -0,0 +1,5 @@ +import type { Graph } from '../../core'; + +export interface FxProcessWebhook extends Graph { + curie: 'fx:process_webhook'; +} diff --git a/src/integration/Graph/property_helpers.d.ts b/src/integration/Graph/property_helpers.d.ts new file mode 100644 index 0000000..f1853d3 --- /dev/null +++ b/src/integration/Graph/property_helpers.d.ts @@ -0,0 +1,57 @@ +import type { FxCheckoutTypes } from './checkout_types'; +import type { FxCountries } from './countries'; +import type { FxCustomerPasswordHashTypes } from './customer_password_hash_types'; +import type { FxDefaultTemplates } from './default_templates'; +import type { FxHostedPaymentGateways } from './hosted_payment_gateways'; +import type { FxLanguageStrings } from './language_strings'; +import type { FxLanguages } from './languages'; +import type { FxLocaleCodes } from './locale_codes'; +import type { FxPaymentGateways } from './payment_gateways'; +import type { FxRegions } from './regions'; +import type { FxShippingAddressTypes } from './shipping_address_types'; +import type { FxShippingMethods } from './shipping_methods'; +import type { FxStoreVersions } from './store_versions'; +import type { FxTimezones } from './timezones'; +import type { Graph } from '../../core'; + +export interface FxPropertyHelpers extends Graph { + curie: 'fx:property_helpers'; + + links: { + /** This resource. */ + 'self': FxPropertyHelpers; + /** List of valid region values. It defaults to US states, but you can fetch other country states using `?country_code=`. */ + 'fx:regions': FxRegions; + /** List of valid timezones for the store's `timezone` setting. */ + 'fx:timezones': FxTimezones; + /** List of valid country values for any country setting such as the store's `store_country`. */ + 'fx:countries': FxCountries; + /** List of valid language values for the store's `language` setting. */ + 'fx:languages': FxLanguages; + /** List of all supported locales. */ + 'fx:locale_codes': FxLocaleCodes; + /** Store versions available along with their changelog details. */ + 'fx:store_versions': FxStoreVersions; + /** List of valid checkout type values for the store's `checkout_type` setting. */ + 'fx:checkout_types': FxCheckoutTypes; + /** The shipping carriers used when configuring live shipping rates. */ + 'fx:shipping_methods': FxShippingMethods; + /** List of supported payment gateways and valid entries for that resource's `type` setting. */ + 'fx:payment_gateways': FxPaymentGateways; + /** List of default language strings that can be overriden. */ + 'fx:language_strings': FxLanguageStrings; + /** Default templates for the cart, checkout, receipt and email. */ + 'fx:default_templates': FxDefaultTemplates; + /** List of valid address type values for the store's `shipping_address_type` setting. */ + 'fx:shipping_address_types': FxShippingAddressTypes; + /** Hosted payment gateways such as PayPal, BitPay, and Dwolla. */ + 'fx:hosted_payment_gateways': FxHostedPaymentGateways; + /** List of valid customer password hash type values for the store's `customer_password_hash_type` setting. */ + 'fx:customer_password_hash_types': FxCustomerPasswordHashTypes; + }; + + props: { + /** Resource description. */ + message: string; + }; +} diff --git a/src/integration/Graph/receipt.d.ts b/src/integration/Graph/receipt.d.ts new file mode 100644 index 0000000..e211c32 --- /dev/null +++ b/src/integration/Graph/receipt.d.ts @@ -0,0 +1,5 @@ +import type { Graph } from '../../core'; + +export interface FxReceipt extends Graph { + curie: 'fx:receipt'; +} diff --git a/src/integration/Graph/receipt_template.d.ts b/src/integration/Graph/receipt_template.d.ts new file mode 100644 index 0000000..0985f92 --- /dev/null +++ b/src/integration/Graph/receipt_template.d.ts @@ -0,0 +1,35 @@ +import type { FxCache } from './cache'; +import type { FxEncode } from './encode'; +import type { FxStore } from './store'; +import type { FxTemplateSets } from './template_sets'; +import type { Graph } from '../../core'; + +export interface FxReceiptTemplate extends Graph { + curie: 'fx:receipt_template'; + + links: { + /** This resource. */ + 'self': FxReceiptTemplate; + /** Related store resource. */ + 'fx:store': FxStore; + /** POST here to cache your template using the `content_url`. */ + 'fx:cache': FxCache; + /** POST here to encode a body of html for use with our HMAC cart encryption. */ + 'fx:encode': FxEncode; + /** Template sets using this template. */ + 'fx:template_sets': FxTemplateSets; + }; + + props: { + /** The description of your receipt template. */ + description: string; + /** The content of your receipt template. Leave blank to use the default responsive template. This shouldn't be set directly unless all of your image references are already over https. If they are not, set the `content_url` to point to your template content online and then POST to the `cache` link relationship. */ + content: string; + /** The URL of your receipt template hosted on your own server online and publicly available for our server to cache. */ + content_url: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/receipt_templates.d.ts b/src/integration/Graph/receipt_templates.d.ts new file mode 100644 index 0000000..a125dd9 --- /dev/null +++ b/src/integration/Graph/receipt_templates.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxReceiptTemplate } from './receipt_template'; +import type { Graph } from '../../core'; + +export interface FxReceiptTemplates extends Graph { + curie: 'fx:receipt_templates'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxReceiptTemplate; +} diff --git a/src/integration/Graph/refund.d.ts b/src/integration/Graph/refund.d.ts new file mode 100644 index 0000000..cc37ec7 --- /dev/null +++ b/src/integration/Graph/refund.d.ts @@ -0,0 +1,5 @@ +import type { Graph } from '../../core'; + +export interface FxRefund extends Graph { + curie: 'fx:refund'; +} diff --git a/src/integration/Graph/regions.d.ts b/src/integration/Graph/regions.d.ts new file mode 100644 index 0000000..bd1545f --- /dev/null +++ b/src/integration/Graph/regions.d.ts @@ -0,0 +1,35 @@ +import type { FxPropertyHelpers } from './property_helpers'; +import type { Graph } from '../../core'; + +export interface FxRegions extends Graph { + curie: 'fx:regions'; + + links: { + /** This resource. */ + 'self': FxRegions; + /** Various predefined property values. */ + 'fx:property_helpers': FxPropertyHelpers; + }; + + props: { + /** A small, human readable explanation of this property helper. */ + message: string; + /** JSON objects with the region codes as the keys. */ + values: { + [key: string]: { + /** The default name for this region. */ + default: string; + /** The code for this region. */ + code: string; + /** The official 3 character country code. */ + cc3: string; + /** Array of alternative names for this region. */ + alternate_values: string[]; + /** This value determines which regions will show up first in our find-as-you-type system. */ + boost: number; + /** True if this region is currently recognized. */ + active: boolean; + }; + }; + }; +} diff --git a/src/integration/Graph/reporting.d.ts b/src/integration/Graph/reporting.d.ts new file mode 100644 index 0000000..ea66deb --- /dev/null +++ b/src/integration/Graph/reporting.d.ts @@ -0,0 +1,21 @@ +import type { FxReportingEmailExists } from './reporting_email_exists'; +import type { FxReportingStoreDomainExists } from './reporting_store_domain_exists'; +import type { Graph } from '../../core'; + +export interface FxReporting extends Graph { + curie: 'fx:reporting'; + + links: { + /** This resource. */ + 'self': FxReporting; + /** Send a GET with an `email` query parameter to see if an existing user exists for this email value. */ + 'fx:reporting_email_exists': FxReportingEmailExists; + /** Send a GET with a `store_domain` query parameter to see if an existing store exists for this `store_domain` value. */ + 'fx:reporting_store_domain_exists': FxReportingStoreDomainExists; + }; + + props: { + /** A small, human readable explanation of this resource. */ + message: string; + }; +} diff --git a/src/integration/Graph/reporting_email_exists.d.ts b/src/integration/Graph/reporting_email_exists.d.ts new file mode 100644 index 0000000..2ae44aa --- /dev/null +++ b/src/integration/Graph/reporting_email_exists.d.ts @@ -0,0 +1,21 @@ +import type { FxReporting } from './reporting'; +import type { FxUser } from './user'; +import type { Graph } from '../../core'; + +export interface FxReportingEmailExists extends Graph { + curie: 'fx:reporting_email_exists'; + + links: { + /** This resource. */ + 'self': FxReportingEmailExists; + /** Link to user resource for the requested email. */ + 'fx:user': FxUser; + /** Reporting API home. */ + 'fx:reporting': FxReporting; + }; + + props: { + /** A small, human readable explanation of this resource. */ + message: string; + }; +} diff --git a/src/integration/Graph/reporting_store_domain_exists.d.ts b/src/integration/Graph/reporting_store_domain_exists.d.ts new file mode 100644 index 0000000..7a23b68 --- /dev/null +++ b/src/integration/Graph/reporting_store_domain_exists.d.ts @@ -0,0 +1,21 @@ +import type { FxReporting } from './reporting'; +import type { FxStore } from './store'; +import type { Graph } from '../../core'; + +export interface FxReportingStoreDomainExists extends Graph { + curie: 'fx:reporting_store_domain_exists'; + + links: { + /** This resource. */ + 'self': FxReportingStoreDomainExists; + /** Link to store for the requested domain. */ + 'fx:store': FxStore; + /** Reporting API home. */ + 'fx:reporting': FxReporting; + }; + + props: { + /** A small, human readable explanation of this resource. */ + message: string; + }; +} diff --git a/src/integration/Graph/send_emails.d.ts b/src/integration/Graph/send_emails.d.ts new file mode 100644 index 0000000..84f7ea2 --- /dev/null +++ b/src/integration/Graph/send_emails.d.ts @@ -0,0 +1,5 @@ +import type { Graph } from '../../core'; + +export interface FxSendEmails extends Graph { + curie: 'fx:send_emails'; +} diff --git a/src/integration/Graph/shipment.d.ts b/src/integration/Graph/shipment.d.ts new file mode 100644 index 0000000..6a1f82b --- /dev/null +++ b/src/integration/Graph/shipment.d.ts @@ -0,0 +1,69 @@ +import type { FxCustomer } from './customer'; +import type { FxCustomerAddress } from './customer_address'; +import type { FxItems } from './items'; +import type { FxShipments } from './shipments'; +import type { FxStore } from './store'; +import type { FxTransaction } from './transaction'; +import type { Graph } from '../../core'; + +export interface FxShipment extends Graph { + curie: 'fx:shipment'; + + links: { + /** This resource. */ + 'self': FxShipment; + /** Related store resource. */ + 'fx:store': FxStore; + /** Items in this shipment. */ + 'fx:items': FxItems; + /** Customer who this shipment is intented for. */ + 'fx:customer': FxCustomer; + /** List of all shipments in the transaction. */ + 'fx:shipments': FxShipments; + /** Related transaction resource. */ + 'fx:transaction': FxTransaction; + /** Customer's address. */ + 'fx:customer_address': FxCustomerAddress; + }; + + props: { + /** Either the shipto value or `Default Shipping Address` for non-multiship transactions. */ + address_name: string; + /** The given name associated with this address. */ + first_name: string; + /** The surname associated with this address. */ + last_name: string; + /** The company associated with this address. */ + company: string; + /** The first line of the street address. */ + address1: string; + /** The second line of the street address. */ + address2: string; + /** The city of this address. */ + city: string; + /** The two character code for states in the United States. Other countries may call this a province. When a two character code isn't available, the full region name will be used. */ + region: string; + /** The postal code of this address. */ + postal_code: string; + /** The country code of this address. */ + country: string; + /** The phone of this address. */ + phone: string; + /** The shipping service id selected during checkout. This will normally correspond with a `shipping_service` from one of the {@link https://api-sandbox.foxycart.com/hal-browser/browser.html#https://api-sandbox.foxycart.com/shipment/shipping_methods shipping_methods} available. */ + shipping_service_id: number; + /** The description of the shipping service selected for this shipment. */ + shipping_service_description: string; + /** The total price of the items in this shipment. */ + total_item_price: number; + /** The total tax on the items in this shipment. */ + total_tax: number; + /** The total shipping cost of the items in this shipment. */ + total_shipping: number; + /** The total price of this shipment. */ + total_price: number; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/shipments.d.ts b/src/integration/Graph/shipments.d.ts new file mode 100644 index 0000000..2c9d676 --- /dev/null +++ b/src/integration/Graph/shipments.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxShipment } from './shipment'; +import type { Graph } from '../../core'; + +export interface FxShipments extends Graph { + curie: 'fx:shipments'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxShipment; +} diff --git a/src/integration/Graph/shipping_address_types.d.ts b/src/integration/Graph/shipping_address_types.d.ts new file mode 100644 index 0000000..aae9b4a --- /dev/null +++ b/src/integration/Graph/shipping_address_types.d.ts @@ -0,0 +1,20 @@ +import type { FxPropertyHelpers } from './property_helpers'; +import type { Graph } from '../../core'; + +export interface FxShippingAddressTypes extends Graph { + curie: 'fx:shipping_address_types'; + + links: { + /** This resource. */ + 'self': FxShippingAddressTypes; + /** Various predefined property values. */ + 'fx:property_helpers': FxPropertyHelpers; + }; + + props: { + /** A small, human readable explanation of this property helper. */ + message: string; + /** JSON objects with the checkout types supported. The key values are the values you use for the Store resource's `shipping_address_type` property. */ + values: Record; + }; +} diff --git a/src/integration/Graph/shipping_container.d.ts b/src/integration/Graph/shipping_container.d.ts new file mode 100644 index 0000000..2779063 --- /dev/null +++ b/src/integration/Graph/shipping_container.d.ts @@ -0,0 +1,33 @@ +import type { FxPropertyHelpers } from './property_helpers'; +import type { FxShippingContainers } from './shipping_containers'; +import type { FxShippingMethod } from './shipping_method'; +import type { FxShippingMethods } from './shipping_methods'; +import type { Graph } from '../../core'; + +export interface FxShippingContainer extends Graph { + curie: 'fx:shipping_container'; + + links: { + /** This resource. */ + 'self': FxShippingContainer; + /** Shipping method that will be used to deliver this container. */ + 'fx:shipping_method': FxShippingMethod; + /** List of all available shipping methods. */ + 'fx:shipping_methods': FxShippingMethods; + /** Various predefined property values. */ + 'fx:property_helpers': FxPropertyHelpers; + /** List of all shipping containers for the shipping method. */ + 'fx:shipping_containers': FxShippingContainers; + }; + + props: { + /** The name of this shipping container */ + name: string; + /** The code for this shipping container */ + code: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/shipping_containers.d.ts b/src/integration/Graph/shipping_containers.d.ts new file mode 100644 index 0000000..0e82a10 --- /dev/null +++ b/src/integration/Graph/shipping_containers.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxShippingContainer } from './shipping_container'; +import type { Graph } from '../../core'; + +export interface FxShippingContainers extends Graph { + curie: 'fx:shipping_containers'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxShippingContainer; +} diff --git a/src/integration/Graph/shipping_drop_type.d.ts b/src/integration/Graph/shipping_drop_type.d.ts new file mode 100644 index 0000000..a1b7094 --- /dev/null +++ b/src/integration/Graph/shipping_drop_type.d.ts @@ -0,0 +1,33 @@ +import type { FxPropertyHelpers } from './property_helpers'; +import type { FxShippingDropTypes } from './shipping_drop_types'; +import type { FxShippingMethod } from './shipping_method'; +import type { FxShippingMethods } from './shipping_methods'; +import type { Graph } from '../../core'; + +export interface FxShippingDropType extends Graph { + curie: 'fx:shipping_drop_type'; + + links: { + /** This resource. */ + 'self': FxShippingDropType; + /** Shipping method that will be used to deliver this container. */ + 'fx:shipping_method': FxShippingMethod; + /** List of all available shipping methods. */ + 'fx:shipping_methods': FxShippingMethods; + /** Various predefined property values. */ + 'fx:property_helpers': FxPropertyHelpers; + /** List of all drop types for the shipping method. */ + 'fx:shipping_drop_types': FxShippingDropTypes; + }; + + props: { + /** The name of this shipping drop type */ + name: string; + /** The code for this shipping drop type */ + code: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/shipping_drop_types.d.ts b/src/integration/Graph/shipping_drop_types.d.ts new file mode 100644 index 0000000..0fbd0ba --- /dev/null +++ b/src/integration/Graph/shipping_drop_types.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxShippingDropType } from './shipping_drop_type'; +import type { Graph } from '../../core'; + +export interface FxShippingDropTypes extends Graph { + curie: 'fx:shipping_drop_types'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxShippingDropType; +} diff --git a/src/integration/Graph/shipping_method.d.ts b/src/integration/Graph/shipping_method.d.ts new file mode 100644 index 0000000..5e0ab13 --- /dev/null +++ b/src/integration/Graph/shipping_method.d.ts @@ -0,0 +1,36 @@ +import type { FxPropertyHelpers } from './property_helpers'; +import type { FxShippingContainers } from './shipping_containers'; +import type { FxShippingDropTypes } from './shipping_drop_types'; +import type { FxShippingMethods } from './shipping_methods'; +import type { FxShippingServices } from './shipping_services'; +import type { Graph } from '../../core'; + +export interface FxShippingMethod extends Graph { + curie: 'fx:shipping_method'; + + links: { + /** This resource. */ + 'self': FxShippingMethod; + /** List of all available shipping methods. */ + 'fx:shipping_methods': FxShippingMethods; + /** Various predefined property values. */ + 'fx:property_helpers': FxPropertyHelpers; + /** List of available shipping services for this shipping method. */ + 'fx:shipping_services': FxShippingServices; + /** List of available shipping containers for this shipping method. */ + 'fx:shipping_containers': FxShippingContainers; + /** List of available shipping drop types for this shipping method. */ + 'fx:shipping_drop_types': FxShippingDropTypes; + }; + + props: { + /** The name of this shipping method */ + name: string; + /** The code for this shipping method */ + code: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/shipping_methods.d.ts b/src/integration/Graph/shipping_methods.d.ts new file mode 100644 index 0000000..59876e5 --- /dev/null +++ b/src/integration/Graph/shipping_methods.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxShippingMethod } from './shipping_method'; +import type { Graph } from '../../core'; + +export interface FxShippingMethods extends Graph { + curie: 'fx:shipping_methods'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxShippingMethod; +} diff --git a/src/integration/Graph/shipping_service.d.ts b/src/integration/Graph/shipping_service.d.ts new file mode 100644 index 0000000..6723057 --- /dev/null +++ b/src/integration/Graph/shipping_service.d.ts @@ -0,0 +1,32 @@ +import type { FxPropertyHelpers } from './property_helpers'; +import type { FxShippingMethod } from './shipping_method'; +import type { FxShippingMethods } from './shipping_methods'; +import type { Graph } from '../../core'; + +export interface FxShippingService extends Graph { + curie: 'fx:shipping_service'; + + links: { + /** This resource. */ + 'self': FxShippingService; + /** Shipping method associated with this shipping service. */ + 'fx:shipping_method': FxShippingMethod; + /** List of all available shipping methods. */ + 'fx:shipping_methods': FxShippingMethods; + /** Various predefined property values. */ + 'fx:property_helpers': FxPropertyHelpers; + }; + + props: { + /** The name of this shipping service */ + name: string; + /** The code for this shipping service */ + code: string; + /** Specifies whether or not this shipping service is for international rate requests only. */ + is_international: boolean; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/shipping_services.d.ts b/src/integration/Graph/shipping_services.d.ts new file mode 100644 index 0000000..a749807 --- /dev/null +++ b/src/integration/Graph/shipping_services.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxShippingService } from './shipping_service'; +import type { Graph } from '../../core'; + +export interface FxShippingServices extends Graph { + curie: 'fx:shipping_services'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxShippingService; +} diff --git a/src/integration/Graph/store.d.ts b/src/integration/Graph/store.d.ts new file mode 100644 index 0000000..59dcb58 --- /dev/null +++ b/src/integration/Graph/store.d.ts @@ -0,0 +1,174 @@ +import type { FxAttributes } from './attributes'; +import type { FxCartIncludeTemplates } from './cart_include_templates'; +import type { FxCartTemplates } from './cart_templates'; +import type { FxCarts } from './carts'; +import type { FxCheckoutTemplates } from './checkout_templates'; +import type { FxCoupons } from './coupons'; +import type { FxCustomerPortalSettings } from './customer_portal_settings'; +import type { FxCustomers } from './customers'; +import type { FxDownloadables } from './downloadables'; +import type { FxEmailTemplates } from './email_templates'; +import type { FxErrorEntries } from './error_entries'; +import type { FxFraudProtections } from './fraud_protections'; +import type { FxHostedPaymentGateways } from './hosted_payment_gateways'; +import type { FxItemCategories } from './item_categories'; +import type { FxPaymentMethodSets } from './payment_method_sets'; +import type { FxProcessSubscriptionWebhook } from './process_subscription_webhook'; +import type { FxReceiptTemplates } from './receipt_templates'; +import type { FxStoreVersion } from './store_version'; +import type { FxSubscriptionSettings } from './subscription_settings'; +import type { FxSubscriptions } from './subscriptions'; +import type { FxTaxes } from './taxes'; +import type { FxTemplateSets } from './template_sets'; +import type { FxTransactions } from './transactions'; +import type { FxUserAccesses } from './user_accesses'; +import type { FxUsers } from './users'; +import type { Graph } from '../../core'; + +export interface FxStore extends Graph { + curie: 'fx:store'; + + links: { + /** This resource. */ + 'self': FxStore; + /** List of carts in this store. */ + 'fx:carts': FxCarts; + /** List of users with access to this store. */ + 'fx:users': FxUsers; + /** List of taxes configured for this store. */ + 'fx:taxes': FxTaxes; + /** List of coupons available in this store. */ + 'fx:coupons': FxCoupons; + /** List of customers of this store. */ + 'fx:customers': FxCustomers; + /** List of custom attributes of this store. */ + 'fx:attributes': FxAttributes; + /** List of transactions performed in this store. */ + 'fx:transactions': FxTransactions; + /** List of template sets configured for this store. */ + 'fx:template_sets': FxTemplateSets; + /** Version of this store. */ + 'fx:store_version': FxStoreVersion; + /** List of user access resources for this store. */ + 'fx:user_accesses': FxUserAccesses; + /** List of subscriptions created in this store. */ + 'fx:subscriptions': FxSubscriptions; + /** List of error entries for this store. */ + 'fx:error_entries': FxErrorEntries; + /** List of downloadable products available in this store. */ + 'fx:downloadables': FxDownloadables; + /** List of cart templates available in this store. */ + 'fx:cart_templates': FxCartTemplates; + /** List of email templates for this store. */ + 'fx:email_templates': FxEmailTemplates; + /** List of item categories configured in this store. */ + 'fx:item_categories': FxItemCategories; + /** List of fraud protection measures enabled on this store. */ + 'fx:fraud_protections': FxFraudProtections; + /** List of receipt templates for this store. */ + 'fx:receipt_templates': FxReceiptTemplates; + /** List of checkout templates for this store. */ + 'fx:checkout_templates': FxCheckoutTemplates; + /** List of payment method sets configured for this store. */ + 'fx:payment_method_sets': FxPaymentMethodSets; + /** Subscription settings for this store. */ + 'fx:subscription_settings': FxSubscriptionSettings; + /** List of cart include templates available in this store. */ + 'fx:cart_include_templates': FxCartIncludeTemplates; + /** List of hosted payment gateways enabled for this store. */ + 'fx:hosted_payment_gateways': FxHostedPaymentGateways; + /** Configuration of this store's customer portal. */ + 'fx:customer_portal_settings': FxCustomerPortalSettings; + /** POST here to resend the daily subscription webhook notification for this store. */ + 'fx:process_subscription_webhook': FxProcessSubscriptionWebhook; + }; + + props: { + /** This is the store version for this store. For more details about this version, see the {@link https://api-sandbox.foxycart.com/hal-browser/browser.html#https://api-sandbox.foxycart.com/property_helpers/store_versions store_versions} property helpers which include changelog information. */ + store_version_uri: string; + /** The name of your store as you'd like it displayed to your customers and our system. */ + store_name: string; + /** This is a unique FoxyCart subdomain for your cart, checkout, and receipt. If you install a custom SSL certificate, this will contain a full domain such as store.yourdomain.com. */ + store_domain: string; + /** Set to true when you plan to use a custom SSL certificate. If set to true, your store_domain must be a full domain. */ + use_remote_domain: boolean; + /** The URL of your online store. */ + store_url: string; + /** By default, FoxyCart sends customers back to the page referrer after completing a purchase. Instead, you can set a specific URL here. */ + receipt_continue_url: string; + /** This is the email address of your store. By default, this will be the from address for your store receipts. If you specify a from_email, you can also put in multiple email addresses here, separated by a comma to be used when bcc_on_receipt_email is true. */ + store_email: string; + /** Used for when you want to specify a different from email than your store's email address or when your store_email has a list of email addresses. */ + from_email: string; + /** Set this to true if you would like each receipt sent to your customer to also be blind carbon copied to your store's email address. */ + bcc_on_receipt_email: string; + /** Set this to true if you have set up your DNS settings to include and spf record for FoxyCart. See the {@link http://wiki.foxycart.com/v/1.1/emails FoxyCart documentation} for more details. */ + use_email_dns: string; + /** If you'd like to configure your own SMTP server for sending transaction receipt emails, you can do so here. The JSON supports the following fields: `username`,`password`,`host`,`port`,`security`. The security value can be blank, `ssl`, or `tls` */ + smtp_config: string; + /** The postal code of your store. This will be used for calculating shipping costs if you sell shippable items. */ + postal_code: string; + /** The two character code for states in the United States. Other countries may call this a province. When a two character code isn't available, use the full region name. This will be used for calculating shipping costs if you sell shippable items. */ + region: string; + /** Two character ISO 3166-1-alpha-2 code for the country your store is located in. This will be used for calculating shipping costs if you sell shippable items. */ + country: string; + /** The locale code for your store's locale. This will be used to format strings for your store. */ + locale_code: string; + /** Set to true to prevent the currency symbol from being displayed (example: a points based checkout system). */ + hide_currency_symbol: boolean; + /** Set to true to prevent the decimal characters from being displayed (example: a points based checkout system). */ + hide_decimal_characters: boolean; + /** Set true to use the international currency symbol such as USD instead of the regional one like $. */ + use_international_currency_symbol: boolean; + /** The default language for your store's cart, checkout, and receipt strings. */ + language: string; + /** A url to your store's logo which may be used in your store's templates. */ + logo_url: string; + /** The preferred configuration of your customer checkout experience, such as defaulting to guest checkout or requiring account creation with each checkout. */ + checkout_type: string; + /** Set this to true to POST encrypted XML of your order to the webhook url of your choice. */ + use_webhook: boolean; + /** This is the url of the webhook endpoint for processing your store's webhook. See the {@link http://wiki.foxycart.com/static/redirect/webhook FoxyCart documentation} for more details. */ + webhook_url: string; + /** This is the key used to encrypt your webhook data. It is also used as the legacy API key and the HMAC cart encryption key. */ + webhook_key: string; + /** Set to true to use HMAC cart validation for your store. */ + use_cart_validation: boolean; + /** Set this to true to redirect to your server before checkout so you can use our single sign on feature and log in your users automatically to FoxyCart or if you want to validate items before checkout. */ + use_single_sign_on: boolean; + /** This is your single sign on url to redirect your users to prior to hitting the checkout page. See the {@link http://wiki.foxycart.com/static/redirect/sso FoxyCart documentation} for more details. */ + single_sign_on_url: string; + /** When saving a customer to FoxyCart, this is the password hashing method that will be used. */ + customer_password_hash_type: string; + /** Configuration settings for the customer_password_hash_type in use. See the {@link http://wiki.foxycart.com/static/redirect/customers FoxyCart documentation} for more details. */ + customer_password_hash_config: unknown; + /** Set to true to turn on FoxyCart's multiship functionality for shipping items to multiple locations in a single order. See the {@link http://wiki.foxycart.com/static/redirect/multiship FoxyCart documentation} for more details. */ + features_multiship: boolean; + /** Set to true to require all front-end add-to-cart interactions have a valid `expires` property. */ + products_require_expires_property: boolean; + /** If your store sells products which collect personal or sensitive information as product attributes, you may want to consider lowering your cart session lifespan. You can leave it as 0 to keep the default which is currently 43200 seconds (12 hours). The maximum allowed time is currently 259200 seconds (72 hours). */ + app_session_time: number; + /** Used for determining the type of the customer address used when calculating shipping costs. */ + shipping_address_type: string; + /** Shipping rate signing ensures that the rate the customer selects is carried through and not altered in any way. If you're intending to make use of javascript snippets on your store to alter the price or label of shipping rates or add custom rates dynamically, disable this setting as it will block those rates from being applied. The default is false. */ + require_signed_shipping_rates: boolean; + /** The timezone of your store. This will impact how dates are shown to customers and within the FoxyCart admin. */ + timezone: string; + /** Set a master password here if you would like to be able to check out as your customers without having to know their password. */ + unified_order_entry_password: string; + /** Instead of displaying the Foxy Transaction ID, you can display your own custom display ID on your store's receipt and receipt emails. This JSON config determines how those display ids will work. The JSON supports the following fields: `enabled`, `start`, `length`, `prefix`, `suffix`. */ + custom_display_id_config: string; + /** This can only be set during store creation. Contact us if you need this value changed later. */ + affiliate_id: number; + /** This settings makes your checkout page completely non-functioning. Your customers will see the maintenance notification language string instead. The default is false. */ + is_maintenance_mode: boolean; + /** If this store is in development or if it has an active FoxyCart subscription and can therefore use a live payment gateway to process live transactions. */ + is_active: boolean; + /** The date of the first payment for this FoxyCart store subscription. This can be considered the go live date for this store. */ + first_payment_date: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/store_shipping_method.d.ts b/src/integration/Graph/store_shipping_method.d.ts new file mode 100644 index 0000000..9d6f603 --- /dev/null +++ b/src/integration/Graph/store_shipping_method.d.ts @@ -0,0 +1,73 @@ +import type { FxShippingContainer } from './shipping_container'; +import type { FxShippingContainers } from './shipping_containers'; +import type { FxShippingDropType } from './shipping_drop_type'; +import type { FxShippingDropTypes } from './shipping_drop_types'; +import type { FxShippingMethod } from './shipping_method'; +import type { FxShippingMethods } from './shipping_methods'; +import type { FxShippingServices } from './shipping_services'; +import type { FxStore } from './store'; +import type { FxStoreShippingServices } from './store_shipping_services'; +import type { Graph } from '../../core'; + +export interface FxStoreShippingMethod extends Graph { + curie: 'fx:store_shipping_method'; + + links: { + /** This resource. */ + 'self': FxStoreShippingMethod; + /** Related store resource. */ + 'fx:store': FxStore; + /** Related shipping method resource. */ + 'fx:shipping_method': FxShippingMethod; + /** List of all available shipping methods. */ + 'fx:shipping_methods': FxShippingMethods; + /** List of all available shipping services. */ + 'fx:shipping_services': FxShippingServices; + /** Shipping container linked to this shipping method. */ + 'fx:shipping_container': FxShippingContainer; + /** Shipping drop type linked to this shipping method. */ + 'fx:shipping_drop_type': FxShippingDropType; + /** List of all available shipping containers for this shipping method. */ + 'fx:shipping_containers': FxShippingContainers; + /** List of all available shipping drop types for this shipping method. */ + 'fx:shipping_drop_types': FxShippingDropTypes; + /** Available shipping services for this shipping method. */ + 'fx:store_shipping_services': FxStoreShippingServices; + }; + + props: { + /** The full API URI of the shipping method defined in our property helpers. */ + shipping_method_uri: string; + /** The full API URI of the shipping method container defined in our property helpers. Each shipping method will have it's own shipping containers. */ + shipping_container_uri: string; + /** The full API URI of the shipping method drop type defined in our property helpers. Each shipping method will have it's own shipping drop types. */ + shipping_drop_type_uri: string; + /** If using account specific rates, enter your shipping account id here. */ + accountid: string; + /** If using account specific rates, enter your shipping account password here. */ + password: string; + /** If using account specific rates, enter your shipping account meter number here, if applicable. */ + meter_number: string; + /** If using account specific rates, enter your shipping account authentication key here, if applicable. */ + authentication_key: string; + /** Set to true if you want this shipping method to apply to domestic shipping rate requests.
Note: This value is read only `true` for `CUSTOM-CODE`. */ + use_for_domestic: string; + /** Set to true if you want this shipping method to apply to international shipping rate requests.
Note: This value is read only `true` for `CUSTOM-CODE`. */ + use_for_international: string; + /** For the `CUSTOM-CODE` shipping method. JavaScript used to create and modify shipping rates. */ + custom_code: string; + /** For the `CUSTOM-CODE` shipping method. Values are `deploying`, `deployed`, and `error`. */ + deployment_status: 'deploying' | 'deployed' | 'error'; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; + + zooms: { + store_shipping_services: FxStoreShippingServices; + shipping_container: FxShippingContainer; + shipping_drop_type: FxShippingDropType; + shipping_method: FxShippingMethod; + }; +} diff --git a/src/integration/Graph/store_shipping_service.d.ts b/src/integration/Graph/store_shipping_service.d.ts new file mode 100644 index 0000000..23f99ba --- /dev/null +++ b/src/integration/Graph/store_shipping_service.d.ts @@ -0,0 +1,36 @@ +import type { FxShippingMethod } from './shipping_method'; +import type { FxShippingMethods } from './shipping_methods'; +import type { FxShippingService } from './shipping_service'; +import type { FxShippingServices } from './shipping_services'; +import type { FxStore } from './store'; +import type { Graph } from '../../core'; + +export interface FxStoreShippingService extends Graph { + curie: 'fx:store_shipping_service'; + + links: { + /** This resource. */ + 'self': FxStoreShippingService; + /** Related store resource. */ + 'fx:store': FxStore; + /** Shipping method linked to this shipping service. */ + 'fx:shipping_method': FxShippingMethod; + /** Related shipping service. */ + 'fx:shipping_service': FxShippingService; + /** List of all available shipping methods. */ + 'fx:shipping_methods': FxShippingMethods; + /** List of all available shipping services for this shipping method. */ + 'fx:shipping_services': FxShippingServices; + }; + + props: { + /** The full API URI of the shipping method defined in our property helpers. */ + shipping_method_uri: string; + /** The full API URI of the shipping method shipping service defined in our property helpers. Each shipping method will have it's own shipping services. */ + shipping_service_uri: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/store_shipping_services.d.ts b/src/integration/Graph/store_shipping_services.d.ts new file mode 100644 index 0000000..983f326 --- /dev/null +++ b/src/integration/Graph/store_shipping_services.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxStoreShippingService } from './store_shipping_service'; +import type { Graph } from '../../core'; + +export interface FxStoreShippingServices extends Graph { + curie: 'fx:store_shipping_services'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxStoreShippingService; +} diff --git a/src/integration/Graph/store_version.d.ts b/src/integration/Graph/store_version.d.ts new file mode 100644 index 0000000..54f777d --- /dev/null +++ b/src/integration/Graph/store_version.d.ts @@ -0,0 +1,39 @@ +import type { FxPropertyHelpers } from './property_helpers'; +import type { FxStoreVersions } from './store_versions'; +import type { Graph } from '../../core'; + +export interface FxStoreVersion extends Graph { + curie: 'fx:store_version'; + + links: { + /** This resource. */ + 'self': FxStoreVersion; + /** List of all available store versions. */ + 'fx:store_versions': FxStoreVersions; + /** Various predefined property values. */ + 'fx:property_helpers': FxPropertyHelpers; + }; + + props: { + /** Human readable store version string. */ + version: string; + /** The full URL of the blog post describing the new release. */ + changelog_blog_url: string; + /** The full URL of the changelog. */ + changelog_url: string; + /** Full content of the changelog as HTML */ + changelog_content: string; + /** A JSON object for various cart types supported by this version. Examples include colorbox with links to the JavaScript library, FoxyCart JavaScript files, and FoxyCart CSS files. */ + cart_types: string; + /** The date this version was publicly released. */ + version_date: string; + /** If this version is currently visible in the FoxyCart admin. At times, FoxyCart may launch a private beta of the latest version. */ + is_visible: boolean; + /** If this version is currently considered a beta release. */ + is_beta: boolean; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/store_versions.d.ts b/src/integration/Graph/store_versions.d.ts new file mode 100644 index 0000000..084383c --- /dev/null +++ b/src/integration/Graph/store_versions.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxStoreVersion } from './store_version'; +import type { Graph } from '../../core'; + +export interface FxStoreVersions extends Graph { + curie: 'fx:store_versions'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxStoreVersion; +} diff --git a/src/integration/Graph/stores.d.ts b/src/integration/Graph/stores.d.ts new file mode 100644 index 0000000..3453799 --- /dev/null +++ b/src/integration/Graph/stores.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxStore } from './store'; +import type { Graph } from '../../core'; + +export interface FxStores extends Graph { + curie: 'fx:stores'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxStore; +} diff --git a/src/integration/Graph/sub_token_url.d.ts b/src/integration/Graph/sub_token_url.d.ts new file mode 100644 index 0000000..011a704 --- /dev/null +++ b/src/integration/Graph/sub_token_url.d.ts @@ -0,0 +1,5 @@ +import type { Graph } from '../../core'; + +export interface FxSubTokenUrl extends Graph { + curie: 'fx:sub_token_url'; +} diff --git a/src/integration/Graph/subscription.d.ts b/src/integration/Graph/subscription.d.ts new file mode 100644 index 0000000..34775c6 --- /dev/null +++ b/src/integration/Graph/subscription.d.ts @@ -0,0 +1,66 @@ +import type { FxAttributes } from './attributes'; +import type { FxCustomer } from './customer'; +import type { FxLastTransaction } from './last_transaction'; +import type { FxOriginalTransaction } from './original_transaction'; +import type { FxStore } from './store'; +import type { FxSubTokenUrl } from './sub_token_url'; +import type { FxTransactionTemplate } from './transaction_template'; +import type { FxTransactions } from './transactions'; +import type { Graph } from '../../core'; + +export interface FxSubscription extends Graph { + curie: 'fx:subscription'; + + links: { + /** This resource. */ + 'self': FxSubscription; + /** List of attributes for this subscription. */ + 'fx:attributes': FxAttributes; + /** Related store resource. */ + 'fx:store': FxStore; + /** Customer who created this subscription. */ + 'fx:customer': FxCustomer; + /** Last transaction for this subscription. */ + 'fx:last_transaction': FxLastTransaction; + /** List of transactions for this subscription. */ + 'fx:transactions': FxTransactions; + /** Transaction template for this subscription. */ + 'fx:transaction_template': FxTransactionTemplate; + /** Open this link in browser to load up the subscription template into a full HTML cart for the store. */ + 'fx:sub_token_url': FxSubTokenUrl; + }; + + props: { + /** The original date this subscription began or will begin if set in the future. */ + start_date: string; + /** The date for when this subscription will run again. */ + next_transaction_date: string; + /** If set, the date this subscription will end. The subscription will not run on this day. */ + end_date: string | null; + /** This determines how often this subscription will be processed. The format is a number followed by a date type such as d (day), w (week), m (month), or y (year). You can also use .5m for twice a month. */ + frequency: string; + /** If the last run of this subscription encountered an error, that error message will be saved here. It will also note if a past due payment was made. */ + error_message: string; + /** If a subscription payment is missed, this amount will be increased by that payment. The next time the subscription runs, it will be charged automatically, depending on your store's subscription settings. */ + past_due_amount: number; + /** If this subscription failed to process due to an error such as expired payment card, this field will show the first date the subscription failed to process. If it processes successfully at the next attempt, this field will be cleared. */ + first_failed_transaction_date: string | null; + /** Determines whether or not this transaction is active or not. If you are using the subscription datafeed, it is best to set the end_date to tomorrow instead of settings this to inactive. */ + is_active: boolean; + /** If this subscription is using a third party subscription system such as PayPal Express, their identifier will be set here. */ + third_party_id: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; + + zooms: { + original_transaction?: FxOriginalTransaction; + transaction_template?: FxTransactionTemplate; + last_transaction?: FxLastTransaction; + transactions?: FxTransactions; + attributes: FxAttributes; + customer?: FxCustomer; + }; +} diff --git a/src/integration/Graph/subscription_settings.d.ts b/src/integration/Graph/subscription_settings.d.ts new file mode 100644 index 0000000..10a9be3 --- /dev/null +++ b/src/integration/Graph/subscription_settings.d.ts @@ -0,0 +1,42 @@ +import type { FxStore } from './store'; +import type { Graph } from '../../core'; + +export interface FxSubscriptionSettings extends Graph { + curie: 'fx:subscription_settings'; + + links: { + /** This resource. */ + 'self': FxSubscriptionSettings; + /** Related store resource. */ + 'fx:store': FxStore; + }; + + props: { + /** If your customer's subscription payment fails and is configured to keep track of past due amounts, this option will automatically charge the past due amount in the next scheduled subscription. The default value is true. */ + automatically_charge_past_due_amount: boolean; + /** If you would like to keep track of past due amounts but not automatically charge them, this setting is helpful to reset them once a successful transaction for that subscription is processed. The default value is false. */ + clear_past_due_amounts_on_success: boolean; + /** This setting determines how you'd like to handle past due amounts when we try to process a subscription and that subscritpion fails. You can either increment the past due for each failure, only keep track of the most recent failure or ignore the amounts completely. The default value is increment. */ + past_due_amount_handling: 'increment' | 'replace' | 'ignore'; + /** If a past due payment is paid directly by the customer, reset the next transaction date for the subscription to be one frequency out from the day that transaction is processed. */ + reset_nextdate_on_makeup_payment: boolean; + /** A comma separated list of numbers. Each number represents the number of days after the initial failure that a reattempt should be made. For example, a setting of `1, 3, 5, 15, 30` would direct FoxyCart to attempt to collect the past-due amount on the 1st, 3rd, 5th, and 15th days after the initial transaction. */ + reattempt_schedule: string; + /** Used in conjunction with the "bypass strings" below, this setting determines whether Foxy should reattempt the subscription charge if the transaction's previous error string does or doesn't contain specific text. */ + reattempt_bypass_logic: 'skip_if_exists' | 'reattempt_if_exists'; + /** A comma separated list of strings containing text strings that should prevent or allow (based on the above setting) a rebilling attempt. For example, setting the logic to "skip if the string is present" with a value for the "strings" field of `Code: 8, Code: 37` would instruct FoxyCart to not initiate the rebilling process if the last error contained either `Code: 8` or `Code: 37`, but to attempt the rebilling in all other cases. */ + reattempt_bypass_strings: string; + /** Enter a comma separated list of numbers. Each number represents the number of days until the payment card expires that an email notification should be sent to the customer. This only happens for customers with active subscriptions. For example, if you put in 20,15,5, 20 days before the end of the month, customers with payment cards that will expire that month will receive an email. Same with 15 days and 5 days before the end of the month. */ + expiring_soon_payment_reminder_schedule: string; + /** A comma separated list of numbers. Each number represents the number of days after the initial failure that an email notification to the customer should be sent. This only happens for active subscriptions which still have a past due amount. If a reattempt is successful, no additional reminder email will be sent. */ + reminder_email_schedule: string; + /** A single number representing the number of days after the initial failure that a subscription should be set to cancel (assuming a successful payment hasn't been made in the meantime). For example, if a subscription is set to process on the 1st of the month and this value is 35, on the 5th of the next month (which is 35 days later, assuming the first month had 30 days), the subscription will be cancelled. (The end date will be set to that day, and it will be set to inactive.) */ + cancellation_schedule: number; + /** When subscriptions run automatically to bill your customers, turning this setting off will prevent the normal receipt emails from being sent for their automated payment. The default value is true. */ + send_email_receipts_for_automated_billing: boolean; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/subscriptions.d.ts b/src/integration/Graph/subscriptions.d.ts new file mode 100644 index 0000000..a160ac3 --- /dev/null +++ b/src/integration/Graph/subscriptions.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxSubscription } from './subscription'; +import type { Graph } from '../../core'; + +export interface FxSubscriptions extends Graph { + curie: 'fx:subscriptions'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxSubscription; +} diff --git a/src/integration/Graph/tax.d.ts b/src/integration/Graph/tax.d.ts new file mode 100644 index 0000000..8948791 --- /dev/null +++ b/src/integration/Graph/tax.d.ts @@ -0,0 +1,48 @@ +import type { FxNativeIntegrations } from './native_integrations'; +import type { FxStore } from './store'; +import type { FxTaxItemCategories } from './tax_item_categories'; +import type { Graph } from '../../core'; + +export interface FxTax extends Graph { + curie: 'fx:tax'; + + links: { + /** This resource. */ + 'self': FxTax; + /** Related store resource. */ + 'fx:store': FxStore; + /** List of tax item category relationships. */ + 'fx:tax_item_categories': FxTaxItemCategories; + /** List of native integrations for this service provider. */ + 'fx:native_integrations': FxNativeIntegrations; + }; + + props: { + /** The name of this tax which will be displayed to the customer. */ + name: string; + /** The type of tax rate which determines when this tax will be applied. */ + type: 'global' | 'country' | 'region' | 'local'; + /** The country which will be matched against the customer shipping country to determine if a country tax will be applied. */ + country: string; + /** The region (also known as a state or province) which will be matched against the customer shipping region to determine if a regional tax will be applied. */ + region: string; + /** The city which will be matched against the customer shipping city to determine if a local tax will be applied. */ + city: string; + /** Set to true if the tax rate will be determined automatically by the postal code. */ + is_live: boolean; + /** If using a live tax rate service provider, this value can be set to determine which provider you would like to use. */ + service_provider: 'avalara' | ''; + /** Set to true if the tax rate will also be applied to the shipping costs. */ + apply_to_shipping: boolean; + /** For a Union tax type, set to true to use the origin country tax rates. */ + use_origin_rates: boolean; + /** Set to true to exempt all customers with a tax id */ + exempt_all_customer_tax_ids: boolean; + /** The tax rate to be applied for this tax. For 10%, use 10. */ + rate: number; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/tax_item_categories.d.ts b/src/integration/Graph/tax_item_categories.d.ts new file mode 100644 index 0000000..95b8bd3 --- /dev/null +++ b/src/integration/Graph/tax_item_categories.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxTaxItemCategory } from './tax_item_category'; +import type { Graph } from '../../core'; + +export interface FxTaxItemCategories extends Graph { + curie: 'fx:tax_item_categories'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxTaxItemCategory; +} diff --git a/src/integration/Graph/tax_item_category.d.ts b/src/integration/Graph/tax_item_category.d.ts new file mode 100644 index 0000000..0f9a381 --- /dev/null +++ b/src/integration/Graph/tax_item_category.d.ts @@ -0,0 +1,30 @@ +import type { FxItemCategory } from './item_category'; +import type { FxStore } from './store'; +import type { FxTax } from './tax'; +import type { Graph } from '../../core'; + +export interface FxTaxItemCategory extends Graph { + curie: 'fx:tax_item_category'; + + links: { + /** This resource. */ + 'self': FxTaxItemCategory; + /** Related tax resource. */ + 'fx:tax': FxTax; + /** Related store resource. */ + 'fx:store': FxStore; + /** Related item category resource. */ + 'fx:item_category': FxItemCategory; + }; + + props: { + /** A full API URI of the item category resource used in this relationship. When working with hypermedia, it's important to save URIs and not just numeric ids. */ + item_category_uri: string; + /** A full API URI of the tax resource used in this relationship. When working with hypermedia, it's important to save URIs and not just numeric ids. */ + store_uri: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/taxes.d.ts b/src/integration/Graph/taxes.d.ts new file mode 100644 index 0000000..7411624 --- /dev/null +++ b/src/integration/Graph/taxes.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxTax } from './tax'; +import type { Graph } from '../../core'; + +export interface FxTaxes extends Graph { + curie: 'fx:taxes'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxTax; +} diff --git a/src/integration/Graph/template_config.d.ts b/src/integration/Graph/template_config.d.ts new file mode 100644 index 0000000..34a5987 --- /dev/null +++ b/src/integration/Graph/template_config.d.ts @@ -0,0 +1,27 @@ +import type { FxStore } from './store'; +import type { FxTemplateSets } from './template_sets'; +import type { Graph } from '../../core'; + +export interface FxTemplateConfig extends Graph { + curie: 'fx:template_config'; + + links: { + /** This resource. */ + 'self': FxTemplateConfig; + /** Related store resource. */ + 'fx:store': FxStore; + /** List of template sets using this template config. */ + 'fx:template_sets': FxTemplateSets; + }; + + props: { + /** The description of your template config. */ + description: string; + /** This is the template configuration settings for your store. */ + json: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/template_set.d.ts b/src/integration/Graph/template_set.d.ts new file mode 100644 index 0000000..3c7f054 --- /dev/null +++ b/src/integration/Graph/template_set.d.ts @@ -0,0 +1,68 @@ +import type { FxCartIncludeTemplate } from './cart_include_template'; +import type { FxCartTemplate } from './cart_template'; +import type { FxCheckoutTemplate } from './checkout_template'; +import type { FxEmailTemplate } from './email_template'; +import type { FxLanguageOverrides } from './language_overrides'; +import type { FxReceiptTemplate } from './receipt_template'; +import type { FxStore } from './store'; +import type { Graph } from '../../core'; + +export interface FxTemplateSet extends Graph { + curie: 'fx:template_set'; + + links: { + /** This resource. */ + 'self': FxTemplateSet; + /** Related store resource. */ + 'fx:store': FxStore; + /** Cart template for this template set. */ + 'fx:cart_template': FxCartTemplate; + /** Email template for this template set. */ + 'fx:email_template': FxEmailTemplate; + /** Receipt template for this template set. */ + 'fx:receipt_template': FxReceiptTemplate; + /** Checkout template for this template set. */ + 'fx:checkout_template': FxCheckoutTemplate; + /** Language overrides for this template set. */ + 'fx:language_overrides': FxLanguageOverrides; + /** Cart include template for this template set. */ + 'fx:cart_include_template': FxCartIncludeTemplate; + }; + + props: { + /** The full API URI of the cart template associated with this template set. */ + cart_template_uri: string; + /** The full API URI of the cart_include template associated with this template set. */ + cart_include_template_uri: string; + /** The full API URI of the checkout template associated with this template set. */ + checkout_template_uri: string; + /** The full API URI of the receipt template associated with this template set. */ + receipt_template_uri: string; + /** The full API URI of the email template associated with this template set. */ + email_template_uri: string; + /** The full API URI of the payment method set associated with this template set. */ + payment_method_set_uri: string; + /** The template set code used when applying this template set to the cart (currently only supports DEFAULT). */ + code: string; + /** The template set description. (currently only supports the default description). */ + description: string; + /** The language configured for this template set. */ + language: string; + /** The locale code for this store. This will impact how the currency and dates are displayed. */ + locale_code: string; + /** This is the template configuration settings for your store. */ + config: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; + + zooms: { + cart_include_template?: FxCartIncludeTemplate; + checkout_template?: FxCheckoutTemplate; + receipt_template?: FxReceiptTemplate; + email_template?: FxEmailTemplate; + cart_template?: FxCartTemplate; + }; +} diff --git a/src/integration/Graph/template_sets.d.ts b/src/integration/Graph/template_sets.d.ts new file mode 100644 index 0000000..3ceb4a9 --- /dev/null +++ b/src/integration/Graph/template_sets.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxTemplateSet } from './template_set'; +import type { Graph } from '../../core'; + +export interface FxTemplateSets extends Graph { + curie: 'fx:template_sets'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxTemplateSet; +} diff --git a/src/integration/Graph/timezones.d.ts b/src/integration/Graph/timezones.d.ts new file mode 100644 index 0000000..4797357 --- /dev/null +++ b/src/integration/Graph/timezones.d.ts @@ -0,0 +1,28 @@ +import type { FxPropertyHelpers } from './property_helpers'; +import type { Graph } from '../../core'; + +export interface FxTimezones extends Graph { + curie: 'fx:timezones'; + + links: { + /** This resource. */ + 'self': FxTimezones; + /** Various predefined property values. */ + 'fx:property_helpers': FxPropertyHelpers; + }; + + props: { + /** A small, human readable explanation of this property helper. */ + message: string; + /** JSON object with an array of timezones. */ + values: { + /** Valid entries for the store resource's timezone property. */ + timezone: { + /** The value you can use for the store's timezone property. */ + timezone: string; + /** The full description of this timezone. */ + description: string; + }[]; + }; + }; +} diff --git a/src/integration/Graph/token.d.ts b/src/integration/Graph/token.d.ts new file mode 100644 index 0000000..ce8d3ac --- /dev/null +++ b/src/integration/Graph/token.d.ts @@ -0,0 +1,18 @@ +import type { Graph } from '../../core'; + +export interface FxToken extends Graph { + curie: 'fx:token'; + + props: { + /** The OAuth refresh token. This token is returned in the response whenever creating a client, user or store or when doing an authorization code grant. */ + refresh_token: string; + /** The OAuth access token. Access tokens expire after 7200 seconds (2 hours). */ + access_token: string; + /** Lifespan of the access token in seconds. */ + expires_in: number; + /** Returned token type, e.g. `bearer`. */ + token_type: string; + /** The scopes assigned to this token. */ + scope: string; + }; +} diff --git a/src/integration/Graph/transaction.d.ts b/src/integration/Graph/transaction.d.ts new file mode 100644 index 0000000..18baf45 --- /dev/null +++ b/src/integration/Graph/transaction.d.ts @@ -0,0 +1,125 @@ +import type { FxAppliedTaxes } from './applied_taxes'; +import type { FxAttributes } from './attributes'; +import type { FxBillingAddresses } from './billing_addresses'; +import type { FxCapture } from './capture'; +import type { FxCustomFields } from './custom_fields'; +import type { FxCustomer } from './customer'; +import type { FxDiscounts } from './discounts'; +import type { FxItems } from './items'; +import type { FxNativeIntegrations } from './native_integrations'; +import type { FxPayments } from './payments'; +import type { FxProcessWebhook } from './process_webhook'; +import type { FxReceipt } from './receipt'; +import type { FxRefund } from './refund'; +import type { FxSendEmails } from './send_emails'; +import type { FxShipments } from './shipments'; +import type { FxStore } from './store'; +import type { FxTransactionLogs } from './transaction_logs'; +import type { FxVoid } from './void'; +import type { Graph } from '../../core'; + +export interface FxTransaction extends Graph { + curie: 'fx:transaction'; + + links: { + /** This resource. */ + 'self': FxTransaction; + /** POST here to void this transaction. */ + 'fx:void': FxVoid; + /** Related store resource. */ + 'fx:store': FxStore; + /** List of items in this transaction. */ + 'fx:items': FxItems; + /** POST here to refund this transaction. */ + 'fx:refund': FxRefund; + /** Open this link in a browser to see a receipt for this transaction. */ + 'fx:receipt': FxReceipt; + /** POST here to capture this transaction. */ + 'fx:capture': FxCapture; + /** List of payments for this transaction. */ + 'fx:payments': FxPayments; + /** Related customer resource. */ + 'fx:customer': FxCustomer; + /** List of discounts applied to this transaction. */ + 'fx:discounts': FxDiscounts; + /** List of shipments for this transaction. */ + 'fx:shipments': FxShipments; + /** List of custom attributes on this transaction. */ + 'fx:attributes': FxAttributes; + /** POST here to resend emails for this transaction. */ + 'fx:send_emails': FxSendEmails; + /** List of taxes applied to this transaction. */ + 'fx:applied_taxes': FxAppliedTaxes; + /** List of custom fields on this transaction. */ + 'fx:custom_fields': FxCustomFields; + /** POST here to resend the webhook notification for this transaction. */ + 'fx:process_webhook': FxProcessWebhook; + /** Transaction logs. */ + 'fx:transaction_logs': FxTransactionLogs; + /** List of billing addresses applicable to this transaction. */ + 'fx:billing_addresses': FxBillingAddresses; + /** POST here to resend transaction to the webhooks. */ + 'fx:native_integrations': FxNativeIntegrations; + }; + + props: { + /** The order number. */ + id: number; + /** True if this transaction was a test transaction and not run against a live payment gateway. */ + is_test: boolean; + /** Set this to true to hide it in the FoxyCart admin. */ + hide_transaction: boolean; + /** If the webhook for this transaction has been successfully sent, this will be true. You can also modify this to meet your needs. */ + data_is_fed: boolean; + /** The date of this transaction shown in the timezone of the store. The format used is ISO 8601 (or 'c' format string for PHP developers). */ + transaction_date: string; + /** The locale code of this transaction. This will be a copy of the store's local_code at the time of the transaction. */ + locale_code: string; + /** The customer's given name at the time of the transaction. */ + customer_first_name: string; + /** The customer's surname at the time of the transaction. */ + customer_last_name: string; + /** If the customer provided a tax_id during checkout, it will be included here. */ + customer_tax_id: string; + /** The customer's email address at the time of the transaction. */ + customer_email: string; + /** The customer's ip address at the time of the transaction. */ + customer_ip: string; + /** The country of the customer's ip address. */ + ip_country: string; + /** Total amount of the items in this transaction. */ + total_item_price: string; + /** Total amount of the taxes for this transaction. */ + total_tax: string; + /** Total amount of the shipping costs for this transaction. */ + total_shipping: string; + /** If this transaction has any shippable subscription items which will process in the future, this will be the total amount of shipping costs for those items. */ + total_future_shipping: string; + /** Total amount of this transaction including all items, taxes, shipping costs and discounts. */ + total_order: number; + /** Used for transactions processed with a hosted payment gateway which can change the status of the transaction after it is originally posted. If the status is empty, a normal payment gateway was used and the transaction should be considered completed. */ + status: 'approved' | 'authorized' | 'declined' | 'pending' | 'rejected'; + /** The type of transaction that has occurred. */ + type: 'updateinfo' | 'subscription_modification' | 'subscription_renewal' | 'subscription_cancellation'; + /** The 3 character ISO code for the currency. */ + currency_code: string; + /** The currency symbol, such as $, £, €, etc. */ + currency_symbol: string; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; + + zooms: { + billing_addresses?: FxBillingAddresses; + applied_taxes?: FxAppliedTaxes; + custom_fields?: FxCustomFields; + attributes: FxAttributes; + discounts?: FxDiscounts; + shipments?: FxShipments; + customer?: FxCustomer; + payments?: FxPayments; + items?: FxItems; + }; +} diff --git a/src/integration/Graph/transaction_log.d.ts b/src/integration/Graph/transaction_log.d.ts new file mode 100644 index 0000000..29eecb7 --- /dev/null +++ b/src/integration/Graph/transaction_log.d.ts @@ -0,0 +1,34 @@ +import type { FxCustomer } from './customer'; +import type { FxStore } from './store'; +import type { FxTransaction } from './transaction'; +import type { FxTransactionLogDetails } from './transaction_log_details'; +import type { FxUser } from './user'; +import type { Graph } from '../../core'; + +export interface FxTransactionLog extends Graph { + curie: 'fx:transaction_logs'; + + links: { + /** This resource. */ + 'self': FxTransactionLog; + /** Related user resource. */ + 'fx:user': FxUser; + /** Relared store resource. */ + 'fx:store': FxStore; + /** Related customer resource. */ + 'fx:customer': FxCustomer; + /** Related transaction resource. */ + 'fx:transaction': FxTransaction; + /** List of detailed entries for this log. */ + 'fx:transaction_log_details': FxTransactionLogDetails; + }; + + props: { + /** A complete JSON snapshot of the transaction prior to the modification made this log entry records. It includes all of the following zoom values: `customer`, `payments`, `applied_taxes`, `discounts`, `shipments`, `billing_addresses`, `items`, `items:item_options`, `custom_fields`, `attributes`. */ + snapshot: string; + /** Describes the source transaction modification such as admin or hAPI. */ + request_source: string; + /** The date this resource was created. */ + date_created: string; + }; +} diff --git a/src/integration/Graph/transaction_log_detail.d.ts b/src/integration/Graph/transaction_log_detail.d.ts new file mode 100644 index 0000000..392ff39 --- /dev/null +++ b/src/integration/Graph/transaction_log_detail.d.ts @@ -0,0 +1,25 @@ +import type { FxStore } from './store'; +import type { FxTransactionLog } from './transaction_log'; +import type { Graph } from '../../core'; + +export interface FxTransactionLogDetail extends Graph { + curie: 'fx:transaction_log_detail'; + + links: { + /** This resource. */ + 'self': FxTransactionLogDetail; + /** Relared store resource. */ + 'fx:store': FxStore; + /** Related transaction log resource. */ + 'fx:transaction_log': FxTransactionLog; + }; + + props: { + /** A text representation of the type of request this log entry is for such as `item_edit`. */ + request_type: string; + /** A reference id of some kind to help describe which resource this log entry refers to. */ + reference: string; + /** The details of the changes for this log in JSON format. */ + log: string; + }; +} diff --git a/src/integration/Graph/transaction_log_details.d.ts b/src/integration/Graph/transaction_log_details.d.ts new file mode 100644 index 0000000..d264486 --- /dev/null +++ b/src/integration/Graph/transaction_log_details.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxTransactionLogDetail } from './transaction_log_detail'; +import type { Graph } from '../../core'; + +export interface FxTransactionLogDetails extends Graph { + curie: 'fx:transaction_log_details'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxTransactionLogDetail; +} diff --git a/src/integration/Graph/transaction_logs.d.ts b/src/integration/Graph/transaction_logs.d.ts new file mode 100644 index 0000000..4992c98 --- /dev/null +++ b/src/integration/Graph/transaction_logs.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxTransactionLog } from './transaction_log'; +import type { Graph } from '../../core'; + +export interface FxTransactionLogs extends Graph { + curie: 'fx:transaction_logs'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxTransactionLog; +} diff --git a/src/integration/Graph/transaction_template.d.ts b/src/integration/Graph/transaction_template.d.ts new file mode 100644 index 0000000..fdf6b44 --- /dev/null +++ b/src/integration/Graph/transaction_template.d.ts @@ -0,0 +1,9 @@ +import type { FxCart } from './cart'; +import type { Graph } from '../../core'; + +export interface FxTransactionTemplate extends Graph { + curie: 'fx:transaction_template'; + links: FxCart['links']; + props: FxCart['props']; + zooms: FxCart['zooms']; +} diff --git a/src/integration/Graph/transactions.d.ts b/src/integration/Graph/transactions.d.ts new file mode 100644 index 0000000..8e64169 --- /dev/null +++ b/src/integration/Graph/transactions.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxTransaction } from './transaction'; +import type { Graph } from '../../core'; + +export interface FxTransactions extends Graph { + curie: 'fx:transactions'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxTransaction; +} diff --git a/src/integration/Graph/user.d.ts b/src/integration/Graph/user.d.ts new file mode 100644 index 0000000..a1879b7 --- /dev/null +++ b/src/integration/Graph/user.d.ts @@ -0,0 +1,44 @@ +import type { FxAttributes } from './attributes'; +import type { FxDefaultStore } from './default_store'; +import type { FxStores } from './stores'; +import type { Graph } from '../../core'; + +export interface FxUser extends Graph { + curie: 'fx:user'; + + links: { + /** This resource. */ + 'self': FxUser; + /** List of stores this user has access to. */ + 'fx:stores': FxStores; + /** List of custom attributes on this user resource. */ + 'fx:attributes': FxAttributes; + /** Default store for this user. */ + 'fx:default_store': FxDefaultStore; + }; + + props: { + /** The user's given name. */ + first_name: string; + /** The user's surname. */ + last_name: string; + /** The user's email address. This is used as the login to the FoxyCart admin for this user. */ + email: string; + /** The user's phone number. */ + phone: string; + /** This can only be set during user creation. Contact us if you need this value changed later. */ + affiliate_id: number; + /** If this user is a programmer who writes server side code in languages like PHP, .NET, Python, Java, Ruby, etc */ + is_programmer: boolean; + /** If this user is a front end developer who writes code in things like HTML, CSS, and maybe some JavaScript. */ + is_front_end_developer: boolean; + /** If this user is a front end designer who works in wireframes, graphic designs, and user interfaces. */ + is_designer: boolean; + /** If this user is a a merchant or store admin involved in the item and money side of the e-commerce business. */ + is_merchant: boolean; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/user_access.d.ts b/src/integration/Graph/user_access.d.ts new file mode 100644 index 0000000..bdeb27d --- /dev/null +++ b/src/integration/Graph/user_access.d.ts @@ -0,0 +1,29 @@ +import type { FxStore } from './store'; +import type { FxUser } from './user'; +import type { Graph } from '../../core'; + +export interface FxUserAccess extends Graph { + curie: 'fx:user_access'; + + links: { + /** This resource. */ + 'self': FxUserAccess; + /** Related user resource. */ + 'fx:user': FxUser; + /** Related store resource. */ + 'fx:store': FxStore; + }; + + props: { + /** A full API URI of the user resource used in this relationship. When working with hypermedia, it's important to save URIs and not just numeric ids. */ + user_uri: string; + /** A full API URI of the store resource used in this relationship. When working with hypermedia, it's important to save URIs and not just numeric ids. */ + store_uri: string; + /** Set this to true to make this store the default store for this user. That means it will be the first store they see when the log in to the FoxyCart admin. */ + is_default_store: boolean; + /** The date this resource was created. */ + date_created: string; + /** The date this resource was last modified. */ + date_modified: string; + }; +} diff --git a/src/integration/Graph/user_accesses.d.ts b/src/integration/Graph/user_accesses.d.ts new file mode 100644 index 0000000..40361d5 --- /dev/null +++ b/src/integration/Graph/user_accesses.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxUserAccess } from './user_access'; +import type { Graph } from '../../core'; + +export interface FxUserAccesses extends Graph { + curie: 'fx:user_accesses'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxUserAccess; +} diff --git a/src/integration/Graph/users.d.ts b/src/integration/Graph/users.d.ts new file mode 100644 index 0000000..757771e --- /dev/null +++ b/src/integration/Graph/users.d.ts @@ -0,0 +1,10 @@ +import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; +import type { FxUser } from './user'; +import type { Graph } from '../../core'; + +export interface FxUsers extends Graph { + curie: 'fx:users'; + links: CollectionGraphLinks; + props: CollectionGraphProps; + child: FxUser; +} diff --git a/src/integration/Graph/void.d.ts b/src/integration/Graph/void.d.ts new file mode 100644 index 0000000..b5a4b4f --- /dev/null +++ b/src/integration/Graph/void.d.ts @@ -0,0 +1,5 @@ +import type { Graph } from '../../core'; + +export interface FxVoid extends Graph { + curie: 'fx:void'; +} diff --git a/src/integration/Rels.d.ts b/src/integration/Rels.d.ts new file mode 100644 index 0000000..7154aa4 --- /dev/null +++ b/src/integration/Rels.d.ts @@ -0,0 +1,149 @@ +export * from './Graph/admin_email_template'; +export * from './Graph/applied_coupon_code'; +export * from './Graph/applied_coupon_codes'; +export * from './Graph/applied_tax'; +export * from './Graph/applied_taxes'; +export * from './Graph/attribute'; +export * from './Graph/attributes'; +export * from './Graph/billing_address'; +export * from './Graph/billing_addresses'; +export * from './Graph/cache'; +export * from './Graph/capture'; +export * from './Graph/cart'; +export * from './Graph/cart_include_template'; +export * from './Graph/cart_include_templates'; +export * from './Graph/cart_template'; +export * from './Graph/cart_templates'; +export * from './Graph/carts'; +export * from './Graph/checkout_template'; +export * from './Graph/checkout_templates'; +export * from './Graph/checkout_types'; +export * from './Graph/client'; +export * from './Graph/countries'; +export * from './Graph/coupon'; +export * from './Graph/coupon_code'; +export * from './Graph/coupon_code_transaction'; +export * from './Graph/coupon_code_transactions'; +export * from './Graph/coupon_codes'; +export * from './Graph/coupon_detail'; +export * from './Graph/coupon_details'; +export * from './Graph/coupon_item_categories'; +export * from './Graph/coupon_item_category'; +export * from './Graph/coupons'; +export * from './Graph/create_client'; +export * from './Graph/create_session'; +export * from './Graph/create_user'; +export * from './Graph/custom_field'; +export * from './Graph/custom_fields'; +export * from './Graph/customer'; +export * from './Graph/customer_address'; +export * from './Graph/customer_addresses'; +export * from './Graph/customer_email_template'; +export * from './Graph/customer_password_hash_types'; +export * from './Graph/customer_portal_settings'; +export * from './Graph/customers'; +export * from './Graph/default_billing_address'; +export * from './Graph/default_payment_method'; +export * from './Graph/default_shipping_address'; +export * from './Graph/default_store'; +export * from './Graph/default_templates'; +export * from './Graph/discount'; +export * from './Graph/discount_detail'; +export * from './Graph/discount_details'; +export * from './Graph/discounts'; +export * from './Graph/downloadable'; +export * from './Graph/downloadable_item_categories'; +export * from './Graph/downloadable_purchase'; +export * from './Graph/downloadables'; +export * from './Graph/email_template'; +export * from './Graph/email_templates'; +export * from './Graph/encode'; +export * from './Graph/error_entries'; +export * from './Graph/error_entry'; +export * from './Graph/fraud_protection'; +export * from './Graph/fraud_protections'; +export * from './Graph/generate_codes'; +export * from './Graph/hosted_payment_gateway'; +export * from './Graph/hosted_payment_gateways'; +export * from './Graph/integration'; +export * from './Graph/item'; +export * from './Graph/item_categories'; +export * from './Graph/item_category'; +export * from './Graph/item_option'; +export * from './Graph/item_options'; +export * from './Graph/items'; +export * from './Graph/language_override'; +export * from './Graph/language_overrides'; +export * from './Graph/language_strings'; +export * from './Graph/languages'; +export * from './Graph/last_transaction'; +export * from './Graph/locale_codes'; +export * from './Graph/native_integration'; +export * from './Graph/native_integrations'; +export * from './Graph/original_transaction'; +export * from './Graph/payment'; +export * from './Graph/payment_gateway'; +export * from './Graph/payment_gateways'; +export * from './Graph/payment_method_expiring'; +export * from './Graph/payment_method_set'; +export * from './Graph/payment_method_set_fraud_protection'; +export * from './Graph/payment_method_set_fraud_protections'; +export * from './Graph/payment_method_set_hosted_payment_gateway'; +export * from './Graph/payment_method_set_hosted_payment_gateways'; +export * from './Graph/payment_method_sets'; +export * from './Graph/payments'; +export * from './Graph/process_subscription_webhook'; +export * from './Graph/process_webhook'; +export * from './Graph/property_helpers'; +export * from './Graph/receipt'; +export * from './Graph/receipt_template'; +export * from './Graph/receipt_templates'; +export * from './Graph/refund'; +export * from './Graph/regions'; +export * from './Graph/reporting'; +export * from './Graph/reporting_email_exists'; +export * from './Graph/reporting_store_domain_exists'; +export * from './Graph/send_emails'; +export * from './Graph/shipment'; +export * from './Graph/shipments'; +export * from './Graph/shipping_address_types'; +export * from './Graph/shipping_container'; +export * from './Graph/shipping_containers'; +export * from './Graph/shipping_drop_type'; +export * from './Graph/shipping_drop_types'; +export * from './Graph/shipping_method'; +export * from './Graph/shipping_methods'; +export * from './Graph/shipping_service'; +export * from './Graph/shipping_services'; +export * from './Graph/store'; +export * from './Graph/store_shipping_method'; +export * from './Graph/store_shipping_service'; +export * from './Graph/store_shipping_services'; +export * from './Graph/store_version'; +export * from './Graph/store_versions'; +export * from './Graph/stores'; +export * from './Graph/sub_token_url'; +export * from './Graph/subscription'; +export * from './Graph/subscription_settings'; +export * from './Graph/subscriptions'; +export * from './Graph/tax'; +export * from './Graph/tax_item_categories'; +export * from './Graph/tax_item_category'; +export * from './Graph/taxes'; +export * from './Graph/template_config'; +export * from './Graph/template_set'; +export * from './Graph/template_sets'; +export * from './Graph/timezones'; +export * from './Graph/token'; +export * from './Graph/transaction'; +export * from './Graph/transaction_log'; +export * from './Graph/transaction_log_detail'; +export * from './Graph/transaction_log_details'; +export * from './Graph/transaction_logs'; +export * from './Graph/transaction_template'; +export * from './Graph/transactions'; +export * from './Graph/user'; +export * from './Graph/user_access'; +export * from './Graph/user_accesses'; +export * from './Graph/users'; +export * from './Graph/void'; diff --git a/src/integration/Signer.ts b/src/integration/Signer.ts new file mode 100644 index 0000000..706fa56 --- /dev/null +++ b/src/integration/Signer.ts @@ -0,0 +1,481 @@ +import * as crypto from 'crypto'; +import * as fs from 'fs'; +import { JSDOM } from 'jsdom'; +import { URL } from 'url'; + +type CodesDict = { + [key: number]: { + code: string; + parent: string; + }; +}; + +/** + * HMAC signing utility. Methods are named after what it is to be signed, to + * allow for an easy to read code in the user application. + * + * @tutorial https://wiki.foxycart.com/v/2.0/hmac_validation + * @example foxy.hmacSign.url("http://...") // signs a URL + */ +export class Signer { + private _secret?: string; + + /** + * Creates an instance of this class. + * + * @param secret OAuth2 client secret for your integration. + */ + constructor(secret: string | null = null) { + if (secret) { + this.setSecret(secret); + } + } + + /** + * Sets the HMAC secret. + * It won't be possible to sign anything without this secret. + * + * @param secret OAuth2 client secret for your integration. + */ + public setSecret(secret: string): Signer { + this._secret = secret; + return this; + } + + /** + * Signs a whole HTML snippet. + * + * @param htmlStr HTML snippet to sign. + */ + public htmlString(htmlStr: string) { + const dom = new JSDOM(htmlStr); + this._fragment(dom.window.document); + return dom.serialize(); + } + + /** + * Signs a file asynchronously. + * + * @param inputPath Path of the file to sign. + * @param outputPath Path of the file where the signed result will be stored. + */ + public htmlFile(inputPath: string, outputPath: string) { + return new Promise((resolve, reject) => { + JSDOM.fromFile(inputPath).then(dom => { + const signed = this._fragment(dom.window.document); + fs.writeFile(outputPath, dom.serialize(), err => { + if (err) reject(err); + else resolve(signed); + }); + }); + }); + } + + /** + * Signs a query string. + * All query fields withing the query string will be signed, provided it is a proper URL and there is a code field + * + * @param urlStr Full URL including the query string that needs to be signed. + */ + public url(urlStr: string): string { + // Build a URL object + if (this._isSigned(urlStr)) { + console.error('Attempt to sign a signed URL', urlStr); + return urlStr; + } + // Do not change invalid URLs + let url; + let stripped; + try { + url = new URL(urlStr); + stripped = new URL(url.origin); + } catch (e) { + //console.assert(e.code === "ERR_INVALID_URL"); + return urlStr; + } + const originalParams = url.searchParams; + const newParams = stripped.searchParams; + const code = this._getCodeFromURL(url); + // If there is no code, return the same URL + if (!code) { + return urlStr; + } + // sign the url object + for (const p of originalParams.entries()) { + const signed = this._queryArg(decodeURIComponent(p[0]), decodeURIComponent(code), decodeURIComponent(p[1])).split( + '=' + ); + newParams.set(signed[0], signed[1]); + } + url.search = newParams.toString(); + return this._replaceURLchars(url.toString()); + } + + /** + * Signs input name. + * + * @param name Name of the input element. + * @param code Product code. + * @param parentCode Parent product code. + * @param value Input value. + */ + public name(name: string, code: string, parentCode = '', value?: string | number): string { + name = name.replace(/ /g, '_'); + const signature = this._product(code + parentCode, name, value); + const encodedName = encodeURIComponent(name); + const nameAttr = this._buildSignedName(encodedName, signature, value); + return nameAttr; + } + + /** + * Signs input value. + * + * @param name Name of the input element. + * @param code Product code. + * @param parentCode Parent product code. + * @param value Input value. + */ + public value(name: string, code: string, parentCode = '', value?: string | number): string { + name = name.replace(/ /g, '_'); + const signature = this._product(code + parentCode, name, value); + const valueAttr = this._buildSignedValue(signature, value); + return valueAttr; + } + + /** + * Signs a product composed of code, name and value. + * + * @param code + * @param name + * @param value + * @private + */ + private _product(code: string, name: string, value?: string | number): string { + return this._message(code + name + this._valueOrOpen(value)); + } + + /** + * Signs a single query argument to be used in `GET` requests. + * + * @param name + * @param code + * @param value + * @private + */ + private _queryArg(name: string, code: string, value?: string): string { + name = name.replace(/ /g, '_'); + code = code.replace(/ /g, '_'); + const signature = this._product(code, name, value); + const encodedName = encodeURIComponent(name).replace(/%20/g, '+'); + const encodedValue = encodeURIComponent(this._valueOrOpen(value)).replace(/%20/g, '+'); + const nameAttr = this._buildSignedQueryArg(encodedName, signature, encodedValue); + return nameAttr; + } + + /** + * Signs an input element. + * + * @param el + * @param codes + * @private + */ + private _input(el: HTMLInputElement, codes: CodesDict): HTMLInputElement { + const splitted = this._splitNamePrefix(el.name); + const nameString = splitted[1]; + const prefix = splitted[0]; + const code = codes[prefix].code; + const parentCode = codes[prefix].parent; + const value = el.value; + const signedName = this.name(nameString, code, parentCode, value); + el.setAttribute('name', prefix + ':' + signedName); + return el; + } + + /** + * Signs a texArea element. + * + * @param el + * @param codes + * @private + */ + private _textArea(el: HTMLTextAreaElement, codes: CodesDict): HTMLTextAreaElement { + const splitted = this._splitNamePrefix(el.name); + const nameString = splitted[1]; + const prefix = splitted[0]; + const code = codes[prefix].code; + const parentCode = codes[prefix].parent; + const value = ''; + const signedName = this.name(nameString, code, parentCode, value); + el.setAttribute('name', prefix + ':' + signedName); + return el; + } + + /** + * Signs all option elements within a Select element. + * + * @param el + * @param codes + * @private + */ + private _select(el: HTMLSelectElement, codes: CodesDict): HTMLSelectElement { + el.querySelectorAll('option').forEach(opt => { + this._option(opt, codes); + }); + return el; + } + + /** + * Sign an option element. + * Signatures are added to the value attribute on options. + * This function may also be used to sign radio buttons. + * + * @param el + * @param codes + * @private + */ + private _option(el: HTMLOptionElement | HTMLInputElement, codes: CodesDict): HTMLOptionElement | HTMLInputElement { + // Get the name parameter, either from the "select" + // parent element of an option tag or from the name + // attribute of the input element itself + let n = (el as any).name; + if (n === undefined) { + const p = el.parentElement as HTMLSelectElement; + n = p.name; + } + const splitted = this._splitNamePrefix(n); + const nameString = splitted[1]; + const prefix = splitted[0]; + const code = codes[prefix].code; + const parentCode = codes[prefix].parent; + const value = el.value; + const signedValue = this.value(nameString, code, parentCode, value); + el.setAttribute('value', prefix + ':' + signedValue); + return el; + } + + /** + * Signs a radio button. Radio buttons use the value attribute to hold their signatures. + * + * @param el + * @param codes + * @private + */ + private _radio(el: HTMLInputElement, codes: CodesDict): HTMLInputElement { + return this._option(el, codes) as HTMLInputElement; + } + + /** + * Splits a string using the prefix pattern for foxy store. + * The prefix pattern allows for including more than a single product in a given GET or POST request. + * + * @param name + * @private + */ + private _splitNamePrefix(name: string): [number, string] { + const splitted = name.split(':'); + if (splitted.length == 2) { + return [parseInt(splitted[0], 10), splitted[1]]; + } + return [0, name]; + } + + /** + * Retrieve a parent code value from a form, given a prefix. + * + * @param formElement + * @param prefix + * @private + */ + private _retrieveParentCode(formElement: Element, prefix: string | number = ''): string { + let result = ''; // A blank string indicates no parent + let separator = ''; + if (prefix) { + separator = ':'; + } + const parentCodeEl = formElement.querySelector(`[name='${prefix}${separator}parent_code']`); + if (parentCodeEl) { + const parentCode = parentCodeEl.getAttribute('value'); + if (parentCode !== null) { + result = parentCode; + } + } + return result; + } + + /** + * Signs a whole form element. + * + * @param formElement + * @private + */ + private _form(formElement: Element) { + // Grab all codes within the form element + const codeList: NodeList = formElement.querySelectorAll('[name$=code]'); + // Store all codes in a object + const codes: any = {}; + for (const node of codeList) { + const nameAttr = (node as Element).getAttribute('name'); + const codeValue = (node as Element).getAttribute('value'); + if (nameAttr && nameAttr.match(/^([0-9]{1,3}:)?code/)) { + const splitted = nameAttr.split(':'); + const prefix = splitted[0]; + if (splitted.length == 2) { + // Store prefix in codes list + codes[prefix] = { + code: codeValue, + parent: this._retrieveParentCode(formElement, prefix), + }; + } else if (codes[0] === undefined) { + // Allow to push a single code without prefix + codes[0] = { + code: codeValue, + parent: this._retrieveParentCode(formElement), + }; + } else { + const documentationURL = 'https://wiki.foxycart.com/v/2.0/hmac_validation#multiple_products_in_one_form'; + const errorMsg = `There are multiple codes in the form element. Please, check ${documentationURL}`; + throw new Error(errorMsg); + } + } + } + // Sign inputs + formElement.querySelectorAll('input[name]').forEach(i => { + if (i.getAttribute('type') === 'radio') { + this._radio(i as HTMLInputElement, codes); + } else { + this._input(i as HTMLInputElement, codes); + } + }); + // Sign selects + formElement.querySelectorAll('select[name]').forEach(s => this._select(s as HTMLSelectElement, codes)); + // Sign textAreas + formElement.querySelectorAll('textarea[name]').forEach(s => this._textArea(s as HTMLTextAreaElement, codes)); + } + + /** + * Builds a signed name given it components. + * + * @param name + * @param signature + * @param value + * @private + */ + private _buildSignedName(name: string, signature: string, value?: string | number) { + let open = this._valueOrOpen(value); + open = this._valueOrOpen(value) == '--OPEN--' ? '||open' : ''; + return `${name}||${signature}${open}`; + } + + /** + * Builds a signed name given it components. + * + * @param signature + * @param value + * @private + */ + private _buildSignedValue(signature: string, value?: string | number) { + let open = this._valueOrOpen(value); + open = this._valueOrOpen(value) == '--OPEN--' ? '||open' : (value as string); + return `${open}||${signature}`; + } + + /** + * Builds a signed query argument given its components. + * + * @param name + * @param signature + * @param value + * @private + */ + private _buildSignedQueryArg(name: string, signature: string, value: string | number) { + return `${name}||${signature}=${value}`; + } + + /** + * Retuns the value of a field on the `--OPEN--` string if the value is not defined. + * Please, notice that `0` is an acceptable value. + * + * @param value + * @private + */ + private _valueOrOpen(value: string | number | undefined): string | number { + if (value === undefined || value === null || value === '') { + return '--OPEN--'; + } + return value; + } + + /** + * Check if a href string is already signed. Signed strings contain two consecutive pipes + * followed by 64 hexadecimal characters. + * + * @param url + * @private + */ + private _isSigned(url: string): boolean { + return url.match(/^.*\|\|[0-9a-fA-F]{64}/) != null; + } + + /** + * Returns the code from a URL or undefined if it does not contain a code. + * + * @param url + * @private + */ + private _getCodeFromURL(url: URL): string | undefined { + for (const p of url.searchParams) { + if (p[0] == 'code') { + return p[1]; + } + } + } + + /** + * Find all cart forms in a document fragment that contain an input named `code`. + * + * @param doc + * @private + */ + private _findCartForms(doc: ParentNode) { + return Array.from(doc.querySelectorAll('form')).filter(e => e.querySelector('[name=code]')); + } + + /** + * Replace some of the characters encoded by `encodeURIComponent()`. + * + * @param urlStr + * @private + */ + private _replaceURLchars(urlStr: string): string { + return urlStr.replace(/%7C/g, '|').replace(/%3D/g, '=').replace(/%2B/g, '+'); + } + + /** + * Signs a document fragment. This method is used to sign HTML snippets. + * + * @param doc + * @private + */ + private _fragment(doc: ParentNode): ParentNode { + doc.querySelectorAll('a').forEach(l => { + l.href = this.url(l.href); + }); + this._findCartForms(doc).forEach(this._form.bind(this)); + return doc; + } + + /** + * Signs a simple message. This function can only be invoked after the secret has been defined. The secret can be defined either in the construction method as in `new FoxySigner(mySecret)` or by invoking the setSecret method, as in `signer.setSecret(mySecret)` + * + * @param message + * @private + */ + private _message(message: string): string { + if (this._secret === undefined) { + throw new Error('No secret was provided to build the hmac'); + } + const hmac = crypto.createHmac('sha256', this._secret); + hmac.update(message); + return hmac.digest('hex'); + } +} diff --git a/src/integration/createSSOURL.ts b/src/integration/createSSOURL.ts new file mode 100644 index 0000000..a59411d --- /dev/null +++ b/src/integration/createSSOURL.ts @@ -0,0 +1,81 @@ +import { URL } from 'url'; +import * as crypto from 'crypto'; + +interface Options { + /** + * Integer, epoch time. The future time that this authentication token will expire. + * If a customer makes a checkout request with an expired authentication token, then FoxyCart + * will redirect them to the endpoint in order to generate a new token. You can make use of the + * timestamp value you received to your endpoint in the GET parameters, and add additional time + * to it for how long you want it to be valid for. For example, adding 3600 to the timestamp will + * extend it by 3600 seconds, or 30 minutes. + * + * @see https://docs.foxycart.com/v/2.0/sso#the_details + */ + timestamp?: number; + + /** + * The FoxyCart session ID. This is necessary to prevent issues with users with 3rd party cookies + * disabled and stores that are not using a custom subdomain. + * + * @see https://docs.foxycart.com/v/2.0/sso#the_details + */ + session?: string; + + /** + * Integer, the customer ID, as determined and stored when the user is first created or synched using the API. + * If a customer is not authenticated and you would like to allow them through to checkout, + * enter a customer ID of 0 (the number). + * + * @see https://docs.foxycart.com/v/2.0/sso#the_details + */ + customer: number; + + /** + * Store's {@link https://docs.foxycart.com/v/2.0/store_secret secret key}. + * A random 60 character key that helps secure sensitive information provided by some of our functionality. + * + * @see https://docs.foxycart.com/v/2.0/sso#the_details + */ + secret: string; + + /** + * The unique FoxyCart subdomain URL for your cart, checkout, and receipt + * that usually looks like this: `https://yourdomain.foxycart.com`. + * + * @see https://docs.foxycart.com/v/2.0/sso#the_details + * @see https://api.foxycart.com/rels/store + */ + domain: string; +} + +/** + * Generates an SSO url for the given configuration. + * + * @example + * + * const url = FoxyApi.sso.createUrl({ + * customer: 123, + * secret: "...", + * domain: "https://yourdomain.foxycart.com" + * }); + * + * @param options sso url configuration + * @tutorial https://docs.foxycart.com/v/2.0/sso#the_details + */ +export function createSSOURL(options: Options) { + const timestamp = options.timestamp ?? Date.now(); + const decodedToken = `${options.customer}|${timestamp}|${options.secret}`; + const encodedToken = crypto.createHash('sha1').update(decodedToken); + const url = new URL('/checkout', options.domain); + + url.searchParams.append('fc_customer_id', options.customer.toString()); + url.searchParams.append('fc_auth_token', encodedToken.digest('hex')); + url.searchParams.append('timestamp', String(timestamp)); + + if (typeof options.session === 'string') { + url.searchParams.append('fcsid', options.session); + } + + return url.toString(); +} diff --git a/src/integration/index.ts b/src/integration/index.ts new file mode 100644 index 0000000..7f74c32 --- /dev/null +++ b/src/integration/index.ts @@ -0,0 +1,9 @@ +export { API } from './API'; +export { Signer } from './Signer'; +export { removeAllLinksExcept, removePrivateAttributes, removeSensitiveData, removeProperties } from './sanitizers'; +export { verifyWebhookSignature } from './verifyWebhookSignature'; +export { createSSOURL } from './createSSOURL'; + +import type * as Rels from './Rels'; +export type { Graph } from './Graph'; +export type { Rels }; diff --git a/src/integration/sanitizers.ts b/src/integration/sanitizers.ts new file mode 100755 index 0000000..6538963 --- /dev/null +++ b/src/integration/sanitizers.ts @@ -0,0 +1,80 @@ +import { TraverseContext } from 'traverse'; + +type Mapper = (this: TraverseContext, v: any) => void; + +/** + * Runs multiple https://www.npmjs.com/package/traverse mappers + * during the node visit. + * + * @param mappers list of mapper functions to run + * @example + * const sanitizedResponse = traverse(response).map(all( + * removePrivateAttributes, + * removeProperties("third_party_id") + * )); + */ +export function all(...mappers: Mapper[]): Mapper { + return function (this: TraverseContext, v: any): void { + mappers.forEach(mapper => mapper.call(this, v)); + }; +} + +/** + * A https://www.npmjs.com/package/traverse mapper that removes all + * private attributes from the response object. + * + * @param this object traversal context + * @param v current property value + * @example const sanitizedResponse = traverse(response).map(removePrivateAttributes); + */ +export function removePrivateAttributes(this: TraverseContext, v: any): void { + if (this.key === 'fx:attributes' && Array.isArray(v)) { + this.update( + v.filter((attr: any) => attr.visibility === 'public'), + true + ); + } +} + +/** + * A https://www.npmjs.com/package/traverse mapper that removes all + * sensitive data such as password hashes or internal identifiers from the response object. + * + * @param this traversal context + * @example const sanitizedResponse = traverse(response).map(removeSensitiveData); + */ +export function removeSensitiveData(this: TraverseContext): void { + const key = this.key; + if (typeof key === 'undefined') return; + + const propsToRemove = ['password', 'third_party_id']; + if (propsToRemove.find(v => key.startsWith(v))) this.remove(); +} + +/** + * Creates a https://www.npmjs.com/package/traverse mapper that removes all + * relations from the response object that aren't listed in the `linksToKeep` array. + * + * @param linksToKeep array of relation keys to keep + * @example const sanitizedResponse = traverse(response).map(removeAllLinksExcept("self", "next")); + */ +export function removeAllLinksExcept(...linksToKeep: string[]): () => void { + return function (this: TraverseContext): void { + if (typeof this.key !== 'undefined' && this.parent?.key === '_links' && linksToKeep.includes(this.key) === false) { + this.remove(); + } + }; +} + +/** + * Creates a https://www.npmjs.com/package/traverse mapper that removes all + * properties from the response object that match the keys of the `propsToRemove` array. + * + * @param propsToRemove array of properties to remove + * @example const sanitizedResponse = traverse(response).map(removeProperties("password_hash", "third_party_id")); + */ +export function removeProperties(...propsToRemove: string[]): () => void { + return function (this: TraverseContext): void { + if (this.key && propsToRemove.includes(this.key)) this.remove(); + }; +} diff --git a/src/integration/verifyWebhookSignature.ts b/src/integration/verifyWebhookSignature.ts new file mode 100755 index 0000000..ad8634c --- /dev/null +++ b/src/integration/verifyWebhookSignature.ts @@ -0,0 +1,44 @@ +import * as crypto from 'crypto'; + +export interface VerificationParams { + /** + * The `Foxy-Webhook-Signature` header value received with the webhook. + * + * @see https://wiki.foxycart.com/v/2.0/webhooks + */ + signature: string; + + /** + * The serialized (string) request body received with the webhook. + * + * @see https://wiki.foxycart.com/v/2.0/webhooks + */ + payload: string; + + /** + * The encryption key for this particular webhook. + * + * @see https://wiki.foxycart.com/v/2.0/webhooks + */ + key: string; +} + +/** + * Verifies that the webhook your app has received was indeed sent from our servers. + * + * @example + * + * const isVerified = FoxyApi.webhook.verify({ + * signature: "...", + * payload: "...", + * key: "..." + * }); + * + * @param params info received with the webhook that needs validation + * @tutorial https://wiki.foxycart.com/v/2.0/webhooks#validating_the_payload + */ +export function verifyWebhookSignature(params: VerificationParams): boolean { + const computedSignature = crypto.createHmac('sha256', params.key).update(params.payload).digest('hex'); + + return params.signature === computedSignature; +} diff --git a/src/ministorage.d.ts b/src/ministorage.d.ts new file mode 100644 index 0000000..be2e0db --- /dev/null +++ b/src/ministorage.d.ts @@ -0,0 +1,3 @@ +declare module 'ministorage' { + export default Storage; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100755 index 0000000..dd40df8 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,18 @@ +{ + "ts-node": { + "compilerOptions": { + "module": "commonjs" + } + }, + "compilerOptions": { + "esModuleInterop": true, + "isolatedModules": true, + "skipLibCheck": true, + "strict": true, + "module": "ES2015", + "target": "ES2015", + "moduleResolution": "node", + "lib": ["ES2015", "DOM", "DOM.Iterable"] + }, + "include": ["src"] +} diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..899d333 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,45 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ + +const TerserPlugin = require('terser-webpack-plugin'); +const path = require('path'); + +module.exports = { + entry: { + Admin: './src/admin/index.ts', + Customer: './src/customer/index.ts', + }, + + mode: 'production', + + module: { + rules: [ + { + exclude: /node_modules/, + test: /\.ts$/, + use: 'ts-loader', + }, + ], + }, + + optimization: { + minimize: true, + minimizer: [ + new TerserPlugin({ + extractComments: false, + }), + ], + }, + + output: { + filename: 'FoxySDK[name].js', + library: ['FoxySDK', '[name]'], + libraryTarget: 'umd', + path: path.join(__dirname, './dist/cdn'), + }, + + resolve: { + extensions: ['.ts', '.js'], + }, + + target: 'web', +}; From 2af15d31395738dba23620a762002ced82fdce36 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Sat, 7 Nov 2020 18:07:36 +0300 Subject: [PATCH 02/98] feat: make cognito credentials configurable --- src/admin/API.ts | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/admin/API.ts b/src/admin/API.ts index ed5638d..172aef6 100644 --- a/src/admin/API.ts +++ b/src/admin/API.ts @@ -4,6 +4,13 @@ import type { Credentials } from './types'; import type { Graph } from './Graph'; import { fetch } from 'cross-fetch'; +type Init = ConstructorParameters[0] & { + identityPoolId: string; + region: string; + userPoolId: string; + userPoolWebClientId: string; +}; + /** * Admin API provides a common interface for the `/s/admin` endpoints, whether * it's a default setup or a custom solution for your integration. Admin API @@ -15,18 +22,17 @@ export class API extends Core.API { /** * Creates an instance of {@link AdminAPI}. * - * @param args Client configuration (same as for {@link BrowserAPI}). + * @param init Client configuration (same as for {@link BrowserAPI}). */ - constructor(...args: ConstructorParameters) { - super(...args); + constructor(init: Init) { + super(init); - // TODO: production config + is multi-tenancy even possible with Amplify? this.__auth.configure({ - identityPoolId: 'us-east-2:6e3cb428-0e77-495e-9960-f4ab46d4dca1', - region: 'us-east-2', - storage: args[0].storage, - userPoolId: 'us-east-2_2Vw7tMmLQ', - userPoolWebClientId: '2i58qs1u38kv605rm3v5t4dake', + identityPoolId: init.identityPoolId, + region: init.region, + storage: init.storage, + userPoolId: init.userPoolId, + userPoolWebClientId: init.userPoolWebClientId, }); } From af003372095f6a1eb3f767abf3d7607c7f5672e7 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Sat, 7 Nov 2020 18:13:53 +0300 Subject: [PATCH 03/98] build: add access level to publish config --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index 0146f6f..8182149 100755 --- a/package.json +++ b/package.json @@ -80,6 +80,9 @@ "path": "./node_modules/cz-conventional-changelog" } }, + "publishConfig": { + "access": "public" + }, "husky": { "hooks": { "prepare-commit-msg": "exec < /dev/tty && git cz --hook || true", From 7db42ac4f3328744a3be170e1dd7ae6427c07f62 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Sat, 7 Nov 2020 20:06:18 +0300 Subject: [PATCH 04/98] fix: remove support for streams in responses Streams were available in Node only because fetch polyfill for browsers included with cross-fetch did not support them. Since our SDK aims to be universal, we need to make sure that the feature set is exactly the same across platforms. --- src/core/API/Node.ts | 10 +++++----- src/core/API/Response.ts | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/core/API/Node.ts b/src/core/API/Node.ts index 9898d8c..8da8e2e 100644 --- a/src/core/API/Node.ts +++ b/src/core/API/Node.ts @@ -116,7 +116,7 @@ export class Node { const response = await this._fetch(new Request(url.toString())); const config = { cache: this._cache, console: this._console, fetch: this._fetch }; - return new Response({ ...config, response }); + return new Response({ ...config, ...response, body: await response.text() }); } /** @@ -132,7 +132,7 @@ export class Node { const response = await this._fetch(request); const config = { cache: this._cache, console: this._console, fetch: this._fetch }; - return new Response({ ...config, response }); + return new Response({ ...config, ...response, body: await response.text() }); } /** @@ -148,7 +148,7 @@ export class Node { const response = await this._fetch(request); const config = { cache: this._cache, console: this._console, fetch: this._fetch }; - return new Response({ ...config, response }); + return new Response({ ...config, ...response, body: await response.text() }); } /** @@ -164,7 +164,7 @@ export class Node { const response = await this._fetch(request); const config = { cache: this._cache, console: this._console, fetch: this._fetch }; - return new Response({ ...config, response }); + return new Response({ ...config, ...response, body: await response.text() }); } /** @@ -179,7 +179,7 @@ export class Node { const response = await this._fetch(request); const config = { cache: this._cache, console: this._console, fetch: this._fetch }; - return new Response({ ...config, response }); + return new Response({ ...config, ...response, body: await response.text() }); } /** diff --git a/src/core/API/Response.ts b/src/core/API/Response.ts index 8050123..2793ddd 100644 --- a/src/core/API/Response.ts +++ b/src/core/API/Response.ts @@ -9,15 +9,15 @@ import type { Query } from '../Query'; import type { Resource } from '../Resource'; /** Options of {@link Response} constructor. */ -type Init = { +type Init = ConstructorParameters[1] & { /** Custom Fetch API implementation for making authenticated requests. */ fetch: Window['fetch']; /** Resolver cache implementing [Web Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API). */ cache: Storage; /** Shared [Consola](https://github.com/nuxt-contrib/consola) instance. */ console: Consola; - /** Original API [Response](https://developer.mozilla.org/en-US/docs/Web/API/Response) object. */ - response: globalThis.Response; + /** Response body. Streams aren't supported at the moment: https://github.com/github/fetch/issues/746#issuecomment-573701120. */ + body: Blob | BufferSource | FormData | URLSearchParams | string | null; }; /** @@ -49,7 +49,7 @@ function getEmbeds(json: object) { * @returns Enriched JSON including followable links. */ function addFollowableLinks | undefined>( - params: Omit & { json: unknown } + params: Pick & { json: unknown } ): Resource { const { json, ...nodeInit } = params; if (typeof json !== 'object' || !json) return json as Resource; @@ -102,8 +102,8 @@ export class Response< /** Resolver cache implementing [Web Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API). */ protected readonly _cache: Storage; - constructor({ response, console, fetch, cache }: Init) { - super(response.body, response); + constructor({ console, fetch, cache, body, ...responseInit }: Init) { + super(body, responseInit); this._console = console; this._fetch = fetch; From 6908d4c72f9fc1ebeb24ad1768819a14d5c460d2 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Sat, 7 Nov 2020 20:09:42 +0300 Subject: [PATCH 05/98] fix: fix fetch override in universal apis --- src/admin/API.ts | 28 ++++++++++++++-------------- src/customer/API.ts | 36 ++++++++++++++++++++---------------- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/src/admin/API.ts b/src/admin/API.ts index 172aef6..104ad0e 100644 --- a/src/admin/API.ts +++ b/src/admin/API.ts @@ -25,7 +25,7 @@ export class API extends Core.API { * @param init Client configuration (same as for {@link BrowserAPI}). */ constructor(init: Init) { - super(init); + super({ ...init, fetch: (...args) => this.__fetch(...args) }); this.__auth.configure({ identityPoolId: init.identityPoolId, @@ -36,19 +36,6 @@ export class API extends Core.API { }); } - async fetch(input: RequestInfo, init?: RequestInit): Promise { - const session = await this.__auth.currentSession().catch(() => null); - const headers = new Headers(init?.headers); - const method = init?.method?.toUpperCase() ?? 'GET'; - const url = typeof input === 'string' ? input : input.url; - - headers.set('Content-Type', 'application/json'); - if (session !== null) headers.set('Authorization', `Bearer ${session.getAccessToken().getJwtToken()}`); - - this.console.trace(`${method} ${url}`); - return fetch(input, { ...init, headers }); - } - async signIn(credentials: Credentials): Promise { let user: { challengeName: string; challengeParam: Record }; @@ -92,4 +79,17 @@ export class API extends Core.API { await this.__auth.signOut(); this.storage.clear(); } + + private async __fetch(input: RequestInfo, init?: RequestInit): Promise { + const session = await this.__auth.currentSession().catch(() => null); + const headers = new Headers(init?.headers); + const method = init?.method?.toUpperCase() ?? 'GET'; + const url = typeof input === 'string' ? input : input.url; + + headers.set('Content-Type', 'application/json'); + if (session !== null) headers.set('Authorization', `Bearer ${session.getAccessToken().getJwtToken()}`); + + this.console.trace(`${method} ${url}`); + return fetch(input, { ...init, headers }); + } } diff --git a/src/customer/API.ts b/src/customer/API.ts index 0c8db40..adfd60c 100644 --- a/src/customer/API.ts +++ b/src/customer/API.ts @@ -1,7 +1,7 @@ import * as Core from '../core'; import type { Credentials, Session } from './types'; +import { Headers, fetch } from 'cross-fetch'; import type { Graph } from './Graph'; -import { fetch } from 'cross-fetch'; export class API extends Core.API { static readonly AUTH_EXPIRES = 'fx.customer.expires'; @@ -12,21 +12,8 @@ export class API extends Core.API { static readonly AUTH_JWT = 'fx.customer.jwt'; - async fetch(input: RequestInfo, init?: RequestInit): Promise { - const headers = new Headers(init?.headers); - const method = init?.method?.toUpperCase() ?? 'GET'; - const token = this.storage.getItem(API.AUTH_TOKEN); - const url = typeof input === 'string' ? input : input.url; - - headers.set('Content-Type', 'application/json'); - if (token !== null) headers.set(API.AUTH_HEADER, token); - - this.console.trace(`${method} ${url}`); - const response = await fetch(input, { ...init, headers }); - const freshToken = response.headers.get(API.AUTH_HEADER); - if (freshToken !== null) this.storage.setItem(API.AUTH_TOKEN, freshToken); - - return response; + constructor(params: ConstructorParameters[0]) { + super({ ...params, fetch: (...args) => this.__fetch(...args) }); } async signIn(credentials: Credentials): Promise { @@ -81,4 +68,21 @@ export class API extends Core.API { async signOut(): Promise { this.storage.clear(); } + + private async __fetch(input: RequestInfo, init?: RequestInit): Promise { + const headers = new Headers(init?.headers); + const method = init?.method?.toUpperCase() ?? 'GET'; + const token = this.storage.getItem(API.AUTH_TOKEN); + const url = typeof input === 'string' ? input : input.url; + + headers.set('Content-Type', 'application/json'); + if (token !== null) headers.set(API.AUTH_HEADER, token); + + this.console.trace(`${method} ${url}`); + const response = await fetch(url, { ...init, headers }); + const freshToken = response.headers.get(API.AUTH_HEADER); + if (freshToken !== null) this.storage.setItem(API.AUTH_TOKEN, freshToken); + + return response; + } } From 8e446e654adfd6e7866b0ef16ff03dce58523a72 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Mon, 9 Nov 2020 18:40:40 +0300 Subject: [PATCH 06/98] build: setup test runner --- .npmignore | 2 +- package-lock.json | 3535 +++++++++++++++++++++++++++++++++++++-------- package.json | 37 +- tsconfig.json | 7 +- 4 files changed, 2931 insertions(+), 650 deletions(-) diff --git a/.npmignore b/.npmignore index 2ee73a5..6e562b3 100644 --- a/.npmignore +++ b/.npmignore @@ -1,6 +1,6 @@ !dist/ src/ -test/ +tests/ .vscode/ .coverage/ .eslintrc.json diff --git a/package-lock.json b/package-lock.json index d413bdf..498b53f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -601,12 +601,183 @@ "@babel/highlight": "^7.10.4" } }, + "@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, "@babel/helper-validator-identifier": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, + "@babel/helpers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, "@babel/highlight": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", @@ -631,6 +802,120 @@ } } }, + "@babel/parser": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", + "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==", + "dev": true + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/runtime": { "version": "7.12.5", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", @@ -650,6 +935,69 @@ "regenerator-runtime": "^0.13.4" } }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", + "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.5", + "@babel/types": "^7.12.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, "@commitlint/execute-rule": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-11.0.0.tgz", @@ -754,54 +1102,324 @@ "eslint-plugin-typescript-sort-keys": "^1.5.0" } }, - "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } } }, - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", "dev": true }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - } - }, - "@octokit/auth-token": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.3.tgz", - "integrity": "sha512-fdGoOQ3kQJh+hrilc0Plg50xSfaCKOeYN9t6dpJKXN9BxhhfquL0OzoQXg3spLYymL5rm29uPeI3KEXRaZQ9zg==", + "@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", "dev": true, "requires": { - "@octokit/types": "^5.0.0" + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" } }, - "@octokit/core": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-2.5.4.tgz", - "integrity": "sha512-HCp8yKQfTITYK+Nd09MHzAlP1v3Ii/oCohv0/TW9rhSLvzb98BOVs2QmVYuloE6a3l6LsfyGIwb6Pc4ycgWlIQ==", + "@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", "dev": true, "requires": { - "@octokit/auth-token": "^2.4.0", - "@octokit/graphql": "^4.3.1", - "@octokit/request": "^5.4.0", - "@octokit/types": "^5.0.0", - "before-after-hook": "^2.1.0", - "universal-user-agent": "^5.0.0" - } + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + } + }, + "@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + } + }, + "@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + } + }, + "@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "dev": true, + "requires": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + } + }, + "@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + } + }, + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, + "@octokit/auth-token": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.3.tgz", + "integrity": "sha512-fdGoOQ3kQJh+hrilc0Plg50xSfaCKOeYN9t6dpJKXN9BxhhfquL0OzoQXg3spLYymL5rm29uPeI3KEXRaZQ9zg==", + "dev": true, + "requires": { + "@octokit/types": "^5.0.0" + } + }, + "@octokit/core": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-2.5.4.tgz", + "integrity": "sha512-HCp8yKQfTITYK+Nd09MHzAlP1v3Ii/oCohv0/TW9rhSLvzb98BOVs2QmVYuloE6a3l6LsfyGIwb6Pc4ycgWlIQ==", + "dev": true, + "requires": { + "@octokit/auth-token": "^2.4.0", + "@octokit/graphql": "^4.3.1", + "@octokit/request": "^5.4.0", + "@octokit/types": "^5.0.0", + "before-after-hook": "^2.1.0", + "universal-user-agent": "^5.0.0" + } }, "@octokit/endpoint": { "version": "6.0.9", @@ -1220,12 +1838,71 @@ } } }, + "@sinonjs/commons": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, + "@types/babel__core": { + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", + "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.3.tgz", + "integrity": "sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.15.tgz", + "integrity": "sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, "@types/cookie": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz", @@ -1262,6 +1939,49 @@ "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==", "dev": true }, + "@types/graceful-fs": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", + "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "26.0.15", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.15.tgz", + "integrity": "sha512-s2VMReFXRg9XXxV+CW9e5Nz8fH2K1aEhwgjUqPPbQd7g95T0laAcvLv032EhFHIa5GHsZ8W7iJEQVaJq6k3Gog==", + "dev": true, + "requires": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, "@types/jsdom": { "version": "16.2.5", "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.5.tgz", @@ -1317,12 +2037,24 @@ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" }, + "@types/prettier": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz", + "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==", + "dev": true + }, "@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, "@types/tough-cookie": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz", @@ -1333,6 +2065,21 @@ "resolved": "https://registry.npmjs.org/@types/traverse/-/traverse-0.6.32.tgz", "integrity": "sha512-RBz2uRZVCXuMg93WD//aTS5B120QlT4lR/gL+935QtGsKHLS6sCtZBaKfWjIfk7ZXv/r8mtGbwjVIee6/3XTow==" }, + "@types/yargs": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "dev": true + }, "@typescript-eslint/eslint-plugin": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.6.1.tgz", @@ -1761,6 +2508,16 @@ "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", "dev": true }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1919,6 +2676,22 @@ "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", "dev": true }, + "babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "dev": true, + "requires": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + } + }, "babel-loader": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", @@ -1931,6 +2704,61 @@ "schema-utils": "^2.6.5" } }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.0.tgz", + "integrity": "sha512-mGkvkpocWJes1CmMKtgGUwCeeq0pOhALyymozzDWYomHTbDLwueDYG6p4TK1YOeYHCzBzYPsWkgTto10JubI1Q==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, "backbone": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.4.0.tgz", @@ -2067,6 +2895,24 @@ "node-releases": "^1.1.65" } }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, "buffer": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", @@ -2145,6 +2991,15 @@ "integrity": "sha512-z7qztybA2eFZTB6Z3yvaQBIoJpQtsewRD74adw2UbRWwsRq3jIPvgrQGawBMbfafekQaD21FWuXNcywtTDGGCw==", "dev": true }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, "cardinal": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", @@ -2211,6 +3066,12 @@ } } }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -2232,6 +3093,12 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, + "cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "dev": true + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -2403,6 +3270,18 @@ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -2706,11 +3585,28 @@ } } }, - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" - }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -2941,6 +3837,12 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -3014,6 +3916,18 @@ "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", "dev": true }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -3186,6 +4100,12 @@ "integrity": "sha512-rQItBTFnol20HaaLm26UgSUduX7iGerwW7pEYX17MB1tI6LzFajiLV7iZ7LVcUcsN/7HrZUoCLrBauChy/IqEg==", "dev": true }, + "emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "dev": true + }, "emoji-regex": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.0.tgz", @@ -3589,6 +4509,15 @@ } } }, + "eslint-plugin-jest": { + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.1.0.tgz", + "integrity": "sha512-827YJ+E8B9PvXu/0eiVSNFfxxndbKv+qE/3GSMhdorCaeaOehtqHGX2YDW9B85TEOre9n/zscledkFW/KbnyGg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "^4.0.1" + } + }, "eslint-plugin-jsdoc": { "version": "30.7.7", "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-30.7.7.tgz", @@ -3808,6 +4737,12 @@ "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", "dev": true }, + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "dev": true + }, "execa": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", @@ -3842,6 +4777,12 @@ } } }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -3901,6 +4842,46 @@ "homedir-polyfill": "^1.0.1" } }, + "expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -4051,6 +5032,15 @@ "reusify": "^1.0.4" } }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -4355,6 +5345,13 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.2.1.tgz", + "integrity": "sha512-bTLYHSeC0UH/EFXS9KqWnXuOl/wHK5Z/d+ghd5AsFMYN7wIGkUCOJyzy88+wJKkZPGON8u4Z9f6U4FdgURE9qA==", + "dev": true, + "optional": true + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -4367,6 +5364,12 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -4390,6 +5393,12 @@ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "dev": true }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, "get-stdin": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", @@ -4547,6 +5556,13 @@ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true, + "optional": true + }, "handlebars": { "version": "4.7.6", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", @@ -4688,6 +5704,12 @@ "whatwg-encoding": "^1.0.5" } }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, "htmlparser2": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", @@ -5078,6 +6100,15 @@ "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", "dev": true }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, "is-core-module": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", @@ -5132,6 +6163,13 @@ } } }, + "is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "dev": true, + "optional": true + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -5150,6 +6188,12 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", @@ -5259,6 +6303,16 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "optional": true, + "requires": { + "is-docker": "^2.0.0" + } + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -5303,21 +6357,41 @@ "lodash.uniqby": "^4.7.0" } }, - "java-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", "dev": true }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, "dependencies": { "has-flag": { @@ -5326,6 +6400,21 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -5337,518 +6426,550 @@ } } }, - "jquery": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", - "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==", - "dev": true - }, - "js-cookie": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", - "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" - }, - "js-tokens": { + "istanbul-lib-source-maps": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsdoctypeparser": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz", - "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==", - "dev": true - }, - "jsdom": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", - "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, "requires": { - "abab": "^2.0.3", - "acorn": "^7.1.1", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.2.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.0", - "domexception": "^2.0.1", - "escodegen": "^1.14.1", - "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", - "nwsapi": "^2.2.0", - "parse5": "5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "saxes": "^5.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0", - "ws": "^7.2.3", - "xml-name-validator": "^3.0.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" } }, - "json-parse-better-errors": { + "java-properties": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", + "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", "dev": true }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "import-local": "^3.0.2", + "jest-cli": "^26.6.3" + }, + "dependencies": { + "jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + } + } + } }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + } }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + } }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, "requires": { - "minimist": "^1.2.0" + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" } }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "detect-newline": "^3.0.0" } }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "dev": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" } }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true + "jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + } }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" } }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", "dev": true }, - "lint-staged": { - "version": "10.5.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.1.tgz", - "integrity": "sha512-fTkTGFtwFIJJzn/PbUO3RXyEBHIhbfYBE7+rJyLcOXabViaO/h6OslgeK6zpeUtzkDrzkgyAYDTLAwx6JzDTHw==", + "jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "dev": true, "requires": { - "chalk": "^4.1.0", - "cli-truncate": "^2.1.0", - "commander": "^6.2.0", - "cosmiconfig": "^7.0.0", - "debug": "^4.2.0", - "dedent": "^0.7.0", - "enquirer": "^2.3.6", - "execa": "^4.1.0", - "listr2": "^3.2.2", - "log-symbols": "^4.0.0", + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", "micromatch": "^4.0.2", - "normalize-path": "^3.0.0", - "please-upgrade-node": "^3.2.0", - "string-argv": "0.3.1", - "stringify-object": "^3.3.0" + "sane": "^4.0.3", + "walker": "^1.0.7" } }, - "listr2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.2.2.tgz", - "integrity": "sha512-AajqcZEUikF2ioph6PfH3dIuxJclhr3i3kHgTOP0xeXdWQohrvJAAmqVcV43/GI987HFY/vzT73jYXoa4esDHg==", + "jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", "dev": true, "requires": { - "chalk": "^4.1.0", - "cli-truncate": "^2.1.0", - "figures": "^3.2.0", - "indent-string": "^4.0.0", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rxjs": "^6.6.3", - "through": "^2.3.8" - }, - "dependencies": { - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - } + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + } + }, + "jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "dev": true, + "requires": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" } }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" } }, - "loader-runner": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.1.0.tgz", - "integrity": "sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA==", - "dev": true - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dev": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" } }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "@jest/types": "^26.6.2", + "@types/node": "*" } }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", - "dev": true - }, - "lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=", - "dev": true - }, - "lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", - "dev": true - }, - "lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" - }, - "lodash.toarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", - "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", "dev": true }, - "lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", + "jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", "dev": true }, - "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", - "dev": true, - "requires": { - "chalk": "^4.0.0" - } - }, - "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "dev": true, "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" }, "dependencies": { - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "type-fest": "^0.11.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "p-locate": "^4.1.0" } }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "restore-cursor": "^3.1.0" + "p-limit": "^2.2.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "dev": true, "requires": { - "color-name": "~1.1.4" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } } }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" } - }, - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true } } }, - "longest": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", - "integrity": "sha1-eB4YMpaqlPbU2RbcM10NF676I/g=", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", "dev": true, "requires": { - "yallist": "^4.0.0" + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" } }, - "lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "macos-release": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz", - "integrity": "sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg==", - "dev": true - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + } + }, + "jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "dependencies": { + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + } } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true + "jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dev": true, + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + } }, - "map-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", - "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", - "dev": true + "jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "object-visit": "^1.0.0" + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" } }, - "marked": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.8.2.tgz", - "integrity": "sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw==", - "dev": true + "jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + } + } }, - "marked-terminal": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-4.1.0.tgz", - "integrity": "sha512-5KllfAOW02WS6hLRQ7cNvGOxvKW1BKuXELH4EtbWfyWgxQhROoMxEvuQ/3fTgkNjledR0J48F4HbapvYp1zWkQ==", + "jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", "dev": true, "requires": { - "ansi-escapes": "^4.3.1", - "cardinal": "^2.1.1", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "cli-table": "^0.3.1", - "node-emoji": "^1.10.0", - "supports-hyperlinks": "^2.1.0" + "jest-util": "^26.6.2", + "string-length": "^4.0.1" }, "dependencies": { "ansi-escapes": { @@ -5868,33 +6989,625 @@ } } }, - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" }, "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "has-flag": "^4.0.0" } - }, - "safe-buffer": { - "version": "5.1.2", + } + } + }, + "jquery": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", + "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==", + "dev": true + }, + "js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsdoctypeparser": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz", + "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==", + "dev": true + }, + "jsdom": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", + "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "requires": { + "abab": "^2.0.3", + "acorn": "^7.1.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.2.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.0", + "domexception": "^2.0.1", + "escodegen": "^1.14.1", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "saxes": "^5.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "lint-staged": { + "version": "10.5.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.1.tgz", + "integrity": "sha512-fTkTGFtwFIJJzn/PbUO3RXyEBHIhbfYBE7+rJyLcOXabViaO/h6OslgeK6zpeUtzkDrzkgyAYDTLAwx6JzDTHw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "commander": "^6.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.2.0", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^4.1.0", + "listr2": "^3.2.2", + "log-symbols": "^4.0.0", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + } + }, + "listr2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.2.2.tgz", + "integrity": "sha512-AajqcZEUikF2ioph6PfH3dIuxJclhr3i3kHgTOP0xeXdWQohrvJAAmqVcV43/GI987HFY/vzT73jYXoa4esDHg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "figures": "^3.2.0", + "indent-string": "^4.0.0", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.3", + "through": "^2.3.8" + }, + "dependencies": { + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + } + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "loader-runner": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.1.0.tgz", + "integrity": "sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", + "dev": true + }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=", + "dev": true + }, + "lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", + "dev": true + }, + "lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "dev": true + }, + "lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", + "dev": true + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "longest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", + "integrity": "sha1-eB4YMpaqlPbU2RbcM10NF676I/g=", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "macos-release": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz", + "integrity": "sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg==", + "dev": true + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "marked": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.8.2.tgz", + "integrity": "sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw==", + "dev": true + }, + "marked-terminal": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-4.1.0.tgz", + "integrity": "sha512-5KllfAOW02WS6hLRQ7cNvGOxvKW1BKuXELH4EtbWfyWgxQhROoMxEvuQ/3fTgkNjledR0J48F4HbapvYp1zWkQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.1", + "cardinal": "^2.1.1", + "chalk": "^4.0.0", + "cli-table": "^0.3.1", + "node-emoji": "^1.10.0", + "supports-hyperlinks": "^2.1.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true @@ -6284,6 +7997,49 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", + "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", + "dev": true, + "optional": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "optional": true + }, + "uuid": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", + "dev": true, + "optional": true + } + } + }, "node-releases": { "version": "1.1.65", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.65.tgz", @@ -10303,6 +12059,15 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, "pkg-conf": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", @@ -10420,6 +12185,44 @@ "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", "dev": true }, + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -10432,6 +12235,16 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -10509,6 +12322,12 @@ } } }, + "react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", + "dev": true + }, "react-native-get-random-values": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/react-native-get-random-values/-/react-native-get-random-values-1.5.0.tgz", @@ -10691,6 +12510,12 @@ "rc": "^1.2.8" } }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", @@ -10754,186 +12579,415 @@ "lodash": "^4.17.19" } }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "requireindex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.1.0.tgz", + "integrity": "sha1-5UBLgVV+91225JxacgBIk/4D4WI=", + "dev": true + }, + "resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "dev": true, + "requires": { + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "optional": true, + "requires": { + "global-dirs": "^0.1.1" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } + "glob": "^7.1.3" } }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true }, - "requireindex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.1.0.tgz", - "integrity": "sha1-5UBLgVV+91225JxacgBIk/4D4WI=", + "run-parallel": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", + "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", "dev": true }, - "resolve": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", - "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", "dev": true, "requires": { - "is-core-module": "^2.0.0", - "path-parse": "^1.0.6" + "tslib": "^1.9.0" } }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "resolve-from": "^5.0.0" + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" }, "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "dev": true, - "optional": true, - "requires": { - "global-dirs": "^0.1.1" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", - "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", - "dev": true - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, "saxes": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", @@ -11220,6 +13274,13 @@ "rechoir": "^0.6.2" } }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true, + "optional": true + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -11250,6 +13311,12 @@ } } }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -11522,6 +13589,23 @@ "tweetnacl": "~0.14.0" } }, + "stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -11596,6 +13680,16 @@ "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true }, + "string-length": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -11860,6 +13954,33 @@ } } }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, "terser": { "version": "5.3.8", "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.8.tgz", @@ -11921,6 +14042,17 @@ } } }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, "text-extensions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", @@ -11933,6 +14065,12 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -11990,6 +14128,18 @@ "os-tmpdir": "~1.0.2" } }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -12080,6 +14230,54 @@ "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", "dev": true }, + "ts-jest": { + "version": "26.4.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.4.4.tgz", + "integrity": "sha512-3lFWKbLxJm34QxyVNNCgXX1u4o/RV0myvA2y2Bxm46iGIjKlaY0own9gIckbjZJPn+WaJEnfPPJ20HHGpoq4yg==", + "dev": true, + "requires": { + "@types/jest": "26.x", + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^26.1.0", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "mkdirp": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "dependencies": { + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + } + } + }, "ts-loader": { "version": "8.0.9", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.9.tgz", @@ -12159,12 +14357,27 @@ "prelude-ls": "~1.1.2" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, "typedoc": { "version": "0.17.0-3", "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.17.0-3.tgz", @@ -12375,6 +14588,25 @@ "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", "dev": true }, + "v8-to-istanbul": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.0.0.tgz", + "integrity": "sha512-fLL2rFuQpMtm9r8hrAV2apXX/WqHJ6+IC4/eQVdMDGBUgH/YMV4Gv3duk3kjmyg6uiQWBAA9nJwue4iJUOkHeA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -12411,6 +14643,15 @@ "xml-name-validator": "^3.0.0" } }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, "watchpack": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.0.1.tgz", @@ -12832,6 +15073,18 @@ "mkdirp": "^0.5.1" } }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, "ws": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", diff --git a/package.json b/package.json index 8182149..82c75cb 100755 --- a/package.json +++ b/package.json @@ -9,6 +9,8 @@ "dist" ], "scripts": { + "test": "jest", + "test:watch": "jest --watch", "lint": "npm run lint:eslint && npm run lint:prettier", "lint:eslint": "eslint --ext .ts,.html . --ignore-path .gitignore", "lint:prettier": "prettier \"**/*.ts\" --check --ignore-path .gitignore", @@ -44,15 +46,20 @@ "homepage": "https://sdk.foxy.dev", "devDependencies": { "@foxy.io/eslint-config": "^1.0.0", + "@types/jest": "^26.0.15", + "@types/node": "^14.14.6", "copyfiles": "^2.4.0", "cz-conventional-changelog": "^3.3.0", "eslint": "^7.12.1", + "eslint-plugin-jest": "^24.1.0", "husky": "^4.3.0", + "jest": "^26.6.3", "lint-staged": "^10.4.0", "npm-run-all": "^4.1.5", "prettier": "^2.1.2", "rimraf": "^3.0.2", "semantic-release": "^17.2.2", + "ts-jest": "^26.4.4", "ts-loader": "^8.0.9", "typedoc": "0.17.0-3", "typescript": "^4.0.3", @@ -64,7 +71,11 @@ "node": ">=10 <=15" }, "eslintConfig": { - "extends": "@foxy.io" + "extends": [ + "@foxy.io", + "plugin:jest/recommended", + "plugin:jest/style" + ] }, "lint-staged": { "{src,test}/**/*.ts": "eslint --cache --fix" @@ -89,6 +100,29 @@ "pre-commit": "lint-staged" } }, + "jest": { + "preset": "ts-jest", + "testEnvironment": "node", + "testMatch": [ + "**/*.test.ts" + ], + "collectCoverage": true, + "coverageProvider": "v8", + "coveragePathIgnorePatterns": [ + "\\.d\\.ts" + ], + "collectCoverageFrom": [ + "src/**/*.ts" + ], + "coverageThreshold": { + "global": { + "branches": 80, + "functions": 80, + "statements": 80, + "lines": 80 + } + } + }, "release": { "branches": [ "main", @@ -102,7 +136,6 @@ "@aws-amplify/auth": "^3.4.4", "@types/crypto-js": "^3.1.47", "@types/jsdom": "^16.2.5", - "@types/node": "^14.11.1", "@types/traverse": "^0.6.32", "babel-loader": "^8.1.0", "consola": "^2.15.0", diff --git a/tsconfig.json b/tsconfig.json index dd40df8..6232db3 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,9 +1,4 @@ { - "ts-node": { - "compilerOptions": { - "module": "commonjs" - } - }, "compilerOptions": { "esModuleInterop": true, "isolatedModules": true, @@ -14,5 +9,5 @@ "moduleResolution": "node", "lib": ["ES2015", "DOM", "DOM.Iterable"] }, - "include": ["src"] + "include": ["src", "tests"] } From 2778d8ae48fa219158d60755fff79c9e785a0900 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Mon, 9 Nov 2020 18:40:57 +0300 Subject: [PATCH 07/98] docs: add a note to readme about testing --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 7dcf4a0..2f79640 100755 --- a/README.md +++ b/README.md @@ -119,4 +119,11 @@ You can also build this package and test it locally in another project by runnin npm pack ``` +Use the following commands to run tests: + +```bash +npm test # run all tests +npm run test:watch # watch files for changes and re-run relevant tests +``` + All the latest features are published from the [beta](https://github.com/Foxy/foxy-sdk/tree/beta) branch to the `beta` distribution channel. If you submit a PR, please target `beta` as well. Releases are published from [main](https://github.com/Foxy/foxy-sdk/tree/main). From 400ff02c517741a0d7f5429df842b8da7347902f Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Mon, 9 Nov 2020 19:30:20 +0300 Subject: [PATCH 08/98] feat: add argument validation to resolution error --- package-lock.json | 5 +++++ package.json | 3 ++- src/core/API/ResolutionError.ts | 4 ++++ src/v8n.d.ts | 1 + 4 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 src/v8n.d.ts diff --git a/package-lock.json b/package-lock.json index 498b53f..1d8bec8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14607,6 +14607,11 @@ } } }, + "v8n": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/v8n/-/v8n-1.3.3.tgz", + "integrity": "sha512-5w0/blXdz5idt+TJj72Vs69HcRYDARRWFami3bj7TLx8qvOVpyL3D3wdnXVrPLWvSApfVe2vBV54V16QYVlJnA==" + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", diff --git a/package.json b/package.json index 82c75cb..06c64e0 100755 --- a/package.json +++ b/package.json @@ -143,6 +143,7 @@ "crypto-js": "^4.0.0", "jsdom": "^16.4.0", "ministorage": "^1.0.0", - "traverse": "^0.6.6" + "traverse": "^0.6.6", + "v8n": "^1.3.3" } } diff --git a/src/core/API/ResolutionError.ts b/src/core/API/ResolutionError.ts index d3b9290..a1682fb 100644 --- a/src/core/API/ResolutionError.ts +++ b/src/core/API/ResolutionError.ts @@ -1,3 +1,6 @@ +import { Response } from 'cross-fetch'; +import v8n from 'v8n'; + /** * This error is thrown when one of the requests for a resource * in a path returns a non-2XX status code during the URL resolution process. @@ -10,6 +13,7 @@ export class ResolutionError extends Error { constructor(response: Response) { super(); + v8n().instanceOf(Response).check(response); this.response = response; } } diff --git a/src/v8n.d.ts b/src/v8n.d.ts new file mode 100644 index 0000000..1801ec7 --- /dev/null +++ b/src/v8n.d.ts @@ -0,0 +1 @@ +declare module 'v8n'; From 2ea9eac0ef6075aceb3599dba23aec3a0d2558ac Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Mon, 9 Nov 2020 19:30:40 +0300 Subject: [PATCH 09/98] test: add tests for resolution error --- tests/core/API/ResolutionError.test.ts | 29 ++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 tests/core/API/ResolutionError.test.ts diff --git a/tests/core/API/ResolutionError.test.ts b/tests/core/API/ResolutionError.test.ts new file mode 100644 index 0000000..0290a80 --- /dev/null +++ b/tests/core/API/ResolutionError.test.ts @@ -0,0 +1,29 @@ +import { ResolutionError } from '../../../src/core/API/ResolutionError'; +import { Response } from 'cross-fetch'; + +describe('Core', () => { + describe('API', () => { + describe('ResolutionError', () => { + let response: Response; + let error: ResolutionError; + + beforeEach(() => { + response = new Response(); + error = new ResolutionError(response); + }); + + it('extends Error', () => { + expect(error).toBeInstanceOf(Error); + }); + + it('stores response in the .response property', () => { + expect(error).toHaveProperty('response', response); + }); + + it('errors when constructed with incorrect arguments', () => { + const incorrectArgument = (null as unknown) as Response; + expect(() => new ResolutionError(incorrectArgument)).toThrow(); + }); + }); + }); +}); From 6f1d8c99a8b206600e015782580a23480a3bbdce Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Mon, 9 Nov 2020 19:47:21 +0300 Subject: [PATCH 10/98] feat: expose v8n in resolution error class --- src/core/API/ResolutionError.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/core/API/ResolutionError.ts b/src/core/API/ResolutionError.ts index a1682fb..e22a798 100644 --- a/src/core/API/ResolutionError.ts +++ b/src/core/API/ResolutionError.ts @@ -8,12 +8,17 @@ import v8n from 'v8n'; * to indicate resolution errors. */ export class ResolutionError extends Error { + /** Available class member validators. */ + static readonly v8n = { + constructor: v8n().instanceOf(Response), + }; + /** API response object with a non-2XX status code. */ readonly response: Response; constructor(response: Response) { super(); - v8n().instanceOf(Response).check(response); + ResolutionError.v8n.constructor.check(response); this.response = response; } } From 5df0d84273128d276159b68e83f9ce852a5a112e Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Mon, 9 Nov 2020 19:57:54 +0300 Subject: [PATCH 11/98] feat: add argument validation to auth error --- src/core/API/AuthError.ts | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/core/API/AuthError.ts b/src/core/API/AuthError.ts index 4f18397..80133dd 100644 --- a/src/core/API/AuthError.ts +++ b/src/core/API/AuthError.ts @@ -1,3 +1,5 @@ +import v8n from 'v8n'; + /** Constructor parameters of the {@link UniversalAPIAuthError} class. */ type AuthErrorParams = { code: UniversalAPIAuthErrorCode; @@ -26,16 +28,28 @@ export class AuthError extends Error { /** Any other or internal error that interrupted authentication. */ static readonly UNKNOWN = 'UNKNOWN'; + /** Available class member validators. */ + static readonly v8n = { + constructor: v8n().schema({ + code: v8n().passesAnyOf( + v8n().exact(AuthError.NEW_PASSWORD_REQUIRED), + v8n().exact(AuthError.UNAUTHORIZED), + v8n().exact(AuthError.UNKNOWN) + ), + }), + }; + /** Exception that triggered this error, if present. */ readonly originalError?: unknown; /** Error code (see static constants on this class for possible values). */ readonly code: UniversalAPIAuthErrorCode; - constructor({ code, originalError }: AuthErrorParams) { - super(`authentication failed with code ${code}`); + constructor(params: AuthErrorParams) { + AuthError.v8n.constructor.check(params); + super(`authentication failed with code ${params.code}`); - this.originalError = originalError; - this.code = code; + this.originalError = params.originalError; + this.code = params.code; } } From 489861308c37fce67d2b1220158b6f8d511d6c98 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Mon, 9 Nov 2020 19:58:06 +0300 Subject: [PATCH 12/98] test: add tests for auth error --- tests/core/API/AuthError.test.ts | 35 ++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 tests/core/API/AuthError.test.ts diff --git a/tests/core/API/AuthError.test.ts b/tests/core/API/AuthError.test.ts new file mode 100644 index 0000000..bc2ac1c --- /dev/null +++ b/tests/core/API/AuthError.test.ts @@ -0,0 +1,35 @@ +import { AuthError } from '../../../src/core/API/AuthError'; + +describe('Core', () => { + describe('API', () => { + describe('AuthError', () => { + it('exposes error codes as static members', () => { + expect(AuthError).toHaveProperty('NEW_PASSWORD_REQUIRED'); + expect(AuthError).toHaveProperty('UNAUTHORIZED'); + expect(AuthError).toHaveProperty('UNKNOWN'); + }); + + it('extends Error', () => { + const error = new AuthError({ code: AuthError.UNKNOWN }); + expect(error).toBeInstanceOf(Error); + }); + + it('stores error code in the .code property', () => { + const code = AuthError.UNAUTHORIZED; + const error = new AuthError({ code }); + expect(error).toHaveProperty('code', code); + }); + + it('stores undefined in the .originalError property when constructed without params.originalError', () => { + const error = new AuthError({ code: AuthError.UNKNOWN }); + expect(error).toHaveProperty('originalError', undefined); + }); + + it('stores provided value in the .originalError property when constructed with params.originalError', () => { + const originalError = new Error(); + const error = new AuthError({ code: AuthError.UNKNOWN, originalError }); + expect(error).toHaveProperty('originalError', originalError); + }); + }); + }); +}); From d0255eec6d239a17bdd4da1af2ec8790e5c1593f Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Mon, 9 Nov 2020 20:40:50 +0300 Subject: [PATCH 13/98] build: ignore desktop service store files --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index cda5804..04c11db 100644 --- a/.gitignore +++ b/.gitignore @@ -117,3 +117,6 @@ docs .yarn/build-state.yml .yarn/install-state.gz .pnp.* + +# misc +**/.DS_Store \ No newline at end of file From b95925018e6391183ba3fed258b68453514a153e Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Mon, 9 Nov 2020 20:53:04 +0300 Subject: [PATCH 14/98] style: fix eslint errors in sso helper --- src/integration/createSSOURL.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/integration/createSSOURL.ts b/src/integration/createSSOURL.ts index a59411d..c7fbc29 100644 --- a/src/integration/createSSOURL.ts +++ b/src/integration/createSSOURL.ts @@ -1,6 +1,7 @@ -import { URL } from 'url'; import * as crypto from 'crypto'; +import { URL } from 'url'; + interface Options { /** * Integer, epoch time. The future time that this authentication token will expire. @@ -62,8 +63,9 @@ interface Options { * * @param options sso url configuration * @tutorial https://docs.foxycart.com/v/2.0/sso#the_details + * @returns SSO URL as string. */ -export function createSSOURL(options: Options) { +export function createSSOURL(options: Options): string { const timestamp = options.timestamp ?? Date.now(); const decodedToken = `${options.customer}|${timestamp}|${options.secret}`; const encodedToken = crypto.createHash('sha1').update(decodedToken); From 53ec0accd8ee923fb416a58cd0e5d6e77d94fead Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Mon, 9 Nov 2020 21:00:53 +0300 Subject: [PATCH 15/98] feat: add argument validation to sso helper --- src/integration/createSSOURL.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/integration/createSSOURL.ts b/src/integration/createSSOURL.ts index c7fbc29..27d74a6 100644 --- a/src/integration/createSSOURL.ts +++ b/src/integration/createSSOURL.ts @@ -1,6 +1,7 @@ import * as crypto from 'crypto'; import { URL } from 'url'; +import v8n from 'v8n'; interface Options { /** @@ -50,6 +51,14 @@ interface Options { domain: string; } +const optionsV8N = v8n().schema({ + customer: v8n().number(), + domain: v8n().string(), + secret: v8n().string(), + session: v8n().optional(v8n().string()), + timestamp: v8n().optional(v8n().number()), +}); + /** * Generates an SSO url for the given configuration. * @@ -66,6 +75,8 @@ interface Options { * @returns SSO URL as string. */ export function createSSOURL(options: Options): string { + optionsV8N.check(options); + const timestamp = options.timestamp ?? Date.now(); const decodedToken = `${options.customer}|${timestamp}|${options.secret}`; const encodedToken = crypto.createHash('sha1').update(decodedToken); From 84cdbe04a413048494dbfd4afdaf691b6c0ebe71 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Mon, 9 Nov 2020 21:01:10 +0300 Subject: [PATCH 16/98] test: add tests for sso helper --- tests/integration/createSSOURL.test.ts | 57 ++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 tests/integration/createSSOURL.test.ts diff --git a/tests/integration/createSSOURL.test.ts b/tests/integration/createSSOURL.test.ts new file mode 100644 index 0000000..fd747e3 --- /dev/null +++ b/tests/integration/createSSOURL.test.ts @@ -0,0 +1,57 @@ +import { createSSOURL } from '../../src/integration/createSSOURL'; + +describe('Integration', () => { + describe('createSSOURL', () => { + beforeAll(() => jest.spyOn(Date, 'now').mockImplementation(() => 1585402055672)); + + it('errors with incorrect params', () => { + const incorrectParams = ({ + customer: 'oh no, it is a string!', + domain: 321, + secret: {}, + session: 456, + timestamp: 'i am not a unix timestamp', + } as unknown) as Parameters[0]; + + expect(() => createSSOURL(incorrectParams)).toThrow(); + }); + + it('works with required params', () => { + const url = createSSOURL({ + customer: 12345, + domain: 'https://foxy-demo.foxycart.com', + secret: 'yes, very', + }); + + expect(url).toBe( + 'https://foxy-demo.foxycart.com/checkout?fc_customer_id=12345&fc_auth_token=097e56e8db16788ec90b4857439098adc3fa8cb2×tamp=1585402055672' + ); + }); + + it('explicitly sets the timestamp if provided', () => { + const url = createSSOURL({ + customer: 12345, + domain: 'https://foxy-demo.foxycart.com', + secret: 'yes, very', + timestamp: 1595406051672, + }); + + expect(url).toBe( + 'https://foxy-demo.foxycart.com/checkout?fc_customer_id=12345&fc_auth_token=2682b3c43e97c98efbe7102e5f46aea5ee81834c×tamp=1595406051672' + ); + }); + + it('sets fcsid query param if session value is passed in', () => { + const url = createSSOURL({ + customer: 12345, + domain: 'https://foxy-demo.foxycart.com', + secret: 'yes, very', + session: 'so_awesomely_unique', + }); + + expect(url).toBe( + 'https://foxy-demo.foxycart.com/checkout?fc_customer_id=12345&fc_auth_token=097e56e8db16788ec90b4857439098adc3fa8cb2×tamp=1585402055672&fcsid=so_awesomely_unique' + ); + }); + }); +}); From 554542be0317dbc7591490388485f3d0dd9cc223 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Mon, 9 Nov 2020 21:08:47 +0300 Subject: [PATCH 17/98] build: remove tests folder from tsconfig --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 6232db3..8609be2 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,5 +9,5 @@ "moduleResolution": "node", "lib": ["ES2015", "DOM", "DOM.Iterable"] }, - "include": ["src", "tests"] + "include": ["src"] } From 0c3161600bb2b5d386516d2220cda11e573895f6 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Mon, 9 Nov 2020 21:09:01 +0300 Subject: [PATCH 18/98] style: remove double spaces --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 06c64e0..8855b7c 100755 --- a/package.json +++ b/package.json @@ -18,8 +18,8 @@ "format:eslint": "eslint --ext .ts,.html . --fix --ignore-path .gitignore", "format:prettier": "prettier \"**/*.ts\" --write --ignore-path .gitignore", "build:cdn": "webpack", - "build:cjs": "tsc --module commonjs --outdir \"dist/cjs\"", - "build:esm": "tsc --module es2015 --outdir \"dist/esm\"", + "build:cjs": "tsc --module commonjs --outdir \"dist/cjs\"", + "build:esm": "tsc --module es2015 --outdir \"dist/esm\"", "build:docs": "typedoc --excludePrivate --ignoreCompilerErrors --mode library --out docs src/index.ts", "build:types": "tsc --declarationdir \"dist/types\" --declaration --emitdeclarationonly && copyfiles --up 1 \"./src/**/*.d.ts\" \"./dist/types\"", "prepack": "rimraf dist && run-p \"build:!(docs)\"" From d87865977ddce76168b2af238f906633a336c1d2 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 14:23:54 +0300 Subject: [PATCH 19/98] docs: update webhook verification docs --- src/integration/verifyWebhookSignature.ts | 42 ++++++----------------- 1 file changed, 10 insertions(+), 32 deletions(-) diff --git a/src/integration/verifyWebhookSignature.ts b/src/integration/verifyWebhookSignature.ts index ad8634c..e9016ac 100755 --- a/src/integration/verifyWebhookSignature.ts +++ b/src/integration/verifyWebhookSignature.ts @@ -1,44 +1,22 @@ import * as crypto from 'crypto'; -export interface VerificationParams { - /** - * The `Foxy-Webhook-Signature` header value received with the webhook. - * - * @see https://wiki.foxycart.com/v/2.0/webhooks - */ +interface Webhook { + /** The `Foxy-Webhook-Signature` header value received with the webhook. */ signature: string; - - /** - * The serialized (string) request body received with the webhook. - * - * @see https://wiki.foxycart.com/v/2.0/webhooks - */ + /** The serialized (string) request body received with the webhook. */ payload: string; - - /** - * The encryption key for this particular webhook. - * - * @see https://wiki.foxycart.com/v/2.0/webhooks - */ + /** The encryption key for this particular webhook. */ key: string; } /** * Verifies that the webhook your app has received was indeed sent from our servers. + * See [our wiki](https://wiki.foxycart.com/v/2.0/webhooks#validating_the_payload) for more info. * - * @example - * - * const isVerified = FoxyApi.webhook.verify({ - * signature: "...", - * payload: "...", - * key: "..." - * }); - * - * @param params info received with the webhook that needs validation - * @tutorial https://wiki.foxycart.com/v/2.0/webhooks#validating_the_payload + * @param webhook info received with the webhook that needs validation + * @returns True if this webhook has a valid signature. */ -export function verifyWebhookSignature(params: VerificationParams): boolean { - const computedSignature = crypto.createHmac('sha256', params.key).update(params.payload).digest('hex'); - - return params.signature === computedSignature; +export function verifyWebhookSignature(webhook: Webhook): boolean { + const computedSignature = crypto.createHmac('sha256', webhook.key).update(webhook.payload).digest('hex'); + return webhook.signature === computedSignature; } From 9491f2236c5738a4820c64ebdbb3e1690b2b7fc4 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 14:30:47 +0300 Subject: [PATCH 20/98] feat: add args validation to webhook verification helper --- src/integration/verifyWebhookSignature.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/integration/verifyWebhookSignature.ts b/src/integration/verifyWebhookSignature.ts index e9016ac..c0060c2 100755 --- a/src/integration/verifyWebhookSignature.ts +++ b/src/integration/verifyWebhookSignature.ts @@ -1,5 +1,7 @@ import * as crypto from 'crypto'; +import v8n from 'v8n'; + interface Webhook { /** The `Foxy-Webhook-Signature` header value received with the webhook. */ signature: string; @@ -9,6 +11,12 @@ interface Webhook { key: string; } +const webhookV8N = v8n().schema({ + key: v8n().string(), + payload: v8n().string(), + signature: v8n().string(), +}); + /** * Verifies that the webhook your app has received was indeed sent from our servers. * See [our wiki](https://wiki.foxycart.com/v/2.0/webhooks#validating_the_payload) for more info. @@ -17,6 +25,7 @@ interface Webhook { * @returns True if this webhook has a valid signature. */ export function verifyWebhookSignature(webhook: Webhook): boolean { + webhookV8N.check(webhook); const computedSignature = crypto.createHmac('sha256', webhook.key).update(webhook.payload).digest('hex'); return webhook.signature === computedSignature; } From 1b484df741cc677a586ef9eb424702e1265305d3 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 14:31:10 +0300 Subject: [PATCH 21/98] test: add tests for webhook verification helper --- .../verifyWebhookSignature.test.ts | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 tests/integration/verifyWebhookSignature.test.ts diff --git a/tests/integration/verifyWebhookSignature.test.ts b/tests/integration/verifyWebhookSignature.test.ts new file mode 100644 index 0000000..3c8e83b --- /dev/null +++ b/tests/integration/verifyWebhookSignature.test.ts @@ -0,0 +1,35 @@ +import { verifyWebhookSignature } from '../../src/integration/verifyWebhookSignature'; + +describe('Integration', () => { + describe('verifyWebhookSignature', () => { + it('errors with incorrect params', () => { + const invalidParams = ({ + key: 0, + payload: {}, + signature: null, + } as unknown) as Parameters[0]; + + expect(() => verifyWebhookSignature(invalidParams)).toThrow(); + }); + + it('returns false when webhook signature is invalid', () => { + const result = verifyWebhookSignature({ + key: 'wrong', + payload: 'very', + signature: "i'm", + }); + + expect(result).toBe(false); + }); + + it('returns true when webhook signature is valid', () => { + const result = verifyWebhookSignature({ + key: 'is definitely right', + payload: 'this, on the other hand', + signature: '055c620a2d1e459b9c4ed676146a6cce9d2ec2e7caf3dba64608c30c4477f532', + }); + + expect(result).toBe(true); + }); + }); +}); From 1569b2670183a01300227641d6b56b99dcea4169 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 14:33:12 +0300 Subject: [PATCH 22/98] refactor: remove unused code --- src/integration/sanitizers.ts | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/integration/sanitizers.ts b/src/integration/sanitizers.ts index 6538963..fc116ba 100755 --- a/src/integration/sanitizers.ts +++ b/src/integration/sanitizers.ts @@ -1,24 +1,5 @@ import { TraverseContext } from 'traverse'; -type Mapper = (this: TraverseContext, v: any) => void; - -/** - * Runs multiple https://www.npmjs.com/package/traverse mappers - * during the node visit. - * - * @param mappers list of mapper functions to run - * @example - * const sanitizedResponse = traverse(response).map(all( - * removePrivateAttributes, - * removeProperties("third_party_id") - * )); - */ -export function all(...mappers: Mapper[]): Mapper { - return function (this: TraverseContext, v: any): void { - mappers.forEach(mapper => mapper.call(this, v)); - }; -} - /** * A https://www.npmjs.com/package/traverse mapper that removes all * private attributes from the response object. From fba23721025dec1aed3322204c0916c0ff2f2ed4 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 14:36:12 +0300 Subject: [PATCH 23/98] refactor: move sanitization utils into separate files --- src/integration/index.ts | 5 +- src/integration/removeAllLinksExcept.ts | 20 +++++++ src/integration/removePrivateAttributes.ts | 23 ++++++++ src/integration/removeProperties.ts | 18 +++++++ src/integration/removeSensitiveData.ts | 20 +++++++ src/integration/sanitizers.ts | 61 ---------------------- 6 files changed, 85 insertions(+), 62 deletions(-) create mode 100644 src/integration/removeAllLinksExcept.ts create mode 100644 src/integration/removePrivateAttributes.ts create mode 100644 src/integration/removeProperties.ts create mode 100644 src/integration/removeSensitiveData.ts delete mode 100755 src/integration/sanitizers.ts diff --git a/src/integration/index.ts b/src/integration/index.ts index 7f74c32..8b1eb0f 100644 --- a/src/integration/index.ts +++ b/src/integration/index.ts @@ -1,6 +1,9 @@ export { API } from './API'; export { Signer } from './Signer'; -export { removeAllLinksExcept, removePrivateAttributes, removeSensitiveData, removeProperties } from './sanitizers'; +export { removeProperties } from './removeProperties'; +export { removeSensitiveData } from './removeSensitiveData'; +export { removeAllLinksExcept } from './removeAllLinksExcept'; +export { removePrivateAttributes } from './removePrivateAttributes'; export { verifyWebhookSignature } from './verifyWebhookSignature'; export { createSSOURL } from './createSSOURL'; diff --git a/src/integration/removeAllLinksExcept.ts b/src/integration/removeAllLinksExcept.ts new file mode 100644 index 0000000..36c9d1d --- /dev/null +++ b/src/integration/removeAllLinksExcept.ts @@ -0,0 +1,20 @@ +import { TraverseContext } from 'traverse'; + +/** + * Creates a https://www.npmjs.com/package/traverse mapper that removes all + * relations from the response object that aren't listed in the `linksToKeep` array. + * + * @param linksToKeep array of relation keys to keep + * @example const sanitizedResponse = traverse(response).map(removeAllLinksExcept("self", "next")); + */ + +/** + * @param {...any} linksToKeep + */ +export function removeAllLinksExcept(...linksToKeep: string[]): () => void { + return function (this: TraverseContext): void { + if (typeof this.key !== 'undefined' && this.parent?.key === '_links' && linksToKeep.includes(this.key) === false) { + this.remove(); + } + }; +} diff --git a/src/integration/removePrivateAttributes.ts b/src/integration/removePrivateAttributes.ts new file mode 100644 index 0000000..c136880 --- /dev/null +++ b/src/integration/removePrivateAttributes.ts @@ -0,0 +1,23 @@ +import { TraverseContext } from 'traverse'; + +/** + * A https://www.npmjs.com/package/traverse mapper that removes all + * private attributes from the response object. + * + * @param this object traversal context + * @param v current property value + * @example const sanitizedResponse = traverse(response).map(removePrivateAttributes); + */ + +/** + * @param this + * @param v + */ +export function removePrivateAttributes(this: TraverseContext, v: any): void { + if (this.key === 'fx:attributes' && Array.isArray(v)) { + this.update( + v.filter((attr: any) => attr.visibility === 'public'), + true + ); + } +} diff --git a/src/integration/removeProperties.ts b/src/integration/removeProperties.ts new file mode 100644 index 0000000..1ac17b3 --- /dev/null +++ b/src/integration/removeProperties.ts @@ -0,0 +1,18 @@ +import { TraverseContext } from 'traverse'; + +/** + * Creates a https://www.npmjs.com/package/traverse mapper that removes all + * properties from the response object that match the keys of the `propsToRemove` array. + * + * @param propsToRemove array of properties to remove + * @example const sanitizedResponse = traverse(response).map(removeProperties("password_hash", "third_party_id")); + */ + +/** + * @param {...any} propsToRemove + */ +export function removeProperties(...propsToRemove: string[]): () => void { + return function (this: TraverseContext): void { + if (this.key && propsToRemove.includes(this.key)) this.remove(); + }; +} diff --git a/src/integration/removeSensitiveData.ts b/src/integration/removeSensitiveData.ts new file mode 100644 index 0000000..d6868b3 --- /dev/null +++ b/src/integration/removeSensitiveData.ts @@ -0,0 +1,20 @@ +import { TraverseContext } from 'traverse'; + +/** + * A https://www.npmjs.com/package/traverse mapper that removes all + * sensitive data such as password hashes or internal identifiers from the response object. + * + * @param this traversal context + * @example const sanitizedResponse = traverse(response).map(removeSensitiveData); + */ + +/** + * @param this + */ +export function removeSensitiveData(this: TraverseContext): void { + const key = this.key; + if (typeof key === 'undefined') return; + + const propsToRemove = ['password', 'third_party_id']; + if (propsToRemove.find(v => key.startsWith(v))) this.remove(); +} diff --git a/src/integration/sanitizers.ts b/src/integration/sanitizers.ts deleted file mode 100755 index fc116ba..0000000 --- a/src/integration/sanitizers.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { TraverseContext } from 'traverse'; - -/** - * A https://www.npmjs.com/package/traverse mapper that removes all - * private attributes from the response object. - * - * @param this object traversal context - * @param v current property value - * @example const sanitizedResponse = traverse(response).map(removePrivateAttributes); - */ -export function removePrivateAttributes(this: TraverseContext, v: any): void { - if (this.key === 'fx:attributes' && Array.isArray(v)) { - this.update( - v.filter((attr: any) => attr.visibility === 'public'), - true - ); - } -} - -/** - * A https://www.npmjs.com/package/traverse mapper that removes all - * sensitive data such as password hashes or internal identifiers from the response object. - * - * @param this traversal context - * @example const sanitizedResponse = traverse(response).map(removeSensitiveData); - */ -export function removeSensitiveData(this: TraverseContext): void { - const key = this.key; - if (typeof key === 'undefined') return; - - const propsToRemove = ['password', 'third_party_id']; - if (propsToRemove.find(v => key.startsWith(v))) this.remove(); -} - -/** - * Creates a https://www.npmjs.com/package/traverse mapper that removes all - * relations from the response object that aren't listed in the `linksToKeep` array. - * - * @param linksToKeep array of relation keys to keep - * @example const sanitizedResponse = traverse(response).map(removeAllLinksExcept("self", "next")); - */ -export function removeAllLinksExcept(...linksToKeep: string[]): () => void { - return function (this: TraverseContext): void { - if (typeof this.key !== 'undefined' && this.parent?.key === '_links' && linksToKeep.includes(this.key) === false) { - this.remove(); - } - }; -} - -/** - * Creates a https://www.npmjs.com/package/traverse mapper that removes all - * properties from the response object that match the keys of the `propsToRemove` array. - * - * @param propsToRemove array of properties to remove - * @example const sanitizedResponse = traverse(response).map(removeProperties("password_hash", "third_party_id")); - */ -export function removeProperties(...propsToRemove: string[]): () => void { - return function (this: TraverseContext): void { - if (this.key && propsToRemove.includes(this.key)) this.remove(); - }; -} From 0b3e09d6464a02324663a507a10d29ea5c6f17ba Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 14:40:21 +0300 Subject: [PATCH 24/98] docs: fix jsdocs for traverse utils --- src/integration/removeAllLinksExcept.ts | 7 ++----- src/integration/removePrivateAttributes.ts | 9 ++------- src/integration/removeProperties.ts | 7 ++----- src/integration/removeSensitiveData.ts | 6 +----- 4 files changed, 7 insertions(+), 22 deletions(-) diff --git a/src/integration/removeAllLinksExcept.ts b/src/integration/removeAllLinksExcept.ts index 36c9d1d..8dcde15 100644 --- a/src/integration/removeAllLinksExcept.ts +++ b/src/integration/removeAllLinksExcept.ts @@ -4,12 +4,9 @@ import { TraverseContext } from 'traverse'; * Creates a https://www.npmjs.com/package/traverse mapper that removes all * relations from the response object that aren't listed in the `linksToKeep` array. * - * @param linksToKeep array of relation keys to keep + * @param linksToKeep Array of relation keys to keep * @example const sanitizedResponse = traverse(response).map(removeAllLinksExcept("self", "next")); - */ - -/** - * @param {...any} linksToKeep + * @returns A `traverse` mapper function. */ export function removeAllLinksExcept(...linksToKeep: string[]): () => void { return function (this: TraverseContext): void { diff --git a/src/integration/removePrivateAttributes.ts b/src/integration/removePrivateAttributes.ts index c136880..ee67d9a 100644 --- a/src/integration/removePrivateAttributes.ts +++ b/src/integration/removePrivateAttributes.ts @@ -4,15 +4,10 @@ import { TraverseContext } from 'traverse'; * A https://www.npmjs.com/package/traverse mapper that removes all * private attributes from the response object. * - * @param this object traversal context - * @param v current property value + * @param this Object traversal context. + * @param v Current property value. * @example const sanitizedResponse = traverse(response).map(removePrivateAttributes); */ - -/** - * @param this - * @param v - */ export function removePrivateAttributes(this: TraverseContext, v: any): void { if (this.key === 'fx:attributes' && Array.isArray(v)) { this.update( diff --git a/src/integration/removeProperties.ts b/src/integration/removeProperties.ts index 1ac17b3..c1c3013 100644 --- a/src/integration/removeProperties.ts +++ b/src/integration/removeProperties.ts @@ -4,12 +4,9 @@ import { TraverseContext } from 'traverse'; * Creates a https://www.npmjs.com/package/traverse mapper that removes all * properties from the response object that match the keys of the `propsToRemove` array. * - * @param propsToRemove array of properties to remove + * @param propsToRemove Array of properties to remove. * @example const sanitizedResponse = traverse(response).map(removeProperties("password_hash", "third_party_id")); - */ - -/** - * @param {...any} propsToRemove + * @returns A `traverse` mapper function. */ export function removeProperties(...propsToRemove: string[]): () => void { return function (this: TraverseContext): void { diff --git a/src/integration/removeSensitiveData.ts b/src/integration/removeSensitiveData.ts index d6868b3..380b636 100644 --- a/src/integration/removeSensitiveData.ts +++ b/src/integration/removeSensitiveData.ts @@ -4,13 +4,9 @@ import { TraverseContext } from 'traverse'; * A https://www.npmjs.com/package/traverse mapper that removes all * sensitive data such as password hashes or internal identifiers from the response object. * - * @param this traversal context + * @param this Traversal context. * @example const sanitizedResponse = traverse(response).map(removeSensitiveData); */ - -/** - * @param this - */ export function removeSensitiveData(this: TraverseContext): void { const key = this.key; if (typeof key === 'undefined') return; From 732f282c777857b84eea39688f042426c33a2e12 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 14:54:08 +0300 Subject: [PATCH 25/98] refactor: avoid any types in private attribute remover helper --- src/integration/removePrivateAttributes.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/integration/removePrivateAttributes.ts b/src/integration/removePrivateAttributes.ts index ee67d9a..1332d5d 100644 --- a/src/integration/removePrivateAttributes.ts +++ b/src/integration/removePrivateAttributes.ts @@ -5,14 +5,16 @@ import { TraverseContext } from 'traverse'; * private attributes from the response object. * * @param this Object traversal context. - * @param v Current property value. + * @param value Current property value. * @example const sanitizedResponse = traverse(response).map(removePrivateAttributes); */ -export function removePrivateAttributes(this: TraverseContext, v: any): void { - if (this.key === 'fx:attributes' && Array.isArray(v)) { - this.update( - v.filter((attr: any) => attr.visibility === 'public'), - true - ); - } +export function removePrivateAttributes(this: TraverseContext, value: unknown): void { + if (this.key !== 'fx:attributes' || !Array.isArray(value)) return; + + const newValue = value.filter((attribute: unknown) => { + if (typeof attribute !== 'object' || attribute === null) return true; + return (attribute as Record).visibility === 'public'; + }); + + this.update(newValue, true); } From 6f490b4ae5a3939640aec03397fe914a690566ec Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 16:38:49 +0300 Subject: [PATCH 26/98] feat: add context validation to private attributes remover --- src/integration/removePrivateAttributes.ts | 3 +++ src/integration/v8n.ts | 12 ++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 src/integration/v8n.ts diff --git a/src/integration/removePrivateAttributes.ts b/src/integration/removePrivateAttributes.ts index 1332d5d..00d75a4 100644 --- a/src/integration/removePrivateAttributes.ts +++ b/src/integration/removePrivateAttributes.ts @@ -1,4 +1,5 @@ import { TraverseContext } from 'traverse'; +import { thisV8N } from './v8n'; /** * A https://www.npmjs.com/package/traverse mapper that removes all @@ -9,6 +10,8 @@ import { TraverseContext } from 'traverse'; * @example const sanitizedResponse = traverse(response).map(removePrivateAttributes); */ export function removePrivateAttributes(this: TraverseContext, value: unknown): void { + thisV8N.check(this); + if (this.key !== 'fx:attributes' || !Array.isArray(value)) return; const newValue = value.filter((attribute: unknown) => { diff --git a/src/integration/v8n.ts b/src/integration/v8n.ts new file mode 100644 index 0000000..55bac74 --- /dev/null +++ b/src/integration/v8n.ts @@ -0,0 +1,12 @@ +import v8n from 'v8n'; + +v8n.extend({ + typeOf: (expected: string) => { + return (value: unknown) => typeof value === expected; + }, +}); + +export const thisV8N = v8n().schema({ + key: v8n().optional(v8n().string()), + update: v8n().typeOf('function'), +}); From 0c3e08dbf0e9a99b582ef8aaedfe03f2ad42eaff Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 16:39:18 +0300 Subject: [PATCH 27/98] test: add tests for private attributes remover --- .../removePrivateAttributes.test.ts | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 tests/integration/removePrivateAttributes.test.ts diff --git a/tests/integration/removePrivateAttributes.test.ts b/tests/integration/removePrivateAttributes.test.ts new file mode 100644 index 0000000..afe5f05 --- /dev/null +++ b/tests/integration/removePrivateAttributes.test.ts @@ -0,0 +1,41 @@ +import traverse, { TraverseContext } from 'traverse'; + +import { removePrivateAttributes } from '../../src/integration/removePrivateAttributes'; + +describe('Integration', () => { + describe('removePrivateAttributes', () => { + it('errors when invoked without traverse context', () => { + const incorrectContext = (null as unknown) as TraverseContext; + expect(() => removePrivateAttributes.call(incorrectContext, null)).toThrow(); + }); + + it('removes private attributes', () => { + const input = { + _embedded: { + 'fx:attributes': [ + { name: 'foo', visibility: 'private' }, + { name: 'bar', visibility: 'public' }, + undefined, + null, + 0, + 'hi', + ], + }, + _links: { + 'fx:attributes': { href: '' }, + }, + }; + + const output = { + _embedded: { + 'fx:attributes': [{ name: 'bar', visibility: 'public' }, undefined, null, 0, 'hi'], + }, + _links: { + 'fx:attributes': { href: '' }, + }, + }; + + expect(traverse(input).map(removePrivateAttributes)).toEqual(output); + }); + }); +}); From 92dd27247873a6fc31b0ca06db174c8395c79fa9 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 16:50:53 +0300 Subject: [PATCH 28/98] feat: add argument and context validation to links remover --- src/integration/removeAllLinksExcept.ts | 8 ++++++++ src/integration/v8n.ts | 1 + 2 files changed, 9 insertions(+) diff --git a/src/integration/removeAllLinksExcept.ts b/src/integration/removeAllLinksExcept.ts index 8dcde15..0a94eb3 100644 --- a/src/integration/removeAllLinksExcept.ts +++ b/src/integration/removeAllLinksExcept.ts @@ -1,4 +1,8 @@ import { TraverseContext } from 'traverse'; +import { thisV8N } from './v8n'; +import v8n from 'v8n'; + +const linksToKeepV8N = v8n().every.string(); /** * Creates a https://www.npmjs.com/package/traverse mapper that removes all @@ -9,7 +13,11 @@ import { TraverseContext } from 'traverse'; * @returns A `traverse` mapper function. */ export function removeAllLinksExcept(...linksToKeep: string[]): () => void { + linksToKeepV8N.check(linksToKeep); + return function (this: TraverseContext): void { + thisV8N.check(this); + if (typeof this.key !== 'undefined' && this.parent?.key === '_links' && linksToKeep.includes(this.key) === false) { this.remove(); } diff --git a/src/integration/v8n.ts b/src/integration/v8n.ts index 55bac74..4a55259 100644 --- a/src/integration/v8n.ts +++ b/src/integration/v8n.ts @@ -8,5 +8,6 @@ v8n.extend({ export const thisV8N = v8n().schema({ key: v8n().optional(v8n().string()), + parent: v8n().optional(v8n().object()), update: v8n().typeOf('function'), }); From 66736b65d32bfe58e409eeabd7498bae86041759 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 16:51:09 +0300 Subject: [PATCH 29/98] test: add tests for links remover --- .../integration/removeAllLinksExcept.test.ts | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 tests/integration/removeAllLinksExcept.test.ts diff --git a/tests/integration/removeAllLinksExcept.test.ts b/tests/integration/removeAllLinksExcept.test.ts new file mode 100644 index 0000000..9d984d4 --- /dev/null +++ b/tests/integration/removeAllLinksExcept.test.ts @@ -0,0 +1,35 @@ +import traverse, { TraverseContext } from 'traverse'; + +import { removeAllLinksExcept } from '../../src/integration/removeAllLinksExcept'; + +describe('Integration', () => { + describe('removeAllLinksExcept', () => { + it('errors when invoked without traverse context', () => { + const incorrectContext = (null as unknown) as TraverseContext; + expect(() => removeAllLinksExcept().call(incorrectContext)).toThrow(); + }); + + it('errors when invoked with incorrect arguments', () => { + const incorrectArgs = ([0, null, {}] as unknown) as Parameters; + expect(() => traverse({}).map(removeAllLinksExcept(...incorrectArgs))).toThrow(); + }); + + it('removes all links except for given', () => { + const input = { + _links: { + 'fx:attributes': { href: 'https://api.foxy.test/stores/0/attributes' }, + 'fx:customer': { href: 'https://api.foxy.test/customers/0' }, + 'fx:user': { href: 'https://api.foxy.test/users/0' }, + }, + }; + + const output = { + _links: { + 'fx:customer': { href: 'https://api.foxy.test/customers/0' }, + }, + }; + + expect(traverse(input).map(removeAllLinksExcept('fx:customer'))).toEqual(output); + }); + }); +}); From 8ac82cee2810f2ad38be5696812e01c30fec30b1 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 16:57:48 +0300 Subject: [PATCH 30/98] refactor: remove extra condition in links remover If parent key matches the given value, then the current key is always a string. --- src/integration/removeAllLinksExcept.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/integration/removeAllLinksExcept.ts b/src/integration/removeAllLinksExcept.ts index 0a94eb3..a9b8c71 100644 --- a/src/integration/removeAllLinksExcept.ts +++ b/src/integration/removeAllLinksExcept.ts @@ -14,12 +14,8 @@ const linksToKeepV8N = v8n().every.string(); */ export function removeAllLinksExcept(...linksToKeep: string[]): () => void { linksToKeepV8N.check(linksToKeep); - return function (this: TraverseContext): void { thisV8N.check(this); - - if (typeof this.key !== 'undefined' && this.parent?.key === '_links' && linksToKeep.includes(this.key) === false) { - this.remove(); - } + if (this.parent?.key === '_links' && linksToKeep.includes(this.key as string) === false) this.remove(); }; } From ea560db2a77c1f08d4274382392723671896b05c Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 17:12:16 +0300 Subject: [PATCH 31/98] feat: add arguments and context validation to properties remover --- src/integration/removeProperties.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/integration/removeProperties.ts b/src/integration/removeProperties.ts index c1c3013..a5a4c73 100644 --- a/src/integration/removeProperties.ts +++ b/src/integration/removeProperties.ts @@ -1,4 +1,8 @@ import { TraverseContext } from 'traverse'; +import { thisV8N } from './v8n'; +import v8n from 'v8n'; + +const propsToRemoveV8N = v8n().every.string(); /** * Creates a https://www.npmjs.com/package/traverse mapper that removes all @@ -9,7 +13,9 @@ import { TraverseContext } from 'traverse'; * @returns A `traverse` mapper function. */ export function removeProperties(...propsToRemove: string[]): () => void { + propsToRemoveV8N.check(propsToRemove); return function (this: TraverseContext): void { + thisV8N.check(this); if (this.key && propsToRemove.includes(this.key)) this.remove(); }; } From e6d542074a22aa3793c1444a7bc1e1c328143888 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 17:12:35 +0300 Subject: [PATCH 32/98] test: add tests for properties remover --- tests/integration/removeProperties.test.ts | 24 ++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 tests/integration/removeProperties.test.ts diff --git a/tests/integration/removeProperties.test.ts b/tests/integration/removeProperties.test.ts new file mode 100644 index 0000000..3aa3f11 --- /dev/null +++ b/tests/integration/removeProperties.test.ts @@ -0,0 +1,24 @@ +import traverse, { TraverseContext } from 'traverse'; + +import { removeProperties } from '../../src/integration/removeProperties'; + +describe('Integration', () => { + describe('removeProperties', () => { + it('errors when invoked without traverse context', () => { + const incorrectContext = (null as unknown) as TraverseContext; + expect(() => removeProperties().call(incorrectContext)).toThrow(); + }); + + it('errors when invoked with incorrect arguments', () => { + const incorrectArgs = ([0, null, {}] as unknown) as Parameters; + expect(() => traverse({}).map(removeProperties(...incorrectArgs))).toThrow(); + }); + + it('removes given properties', () => { + const input = { bar: { baz: ['qux'] }, foo: 0 }; + const output = { bar: {} }; + + expect(traverse(input).map(removeProperties('foo', 'baz'))).toEqual(output); + }); + }); +}); From 7ecc19b7bbf5b8a2d64364693f337a955b7c7b9f Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 17:21:14 +0300 Subject: [PATCH 33/98] feat: add context validation to sensitive data remover --- src/integration/removeSensitiveData.ts | 3 +++ src/integration/v8n.ts | 1 + 2 files changed, 4 insertions(+) diff --git a/src/integration/removeSensitiveData.ts b/src/integration/removeSensitiveData.ts index 380b636..7f92517 100644 --- a/src/integration/removeSensitiveData.ts +++ b/src/integration/removeSensitiveData.ts @@ -1,4 +1,5 @@ import { TraverseContext } from 'traverse'; +import { thisV8N } from './v8n'; /** * A https://www.npmjs.com/package/traverse mapper that removes all @@ -8,6 +9,8 @@ import { TraverseContext } from 'traverse'; * @example const sanitizedResponse = traverse(response).map(removeSensitiveData); */ export function removeSensitiveData(this: TraverseContext): void { + thisV8N.check(this); + const key = this.key; if (typeof key === 'undefined') return; diff --git a/src/integration/v8n.ts b/src/integration/v8n.ts index 4a55259..cec8db4 100644 --- a/src/integration/v8n.ts +++ b/src/integration/v8n.ts @@ -9,5 +9,6 @@ v8n.extend({ export const thisV8N = v8n().schema({ key: v8n().optional(v8n().string()), parent: v8n().optional(v8n().object()), + remove: v8n().typeOf('function'), update: v8n().typeOf('function'), }); From 28c4d31b5b42f3eab288f04d4bf39359ef48680f Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 17:21:29 +0300 Subject: [PATCH 34/98] test: add tests for sensitive data remover --- tests/integration/removeSensitiveData.test.ts | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 tests/integration/removeSensitiveData.test.ts diff --git a/tests/integration/removeSensitiveData.test.ts b/tests/integration/removeSensitiveData.test.ts new file mode 100644 index 0000000..9d5ec66 --- /dev/null +++ b/tests/integration/removeSensitiveData.test.ts @@ -0,0 +1,33 @@ +import traverse, { TraverseContext } from 'traverse'; + +import { removeSensitiveData } from '../../src/integration/removeSensitiveData'; + +describe('Integration', () => { + describe('removeSensitiveData', () => { + it('errors when invoked without traverse context', () => { + const incorrectContext = (null as unknown) as TraverseContext; + expect(() => removeSensitiveData.call(incorrectContext)).toThrow(); + }); + + it('removes sensitive data from record', () => { + const input = { + bar: 1, + foo: { + baz: [], + password_hash: 'so secret', + third_party_id: 1, + }, + password: 'one-time code', + }; + + const output = { + bar: 1, + foo: { + baz: [], + }, + }; + + expect(traverse(input).map(removeSensitiveData)).toEqual(output); + }); + }); +}); From 4a678d974cdf73e268149bc7a1b48d470682ac5f Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 17:30:58 +0300 Subject: [PATCH 35/98] refactor: extract admin sdk to move it into a new branch Removing Admin SDK from beta and moving it into a new branch because the backend for it is still being worked on. Not marking this as a breaking change since this code would only work with the internal tooling available to Foxy team anyway. --- README.md | 9 +- package-lock.json | 717 +------------------------------------------ package.json | 1 - src/admin/API.ts | 95 ------ src/admin/Graph.d.ts | 1 - src/admin/Rels.d.ts | 1 - src/admin/index.ts | 5 - src/admin/types.d.ts | 9 - src/index.ts | 1 - webpack.config.js | 1 - 10 files changed, 8 insertions(+), 832 deletions(-) delete mode 100644 src/admin/API.ts delete mode 100644 src/admin/Graph.d.ts delete mode 100644 src/admin/Rels.d.ts delete mode 100644 src/admin/index.ts delete mode 100644 src/admin/types.d.ts diff --git a/README.md b/README.md index 2f79640..07183a0 100755 --- a/README.md +++ b/README.md @@ -26,14 +26,13 @@ import * as FoxySDK from '@foxy.io/sdk'; ## Getting started -Our SDK consists of 4 main parts available via the main file: +Our SDK consists of 3 main parts available via the main file: 1. **Integration** is for building integrations that connect to hAPI directly from a safe **server-side** environment. Apart from the API client, you'll also find a number of useful utilities for HMAC signing, removing sensitive info from responses and webhook verification under this export alias. 2. **Customer** is for building **universal** apps and websites that interact with a subset of hAPI available to customers of a particular store. This export is also available as a pre-built library on our CDN. -3. **Admin** is for building **universal** apps and websites that interact with a subset of hAPI available to store admins. This export is also available as a pre-built library on our CDN. -4. **Core**: is for building custom API clients that interact with Hypermedia API endpoints. This is the most advanced part of the SDK that every other built-in API client depends on. You can run it server and client-side. +3. **Core**: is for building custom API clients that interact with Hypermedia API endpoints. This is the most advanced part of the SDK that every other built-in API client depends on. You can run it server and client-side. -Integration, Customer and Admin all export API client classes for working with the respective endpoints. If you're using TypeScript, you'll also see the type exports for API-specific hypermedia relations and graphs named `Rels` and `Graph`. Let's connect to hAPI using `FoxySDK.Integration.API` class: +Integration and Customer export API client classes for working with the respective endpoints. If you're using TypeScript, you'll also see the type exports for API-specific hypermedia relations and graphs named `Rels` and `Graph`. Let's connect to hAPI using `FoxySDK.Integration.API` class: ```js const api = new FoxySDK.Integration.API({ @@ -43,7 +42,7 @@ const api = new FoxySDK.Integration.API({ }); ``` -This will create a hAPI version 1 client connecting to `https://api.foxycart.com/` with the given credentials, using in-memory storage for access token and URL resolution, logging errors, warnings and informational messages to console. You can customize each one of these defaults in constructor params and you'll see similar options for Customer and Admin API as well. +This will create a hAPI version 1 client connecting to `https://api.foxycart.com/` with the given credentials, using in-memory storage for access token and URL resolution, logging errors, warnings and informational messages to console. You can customize each one of these defaults in constructor params and you'll see similar options for Customer API as well. Regardless of the API type you're working with, you'll see the same methods on each node: `.follow()`, `.get()`, `.put()`, `.post()`, `.patch()` and `.delete()`. Here's how you can use them in 3 steps: diff --git a/package-lock.json b/package-lock.json index 1d8bec8..413b8d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,594 +4,6 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@aws-amplify/auth": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/@aws-amplify/auth/-/auth-3.4.10.tgz", - "integrity": "sha512-SEne3/8cen2J85QvXHR7KfWw9eRAlCBekkfGUCeEfp4S9sWhWAoA5FVEVeOOK8arEHupRanjPZk/fKp6povYNg==", - "requires": { - "@aws-amplify/cache": "^3.1.35", - "@aws-amplify/core": "^3.8.2", - "amazon-cognito-identity-js": "^4.5.3", - "crypto-js": "^3.3.0" - }, - "dependencies": { - "crypto-js": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", - "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" - } - } - }, - "@aws-amplify/cache": { - "version": "3.1.35", - "resolved": "https://registry.npmjs.org/@aws-amplify/cache/-/cache-3.1.35.tgz", - "integrity": "sha512-PBpEjINpmDJ5HflaAHJ1EpiT7JT22lehO+BuYRE9Wj9xLN3u/l4RSFgHMJVacJfWEQy7yscsIxNQccN+VTs8xw==", - "requires": { - "@aws-amplify/core": "^3.8.2" - } - }, - "@aws-amplify/core": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@aws-amplify/core/-/core-3.8.2.tgz", - "integrity": "sha512-Dzfgkda+2wShw30GljitL8nu02XdeXfxD8C0KpbCOA+aoPY3f1np/6ExvPYW7y/oMP5MN8lEMc+wCwYhWB0e8A==", - "requires": { - "@aws-crypto/sha256-js": "1.0.0-alpha.0", - "@aws-sdk/client-cognito-identity": "1.0.0-gamma.8", - "@aws-sdk/credential-provider-cognito-identity": "1.0.0-gamma.8", - "@aws-sdk/node-http-handler": "1.0.0-gamma.7", - "@aws-sdk/types": "1.0.0-gamma.6", - "@aws-sdk/util-hex-encoding": "1.0.0-gamma.6", - "@aws-sdk/util-user-agent-browser": "1.0.0-gamma.7", - "universal-cookie": "^4.0.4", - "url": "^0.11.0", - "zen-observable-ts": "0.8.19" - } - }, - "@aws-crypto/ie11-detection": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-1.0.0.tgz", - "integrity": "sha512-kCKVhCF1oDxFYgQrxXmIrS5oaWulkvRcPz+QBDMsUr2crbF4VGgGT6+uQhSwJFdUAQ2A//Vq+uT83eJrkzFgXA==", - "requires": { - "tslib": "^1.11.1" - } - }, - "@aws-crypto/sha256-browser": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-1.0.0.tgz", - "integrity": "sha512-uSufui4ZktC5lYX6bDxgBgNboxGyw9V9V+rlcNsNTxh4YPhOdCslwJMGntiWOBRGAgXhhvWi7FqnTS2SaT3cpg==", - "requires": { - "@aws-crypto/ie11-detection": "^1.0.0", - "@aws-crypto/sha256-js": "^1.0.0", - "@aws-crypto/supports-web-crypto": "^1.0.0", - "@aws-sdk/types": "^1.0.0-rc.1", - "@aws-sdk/util-locate-window": "^1.0.0-rc.1", - "@aws-sdk/util-utf8-browser": "^1.0.0-rc.1", - "tslib": "^1.11.1" - }, - "dependencies": { - "@aws-crypto/sha256-js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.0.0.tgz", - "integrity": "sha512-89kqtFs/tdHBFHEBXZ4UXlCISswvEor3BVVOriR68Tbk1Qe1zBOZtfbSOt3CDT69z88x5uM558YW9k8I1xei5A==", - "requires": { - "@aws-sdk/types": "^1.0.0-rc.1", - "@aws-sdk/util-utf8-browser": "^1.0.0-rc.1", - "tslib": "^1.11.1" - } - }, - "@aws-sdk/types": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-1.0.0-rc.3.tgz", - "integrity": "sha512-pKKR2SXG8IHbWcmVgFwLUrHqqqFOEuf5JiQmP7dEBjUXqavzDnqFUY7g9PGuM8928IQqL7IXrRsK7R+VbLgodQ==" - } - } - }, - "@aws-crypto/sha256-js": { - "version": "1.0.0-alpha.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.0.0-alpha.0.tgz", - "integrity": "sha512-GidX2lccEtHZw8mXDKJQj6tea7qh3pAnsNSp1eZNxsN4MMu2OvSraPSqiB1EihsQkZBMg0IiZPpZHoACUX/QMQ==", - "requires": { - "@aws-sdk/types": "^1.0.0-alpha.0", - "@aws-sdk/util-utf8-browser": "^1.0.0-alpha.0", - "tslib": "^1.9.3" - } - }, - "@aws-crypto/supports-web-crypto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-1.0.0.tgz", - "integrity": "sha512-IHLfv+WmVH89EW4n6a5eE8/hUlz6qkWGMn/v4r5ZgzcXdTC5nolii2z3k46y01hWRiC2PPhOdeSLzMUCUMco7g==", - "requires": { - "tslib": "^1.11.1" - } - }, - "@aws-sdk/abort-controller": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-1.0.0-gamma.7.tgz", - "integrity": "sha512-21RG318IO6905SClJuHAxRuIiuCcg9uoCDnuGXXdNmLEOpmjeTWf1N4AESs3p+HyAflIdpHVWnJGsEeWgEGghA==", - "requires": { - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/client-cognito-identity": { - "version": "1.0.0-gamma.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-1.0.0-gamma.8.tgz", - "integrity": "sha512-N/xAm36p8N8IRWJFSQqodrGxSd9/XapBZH1Dc26rL8eVKdhxjTdQ3Gi7ga/xrv9WYd9kYUg9ONVQrYtet4Ej/g==", - "requires": { - "@aws-crypto/sha256-browser": "^1.0.0-alpha.0", - "@aws-crypto/sha256-js": "^1.0.0-alpha.0", - "@aws-sdk/config-resolver": "1.0.0-gamma.7", - "@aws-sdk/credential-provider-node": "1.0.0-gamma.7", - "@aws-sdk/fetch-http-handler": "1.0.0-gamma.8", - "@aws-sdk/hash-node": "1.0.0-gamma.7", - "@aws-sdk/invalid-dependency": "1.0.0-gamma.5", - "@aws-sdk/middleware-content-length": "1.0.0-gamma.7", - "@aws-sdk/middleware-host-header": "1.0.0-gamma.7", - "@aws-sdk/middleware-logger": "1.0.0-gamma.1", - "@aws-sdk/middleware-retry": "1.0.0-gamma.7", - "@aws-sdk/middleware-serde": "1.0.0-gamma.6", - "@aws-sdk/middleware-signing": "1.0.0-gamma.7", - "@aws-sdk/middleware-stack": "1.0.0-gamma.7", - "@aws-sdk/middleware-user-agent": "1.0.0-gamma.7", - "@aws-sdk/node-config-provider": "1.0.0-gamma.2", - "@aws-sdk/node-http-handler": "1.0.0-gamma.7", - "@aws-sdk/protocol-http": "1.0.0-gamma.7", - "@aws-sdk/smithy-client": "1.0.0-gamma.7", - "@aws-sdk/types": "1.0.0-gamma.6", - "@aws-sdk/url-parser-browser": "1.0.0-gamma.7", - "@aws-sdk/url-parser-node": "1.0.0-gamma.7", - "@aws-sdk/util-base64-browser": "1.0.0-gamma.6", - "@aws-sdk/util-base64-node": "1.0.0-gamma.6", - "@aws-sdk/util-body-length-browser": "1.0.0-gamma.6", - "@aws-sdk/util-body-length-node": "1.0.0-gamma.6", - "@aws-sdk/util-user-agent-browser": "1.0.0-gamma.7", - "@aws-sdk/util-user-agent-node": "1.0.0-gamma.7", - "@aws-sdk/util-utf8-browser": "1.0.0-gamma.6", - "@aws-sdk/util-utf8-node": "1.0.0-gamma.6", - "tslib": "^2.0.0" - }, - "dependencies": { - "@aws-sdk/util-utf8-browser": { - "version": "1.0.0-gamma.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-1.0.0-gamma.6.tgz", - "integrity": "sha512-JIT2wPZKdOGynAD6V5ZhGT1XlHJbOWAYn0zQUgf4fkfcwwsfjXp9MALptdavKG/N7plq6p7z5JxMUP/VGKXyYA==", - "requires": { - "tslib": "^1.8.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" - } - } - }, - "@aws-sdk/config-resolver": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-1.0.0-gamma.7.tgz", - "integrity": "sha512-X8Zg11VY4E1TCcIckbCwQuL1wStN2Mi3Oxm3kdON5lO8cx9Fka/zICBSee0gEiAkbcwcUgKy51NA0teMPqFZqg==", - "requires": { - "@aws-sdk/signature-v4": "1.0.0-gamma.7", - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/credential-provider-cognito-identity": { - "version": "1.0.0-gamma.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-1.0.0-gamma.8.tgz", - "integrity": "sha512-tMnysEykVbrVE20zeKae0hYW9RDw9CSGIZ469Y7GnyGK7sTzh35OHZgZ2XrUPjN7GKJuV2wh5cJ0da/tnGgWCA==", - "requires": { - "@aws-sdk/client-cognito-identity": "1.0.0-gamma.8", - "@aws-sdk/property-provider": "1.0.0-gamma.7", - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/credential-provider-env": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-1.0.0-gamma.7.tgz", - "integrity": "sha512-xc1Beg0KZ9jiy7LqgywlsYUu3U+9H46foO0uuoBJI9a1AOgG0wuRBNf6/4h5McOQTdTgqfrQgsamkwki5lV44Q==", - "requires": { - "@aws-sdk/property-provider": "1.0.0-gamma.7", - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/credential-provider-imds": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-1.0.0-gamma.7.tgz", - "integrity": "sha512-TkvcSiqY0/XIsJrlPx6tOkN0iNq86Twmkk9D4YbGU9BK3awX0Hb9HIBLk5DptVURWZxDnOyUM+eHktAS/bUEOQ==", - "requires": { - "@aws-sdk/property-provider": "1.0.0-gamma.7", - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/credential-provider-ini": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-1.0.0-gamma.7.tgz", - "integrity": "sha512-pBR8WXmt4SW5Efm9DrapnAhl5xUzG5QwnPqnoSFTFwg9NnzCo2ispfJ27hc7Yx9VPtYTv4IUYuayQUIsojiC/w==", - "requires": { - "@aws-sdk/property-provider": "1.0.0-gamma.7", - "@aws-sdk/shared-ini-file-loader": "1.0.0-gamma.6", - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/credential-provider-node": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-1.0.0-gamma.7.tgz", - "integrity": "sha512-SW9HD3OYjiFkj4HVPkheSEyK2FG9QPzGup9BodPwlnAmSbLrvsLNKzJfA5lwBPAXSoI/IuNK95aCF6mO3ldP3A==", - "requires": { - "@aws-sdk/credential-provider-env": "1.0.0-gamma.7", - "@aws-sdk/credential-provider-imds": "1.0.0-gamma.7", - "@aws-sdk/credential-provider-ini": "1.0.0-gamma.7", - "@aws-sdk/credential-provider-process": "1.0.0-gamma.7", - "@aws-sdk/property-provider": "1.0.0-gamma.7", - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/credential-provider-process": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-1.0.0-gamma.7.tgz", - "integrity": "sha512-Je2aLOVstN8mq/ipuVqRlLC1Vg9KDSju4HWRWmHX/hqkxZZoPFo8fSEe7/lkNqLAu/I9kG0dXvcO/xCbzZ3geg==", - "requires": { - "@aws-sdk/credential-provider-ini": "1.0.0-gamma.7", - "@aws-sdk/property-provider": "1.0.0-gamma.7", - "@aws-sdk/shared-ini-file-loader": "1.0.0-gamma.6", - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/fetch-http-handler": { - "version": "1.0.0-gamma.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-1.0.0-gamma.8.tgz", - "integrity": "sha512-63MMgxLxtC70x/0dH1BeYscJk+xiaKCZKWy+3s7rCxTVDxdkWL60FhE620bhF5fUD6J+5fPKxjBtawojun5xCA==", - "requires": { - "@aws-sdk/protocol-http": "1.0.0-gamma.7", - "@aws-sdk/querystring-builder": "1.0.0-gamma.7", - "@aws-sdk/types": "1.0.0-gamma.6", - "@aws-sdk/util-base64-browser": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/hash-node": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-1.0.0-gamma.7.tgz", - "integrity": "sha512-FLpwEXd36dGWOwrjANzOl+0ase7VK+Mubd8Xi5w2VLfv3+94iMtdQllYpyl0uJdBm9IV5Hz291B/9BhCutTeVA==", - "requires": { - "@aws-sdk/types": "1.0.0-gamma.6", - "@aws-sdk/util-buffer-from": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/invalid-dependency": { - "version": "1.0.0-gamma.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-1.0.0-gamma.5.tgz", - "integrity": "sha512-oQznDe4+m3xBRZq9NbEtaZqdpEqcNAExJbfwfF9DQHmUiRZdoEhU36v87Buxv8a3UMa5a0QvMrzSQJhIhfSBZw==", - "requires": { - "tslib": "^1.8.0" - } - }, - "@aws-sdk/is-array-buffer": { - "version": "1.0.0-gamma.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-1.0.0-gamma.6.tgz", - "integrity": "sha512-F80N+xct+ZFhtvwVCAq2IugjL5KrhzkYLl/q/A3qGLTTCsDsh4sbL8KxRbp8OQZyuq8OCcrlRPlt1fvFBjQJ9w==", - "requires": { - "tslib": "^1.8.0" - } - }, - "@aws-sdk/middleware-content-length": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-1.0.0-gamma.7.tgz", - "integrity": "sha512-VvmnYedZk09loKqZ6wQYjIqFzXAw0my5wsRpLkgBXVAcuQ9O4hzm2TyB7vRK0WnNTi2Q0Fr1BSPlKSQaxVZang==", - "requires": { - "@aws-sdk/protocol-http": "1.0.0-gamma.7", - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/middleware-host-header": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-1.0.0-gamma.7.tgz", - "integrity": "sha512-1w8HQ8CQuDK0dOT31cQ/JT1iPTlEM3nLFZWXigeCY0Rhq0oZiZjwWy1htZzi7UNmxOC2Ff+HN73EoiKoXFTfFg==", - "requires": { - "@aws-sdk/protocol-http": "1.0.0-gamma.7", - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/middleware-logger": { - "version": "1.0.0-gamma.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-1.0.0-gamma.1.tgz", - "integrity": "sha512-54b+6SHBSa/oazUoqRqimkp4x/jnA3PQJu3uPuZJ9NvmCeovX0dobW6323TVY/7Hn5DzV/vSTj0WW76f/c12gw==", - "requires": { - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/middleware-retry": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-1.0.0-gamma.7.tgz", - "integrity": "sha512-VCs/woQIF5VvYOc/HEvpHYa/SpKqqWhDhh44mo2G5D+qjdvlGNWjD4bi7ad1+d5Uczf4r7DlKz/wHbUP5pBKbA==", - "requires": { - "@aws-sdk/protocol-http": "1.0.0-gamma.7", - "@aws-sdk/service-error-classification": "1.0.0-gamma.7", - "@aws-sdk/types": "1.0.0-gamma.6", - "react-native-get-random-values": "^1.4.0", - "tslib": "^1.8.0", - "uuid": "^3.0.0" - } - }, - "@aws-sdk/middleware-serde": { - "version": "1.0.0-gamma.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-1.0.0-gamma.6.tgz", - "integrity": "sha512-pTOjbgLNQlZ9ck27D5aCg+7UfLlFOQqrihRrXXSf4Dc4zt5mS99rbToSzbY3m9Bfo7DmIG4epn+gERFr/cz5dg==", - "requires": { - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/middleware-signing": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-1.0.0-gamma.7.tgz", - "integrity": "sha512-WnUH2ysHUb/sYvuWrn5M96O4ViNwA6xVaK2g0UmzEspkYri/xcbGwvZhmiSxgp5QUeZAbgMR9lzwiLCI5Ft5Jg==", - "requires": { - "@aws-sdk/protocol-http": "1.0.0-gamma.7", - "@aws-sdk/signature-v4": "1.0.0-gamma.7", - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/middleware-stack": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-1.0.0-gamma.7.tgz", - "integrity": "sha512-lv1HDQVM6ulVnhAB+5DmGLTJfToxapM4AvbWk2lNVJeWiv7AGyDJV+B+kby240T2u+DdcTPtLbQ35usDexiVXw==", - "requires": { - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/middleware-user-agent": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-1.0.0-gamma.7.tgz", - "integrity": "sha512-BNSEx+iuEpuIFWiCwtecGQyBG8bk0m5NrztlTlpvgX3cq9Ks4atIXQAfrUn6WzJ1OEhvwFpHizzMdwRhK00tZg==", - "requires": { - "@aws-sdk/protocol-http": "1.0.0-gamma.7", - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/node-config-provider": { - "version": "1.0.0-gamma.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-1.0.0-gamma.2.tgz", - "integrity": "sha512-ByKHCZPZ5X/mPiTf6ruPdis2IxPvOHcgrgFiaHI0b1Pc61u7VsTDc0k8ydMZPUnuSi3MyRTC/WqhT4IdySFQxw==", - "requires": { - "@aws-sdk/property-provider": "1.0.0-gamma.7", - "@aws-sdk/shared-ini-file-loader": "1.0.0-gamma.6", - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/node-http-handler": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-1.0.0-gamma.7.tgz", - "integrity": "sha512-/qHRR8l0q8ALah+dNX0vd6rZFmdzNxmhdZDwifeYu9qo7W3ZPRBYC8u1uFrNTZKEbWCcGb25tnLvkAyQeBmYKQ==", - "requires": { - "@aws-sdk/abort-controller": "1.0.0-gamma.7", - "@aws-sdk/protocol-http": "1.0.0-gamma.7", - "@aws-sdk/querystring-builder": "1.0.0-gamma.7", - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/property-provider": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-1.0.0-gamma.7.tgz", - "integrity": "sha512-WKsV7RVkHy/uoc/BIwQm8lFwks1/kEE/U1qcO/diefQLeNK99aAxuOH7wahZUvD6Mb0iEI/0joTG2xe9CMqZyw==", - "requires": { - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/protocol-http": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-1.0.0-gamma.7.tgz", - "integrity": "sha512-KJsseiQd9ZckiC0TSbMckzclVY5QSL+5VkNlf0dSVmXMv2JzaSpJUt9SviNS9EVviNmzbyRHjaQy4/O6JN+Svg==", - "requires": { - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/querystring-builder": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-1.0.0-gamma.7.tgz", - "integrity": "sha512-eOb1z8DtSD3/z9bbAEcRvVI4a1H/Jnv+PlsBarUo6skonlRbyK/wH73DsIJg4tZCGc87mFJq+8e2z1V7w3Isbw==", - "requires": { - "@aws-sdk/types": "1.0.0-gamma.6", - "@aws-sdk/util-uri-escape": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/querystring-parser": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-1.0.0-gamma.7.tgz", - "integrity": "sha512-L1J8+rc+dlDr/+FW4j5iwZRWC16syP2bRpAEinQkqWWlSc5a4OoQNG0rk/Kxw1HZTc2hQKpuWkwLb5RFlnksCg==", - "requires": { - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/service-error-classification": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-1.0.0-gamma.7.tgz", - "integrity": "sha512-PtZ4GNqccq0re3PoFRSyysPSuk91oTpz8FLBaesz7K8FJ6Zp21/+QfAGoatU4YOGV1crdtwCSZhClVq875FfwA==" - }, - "@aws-sdk/shared-ini-file-loader": { - "version": "1.0.0-gamma.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-1.0.0-gamma.6.tgz", - "integrity": "sha512-K5FHebfLt4zqeIM88ndfuVXnpDa5GTHINy/AcqYW/wkjk5+gxahMChYtvRBJaX/9sbf1g7YYhGXGuuCednWiQg==", - "requires": { - "tslib": "^1.8.0" - } - }, - "@aws-sdk/signature-v4": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-1.0.0-gamma.7.tgz", - "integrity": "sha512-t5TMlyTwOqzkNJ1aBS7E5SgqMqO6MDssdn0hpes1l+6H1n9FXpRSBhTC9Dy5ZEA+v59WoS8p0IUnheHn8t1pGA==", - "requires": { - "@aws-sdk/is-array-buffer": "1.0.0-gamma.6", - "@aws-sdk/types": "1.0.0-gamma.6", - "@aws-sdk/util-hex-encoding": "1.0.0-gamma.6", - "@aws-sdk/util-uri-escape": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/smithy-client": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-1.0.0-gamma.7.tgz", - "integrity": "sha512-gTvR+cFYv94/1ijHQWgwi0upx+mumERR8ymrl/q8nrjOWJsf02j3FD7Tu10QlA1Hk6qCx43MWeEv86kD6sO0rw==", - "requires": { - "@aws-sdk/middleware-stack": "1.0.0-gamma.7", - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/types": { - "version": "1.0.0-gamma.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-1.0.0-gamma.6.tgz", - "integrity": "sha512-5mQGLqXw269oXH4bxA3iK+Pnhy72wjIa6ccsLJVypyk1ZYiJq8Xk/ratosvZ4CDAnSwnUS1BibtxP8zrY14HnA==" - }, - "@aws-sdk/url-parser-browser": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser-browser/-/url-parser-browser-1.0.0-gamma.7.tgz", - "integrity": "sha512-LKcNpxTENDMPu70wFKB/S3QVtOzJz+liorRiRq07JtkH0ct4ScvFFL0CIVu3DXCkhmaL6nk9Ez6pv2+r6+goWw==", - "requires": { - "@aws-sdk/querystring-parser": "1.0.0-gamma.7", - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/url-parser-node": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser-node/-/url-parser-node-1.0.0-gamma.7.tgz", - "integrity": "sha512-akR4BFHD47mNeT3jsN11LrHsCf4QmtVmbOlnmSezdic96cnPkfPnK/VtGElsjrLeklHeKNAC0xacu24Zp4n1qA==", - "requires": { - "@aws-sdk/querystring-parser": "1.0.0-gamma.7", - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0", - "url": "^0.11.0" - } - }, - "@aws-sdk/util-base64-browser": { - "version": "1.0.0-gamma.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-1.0.0-gamma.6.tgz", - "integrity": "sha512-8c1K6rXLEIu0sOqj8ynFFsD9LB0SNZ/WgBS58Vt9Q+U4UZ14OQMfoK2f1VmFvgSv+w8ztz/fcwXs2aJpld6oBw==", - "requires": { - "tslib": "^1.8.0" - } - }, - "@aws-sdk/util-base64-node": { - "version": "1.0.0-gamma.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-1.0.0-gamma.6.tgz", - "integrity": "sha512-Rlhui8eN3x5Iyt52+K5A67hZAFUEjDI612+cCgOWrgc2lWx/H4byva5HlND9V/ac3302QqBPDpx9DSh65CFY+Q==", - "requires": { - "@aws-sdk/util-buffer-from": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/util-body-length-browser": { - "version": "1.0.0-gamma.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-1.0.0-gamma.6.tgz", - "integrity": "sha512-ovrZJoSCS87nt+Mncd29gMWxZp2UDDeDbCgoFxAzO2P45k4DSHO6311SNz+zNJQ90SWZpy971WNRKUJlzvR+qw==", - "requires": { - "tslib": "^1.8.0" - } - }, - "@aws-sdk/util-body-length-node": { - "version": "1.0.0-gamma.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-1.0.0-gamma.6.tgz", - "integrity": "sha512-BiTFGEoOpXkCsdCJcZgCWpwUiX+hO7/VvqtEoImu/hJkUiDB9fkTXqWVWN+PHk8ao4DdJ9KDkp4eEwy9/+sqew==", - "requires": { - "tslib": "^1.8.0" - } - }, - "@aws-sdk/util-buffer-from": { - "version": "1.0.0-gamma.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-1.0.0-gamma.6.tgz", - "integrity": "sha512-VRfP8B1Uduf9fpnUynVA9D61RZWLoy8cWcZheuLaR2CWLEzh3Sq9NeHmybMeSEFXWrgrMNkZ8TccRH3qL3goDA==", - "requires": { - "@aws-sdk/is-array-buffer": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/util-hex-encoding": { - "version": "1.0.0-gamma.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-1.0.0-gamma.6.tgz", - "integrity": "sha512-bIRIhdAfQH94dWp6lE8OAu4+ghGuRFRDWfIm5id+ekwwPeCI82kxnXUxbI/U3zeQqj/PX96ZD64/SPYd1+cklg==", - "requires": { - "tslib": "^1.8.0" - } - }, - "@aws-sdk/util-locate-window": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-1.0.0-rc.3.tgz", - "integrity": "sha512-ioJ+/wneV6Q0ulOz7SLzacISHAMTwSGzhxBiuD/OMtiyoErZch2oc5h+PNh5Vc5jLV33R1jW01jz1pP1SVY+jQ==", - "requires": { - "tslib": "^1.8.0" - } - }, - "@aws-sdk/util-uri-escape": { - "version": "1.0.0-gamma.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-1.0.0-gamma.6.tgz", - "integrity": "sha512-U11YFhWSwyobmWF03Q5QRxLjG6sN/mfss58ue0KTKFhuTJxdrQ/Y+Aj/7TNSnVBNfHZqz7aETGz5HHD4ccgSAA==", - "requires": { - "tslib": "^1.8.0" - } - }, - "@aws-sdk/util-user-agent-browser": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-1.0.0-gamma.7.tgz", - "integrity": "sha512-9T86rQBzulki2F7WF0MWCpe8lv764luBpM4RY1oP+aeCF5zU7Q0XsGm1UeSBKupQBMN4v0OV1LHTvXqWGcEkbA==", - "requires": { - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/util-user-agent-node": { - "version": "1.0.0-gamma.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-1.0.0-gamma.7.tgz", - "integrity": "sha512-dLQfS9ADWBgBNMQ2+IWPuqkJ+RoqV4zBeyDd2ECNu2w7WsfcfeuiGR0VPQDFUJbGS+y+cY21NBRO1IXGMIzhfg==", - "requires": { - "@aws-sdk/types": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/util-utf8-browser": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-1.0.0-rc.3.tgz", - "integrity": "sha512-ypEJ2zsfm844dPSnES5lvS80Jb6hQ7D9iu0TUKQfIVu0LernJaAiSM05UEbktN+bEAoQBi9S64l8JjHVKFWu1Q==", - "requires": { - "tslib": "^1.8.0" - } - }, - "@aws-sdk/util-utf8-node": { - "version": "1.0.0-gamma.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-1.0.0-gamma.6.tgz", - "integrity": "sha512-mci/TC5dFV8SXMsfVwra3ktFWlzXEFFFXaFcNFMZmcbTakzerjpbTp6KHfOC3/seXPf8ErsDgY4X2ZxT4ue8aw==", - "requires": { - "@aws-sdk/util-buffer-from": "1.0.0-gamma.6", - "tslib": "^1.8.0" - } - }, "@babel/code-frame": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", @@ -1903,11 +1315,6 @@ "@babel/types": "^7.3.0" } }, - "@types/cookie": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz", - "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==" - }, "@types/crypto-js": { "version": "3.1.47", "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-3.1.47.tgz", @@ -2456,25 +1863,6 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" }, - "amazon-cognito-identity-js": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-4.5.3.tgz", - "integrity": "sha512-BqVEb1kNPzgmpy/pcTmBVcRjLRbSE8521urbpfJUwFteoOF/T8Zq7RF27vAiGW4TjKwi4PKtMTs85i6u99kSqg==", - "requires": { - "buffer": "4.9.1", - "crypto-js": "^3.3.0", - "fast-base64-decode": "^1.0.0", - "isomorphic-unfetch": "^3.0.0", - "js-cookie": "^2.2.1" - }, - "dependencies": { - "crypto-js": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", - "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" - } - } - }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -2829,11 +2217,6 @@ } } }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" - }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -2913,16 +2296,6 @@ "node-int64": "^0.4.0" } }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -3602,11 +2975,6 @@ } } }, - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" - }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -4989,11 +4357,6 @@ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, - "fast-base64-decode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", - "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==" - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5830,11 +5193,6 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, "ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", @@ -6316,7 +5674,8 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "isexe": { "version": "2.0.0", @@ -6330,15 +5689,6 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "isomorphic-unfetch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", - "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", - "requires": { - "node-fetch": "^2.6.1", - "unfetch": "^4.2.0" - } - }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -7023,11 +6373,6 @@ "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==", "dev": true }, - "js-cookie": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", - "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -12266,11 +11611,6 @@ "once": "^1.3.1" } }, - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -12282,11 +11622,6 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, "quick-lru": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", @@ -12328,14 +11663,6 @@ "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", "dev": true }, - "react-native-get-random-values": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/react-native-get-random-values/-/react-native-get-random-values-1.5.0.tgz", - "integrity": "sha512-LK+Wb8dEimJkd/dub7qziDmr9Tw4chhpzVeQ6JDo4czgfG4VXbptRyOMdu8503RiMF6y9pTH6ZUTkrrpprqT7w==", - "requires": { - "fast-base64-decode": "^1.0.0" - } - }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -14325,7 +13652,8 @@ "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true }, "tsutils": { "version": "3.17.1", @@ -14433,11 +13761,6 @@ "integrity": "sha512-xY96SsN3NA461qIRKZ/+qox37YXPtSBswMGfiNptr+wrt6ds4HaMw23TP612fEyGekRE6LNRiLYr/aqbHXNedw==", "dev": true }, - "unfetch": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", - "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" - }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -14459,15 +13782,6 @@ "crypto-random-string": "^2.0.0" } }, - "universal-cookie": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-4.0.4.tgz", - "integrity": "sha512-lbRVHoOMtItjWbM7TwDLdl8wug7izB0tq3/YVKhT/ahB4VDvWMyvnADfnJI8y6fSvsjh51Ix7lTGC6Tn4rMPhw==", - "requires": { - "@types/cookie": "^0.3.3", - "cookie": "^0.4.0" - } - }, "universal-user-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz", @@ -14550,15 +13864,6 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, "url-join": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", @@ -15216,20 +14521,6 @@ "camelcase": "^5.0.0", "decamelize": "^1.2.0" } - }, - "zen-observable": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", - "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" - }, - "zen-observable-ts": { - "version": "0.8.19", - "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.19.tgz", - "integrity": "sha512-u1a2rpE13G+jSzrg3aiCqXU5tN2kw41b+cBZGmnc+30YimdkKiDj9bTowcB41eL77/17RF/h+393AuVgShyheQ==", - "requires": { - "tslib": "^1.9.3", - "zen-observable": "^0.8.0" - } } } } diff --git a/package.json b/package.json index 8855b7c..f6d38a7 100755 --- a/package.json +++ b/package.json @@ -133,7 +133,6 @@ ] }, "dependencies": { - "@aws-amplify/auth": "^3.4.4", "@types/crypto-js": "^3.1.47", "@types/jsdom": "^16.2.5", "@types/traverse": "^0.6.32", diff --git a/src/admin/API.ts b/src/admin/API.ts deleted file mode 100644 index 104ad0e..0000000 --- a/src/admin/API.ts +++ /dev/null @@ -1,95 +0,0 @@ -import * as Core from '../core'; -import Auth from '@aws-amplify/auth'; -import type { Credentials } from './types'; -import type { Graph } from './Graph'; -import { fetch } from 'cross-fetch'; - -type Init = ConstructorParameters[0] & { - identityPoolId: string; - region: string; - userPoolId: string; - userPoolWebClientId: string; -}; - -/** - * Admin API provides a common interface for the `/s/admin` endpoints, whether - * it's a default setup or a custom solution for your integration. Admin API - * is the most feature-rich subset of Integration API available from the browser. - */ -export class API extends Core.API { - private readonly __auth = Auth; - - /** - * Creates an instance of {@link AdminAPI}. - * - * @param init Client configuration (same as for {@link BrowserAPI}). - */ - constructor(init: Init) { - super({ ...init, fetch: (...args) => this.__fetch(...args) }); - - this.__auth.configure({ - identityPoolId: init.identityPoolId, - region: init.region, - storage: init.storage, - userPoolId: init.userPoolId, - userPoolWebClientId: init.userPoolWebClientId, - }); - } - - async signIn(credentials: Credentials): Promise { - let user: { challengeName: string; challengeParam: Record }; - - try { - user = await this.__auth.signIn(credentials.email, credentials.password); - } catch (err) { - throw new Core.API.AuthError({ - code: 'UNAUTHORIZED', - originalError: err, - }); - } - - if (user.challengeName === 'NEW_PASSWORD_REQUIRED') { - if (credentials.newPassword) { - try { - await this.__auth.completeNewPassword(user, credentials.newPassword, user.challengeParam.requiredAttributes); - } catch (err) { - throw new Core.API.AuthError({ - code: 'UNKNOWN', - originalError: err, - }); - } - } else { - throw new Core.API.AuthError({ code: 'NEW_PASSWORD_REQUIRED' }); - } - } - } - - async sendPasswordResetEmail(email: string): Promise { - try { - await this.__auth.forgotPassword(email); - } catch (err) { - throw new Core.API.AuthError({ - code: 'UNKNOWN', - originalError: err, - }); - } - } - - async signOut(): Promise { - await this.__auth.signOut(); - this.storage.clear(); - } - - private async __fetch(input: RequestInfo, init?: RequestInit): Promise { - const session = await this.__auth.currentSession().catch(() => null); - const headers = new Headers(init?.headers); - const method = init?.method?.toUpperCase() ?? 'GET'; - const url = typeof input === 'string' ? input : input.url; - - headers.set('Content-Type', 'application/json'); - if (session !== null) headers.set('Authorization', `Bearer ${session.getAccessToken().getJwtToken()}`); - - this.console.trace(`${method} ${url}`); - return fetch(input, { ...init, headers }); - } -} diff --git a/src/admin/Graph.d.ts b/src/admin/Graph.d.ts deleted file mode 100644 index 2aa1f12..0000000 --- a/src/admin/Graph.d.ts +++ /dev/null @@ -1 +0,0 @@ -export type { Graph } from '../integration'; diff --git a/src/admin/Rels.d.ts b/src/admin/Rels.d.ts deleted file mode 100644 index cd373d7..0000000 --- a/src/admin/Rels.d.ts +++ /dev/null @@ -1 +0,0 @@ -export type { Rels } from '../integration'; diff --git a/src/admin/index.ts b/src/admin/index.ts deleted file mode 100644 index c1d8a59..0000000 --- a/src/admin/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { API } from './API'; - -import type * as Rels from './Rels'; -export type { Graph } from './Graph'; -export type { Rels }; diff --git a/src/admin/types.d.ts b/src/admin/types.d.ts deleted file mode 100644 index 5cf68d7..0000000 --- a/src/admin/types.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** User credentials for authentication. */ -export interface Credentials { - /** Email address associated with an account. */ - email: string; - /** Current password during regular sign-in, temporary password or a one-time code during access recovery. */ - password: string; - /** New password (only needed during the access recovery or force reset). */ - newPassword?: string; -} diff --git a/src/index.ts b/src/index.ts index d90d10f..ba274c5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,3 @@ export * as Core from './core'; export * as Integration from './integration'; export * as Customer from './customer'; -export * as Admin from './admin'; diff --git a/webpack.config.js b/webpack.config.js index 899d333..f9c7706 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -5,7 +5,6 @@ const path = require('path'); module.exports = { entry: { - Admin: './src/admin/index.ts', Customer: './src/customer/index.ts', }, From cf5643f02bd55bc288e12621ea6b859a50981770 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 19:55:13 +0300 Subject: [PATCH 36/98] refactor: replace deprecated ministorage with fake-storage --- package-lock.json | 17 +++++++++-------- package.json | 2 +- src/core/API/API.ts | 2 +- src/fake-storage.d.ts | 3 +++ src/integration/API.ts | 2 +- src/ministorage.d.ts | 3 --- 6 files changed, 15 insertions(+), 14 deletions(-) create mode 100644 src/fake-storage.d.ts delete mode 100644 src/ministorage.d.ts diff --git a/package-lock.json b/package-lock.json index 413b8d1..3f773d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -332,7 +332,6 @@ "version": "7.12.5", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", - "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } @@ -4357,6 +4356,14 @@ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, + "fake-storage": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fake-storage/-/fake-storage-2.0.0.tgz", + "integrity": "sha512-7K718tMkZO5CdLH8GsCPXkkJw4cJOMwoo2YKnWqcTSFsVCOB111pxka5kMsSMcyAYn+Xu6SvbnTQDLqwrDuomw==", + "requires": { + "@babel/runtime": "^7.11.2" + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -7227,11 +7234,6 @@ "kind-of": "^6.0.3" } }, - "ministorage": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ministorage/-/ministorage-1.0.0.tgz", - "integrity": "sha1-Dzz5ROmVFfUfQmxNFRnIL41kEa0=" - }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -11803,8 +11805,7 @@ "regenerator-runtime": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", - "dev": true + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" }, "regex-not": { "version": "1.0.2", diff --git a/package.json b/package.json index f6d38a7..2d9375b 100755 --- a/package.json +++ b/package.json @@ -140,8 +140,8 @@ "consola": "^2.15.0", "cross-fetch": "^3.0.6", "crypto-js": "^4.0.0", + "fake-storage": "^2.0.0", "jsdom": "^16.4.0", - "ministorage": "^1.0.0", "traverse": "^0.6.6", "v8n": "^1.3.3" } diff --git a/src/core/API/API.ts b/src/core/API/API.ts index f7d0980..f78c704 100644 --- a/src/core/API/API.ts +++ b/src/core/API/API.ts @@ -1,7 +1,7 @@ import consola, { Consola, LogLevel } from 'consola'; import { AuthError } from './AuthError'; import { Graph } from '../Graph'; -import MemoryStorage from 'ministorage'; +import MemoryStorage from 'fake-storage'; import { Node } from './Node'; import { fetch } from 'cross-fetch'; diff --git a/src/fake-storage.d.ts b/src/fake-storage.d.ts new file mode 100644 index 0000000..176e64d --- /dev/null +++ b/src/fake-storage.d.ts @@ -0,0 +1,3 @@ +declare module 'fake-storage' { + export default Storage; +} diff --git a/src/integration/API.ts b/src/integration/API.ts index e8931c4..857ea7d 100644 --- a/src/integration/API.ts +++ b/src/integration/API.ts @@ -3,7 +3,7 @@ import * as Rels from './Rels'; import fetch, { Headers } from 'cross-fetch'; import { Graph } from './Graph'; import { LogLevel } from 'consola'; -import MemoryStorage from 'ministorage'; +import MemoryStorage from 'fake-storage'; type LocalToken = Rels.FxToken['props'] & { date_created: string }; diff --git a/src/ministorage.d.ts b/src/ministorage.d.ts deleted file mode 100644 index be2e0db..0000000 --- a/src/ministorage.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare module 'ministorage' { - export default Storage; -} From 706ccb36704cc197612267c94e1efd83afa22b13 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 19:59:27 +0300 Subject: [PATCH 37/98] chore: remove unused dependencies --- package-lock.json | 122 ++++++++-------------------------------------- package.json | 3 -- 2 files changed, 20 insertions(+), 105 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3f773d4..cd22f75 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1314,11 +1314,6 @@ "@babel/types": "^7.3.0" } }, - "@types/crypto-js": { - "version": "3.1.47", - "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-3.1.47.tgz", - "integrity": "sha512-eI6gvpcGHLk3dAuHYnRCAjX+41gMv1nz/VP55wAe5HtmAKDOoPSfr3f6vkMc08ov1S0NsjvUBxDtHHxqQY1LGA==" - }, "@types/eslint": { "version": "7.2.4", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.4.tgz", @@ -1401,7 +1396,8 @@ "@types/json-schema": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==" + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true }, "@types/json5": { "version": "0.0.29", @@ -1860,7 +1856,8 @@ "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true }, "ansi-colors": { "version": "4.1.1", @@ -2079,18 +2076,6 @@ "slash": "^3.0.0" } }, - "babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", - "requires": { - "find-cache-dir": "^2.1.0", - "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", - "pify": "^4.0.1", - "schema-utils": "^2.6.5" - } - }, "babel-plugin-istanbul": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", @@ -2233,7 +2218,8 @@ "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true }, "bottleneck": { "version": "2.19.5", @@ -2786,11 +2772,6 @@ } } }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, "compare-func": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", @@ -3060,11 +3041,6 @@ "which": "^2.0.1" } }, - "crypto-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.0.0.tgz", - "integrity": "sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg==" - }, "crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -3482,7 +3458,8 @@ "emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true }, "end-of-stream": { "version": "1.4.4", @@ -4438,16 +4415,6 @@ "to-regex-range": "^5.0.1" } }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, "find-node-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.0.0.tgz", @@ -4464,14 +4431,6 @@ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", "dev": true }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, "find-versions": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", @@ -6483,6 +6442,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, "requires": { "minimist": "^1.2.0" } @@ -6626,21 +6586,13 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^1.0.1" } }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", @@ -6851,15 +6803,6 @@ "integrity": "sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg==", "dev": true }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, "make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -7221,7 +7164,8 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true }, "minimist-options": { "version": "4.1.0", @@ -7259,6 +7203,7 @@ "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, "requires": { "minimist": "^1.2.5" } @@ -11261,18 +11206,11 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "requires": { "p-try": "^2.0.0" } }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, "p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -11301,7 +11239,8 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true }, "parent-module": { "version": "1.0.1", @@ -11358,7 +11297,8 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -11401,11 +11341,6 @@ "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", "dev": true }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, "pirates": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", @@ -11498,14 +11433,6 @@ } } }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "requires": { - "find-up": "^3.0.0" - } - }, "please-upgrade-node": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", @@ -12324,16 +12251,6 @@ "xmlchars": "^2.2.0" } }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - }, "semantic-release": { "version": "17.2.2", "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-17.2.2.tgz", @@ -12501,7 +12418,8 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true }, "semver-compare": { "version": "1.0.0", diff --git a/package.json b/package.json index 2d9375b..0ca6ad9 100755 --- a/package.json +++ b/package.json @@ -133,13 +133,10 @@ ] }, "dependencies": { - "@types/crypto-js": "^3.1.47", "@types/jsdom": "^16.2.5", "@types/traverse": "^0.6.32", - "babel-loader": "^8.1.0", "consola": "^2.15.0", "cross-fetch": "^3.0.6", - "crypto-js": "^4.0.0", "fake-storage": "^2.0.0", "jsdom": "^16.4.0", "traverse": "^0.6.6", From 0b46551de13458df192e0a29c4ec879ccb01a3b3 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 22:44:35 +0300 Subject: [PATCH 38/98] fix: omit empty _embedded and _links in processed responses if they aren't present in the original json --- src/core/API/Response.ts | 41 +++++++++++++--------------------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/src/core/API/Response.ts b/src/core/API/Response.ts index 2793ddd..89cf029 100644 --- a/src/core/API/Response.ts +++ b/src/core/API/Response.ts @@ -20,28 +20,6 @@ type Init = ConstructorParameters[1] & { body: Blob | BufferSource | FormData | URLSearchParams | string | null; }; -/** - * Gets `json._links` if available. - * - * @param json Raw resource JSON. - * @returns The `_links` record or an empty object if unavailable. - */ -function getLinks(json: object) { - const links = (json as Record)._links; - return typeof links !== 'object' || !links ? {} : (links as Record); -} - -/** - * Gets `json._embedded` if available. - * - * @param json Raw resource JSON. - * @returns The `_embedded` record or an empty object if unavailable. - */ -function getEmbeds(json: object) { - const embeds = (json as Record)._embedded; - return typeof embeds !== 'object' || !embeds ? {} : (embeds as Record); -} - /** * Adds {@link Node} methods such as `.get()` or `.follow()` to each value in resource `_links`. * @@ -49,12 +27,14 @@ function getEmbeds(json: object) { * @returns Enriched JSON including followable links. */ function addFollowableLinks | undefined>( - params: Pick & { json: unknown } + params: Pick & { json: Record } ): Resource { const { json, ...nodeInit } = params; - if (typeof json !== 'object' || !json) return json as Resource; - const _links = Object.entries(getLinks(json)).reduce((links, [curie, link]) => { + if ('_links' in json) { + const links = (json as { _links: Record })._links; + + json._links = Object.entries(links).reduce((links, [curie, link]) => { if (Array.isArray(link)) return { ...links, [curie]: link }; const node = new Node({ ...nodeInit, path: [new URL(link.href)] }); @@ -69,18 +49,23 @@ function addFollowableLinks | return { ...links, [curie]: { ...link, ...methods } }; }, {}); + } + + if ('_embedded' in json) { + const embeds = (json as { _embedded: Record })._embedded; - const _embedded = Object.entries(getEmbeds(json)).reduce( + json._embedded = Object.entries(embeds).reduce( (embeds, [embedCurie, embedJSON]) => Object.assign(embeds, { [embedCurie]: Array.isArray(embedJSON) ? embedJSON.map(itemJSON => addFollowableLinks({ ...nodeInit, json: itemJSON })) - : addFollowableLinks({ ...nodeInit, json: embedJSON }), + : addFollowableLinks({ ...nodeInit, json: embedJSON as Record }), }), {} ); + } - return ({ ...json, _embedded, _links } as unknown) as Resource; + return json as Resource; } /** From 3691a7620785f33216cf3373ae2595090212b156 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 22:45:11 +0300 Subject: [PATCH 39/98] feat: add argument validation to response --- src/core/API/Response.ts | 73 +++++++++++++++++++++++++--------------- src/core/v8n.ts | 7 ++++ src/integration/v8n.ts | 8 ++--- 3 files changed, 55 insertions(+), 33 deletions(-) create mode 100644 src/core/v8n.ts diff --git a/src/core/API/Response.ts b/src/core/API/Response.ts index 89cf029..302be8f 100644 --- a/src/core/API/Response.ts +++ b/src/core/API/Response.ts @@ -1,12 +1,15 @@ /* eslint-disable @typescript-eslint/ban-types */ /* eslint-disable @typescript-eslint/no-unused-vars */ -import type { Consola } from 'consola'; +import '../v8n'; + +import { Consola } from 'consola'; import { Response as GlobalThisResponse } from 'cross-fetch'; import type { Graph } from '../Graph'; import { Node } from './Node'; import type { Query } from '../Query'; import type { Resource } from '../Resource'; +import v8n from 'v8n'; /** Options of {@link Response} constructor. */ type Init = ConstructorParameters[1] & { @@ -35,34 +38,34 @@ function addFollowableLinks | const links = (json as { _links: Record })._links; json._links = Object.entries(links).reduce((links, [curie, link]) => { - if (Array.isArray(link)) return { ...links, [curie]: link }; - - const node = new Node({ ...nodeInit, path: [new URL(link.href)] }); - const methods = { - delete: node.delete.bind(node), - follow: node.follow.bind(node), - get: node.get.bind(node), - patch: node.patch.bind(node), - post: node.post.bind(node), - put: node.put.bind(node), - }; - - return { ...links, [curie]: { ...link, ...methods } }; - }, {}); + if (Array.isArray(link)) return { ...links, [curie]: link }; + + const node = new Node({ ...nodeInit, path: [new URL(link.href)] }); + const methods = { + delete: node.delete.bind(node), + follow: node.follow.bind(node), + get: node.get.bind(node), + patch: node.patch.bind(node), + post: node.post.bind(node), + put: node.put.bind(node), + }; + + return { ...links, [curie]: { ...link, ...methods } }; + }, {}); } if ('_embedded' in json) { const embeds = (json as { _embedded: Record })._embedded; json._embedded = Object.entries(embeds).reduce( - (embeds, [embedCurie, embedJSON]) => - Object.assign(embeds, { - [embedCurie]: Array.isArray(embedJSON) - ? embedJSON.map(itemJSON => addFollowableLinks({ ...nodeInit, json: itemJSON })) + (embeds, [embedCurie, embedJSON]) => + Object.assign(embeds, { + [embedCurie]: Array.isArray(embedJSON) + ? embedJSON.map(itemJSON => addFollowableLinks({ ...nodeInit, json: itemJSON })) : addFollowableLinks({ ...nodeInit, json: embedJSON as Record }), - }), - {} - ); + }), + {} + ); } return json as Resource; @@ -78,6 +81,21 @@ export class Response< TGraph extends Graph, TQuery extends Query | undefined = undefined > extends GlobalThisResponse { + static readonly v8n = { + constructor: v8n().schema({ + cache: v8n().schema({ + clear: v8n().typeOf('function'), + getItem: v8n().typeOf('function'), + key: v8n().typeOf('function'), + length: v8n().number(), + removeItem: v8n().typeOf('function'), + setItem: v8n().typeOf('function'), + }), + console: v8n().instanceOf(Consola), + fetch: v8n().typeOf('function'), + }), + }; + /** Shared [Consola](https://github.com/nuxt-contrib/consola) instance. */ protected readonly _console: Consola; @@ -87,12 +105,13 @@ export class Response< /** Resolver cache implementing [Web Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API). */ protected readonly _cache: Storage; - constructor({ console, fetch, cache, body, ...responseInit }: Init) { - super(body, responseInit); + constructor(init: Init) { + Response.v8n.constructor.check(init); + super(init.body, init); - this._console = console; - this._fetch = fetch; - this._cache = cache; + this._console = init.console; + this._fetch = init.fetch; + this._cache = init.cache; } /** diff --git a/src/core/v8n.ts b/src/core/v8n.ts new file mode 100644 index 0000000..9fb9308 --- /dev/null +++ b/src/core/v8n.ts @@ -0,0 +1,7 @@ +import v8n from 'v8n'; + +v8n.extend({ + typeOf: (expected: string) => { + return (value: unknown) => typeof value === expected; + }, +}); diff --git a/src/integration/v8n.ts b/src/integration/v8n.ts index cec8db4..f11601f 100644 --- a/src/integration/v8n.ts +++ b/src/integration/v8n.ts @@ -1,10 +1,6 @@ -import v8n from 'v8n'; +import '../core/v8n'; -v8n.extend({ - typeOf: (expected: string) => { - return (value: unknown) => typeof value === expected; - }, -}); +import v8n from 'v8n'; export const thisV8N = v8n().schema({ key: v8n().optional(v8n().string()), From 2a0bd3e12970df1f2c3af2d73363b295abc5692e Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 22:45:21 +0300 Subject: [PATCH 40/98] test: add tests for response --- tests/core/API/Response.test.ts | 66 +++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 tests/core/API/Response.test.ts diff --git a/tests/core/API/Response.test.ts b/tests/core/API/Response.test.ts new file mode 100644 index 0000000..a7825db --- /dev/null +++ b/tests/core/API/Response.test.ts @@ -0,0 +1,66 @@ +import { Response as CrossFetchResponse } from 'cross-fetch'; +import MemoryStorage from 'fake-storage'; +import { Response } from '../../../src/core/API/Response'; +import consola from 'consola'; + +describe('Core', () => { + describe('API', () => { + describe('Response', () => { + it('errors when constructed with incorrect arguments', () => { + const invalidInit = (null as unknown) as ConstructorParameters[0]; + expect(() => new Response(invalidInit)).toThrow(); + }); + + it('extends Response class from cross-fetch package', () => { + const response = new Response({ + body: null, + cache: new MemoryStorage(), + console: consola.create({ level: Infinity }).withTag('@foxy.io/sdk'), + fetch: () => Promise.resolve(new CrossFetchResponse(null)), + }); + + expect(response).toBeInstanceOf(CrossFetchResponse); + }); + + it('returns data as-is from .json() when there are no _links', async () => { + const data = { baz: 'qux', foo: 'bar' }; + const response = new Response({ + body: JSON.stringify(data), + cache: new MemoryStorage(), + console: consola.create({ level: Infinity }).withTag('@foxy.io/sdk'), + fetch: () => Promise.resolve(new CrossFetchResponse(null)), + }); + + expect(await response.json()).toEqual(data); + }); + + it('adds node helpers to _links in .json() output', async () => { + const curies: unknown[] = []; + const data = { + _embedded: { + bar: [{ _links: { baz: { href: 'https://example.com' }, curies }, qux: 0 }], + foo: { _links: { bar: { href: 'https://example.com' }, curies }, qux: 0 }, + }, + _links: { curies, foo: { href: 'https://example.com' } }, + baz: 'qux', + }; + + const response = new Response({ + body: JSON.stringify(data), + cache: new MemoryStorage(), + console: consola.create({ level: Infinity }).withTag('@foxy.io/sdk'), + fetch: () => Promise.resolve(new CrossFetchResponse(null)), + }); + + const json = await response.json(); + const methods = ['get', 'put', 'post', 'patch', 'delete'] as const; + + expect(json).toMatchObject(data); + + methods.forEach(method => expect(json).toHaveProperty(`_links.foo.${method}`)); + methods.forEach(method => expect(json).toHaveProperty(`_embedded.foo._links.bar.${method}`)); + methods.forEach(method => expect(json).toHaveProperty(`_embedded.bar.0._links.baz.${method}`)); + }); + }); + }); +}); From 3c98aa4437af3c61e689e0c2a1312dee448705f3 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 10 Nov 2020 23:27:07 +0300 Subject: [PATCH 41/98] feat: add argument validation to node --- src/core/API/Node.ts | 38 +++++++++++++++++++++++++++++++++----- src/core/API/Response.ts | 12 ++---------- src/core/v8n.ts | 16 ++++++++++++++++ 3 files changed, 51 insertions(+), 15 deletions(-) diff --git a/src/core/API/Node.ts b/src/core/API/Node.ts index 8da8e2e..d304450 100644 --- a/src/core/API/Node.ts +++ b/src/core/API/Node.ts @@ -1,3 +1,5 @@ +import { storageV8N, v8n } from '../v8n'; + import { Consola } from 'consola'; import { Graph } from '../Graph'; import { Query } from '../Query'; @@ -62,6 +64,26 @@ function stringifyOrder(order: unknown): string { * of this class unless you're building a custom API client with our SDK. */ export class Node { + static readonly v8n = { + constructor: v8n().schema({ + cache: storageV8N, + console: v8n().instanceOf(Consola), + fetch: v8n().typeOf('function'), + path: v8n().curieChain(), + }), + follow: v8n().string(), + get: v8n().optional( + v8n().schema({ + fields: v8n().optional(v8n().array().every.string()), + filters: v8n().optional(v8n().array().every.string()), + limit: v8n().optional(v8n().number()), + offset: v8n().optional(v8n().number()), + order: v8n().optional(v8n().passesAnyOf(v8n().string(), v8n().object(), v8n().array())), + zoom: v8n().optional(v8n().passesAnyOf(v8n().string(), v8n().object(), v8n().array())), + }) + ), + }; + static readonly ResolutionError = ResolutionError; static readonly Response = Response; @@ -78,11 +100,13 @@ export class Node { /** Path to this resource node as base URL followed by a list of curies. */ protected readonly _path: CurieChain; - constructor({ path, fetch, cache, console }: NodeInit) { - this._path = path; - this._fetch = fetch; - this._cache = cache; - this._console = console; + constructor(init: NodeInit) { + Node.v8n.constructor.check(init); + + this._path = init.path; + this._fetch = init.fetch; + this._cache = init.cache; + this._console = init.console; } async get(): Promise>; @@ -97,6 +121,8 @@ export class Node { * @returns Instance of {@link APIResponse} representing this resource. */ async get(query?: Query): Promise> { + Node.v8n.get.check(query); + const url = await this._resolve(); const { filters, fields, offset, limit, order, zoom } = query ?? {}; @@ -191,6 +217,8 @@ export class Node { * @returns Instance of {@link APINode} representing the resource at curie location. */ follow(curie: C): Node { + Node.v8n.follow.check(curie); + const config = { cache: this._cache, console: this._console, fetch: this._fetch }; const path = this._path.concat(curie as string) as CurieChain; diff --git a/src/core/API/Response.ts b/src/core/API/Response.ts index 302be8f..7777934 100644 --- a/src/core/API/Response.ts +++ b/src/core/API/Response.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/ban-types */ /* eslint-disable @typescript-eslint/no-unused-vars */ -import '../v8n'; +import { storageV8N, v8n } from '../v8n'; import { Consola } from 'consola'; import { Response as GlobalThisResponse } from 'cross-fetch'; @@ -9,7 +9,6 @@ import type { Graph } from '../Graph'; import { Node } from './Node'; import type { Query } from '../Query'; import type { Resource } from '../Resource'; -import v8n from 'v8n'; /** Options of {@link Response} constructor. */ type Init = ConstructorParameters[1] & { @@ -83,14 +82,7 @@ export class Response< > extends GlobalThisResponse { static readonly v8n = { constructor: v8n().schema({ - cache: v8n().schema({ - clear: v8n().typeOf('function'), - getItem: v8n().typeOf('function'), - key: v8n().typeOf('function'), - length: v8n().number(), - removeItem: v8n().typeOf('function'), - setItem: v8n().typeOf('function'), - }), + cache: storageV8N, console: v8n().instanceOf(Consola), fetch: v8n().typeOf('function'), }), diff --git a/src/core/v8n.ts b/src/core/v8n.ts index 9fb9308..2ede1ed 100644 --- a/src/core/v8n.ts +++ b/src/core/v8n.ts @@ -1,7 +1,23 @@ +import { URL } from 'url'; import v8n from 'v8n'; v8n.extend({ + curieChain: () => { + return (value: unknown) => + Array.isArray(value) && value[0] instanceof URL && value.slice(1).every(i => typeof i === 'string'); + }, typeOf: (expected: string) => { return (value: unknown) => typeof value === expected; }, }); + +export { v8n }; + +export const storageV8N = v8n().schema({ + clear: v8n().typeOf('function'), + getItem: v8n().typeOf('function'), + key: v8n().typeOf('function'), + length: v8n().number(), + removeItem: v8n().typeOf('function'), + setItem: v8n().typeOf('function'), +}); From 1bc870a906a8f995b8244203ece31c8ae55956a0 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Wed, 11 Nov 2020 23:01:31 +0300 Subject: [PATCH 42/98] fix: send PATCH instead of POST on `node.patch()` --- src/core/API/Node.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/API/Node.ts b/src/core/API/Node.ts index d304450..68c39e2 100644 --- a/src/core/API/Node.ts +++ b/src/core/API/Node.ts @@ -186,7 +186,7 @@ export class Node { */ async patch(body?: Partial): Promise> { const url = await this._resolve(); - const request = new Request(url.toString(), { body: JSON.stringify(body), method: 'POST' }); + const request = new Request(url.toString(), { body: JSON.stringify(body), method: 'PATCH' }); const response = await this._fetch(request); const config = { cache: this._cache, console: this._console, fetch: this._fetch }; From 82ce431dab039d2cb995f4f875d38353c028f812 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Wed, 11 Nov 2020 23:02:51 +0300 Subject: [PATCH 43/98] fix: clone resolved url to avoid accidental path mutations --- src/core/API/Node.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/API/Node.ts b/src/core/API/Node.ts index 68c39e2..a4553c5 100644 --- a/src/core/API/Node.ts +++ b/src/core/API/Node.ts @@ -233,7 +233,7 @@ export class Node { * @throws Throws {@link APIResolutionError} when once of the resources can't be reached. */ protected async _resolve(): Promise { - if (this._path.length === 1) return this._path[0]; + if (this._path.length === 1) return new URL(this._path[0].toString()); const [baseURL, curie] = this._path; const key = `${baseURL.toString()} > ${curie}`; From b6f16ece18914a6d85464f16d9b9ff0d795131d2 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Thu, 12 Nov 2020 00:26:25 +0300 Subject: [PATCH 44/98] test: add tests for node class --- tests/core/API/Node.test.ts | 235 ++++++++++++++++++++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 tests/core/API/Node.test.ts diff --git a/tests/core/API/Node.test.ts b/tests/core/API/Node.test.ts new file mode 100644 index 0000000..9721be0 --- /dev/null +++ b/tests/core/API/Node.test.ts @@ -0,0 +1,235 @@ +/* eslint-disable jest/valid-title */ + +import { Request as CrossFetchRequest, Response as CrossFetchResponse } from 'cross-fetch'; + +import { Graph } from '../../../src/core/Graph'; +import MemoryStorage from 'fake-storage'; +import { Node } from '../../../src/core/API/Node'; +import { Query } from '../../../src/core/Query'; +import { ResolutionError } from '../../../src/core/API/ResolutionError'; +import { Response } from '../../../src/core/API/Response'; +import consola from 'consola'; + +describe('Core', () => { + describe('API', () => { + describe('Node', () => { + it('errors when constructed with incorrect arguments', () => { + const invalidInit = (null as unknown) as ConstructorParameters[0]; + expect(() => new Node(invalidInit)).toThrow(); + }); + + it('has a static link to ResolutionError', () => { + expect(Node).toHaveProperty('ResolutionError', ResolutionError); + }); + + it('has a static link to Response', () => { + expect(Node).toHaveProperty('Response', Response); + }); + + const console = consola.create({ level: Infinity }).withTag('@foxy.io/sdk'); + const cache = new MemoryStorage(); + const path = [new URL('https://example.com/')] as [URL, ...string[]]; + + beforeEach(() => cache.clear()); + + type TestGETInit = { + label: string; + query?: Query; + target: string; + }; + + // eslint-disable-next-line jsdoc/require-jsdoc + function testGET({ label, query, target }: TestGETInit) { + it(label, async () => { + const body = { foo: 'bar' }; + const fetch = jest.fn().mockResolvedValue(new CrossFetchResponse(JSON.stringify(body))); + const node = new Node({ cache, console, fetch, path }); + const response = query ? await node.get(query) : await node.get(); + + expect(fetch).toHaveBeenCalledWith(new CrossFetchRequest(target)); + expect(response).toBeInstanceOf(Response); + expect(await response.json()).toMatchObject(body); + }); + } + + testGET({ + label: 'GETs resolved URL without args', + target: 'https://example.com/', + }); + + testGET<{ zooms: { foo: { zooms: { bar: never } } } }>({ + label: 'GETs resolved URL with simple zoom', + query: { zoom: 'foo' }, + target: 'https://example.com/?zoom=foo', + }); + + testGET<{ zooms: { foo: { zooms: { bar: never } } } }>({ + label: 'GETs resolved URL with array zoom', + query: { zoom: { foo: 'bar' } }, + target: 'https://example.com/?zoom=foo%3Abar', + }); + + testGET<{ zooms: { foo: never; bar: never } }>({ + label: 'GETs resolved URL with array zoom', + query: { zoom: ['foo', 'bar'] }, + target: 'https://example.com/?zoom=foo%2Cbar', + }); + + testGET<{ zooms: { foo: never; bar: { zooms: { baz: never } } } }>({ + label: 'GETs resolved URL with complex array zoom', + query: { zoom: ['foo', { bar: 'baz' }] }, + target: 'https://example.com/?zoom=foo%2Cbar%3Abaz', + }); + + testGET<{ child: { props: { foo: string } } }>({ + label: 'GETs resolved URL with simple order', + query: { order: 'foo' }, + target: 'https://example.com/?order=foo', + }); + + testGET<{ child: { props: { foo: string } } }>({ + label: 'GETs resolved URL with record order', + query: { order: { foo: 'desc' } }, + target: 'https://example.com/?order=foo+desc', + }); + + testGET<{ child: { props: { foo: string; bar: number } } }>({ + label: 'GETs resolved URL with array order', + query: { order: ['foo', 'bar'] }, + target: 'https://example.com/?order=foo%2Cbar', + }); + + testGET<{ child: never }>({ + label: 'GETs resolved URL with limit', + query: { limit: 10 }, + target: 'https://example.com/?limit=10', + }); + + testGET<{ props: { foo: string; bar: string } }>({ + label: 'GETs resolved URL with fields', + query: { fields: ['foo', 'bar'] }, + target: 'https://example.com/?fields=foo%2Cbar', + }); + + testGET<{ child: never }>({ + label: 'GETs resolved URL with offset', + query: { offset: 10 }, + target: 'https://example.com/?offset=10', + }); + + testGET<{ child: never }>({ + label: 'GETs resolved URL with filters', + query: { filters: ['foo=bar', 'baz=qux'] }, + target: 'https://example.com/?foo=bar&baz=qux', + }); + + it('errors when .get() is called with incorrect query', async () => { + const incorrectQuery = { + fields: null, + filters: {}, + limit: 'o_0', + offset: 'huh', + order: undefined, + zoom: 0, + }; + + const fetch = jest.fn(); + const node = new Node({ cache, console, fetch, path }); + const promise = node.get((incorrectQuery as unknown) as Parameters[0]); + + // eslint-disable-next-line jest/valid-expect + expect(promise).rejects.toThrow(); + }); + + (['put', 'post', 'patch'] as const).forEach(method => { + it(`can ${method.toUpperCase()} to resolved URL`, async () => { + const data = { foo: 'bar' }; + const body = JSON.stringify(data); + const fetch = jest.fn().mockResolvedValue(new CrossFetchResponse(body)); + const response = await new Node({ cache, console, fetch, path })[method](data); + + expect(fetch).toHaveBeenCalledWith(new CrossFetchRequest(path[0].toString(), { body, method })); + expect(response).toBeInstanceOf(Response); + expect(await response.json()).toMatchObject(data); + }); + }); + + it('can send DELETE to resolved URL', async () => { + const fetch = jest.fn().mockResolvedValue(new CrossFetchResponse(null)); + const response = await new Node({ cache, console, fetch, path }).delete(); + + expect(fetch).toHaveBeenCalledWith(new CrossFetchRequest(path[0].toString(), { method: 'DELETE' })); + expect(response).toBeInstanceOf(Response); + }); + + it('resolves simple paths', async () => { + const path = [new URL('https://example.com/')] as [URL, ...string[]]; + const fetch = jest.fn().mockResolvedValue(new CrossFetchResponse(null)); + await new Node({ cache, console, fetch, path }).get(); + + expect(fetch).toHaveBeenCalledWith(new CrossFetchRequest(path[0].toString())); + }); + + it('resolves complex paths', async () => { + const path = [new URL('https://example.com/'), 'foo'] as [URL, ...string[]]; + const bookmarkHref = path[0].toString(); + const fooHref = 'https://foo.example.com/and/some/path/'; + + const fetch = jest.fn().mockImplementation(async (info: string | Request) => { + const fooBody = { _links: { foo: { href: fooHref } } }; + if (info === bookmarkHref) return new CrossFetchResponse(JSON.stringify(fooBody)); + return new CrossFetchResponse(null); + }); + + await new Node({ cache, console, fetch, path }).get(); + + expect(fetch).toHaveBeenNthCalledWith(1, bookmarkHref); + expect(fetch).toHaveBeenNthCalledWith(2, new CrossFetchRequest(fooHref)); + }); + + it('resolves complex paths from cache', async () => { + const path = [new URL('https://example.com/'), 'foo'] as [URL, ...string[]]; + const bookmarkHref = path[0].toString(); + const fooHref = 'https://foo.example.com/and/some/path/'; + + const fetch = jest.fn().mockImplementation(async (info: string | Request) => { + const fooBody = { _links: { foo: { href: fooHref } } }; + if (info === bookmarkHref) return new CrossFetchResponse(JSON.stringify(fooBody)); + return new CrossFetchResponse(null); + }); + + cache.setItem(`${bookmarkHref} > foo`, fooHref); + await new Node({ cache, console, fetch, path }).get(); + + expect(fetch).toHaveBeenCalledWith(new CrossFetchRequest(fooHref)); + }); + + it('throws ResolutionError on non-2xx status', async () => { + const path = [new URL('https://example.com/'), 'foo'] as [URL, ...string[]]; + const fetch = jest.fn().mockResolvedValue(new CrossFetchResponse(null, { status: 500 })); + const promise = new Node({ cache, console, fetch, path }).get(); + + // eslint-disable-next-line jest/valid-expect + expect(promise).rejects.toThrow(ResolutionError); + }); + + it('is followable', () => { + const fetch = jest.fn(); + const node = new Node<{ links: { foo: never } }>({ cache, console, fetch, path }); + const nextNode = node.follow('foo'); + + expect(nextNode).toBeInstanceOf(Node); + expect(nextNode).toHaveProperty('_console', console); + expect(nextNode).toHaveProperty('_fetch', fetch); + expect(nextNode).toHaveProperty('_path', [...path, 'foo']); + }); + + it('errors when .follow() is called with a non-string curie', () => { + const fetch = jest.fn(); + const node = new Node<{ links: { foo: never } }>({ cache, console, fetch, path }); + + expect(() => node.follow((123 as unknown) as 'foo')).toThrow(); + }); + }); + }); +}); From 4848d9dbf0f60019c21be33c94ce51060910681b Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Thu, 12 Nov 2020 00:31:25 +0300 Subject: [PATCH 45/98] refactor: remove url import from v8n helpers file --- src/core/v8n.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/core/v8n.ts b/src/core/v8n.ts index 2ede1ed..3931af2 100644 --- a/src/core/v8n.ts +++ b/src/core/v8n.ts @@ -1,4 +1,3 @@ -import { URL } from 'url'; import v8n from 'v8n'; v8n.extend({ From d9318560c671b7b1dcdfba3e9e37cf713c6deefd Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Thu, 12 Nov 2020 00:32:50 +0300 Subject: [PATCH 46/98] test: disable logging in tests --- tests/core/API/Node.test.ts | 2 +- tests/core/API/Response.test.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/core/API/Node.test.ts b/tests/core/API/Node.test.ts index 9721be0..3c00af9 100644 --- a/tests/core/API/Node.test.ts +++ b/tests/core/API/Node.test.ts @@ -26,7 +26,7 @@ describe('Core', () => { expect(Node).toHaveProperty('Response', Response); }); - const console = consola.create({ level: Infinity }).withTag('@foxy.io/sdk'); + const console = consola.create({ level: -1 }).withTag('@foxy.io/sdk'); const cache = new MemoryStorage(); const path = [new URL('https://example.com/')] as [URL, ...string[]]; diff --git a/tests/core/API/Response.test.ts b/tests/core/API/Response.test.ts index a7825db..2863cdc 100644 --- a/tests/core/API/Response.test.ts +++ b/tests/core/API/Response.test.ts @@ -15,7 +15,7 @@ describe('Core', () => { const response = new Response({ body: null, cache: new MemoryStorage(), - console: consola.create({ level: Infinity }).withTag('@foxy.io/sdk'), + console: consola.create({ level: -1 }).withTag('@foxy.io/sdk'), fetch: () => Promise.resolve(new CrossFetchResponse(null)), }); @@ -27,7 +27,7 @@ describe('Core', () => { const response = new Response({ body: JSON.stringify(data), cache: new MemoryStorage(), - console: consola.create({ level: Infinity }).withTag('@foxy.io/sdk'), + console: consola.create({ level: -1 }).withTag('@foxy.io/sdk'), fetch: () => Promise.resolve(new CrossFetchResponse(null)), }); @@ -48,7 +48,7 @@ describe('Core', () => { const response = new Response({ body: JSON.stringify(data), cache: new MemoryStorage(), - console: consola.create({ level: Infinity }).withTag('@foxy.io/sdk'), + console: consola.create({ level: -1 }).withTag('@foxy.io/sdk'), fetch: () => Promise.resolve(new CrossFetchResponse(null)), }); From 30f0cb89733bcc42d714c819018b805131637f9c Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Thu, 12 Nov 2020 16:29:39 +0300 Subject: [PATCH 47/98] feat: add arguments validation to core api --- src/core/API/API.ts | 14 ++++++++++++++ src/core/API/Node.ts | 8 ++++---- src/core/v8n.ts | 3 +++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/core/API/API.ts b/src/core/API/API.ts index f78c704..7d23838 100644 --- a/src/core/API/API.ts +++ b/src/core/API/API.ts @@ -1,4 +1,6 @@ import consola, { Consola, LogLevel } from 'consola'; +import { storageV8N, v8n } from '../v8n'; + import { AuthError } from './AuthError'; import { Graph } from '../Graph'; import MemoryStorage from 'fake-storage'; @@ -47,6 +49,16 @@ export class API extends Node { static readonly Node = Node; + static readonly v8n = { + classConstructor: v8n().schema({ + base: v8n().instanceOf(URL), + cache: v8n().optional(storageV8N), + fetch: v8n().optional(v8n().typeOf('function')), + level: v8n().optional(v8n().integer()), + storage: v8n().optional(storageV8N), + }), + }; + /** * [Consola](https://github.com/nuxt-contrib/consola) instance. * If you extend this class and add logging in your code, use this instead of native console. @@ -72,6 +84,8 @@ export class API extends Node { readonly base: URL; constructor(init: Init) { + API.v8n.classConstructor.check(init); + super({ cache: init.cache ?? new MemoryStorage(), console: consola.create({ level: init.level }).withTag('@foxy.io/sdk'), diff --git a/src/core/API/Node.ts b/src/core/API/Node.ts index a4553c5..2e3a27c 100644 --- a/src/core/API/Node.ts +++ b/src/core/API/Node.ts @@ -1,4 +1,4 @@ -import { storageV8N, v8n } from '../v8n'; +import { V8N, storageV8N, v8n } from '../v8n'; import { Consola } from 'consola'; import { Graph } from '../Graph'; @@ -64,8 +64,8 @@ function stringifyOrder(order: unknown): string { * of this class unless you're building a custom API client with our SDK. */ export class Node { - static readonly v8n = { - constructor: v8n().schema({ + static readonly v8n: Record = { + classConstructor: v8n().schema({ cache: storageV8N, console: v8n().instanceOf(Consola), fetch: v8n().typeOf('function'), @@ -101,7 +101,7 @@ export class Node { protected readonly _path: CurieChain; constructor(init: NodeInit) { - Node.v8n.constructor.check(init); + Node.v8n.classConstructor.check(init); this._path = init.path; this._fetch = init.fetch; diff --git a/src/core/v8n.ts b/src/core/v8n.ts index 3931af2..0a08514 100644 --- a/src/core/v8n.ts +++ b/src/core/v8n.ts @@ -12,6 +12,9 @@ v8n.extend({ export { v8n }; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type V8N = { check: (...args: any[]) => boolean }; + export const storageV8N = v8n().schema({ clear: v8n().typeOf('function'), getItem: v8n().typeOf('function'), From f8a43cfa2f506cc0359343909797f92ec2997744 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Thu, 12 Nov 2020 16:29:54 +0300 Subject: [PATCH 48/98] test: add tests for core api --- tests/core/API/API.test.ts | 69 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 tests/core/API/API.test.ts diff --git a/tests/core/API/API.test.ts b/tests/core/API/API.test.ts new file mode 100644 index 0000000..a0f0918 --- /dev/null +++ b/tests/core/API/API.test.ts @@ -0,0 +1,69 @@ +import { API } from '../../../src/core/API/API'; +import { AuthError } from '../../../src/core/API/AuthError'; +import { Response as CrossFetchResponse } from 'cross-fetch'; +import MemoryCache from 'fake-storage'; +import { Node } from '../../../src/core/API/Node'; + +describe('Core', () => { + describe('API', () => { + it('exposes AuthError via static property', () => { + expect(API).toHaveProperty('AuthError', AuthError); + }); + + it('exposes Node via static property', () => { + expect(API).toHaveProperty('Node', Node); + }); + + it('errors when constructed with incorrect params', () => { + const incorrectInit = ({ + base: undefined, + cache: Number, + fetch: 123, + level: 'hi', + storage: null, + } as unknown) as ConstructorParameters[0]; + + expect(() => new API(incorrectInit)).toThrow(); + }); + + it('extends Node', () => { + const api = new API({ base: new URL('https://example.com/') }); + expect(api).toBeInstanceOf(Node); + }); + + it('exposes base URL as instance property', () => { + const base = new URL('https://example.com/'); + expect(new API({ base }).base).toBe(base); + }); + + it('uses custom fetch implementation when provided', async () => { + const params = ['https://example.com/path/to/resource/', { method: 'POST' }] as const; + const fetch = jest.fn().mockResolvedValue(new CrossFetchResponse(null)); + + await new API({ base: new URL('https://example.com/'), fetch }).fetch(...params); + expect(fetch).toHaveBeenCalledWith(...params); + }); + + it('uses fake-storage for cache by default', () => { + const api = new API({ base: new URL('https://example.com/') }); + expect(api.cache).toBeInstanceOf(MemoryCache); + }); + + it('uses custom storage implementation for cache if provided', () => { + const cache = new MemoryCache(); + const api = new API({ base: new URL('https://example.com/'), cache }); + expect(api.cache).toBe(cache); + }); + + it('uses fake-storage for storage by default', () => { + const api = new API({ base: new URL('https://example.com/') }); + expect(api.storage).toBeInstanceOf(MemoryCache); + }); + + it('uses custom storage implementation for storage if provided', () => { + const storage = new MemoryCache(); + const api = new API({ base: new URL('https://example.com/'), storage }); + expect(api.storage).toBe(storage); + }); + }); +}); From 80da1ff88a7cd3204992e8af826fd06a9699b66d Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Thu, 12 Nov 2020 16:47:59 +0300 Subject: [PATCH 49/98] test: add entry point tests --- tests/index.test.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 tests/index.test.ts diff --git a/tests/index.test.ts b/tests/index.test.ts new file mode 100644 index 0000000..c2c2ac2 --- /dev/null +++ b/tests/index.test.ts @@ -0,0 +1,18 @@ +import * as FoxySDK from '../src/index'; +import * as FoxySDKCore from '../src/core'; +import * as FoxySDKCustomer from '../src/customer'; +import * as FoxySDKIntegration from '../src/integration'; + +describe('Index', () => { + it('exports core modules as Core', () => { + expect(FoxySDK).toHaveProperty('Core', FoxySDKCore); + }); + + it('exports customer sdk modules as Customer', () => { + expect(FoxySDK).toHaveProperty('Customer', FoxySDKCustomer); + }); + + it('exports integration sdk modules as Integration', () => { + expect(FoxySDK).toHaveProperty('Integration', FoxySDKIntegration); + }); +}); From 40670a51ca3ca5b6a6b240ff7266294bc48fd23b Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Thu, 12 Nov 2020 16:57:37 +0300 Subject: [PATCH 50/98] style: fix eslint warnings in integration api class --- src/integration/API.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/integration/API.ts b/src/integration/API.ts index 857ea7d..b984182 100644 --- a/src/integration/API.ts +++ b/src/integration/API.ts @@ -1,6 +1,8 @@ import * as Core from '../core'; import * as Rels from './Rels'; + import fetch, { Headers } from 'cross-fetch'; + import { Graph } from './Graph'; import { LogLevel } from 'consola'; import MemoryStorage from 'fake-storage'; @@ -42,11 +44,11 @@ export class API extends Core.API { constructor(params: IntegrationAPIInit) { super({ - level: params.logLevel, - storage: params.storage ?? new MemoryStorage(), base: params.baseURL ?? API.BASE_URL, - fetch: (...args) => this.__fetch(...args), cache: params.cache ?? new MemoryStorage(), + fetch: (...args) => this.__fetch(...args), + level: params.logLevel, + storage: params.storage ?? new MemoryStorage(), }); this.refreshToken = params.refreshToken; @@ -83,7 +85,7 @@ export class API extends Core.API { body.set('client_id', this.clientId); this.console.trace("Access token isn't present in the storage. Fetching a new one..."); - const response = await fetch(url, { method: 'POST', headers, body }); + const response = await fetch(url, { body, headers, method: 'POST' }); if (response.ok) { const props = (await response.json()) as Rels.FxToken['props']; From 35529ce1c7da1e7a3e9b546d8e70e2cce85774ef Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Thu, 12 Nov 2020 18:45:04 +0300 Subject: [PATCH 51/98] refactor: rename baseURL to base, logLevel to level in integration api for consistency with the core api class --- src/integration/API.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/integration/API.ts b/src/integration/API.ts index b984182..b3a8b00 100644 --- a/src/integration/API.ts +++ b/src/integration/API.ts @@ -17,10 +17,10 @@ type IntegrationAPIInit = { refreshToken: string; clientSecret: string; clientId: string; - logLevel?: LogLevel; + level?: LogLevel; storage?: Storage; version?: IntegrationAPIVersion; - baseURL?: URL; // pathname ending with "/" !!! + base?: URL; // pathname ending with "/" !!! cache?: Storage; }; @@ -44,10 +44,10 @@ export class API extends Core.API { constructor(params: IntegrationAPIInit) { super({ - base: params.baseURL ?? API.BASE_URL, + base: params.base ?? API.BASE_URL, cache: params.cache ?? new MemoryStorage(), fetch: (...args) => this.__fetch(...args), - level: params.logLevel, + level: params.level, storage: params.storage ?? new MemoryStorage(), }); From 9159012aaf6dcc2ba3128cb778509442d10254d6 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Thu, 12 Nov 2020 18:49:35 +0300 Subject: [PATCH 52/98] feat: add arguments validation to integration api --- src/integration/API.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/integration/API.ts b/src/integration/API.ts index b3a8b00..72a5555 100644 --- a/src/integration/API.ts +++ b/src/integration/API.ts @@ -2,6 +2,7 @@ import * as Core from '../core'; import * as Rels from './Rels'; import fetch, { Headers } from 'cross-fetch'; +import { storageV8N, v8n } from '../core/v8n'; import { Graph } from './Graph'; import { LogLevel } from 'consola'; @@ -34,6 +35,19 @@ export class API extends Core.API { static readonly VERSION: IntegrationAPIVersion = '1'; + static readonly v8n = { + classConstructor: v8n().schema({ + base: v8n().optional(v8n().instanceOf(URL)), + cache: v8n().optional(storageV8N), + clientId: v8n().string(), + clientSecret: v8n().string(), + level: v8n().optional(v8n().integer()), + refreshToken: v8n().string(), + storage: v8n().optional(storageV8N), + version: v8n().optional(v8n().passesAnyOf(v8n().exact('1'))), + }), + }; + readonly refreshToken: string; readonly clientSecret: string; @@ -43,6 +57,8 @@ export class API extends Core.API { readonly version: IntegrationAPIVersion; constructor(params: IntegrationAPIInit) { + API.v8n.classConstructor.check(params); + super({ base: params.base ?? API.BASE_URL, cache: params.cache ?? new MemoryStorage(), From 1c2bfbe55c9bcc988d55956d5a841b60c77b34dc Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Thu, 12 Nov 2020 21:03:57 +0300 Subject: [PATCH 53/98] test: add tests for integration api --- src/integration/API.ts | 6 +- tests/integration/API.test.ts | 225 ++++++++++++++++++++++++++++++++++ 2 files changed, 228 insertions(+), 3 deletions(-) create mode 100644 tests/integration/API.test.ts diff --git a/src/integration/API.ts b/src/integration/API.ts index 72a5555..1f0d553 100644 --- a/src/integration/API.ts +++ b/src/integration/API.ts @@ -1,7 +1,7 @@ import * as Core from '../core'; import * as Rels from './Rels'; -import fetch, { Headers } from 'cross-fetch'; +import { Headers, fetch } from 'cross-fetch'; import { storageV8N, v8n } from '../core/v8n'; import { Graph } from './Graph'; @@ -95,10 +95,10 @@ export class API extends Core.API { headers.set('FOXY-API-VERSION', this.version); headers.set('Content-Type', 'application/x-www-form-urlencoded'); - body.set('refresh_token', this.refreshToken); + body.set('client_id', this.clientId); body.set('client_secret', this.clientSecret); body.set('grant_type', 'refresh_token'); - body.set('client_id', this.clientId); + body.set('refresh_token', this.refreshToken); this.console.trace("Access token isn't present in the storage. Fetching a new one..."); const response = await fetch(url, { body, headers, method: 'POST' }); diff --git a/tests/integration/API.test.ts b/tests/integration/API.test.ts new file mode 100644 index 0000000..6b6e89b --- /dev/null +++ b/tests/integration/API.test.ts @@ -0,0 +1,225 @@ +jest.mock('cross-fetch', () => ({ + Headers: (jest.requireActual('cross-fetch') as typeof import('cross-fetch')).Headers, + Request: (jest.requireActual('cross-fetch') as typeof import('cross-fetch')).Request, + Response: (jest.requireActual('cross-fetch') as typeof import('cross-fetch')).Response, + default: jest.fn(), + fetch: jest.fn(), +})); + +import { Headers, Request, Response, fetch } from 'cross-fetch'; + +import { API as CoreAPI } from '../../src/core/API'; +import { FxToken } from '../../src/integration/Rels'; +import { API as IntegrationAPI } from '../../src/integration/API'; +import MemoryCache from 'fake-storage'; + +const fetchMock = (fetch as unknown) as jest.MockInstance; + +const commonHeaders = { + 'Content-Type': 'application/json', + 'FOXY-API-VERSION': '1', +}; + +const commonInit = { + clientId: 'client_358462935687323', + clientSecret: 'gfcvbghnjmkmjnhbgvfcdvbnm', + level: -1, + refreshToken: '65redfghyuyjthgrhyjthrgdfghytredtyuytredrtyuy6trtyuhgfdr', +}; + +const sampleToken: FxToken['props'] = { + access_token: 'w8a49rbvuznxmzs39xliwfa943fda84klkvniutgh34q1fjmnfma90iubl', + expires_in: IntegrationAPI.REFRESH_THRESHOLD * 3, + refresh_token: '65redfghyuyjthgrhyjthrgdfghytredtyuytredrtyuy6trtyuhgfdr', + scope: 'store', + token_type: 'bearer', +}; + +const sampleStoredToken = Object.assign({}, sampleToken, { + date_created: new Date().toISOString(), +}); + +describe('Integration', () => { + describe('API', () => { + it('exposes numeric refresh threshold as static property', () => { + expect(IntegrationAPI).toHaveProperty('REFRESH_THRESHOLD'); + expect(typeof IntegrationAPI.REFRESH_THRESHOLD).toBe('number'); + }); + + it('exposes storage key for access token as static property', () => { + expect(IntegrationAPI).toHaveProperty('ACCESS_TOKEN'); + expect(typeof IntegrationAPI.ACCESS_TOKEN).toBe('string'); + }); + + it('exposes default base url as static property', () => { + expect(IntegrationAPI).toHaveProperty('BASE_URL'); + expect(IntegrationAPI.BASE_URL).toBeInstanceOf(URL); + }); + + it('exposes default version as static property', () => { + expect(IntegrationAPI).toHaveProperty('VERSION'); + expect(typeof IntegrationAPI.VERSION).toBe('string'); + }); + + it('errors when constructed with incorrect arguments', () => { + const incorrectInit = ({ + base: 0, + cache: { oh: 'no' }, + clientId: null, + clientSecret: NaN, + level: 'top', + refreshToken: new Date(), + storage: undefined, + version: '3', + } as unknown) as ConstructorParameters[0]; + + expect(() => new IntegrationAPI(incorrectInit)).toThrow(); + }); + + it('extends core API class', () => { + expect(new IntegrationAPI(commonInit)).toBeInstanceOf(CoreAPI); + }); + + it('stores client ID as instance.clientId', () => { + const api = new IntegrationAPI(commonInit); + expect(api).toHaveProperty('clientId', commonInit.clientId); + }); + + it('stores client secret as instance.clientSecret', () => { + const api = new IntegrationAPI(commonInit); + expect(api).toHaveProperty('clientSecret', commonInit.clientSecret); + }); + + it('stores refresh token as instance.refreshToken', () => { + const api = new IntegrationAPI(commonInit); + expect(api).toHaveProperty('refreshToken', commonInit.refreshToken); + }); + + it('stores version as instance.version', () => { + const version = '1'; + const api = new IntegrationAPI({ ...commonInit, version }); + expect(api).toHaveProperty('version', version); + }); + + it('allows setting custom base URL', () => { + const base = new URL('https://example.com/base/'); + const api = new IntegrationAPI({ ...commonInit, base }); + expect(api).toHaveProperty('base', base); + }); + + it('allows setting custom storage', () => { + const storage = new MemoryCache(); + const api = new IntegrationAPI({ ...commonInit, storage }); + expect(api).toHaveProperty('storage', storage); + }); + + it('allows setting custom cache', () => { + const cache = new MemoryCache(); + const api = new IntegrationAPI({ ...commonInit, cache }); + expect(api).toHaveProperty('cache', cache); + }); + + it('makes an authenticated request when a valid access token is present in the cache', async () => { + fetchMock.mockImplementation(() => Promise.resolve(new Response(null))); + + const url = IntegrationAPI.BASE_URL.toString(); + const api = new IntegrationAPI(commonInit); + + api.storage.setItem(IntegrationAPI.ACCESS_TOKEN, JSON.stringify(sampleStoredToken)); + await api.fetch(url); + + const headers = new Headers({ ...commonHeaders, Authorization: `Bearer ${sampleToken.access_token}` }); + expect(fetchMock).toHaveBeenCalledWith(url, { headers }); + + fetchMock.mockClear(); + }); + + it('obtains a new access token when the stored one is outdated', async () => { + fetchMock.mockImplementation(() => Promise.resolve(new Response(JSON.stringify(sampleToken)))); + + const url = IntegrationAPI.BASE_URL.toString(); + const api = new IntegrationAPI(commonInit); + + api.storage.setItem(IntegrationAPI.ACCESS_TOKEN, JSON.stringify({ ...sampleStoredToken, expires_in: 0 })); + await api.fetch(url); + + expect(fetchMock).toHaveBeenNthCalledWith(1, new URL('token', IntegrationAPI.BASE_URL.toString()).toString(), { + body: new URLSearchParams({ + client_id: api.clientId, + client_secret: api.clientSecret, + grant_type: 'refresh_token', + refresh_token: api.refreshToken, + }), + headers: new Headers({ ...commonHeaders, 'Content-Type': 'application/x-www-form-urlencoded' }), + method: 'POST', + }); + + const headers = new Headers({ ...commonHeaders, Authorization: `Bearer ${sampleToken.access_token}` }); + expect(fetchMock).toHaveBeenNthCalledWith(2, url, { headers }); + + fetchMock.mockClear(); + }); + + it("obtains a new access token when there isn't one", async () => { + fetchMock.mockImplementation(() => Promise.resolve(new Response(JSON.stringify(sampleToken)))); + + const url = IntegrationAPI.BASE_URL.toString(); + const api = new IntegrationAPI(commonInit); + await api.fetch(url); + + expect(fetchMock).toHaveBeenNthCalledWith(1, new URL('token', IntegrationAPI.BASE_URL.toString()).toString(), { + body: new URLSearchParams({ + client_id: api.clientId, + client_secret: api.clientSecret, + grant_type: 'refresh_token', + refresh_token: api.refreshToken, + }), + headers: new Headers({ ...commonHeaders, 'Content-Type': 'application/x-www-form-urlencoded' }), + method: 'POST', + }); + + const headers = new Headers({ ...commonHeaders, Authorization: `Bearer ${sampleToken.access_token}` }); + expect(fetchMock).toHaveBeenNthCalledWith(2, url, { headers }); + + fetchMock.mockClear(); + }); + + it('makes an unauthenticated request after a failure to obtain a new access token', async () => { + fetchMock.mockImplementation(() => Promise.resolve(new Response(null, { status: 500 }))); + + const url = IntegrationAPI.BASE_URL.toString(); + const api = new IntegrationAPI(commonInit); + await api.fetch(url); + + expect(fetchMock).toHaveBeenNthCalledWith(1, new URL('token', IntegrationAPI.BASE_URL.toString()).toString(), { + body: new URLSearchParams({ + client_id: api.clientId, + client_secret: api.clientSecret, + grant_type: 'refresh_token', + refresh_token: api.refreshToken, + }), + headers: new Headers({ ...commonHeaders, 'Content-Type': 'application/x-www-form-urlencoded' }), + method: 'POST', + }); + + expect(fetchMock).toHaveBeenNthCalledWith(2, url, { headers: new Headers(commonHeaders) }); + + fetchMock.mockClear(); + }); + + it('supports complex fetch requests', async () => { + fetchMock.mockImplementation(() => Promise.resolve(new Response(null, { status: 500 }))); + + const api = new IntegrationAPI(commonInit); + const info = new Request(IntegrationAPI.BASE_URL.toString()); + const init = { headers: { foo: 'bar' }, method: 'POST' }; + + await api.fetch(info, init); + + const headers = new Headers({ ...commonHeaders, ...init.headers }); + expect(fetchMock).toHaveBeenLastCalledWith(info, { ...init, headers }); + + fetchMock.mockClear(); + }); + }); +}); From 83cf7f47e0fe1b6014a0bbdf58000a03c273187c Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Wed, 25 Nov 2020 00:21:25 +0300 Subject: [PATCH 54/98] fix: add missing typedefs for jwtPrivateKey and ssoSecret --- .../Graph/customer_portal_settings.d.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/integration/Graph/customer_portal_settings.d.ts b/src/integration/Graph/customer_portal_settings.d.ts index 7a2a2ae..6bbca8c 100644 --- a/src/integration/Graph/customer_portal_settings.d.ts +++ b/src/integration/Graph/customer_portal_settings.d.ts @@ -54,13 +54,22 @@ export interface FxCustomerPortalSettings extends Graph { }; /** If this field is true we get legacy API key or sso key from store and save it in settings. For false value we drop it. */ sso: boolean; - /** Shared secret key. */ - jwtSharedSecret: string; + /** SSO secret for SSO URLs. */ + ssoSecret?: string; /** Life span of session in minutes. Maximum 40320 (4 weeks). */ sessionLifespanInMinutes: number; /** The date this resource was created. */ date_created: string; /** The date this resource was last modified. */ date_modified: string; - }; + } & ( + | { + /** Shared secret key. */ + jwtSharedSecret: string; + } + | { + /** Private key for JWT signing. */ + jwtPrivateKey: string; + } + ); } From 024985a51afcbb92938cf6a8fbbdd059d21fae24 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Wed, 25 Nov 2020 00:22:55 +0300 Subject: [PATCH 55/98] chore: remove .DS_Store files --- .DS_Store | Bin 6148 -> 0 bytes .gitignore | 2 +- src/.DS_Store | Bin 6148 -> 0 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 .DS_Store delete mode 100644 src/.DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 30703ae3998caff86c6b34df48d1e38a4a08db9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK!EVz)5S?uTb<$R(5>k8g1&Kq5Ql)AS2q~n=Arc^j3kU&f?Krfit{ue=5rm*z z_y^z*_!Pc?58(sg&F)ggPIE;FcBI|6J3BM$dAs&{iAc0Y{ti)vh%6MwVj0yX!sA>P zWJPP%fr4Xn!?@>#v4=hfG-4Pq4E)^;@Vi?ipJM7!l6!x@;Eoi!IpPoU`7f0lA2JhWdp1bc;ec%Nf<^H6>_Axd=aU5!Q1NmiWcRshxF`HFP>*U!veAxQZE}@@-Y82+R7Uz1O09M z<_*FiN$d6RVx>^La&^_R%2s)!{L(p%$4=^|qom~ypL6e_o1S{QeHh2#McehB1pV<* z<@!M!rEU=QhtfIl`!IR&G>H6o+=@q$pU60l8nCRARXVC{PbQ7}Zq;to_oh{QvcF%i z+PjUt>9k~R-PpO)JwAW?Zt{Nm;WHA32z=b7T+{d)zM!Gg^OIia;Q@I_tKK-nD2$^M zXgI(IrQoZ_>rSsIz@AvLo`UzmJcFAw#{Tgxc0+A3N^T84<|3eLWPt&_tk&AXh*1~@ z3&srPh7=?xHW(uVXDt#Qw1|P-SC{i$Ha|77aI8z7>#QX?I8cbyv I_@fN`0<0L&w*UYD diff --git a/.gitignore b/.gitignore index 04c11db..03c1eef 100644 --- a/.gitignore +++ b/.gitignore @@ -119,4 +119,4 @@ docs .pnp.* # misc -**/.DS_Store \ No newline at end of file +.DS_Store \ No newline at end of file diff --git a/src/.DS_Store b/src/.DS_Store deleted file mode 100644 index 8d06a7be04c381d85f0af399bc429057d63726a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK!A{#i5Sp{>Bi7FaS~6gy4ZG{_hJ z0X~60;Sc&b?VH^VB9Ka)5Nda%**7~ovm-wzyB;DE{b90BCLNNZ0i}1|-xbzg|JI@(L{dftC6v-PTBC}}*?4h& zC*GqIosm(AXs!^^5wh2?$DDlPdKb6qEz%Hq8RhdT2{}J99+ju|H+UVN=2=;FyT3$Z zp}Dy9Ov<)wKW~2tkJTuwqH0+7qroSh?M2mbZ0+|-gOUZ}c`Nla^e0wf=VZ z;N<&{@z2TGg=Uuo{zF<`Se(Koj9XlM4F^T8iX(WZ8PiCIjseGjW8h&7*waHUKP=ou zIR+d9{}BUxKKM|^z+!Ds9~~HU3jl1wtp&FJ^auLv00tIogYZCvNd=lzVOtDgI|pIX zu^!m?+Mr1%p(|q_TUpo+McBqe_&S_KV9K-`Cbroj!4 Ifk$QF4_AnW9RL6T From 7795348fe73adea77b8b9abe2759cd07c4c6f7cb Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 1 Dec 2020 01:00:00 +0300 Subject: [PATCH 56/98] feat: add allowed frequencies generator utility --- package-lock.json | 10 +++ package.json | 2 + src/integration/getAllowedFrequencies.ts | 31 +++++++++ src/integration/index.ts | 1 + .../integration/getAllowedFrequencies.test.ts | 68 +++++++++++++++++++ 5 files changed, 112 insertions(+) create mode 100644 src/integration/getAllowedFrequencies.ts create mode 100644 tests/integration/getAllowedFrequencies.test.ts diff --git a/package-lock.json b/package-lock.json index cd22f75..a7993e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6447,6 +6447,11 @@ "minimist": "^1.2.0" } }, + "jsonata": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/jsonata/-/jsonata-1.8.4.tgz", + "integrity": "sha512-OqzmM5IICtm/687zckG5BROZzInGCEuKojpYs48H8RnkII8Np+o912ryvhnYwsRrSI24TQRG/qqrSwBuaneDbg==" + }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -11251,6 +11256,11 @@ "callsites": "^3.0.0" } }, + "parse-duration": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-0.4.4.tgz", + "integrity": "sha512-KbAJuYGUhZkB9gotDiKLnZ7Z3VTacK3fgwmDdB6ZVDtJbMBT6MfLga0WJaYpPDu0mzqT0NgHtHDt5PY4l0nidg==" + }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", diff --git a/package.json b/package.json index 0ca6ad9..75a02f8 100755 --- a/package.json +++ b/package.json @@ -139,6 +139,8 @@ "cross-fetch": "^3.0.6", "fake-storage": "^2.0.0", "jsdom": "^16.4.0", + "jsonata": "^1.8.4", + "parse-duration": "^0.4.4", "traverse": "^0.6.6", "v8n": "^1.3.3" } diff --git a/src/integration/getAllowedFrequencies.ts b/src/integration/getAllowedFrequencies.ts new file mode 100644 index 0000000..83a1b9f --- /dev/null +++ b/src/integration/getAllowedFrequencies.ts @@ -0,0 +1,31 @@ +import { FxCustomerPortalSettings } from './Graph/customer_portal_settings'; +import jsonata from 'jsonata'; + +type Rules = FxCustomerPortalSettings['props']['subscriptions']['allowFrequencyModification']; + +type Options = { + settings: { subscriptions: { allowFrequencyModification: Rules } }; + subscription: unknown; +}; + +/** + * Returns allowed frequencies for given subscription and customer portal settings. + * + * @param opts Subscription and settings. + */ +export function* getAllowedFrequencies(opts: Options): Generator { + const returnedFrequencies: string[] = []; + + for (const rule of opts.settings.subscriptions.allowFrequencyModification) { + const isRuleApplicable = !!jsonata(rule.jsonataQuery).evaluate(opts.subscription); + if (!isRuleApplicable) continue; + + for (const frequency of rule.values) { + const isFrequencyUnique = !returnedFrequencies.includes(frequency); + if (!isFrequencyUnique) continue; + + returnedFrequencies.push(frequency); + yield frequency; + } + } +} diff --git a/src/integration/index.ts b/src/integration/index.ts index 8b1eb0f..ec8a739 100644 --- a/src/integration/index.ts +++ b/src/integration/index.ts @@ -5,6 +5,7 @@ export { removeSensitiveData } from './removeSensitiveData'; export { removeAllLinksExcept } from './removeAllLinksExcept'; export { removePrivateAttributes } from './removePrivateAttributes'; export { verifyWebhookSignature } from './verifyWebhookSignature'; +export { getAllowedFrequencies } from './getAllowedFrequencies'; export { createSSOURL } from './createSSOURL'; import type * as Rels from './Rels'; diff --git a/tests/integration/getAllowedFrequencies.test.ts b/tests/integration/getAllowedFrequencies.test.ts new file mode 100644 index 0000000..7fdf3aa --- /dev/null +++ b/tests/integration/getAllowedFrequencies.test.ts @@ -0,0 +1,68 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +/* eslint-disable jsdoc/require-jsdoc */ + +import { FxCustomerPortalSettings } from '../../src/integration/Graph/customer_portal_settings'; +import { getAllowedFrequencies } from '../../src/integration/getAllowedFrequencies'; + +function mockSubscription(frequency = '1m') { + return { + date_created: '2013-08-19T10:58:39-0700', + date_modified: '2013-08-19T10:58:39-0700', + end_date: null, + error_message: '', + first_failed_transaction_date: null, + frequency, + is_active: false, + next_transaction_date: '2014-05-01T00:00:00-0700', + past_due_amount: 0, + start_date: '2010-09-15T00:00:00-0700', + third_party_id: '', + }; +} + +type Rules = FxCustomerPortalSettings['props']['subscriptions']['allowFrequencyModification']; + +function mockSettings(rules: Rules = []) { + return { subscriptions: { allowFrequencyModification: rules } }; +} + +describe('Integration', () => { + describe('getAllowedFrequencies', () => { + it('returns empty array for empty ruleset', () => { + const result = getAllowedFrequencies({ + settings: mockSettings(), + subscription: mockSubscription(), + }); + + expect([...result]).toHaveLength(0); + }); + + it('returns frequencies from matched ruleset', () => { + const rules = [ + { jsonataQuery: '$contains(frequency, "1m")', values: ['1m', '2m', '3m'] }, + { jsonataQuery: '$contains(frequency, "1y")', values: ['1y'] }, + ]; + + const result = getAllowedFrequencies({ + settings: mockSettings(rules), + subscription: mockSubscription('1m'), + }); + + expect([...result]).toEqual(['1m', '2m', '3m']); + }); + + it('returns only unique frequency values from all matched rulesets', () => { + const rules = [ + { jsonataQuery: '$contains(frequency, "1m")', values: ['1m', '2m'] }, + { jsonataQuery: '*', values: ['1m', '3m'] }, + ]; + + const result = getAllowedFrequencies({ + settings: mockSettings(rules), + subscription: mockSubscription('1m'), + }); + + expect([...result]).toEqual(['1m', '2m', '3m']); + }); + }); +}); From 6928aff1dbcbcbf773908624e74ec6b864ca2b5e Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 1 Dec 2020 01:24:08 +0300 Subject: [PATCH 57/98] feat: add next transaction date validator utility --- src/integration/index.ts | 1 + src/integration/isNextTransactionDate.ts | 72 +++++++ .../integration/isNextTransactionDate.test.ts | 175 ++++++++++++++++++ 3 files changed, 248 insertions(+) create mode 100644 src/integration/isNextTransactionDate.ts create mode 100644 tests/integration/isNextTransactionDate.test.ts diff --git a/src/integration/index.ts b/src/integration/index.ts index ec8a739..f6d1695 100644 --- a/src/integration/index.ts +++ b/src/integration/index.ts @@ -6,6 +6,7 @@ export { removeAllLinksExcept } from './removeAllLinksExcept'; export { removePrivateAttributes } from './removePrivateAttributes'; export { verifyWebhookSignature } from './verifyWebhookSignature'; export { getAllowedFrequencies } from './getAllowedFrequencies'; +export { isNextTransactionDate } from './isNextTransactionDate'; export { createSSOURL } from './createSSOURL'; import type * as Rels from './Rels'; diff --git a/src/integration/isNextTransactionDate.ts b/src/integration/isNextTransactionDate.ts new file mode 100644 index 0000000..45e3336 --- /dev/null +++ b/src/integration/isNextTransactionDate.ts @@ -0,0 +1,72 @@ +import { FxCustomerPortalSettings } from './Graph/customer_portal_settings'; +import jsonata from 'jsonata'; +import parse from 'parse-duration'; + +type Config = FxCustomerPortalSettings['props']['subscriptions']['allowNextDateModification']; + +type Options = { + value: string; + settings: { subscriptions: { allowNextDateModification: Config } }; + subscription: unknown; +}; + +/** + * Converts YYYY-MM-DD to date. + * + * @param yyyyMmDd Date as YYYY-MM-DD. + * @returns Date object. + */ +function toDate(yyyyMmDd: string) { + const [yyyy, mm, dd] = yyyyMmDd.split('-').map(v => parseInt(v)); + return new Date(yyyy, mm - 1, dd); +} + +/** + * Checks if given date (YYYY-MM-DD) can be used as the next transaction + * date for given subscription. + * + * @param opts Subscription, customer portal settings and value. + * @returns True if given date can be used as next transaction date. + */ +export function isNextTransactionDate(opts: Options): boolean { + const config = opts.settings.subscriptions.allowNextDateModification; + if (typeof config === 'boolean') return config; + + const valueAsDate = toDate(opts.value); + const valueAsTime = valueAsDate.getTime(); + + const match = config.find(rule => { + if (!jsonata(rule.jsonataQuery).evaluate(opts.subscription)) return false; + + if (rule.disallowedDates) { + const match = rule.disallowedDates.find(dateOrRange => { + const [from, to] = dateOrRange.split('..').map(v => toDate(v).getTime()); + return valueAsTime === from || (to !== undefined && valueAsTime >= from && valueAsTime <= to); + }); + + if (match) return false; + } + + if (rule.allowedDays?.type === 'month') { + if (!rule.allowedDays.days.includes(valueAsDate.getDate())) return false; + } + + if (rule.allowedDays?.type === 'day') { + if (!rule.allowedDays.days.includes(valueAsDate.getDay())) return false; + } + + if (rule.min) { + const duration = parse(rule.min); + if (duration !== null && Date.now() + duration >= valueAsTime) return false; + } + + if (rule.max) { + const duration = parse(rule.max); + if (duration !== null && Date.now() + duration <= valueAsTime) return false; + } + + return true; + }); + + return !!match; +} diff --git a/tests/integration/isNextTransactionDate.test.ts b/tests/integration/isNextTransactionDate.test.ts new file mode 100644 index 0000000..452d744 --- /dev/null +++ b/tests/integration/isNextTransactionDate.test.ts @@ -0,0 +1,175 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +/* eslint-disable jsdoc/require-jsdoc */ + +import { FxCustomerPortalSettings } from '../../src/integration/Graph/customer_portal_settings'; +import { isNextTransactionDate } from '../../src/integration/isNextTransactionDate'; + +function mockSubscription(frequency = '1m') { + return { + date_created: '2013-08-19T10:58:39-0700', + date_modified: '2013-08-19T10:58:39-0700', + end_date: null, + error_message: '', + first_failed_transaction_date: null, + frequency, + is_active: false, + next_transaction_date: '2014-05-01T00:00:00-0700', + past_due_amount: 0, + start_date: '2010-09-15T00:00:00-0700', + third_party_id: '', + }; +} + +type Config = FxCustomerPortalSettings['props']['subscriptions']['allowNextDateModification']; + +function mockSettings(rules: Config) { + return { subscriptions: { allowNextDateModification: rules } }; +} + +describe('Integration', () => { + describe('isNextTransactionDate', () => { + it('returns true if allowNextDateModification is true', () => { + const result = isNextTransactionDate({ + settings: mockSettings(true), + subscription: mockSubscription(), + value: '2020-01-01', + }); + + expect(result).toBe(true); + }); + + it('returns false if allowNextDateModification is false', () => { + const result = isNextTransactionDate({ + settings: mockSettings(false), + subscription: mockSubscription(), + value: '2020-01-01', + }); + + expect(result).toBe(false); + }); + + it('returns false if none of the rules match', () => { + const result = isNextTransactionDate({ + settings: mockSettings([{ jsonataQuery: '$contains(frequency, "2y")' }]), + subscription: mockSubscription('1m'), + value: '2020-01-01', + }); + + expect(result).toBe(false); + }); + + it('returns true if none of the disallowedDates match', () => { + const result = isNextTransactionDate({ + settings: mockSettings([{ disallowedDates: ['2021-01-01'], jsonataQuery: '*' }]), + subscription: mockSubscription('1m'), + value: '2020-01-01', + }); + + expect(result).toBe(true); + }); + + it('returns false if one of the disallowedDates matches', () => { + const result = isNextTransactionDate({ + settings: mockSettings([{ disallowedDates: ['2020-01-01'], jsonataQuery: '*' }]), + subscription: mockSubscription('1m'), + value: '2020-01-01', + }); + + expect(result).toBe(false); + }); + + it('returns false if one of the ranges in disallowedDates includes given date', () => { + const result = isNextTransactionDate({ + settings: mockSettings([{ disallowedDates: ['2019-01-01..2021-01-01'], jsonataQuery: '*' }]), + subscription: mockSubscription('1m'), + value: '2020-01-01', + }); + + expect(result).toBe(false); + }); + + it('returns true if day of month matches one in allowedDays', () => { + const result = isNextTransactionDate({ + settings: mockSettings([{ allowedDays: { days: [1], type: 'month' }, jsonataQuery: '*' }]), + subscription: mockSubscription('1m'), + value: '2020-01-01', + }); + + expect(result).toBe(true); + }); + + it("returns false if day of month doesn't match any in allowedDays", () => { + const result = isNextTransactionDate({ + settings: mockSettings([{ allowedDays: { days: [2], type: 'month' }, jsonataQuery: '*' }]), + subscription: mockSubscription('1m'), + value: '2020-01-01', + }); + + expect(result).toBe(false); + }); + + it('returns true if day of week matches one in allowedDays', () => { + const result = isNextTransactionDate({ + settings: mockSettings([{ allowedDays: { days: [3], type: 'day' }, jsonataQuery: '*' }]), + subscription: mockSubscription('1m'), + value: '2020-01-01', + }); + + expect(result).toBe(true); + }); + + it("returns false if day of week doesn't match any in allowedDays", () => { + const result = isNextTransactionDate({ + settings: mockSettings([{ allowedDays: { days: [1], type: 'day' }, jsonataQuery: '*' }]), + subscription: mockSubscription('1m'), + value: '2020-01-01', + }); + + expect(result).toBe(false); + }); + + it('returns true if given date is later than min', () => { + const value = new Date(new Date().getFullYear() + 1, 0, 1); + const result = isNextTransactionDate({ + settings: mockSettings([{ jsonataQuery: '*', min: '1m' }]), + subscription: mockSubscription('1m'), + value: value.toISOString().substring(0, 10), + }); + + expect(result).toBe(true); + }); + + it('returns false if given date is earlier than min', () => { + const value = new Date(new Date().getFullYear(), new Date().getMonth() + 1, 1); + const result = isNextTransactionDate({ + settings: mockSettings([{ jsonataQuery: '*', min: '1y' }]), + subscription: mockSubscription('1m'), + value: value.toISOString().substring(0, 10), + }); + + expect(result).toBe(false); + }); + + it('returns true if given date is earlier than max', () => { + const value = new Date(new Date().getFullYear(), new Date().getMonth() + 1, 1); + const result = isNextTransactionDate({ + settings: mockSettings([{ jsonataQuery: '*', max: '1y' }]), + subscription: mockSubscription('1m'), + value: value.toISOString().substring(0, 10), + }); + + expect(result).toBe(true); + }); + + it('returns false if given date is later than max', () => { + const value = new Date(new Date().getFullYear() + 1, 0, 1); + const result = isNextTransactionDate({ + settings: mockSettings([{ jsonataQuery: '*', max: '1m' }]), + subscription: mockSubscription('1m'), + value: value.toISOString().substring(0, 10), + }); + + expect(result).toBe(false); + }); + }); +}); From 068c2e48c24c3e5f632ee3afa384bab744ac562c Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 1 Dec 2020 01:30:22 +0300 Subject: [PATCH 58/98] feat: remove traverse mappers These mappers were used internally in one of the legacy projects. No need for them to be included in the SDK. --- package-lock.json | 8 +--- package.json | 2 - src/integration/index.ts | 4 -- src/integration/removeAllLinksExcept.ts | 21 ---------- src/integration/removePrivateAttributes.ts | 23 ----------- src/integration/removeProperties.ts | 21 ---------- src/integration/removeSensitiveData.ts | 19 --------- .../integration/removeAllLinksExcept.test.ts | 35 ---------------- .../removePrivateAttributes.test.ts | 41 ------------------- tests/integration/removeProperties.test.ts | 24 ----------- tests/integration/removeSensitiveData.test.ts | 33 --------------- 11 files changed, 2 insertions(+), 229 deletions(-) delete mode 100644 src/integration/removeAllLinksExcept.ts delete mode 100644 src/integration/removePrivateAttributes.ts delete mode 100644 src/integration/removeProperties.ts delete mode 100644 src/integration/removeSensitiveData.ts delete mode 100644 tests/integration/removeAllLinksExcept.test.ts delete mode 100644 tests/integration/removePrivateAttributes.test.ts delete mode 100644 tests/integration/removeProperties.test.ts delete mode 100644 tests/integration/removeSensitiveData.test.ts diff --git a/package-lock.json b/package-lock.json index a7993e2..43164b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1462,11 +1462,6 @@ "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz", "integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==" }, - "@types/traverse": { - "version": "0.6.32", - "resolved": "https://registry.npmjs.org/@types/traverse/-/traverse-0.6.32.tgz", - "integrity": "sha512-RBz2uRZVCXuMg93WD//aTS5B120QlT4lR/gL+935QtGsKHLS6sCtZBaKfWjIfk7ZXv/r8mtGbwjVIee6/3XTow==" - }, "@types/yargs": { "version": "15.0.9", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", @@ -13472,7 +13467,8 @@ "traverse": { "version": "0.6.6", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=" + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", + "dev": true }, "trim-newlines": { "version": "3.0.0", diff --git a/package.json b/package.json index 75a02f8..4d9d57c 100755 --- a/package.json +++ b/package.json @@ -134,14 +134,12 @@ }, "dependencies": { "@types/jsdom": "^16.2.5", - "@types/traverse": "^0.6.32", "consola": "^2.15.0", "cross-fetch": "^3.0.6", "fake-storage": "^2.0.0", "jsdom": "^16.4.0", "jsonata": "^1.8.4", "parse-duration": "^0.4.4", - "traverse": "^0.6.6", "v8n": "^1.3.3" } } diff --git a/src/integration/index.ts b/src/integration/index.ts index f6d1695..cdcff22 100644 --- a/src/integration/index.ts +++ b/src/integration/index.ts @@ -1,9 +1,5 @@ export { API } from './API'; export { Signer } from './Signer'; -export { removeProperties } from './removeProperties'; -export { removeSensitiveData } from './removeSensitiveData'; -export { removeAllLinksExcept } from './removeAllLinksExcept'; -export { removePrivateAttributes } from './removePrivateAttributes'; export { verifyWebhookSignature } from './verifyWebhookSignature'; export { getAllowedFrequencies } from './getAllowedFrequencies'; export { isNextTransactionDate } from './isNextTransactionDate'; diff --git a/src/integration/removeAllLinksExcept.ts b/src/integration/removeAllLinksExcept.ts deleted file mode 100644 index a9b8c71..0000000 --- a/src/integration/removeAllLinksExcept.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { TraverseContext } from 'traverse'; -import { thisV8N } from './v8n'; -import v8n from 'v8n'; - -const linksToKeepV8N = v8n().every.string(); - -/** - * Creates a https://www.npmjs.com/package/traverse mapper that removes all - * relations from the response object that aren't listed in the `linksToKeep` array. - * - * @param linksToKeep Array of relation keys to keep - * @example const sanitizedResponse = traverse(response).map(removeAllLinksExcept("self", "next")); - * @returns A `traverse` mapper function. - */ -export function removeAllLinksExcept(...linksToKeep: string[]): () => void { - linksToKeepV8N.check(linksToKeep); - return function (this: TraverseContext): void { - thisV8N.check(this); - if (this.parent?.key === '_links' && linksToKeep.includes(this.key as string) === false) this.remove(); - }; -} diff --git a/src/integration/removePrivateAttributes.ts b/src/integration/removePrivateAttributes.ts deleted file mode 100644 index 00d75a4..0000000 --- a/src/integration/removePrivateAttributes.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { TraverseContext } from 'traverse'; -import { thisV8N } from './v8n'; - -/** - * A https://www.npmjs.com/package/traverse mapper that removes all - * private attributes from the response object. - * - * @param this Object traversal context. - * @param value Current property value. - * @example const sanitizedResponse = traverse(response).map(removePrivateAttributes); - */ -export function removePrivateAttributes(this: TraverseContext, value: unknown): void { - thisV8N.check(this); - - if (this.key !== 'fx:attributes' || !Array.isArray(value)) return; - - const newValue = value.filter((attribute: unknown) => { - if (typeof attribute !== 'object' || attribute === null) return true; - return (attribute as Record).visibility === 'public'; - }); - - this.update(newValue, true); -} diff --git a/src/integration/removeProperties.ts b/src/integration/removeProperties.ts deleted file mode 100644 index a5a4c73..0000000 --- a/src/integration/removeProperties.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { TraverseContext } from 'traverse'; -import { thisV8N } from './v8n'; -import v8n from 'v8n'; - -const propsToRemoveV8N = v8n().every.string(); - -/** - * Creates a https://www.npmjs.com/package/traverse mapper that removes all - * properties from the response object that match the keys of the `propsToRemove` array. - * - * @param propsToRemove Array of properties to remove. - * @example const sanitizedResponse = traverse(response).map(removeProperties("password_hash", "third_party_id")); - * @returns A `traverse` mapper function. - */ -export function removeProperties(...propsToRemove: string[]): () => void { - propsToRemoveV8N.check(propsToRemove); - return function (this: TraverseContext): void { - thisV8N.check(this); - if (this.key && propsToRemove.includes(this.key)) this.remove(); - }; -} diff --git a/src/integration/removeSensitiveData.ts b/src/integration/removeSensitiveData.ts deleted file mode 100644 index 7f92517..0000000 --- a/src/integration/removeSensitiveData.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { TraverseContext } from 'traverse'; -import { thisV8N } from './v8n'; - -/** - * A https://www.npmjs.com/package/traverse mapper that removes all - * sensitive data such as password hashes or internal identifiers from the response object. - * - * @param this Traversal context. - * @example const sanitizedResponse = traverse(response).map(removeSensitiveData); - */ -export function removeSensitiveData(this: TraverseContext): void { - thisV8N.check(this); - - const key = this.key; - if (typeof key === 'undefined') return; - - const propsToRemove = ['password', 'third_party_id']; - if (propsToRemove.find(v => key.startsWith(v))) this.remove(); -} diff --git a/tests/integration/removeAllLinksExcept.test.ts b/tests/integration/removeAllLinksExcept.test.ts deleted file mode 100644 index 9d984d4..0000000 --- a/tests/integration/removeAllLinksExcept.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -import traverse, { TraverseContext } from 'traverse'; - -import { removeAllLinksExcept } from '../../src/integration/removeAllLinksExcept'; - -describe('Integration', () => { - describe('removeAllLinksExcept', () => { - it('errors when invoked without traverse context', () => { - const incorrectContext = (null as unknown) as TraverseContext; - expect(() => removeAllLinksExcept().call(incorrectContext)).toThrow(); - }); - - it('errors when invoked with incorrect arguments', () => { - const incorrectArgs = ([0, null, {}] as unknown) as Parameters; - expect(() => traverse({}).map(removeAllLinksExcept(...incorrectArgs))).toThrow(); - }); - - it('removes all links except for given', () => { - const input = { - _links: { - 'fx:attributes': { href: 'https://api.foxy.test/stores/0/attributes' }, - 'fx:customer': { href: 'https://api.foxy.test/customers/0' }, - 'fx:user': { href: 'https://api.foxy.test/users/0' }, - }, - }; - - const output = { - _links: { - 'fx:customer': { href: 'https://api.foxy.test/customers/0' }, - }, - }; - - expect(traverse(input).map(removeAllLinksExcept('fx:customer'))).toEqual(output); - }); - }); -}); diff --git a/tests/integration/removePrivateAttributes.test.ts b/tests/integration/removePrivateAttributes.test.ts deleted file mode 100644 index afe5f05..0000000 --- a/tests/integration/removePrivateAttributes.test.ts +++ /dev/null @@ -1,41 +0,0 @@ -import traverse, { TraverseContext } from 'traverse'; - -import { removePrivateAttributes } from '../../src/integration/removePrivateAttributes'; - -describe('Integration', () => { - describe('removePrivateAttributes', () => { - it('errors when invoked without traverse context', () => { - const incorrectContext = (null as unknown) as TraverseContext; - expect(() => removePrivateAttributes.call(incorrectContext, null)).toThrow(); - }); - - it('removes private attributes', () => { - const input = { - _embedded: { - 'fx:attributes': [ - { name: 'foo', visibility: 'private' }, - { name: 'bar', visibility: 'public' }, - undefined, - null, - 0, - 'hi', - ], - }, - _links: { - 'fx:attributes': { href: '' }, - }, - }; - - const output = { - _embedded: { - 'fx:attributes': [{ name: 'bar', visibility: 'public' }, undefined, null, 0, 'hi'], - }, - _links: { - 'fx:attributes': { href: '' }, - }, - }; - - expect(traverse(input).map(removePrivateAttributes)).toEqual(output); - }); - }); -}); diff --git a/tests/integration/removeProperties.test.ts b/tests/integration/removeProperties.test.ts deleted file mode 100644 index 3aa3f11..0000000 --- a/tests/integration/removeProperties.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import traverse, { TraverseContext } from 'traverse'; - -import { removeProperties } from '../../src/integration/removeProperties'; - -describe('Integration', () => { - describe('removeProperties', () => { - it('errors when invoked without traverse context', () => { - const incorrectContext = (null as unknown) as TraverseContext; - expect(() => removeProperties().call(incorrectContext)).toThrow(); - }); - - it('errors when invoked with incorrect arguments', () => { - const incorrectArgs = ([0, null, {}] as unknown) as Parameters; - expect(() => traverse({}).map(removeProperties(...incorrectArgs))).toThrow(); - }); - - it('removes given properties', () => { - const input = { bar: { baz: ['qux'] }, foo: 0 }; - const output = { bar: {} }; - - expect(traverse(input).map(removeProperties('foo', 'baz'))).toEqual(output); - }); - }); -}); diff --git a/tests/integration/removeSensitiveData.test.ts b/tests/integration/removeSensitiveData.test.ts deleted file mode 100644 index 9d5ec66..0000000 --- a/tests/integration/removeSensitiveData.test.ts +++ /dev/null @@ -1,33 +0,0 @@ -import traverse, { TraverseContext } from 'traverse'; - -import { removeSensitiveData } from '../../src/integration/removeSensitiveData'; - -describe('Integration', () => { - describe('removeSensitiveData', () => { - it('errors when invoked without traverse context', () => { - const incorrectContext = (null as unknown) as TraverseContext; - expect(() => removeSensitiveData.call(incorrectContext)).toThrow(); - }); - - it('removes sensitive data from record', () => { - const input = { - bar: 1, - foo: { - baz: [], - password_hash: 'so secret', - third_party_id: 1, - }, - password: 'one-time code', - }; - - const output = { - bar: 1, - foo: { - baz: [], - }, - }; - - expect(traverse(input).map(removeSensitiveData)).toEqual(output); - }); - }); -}); From 015f4afe2d766e36c27a4bbe768a1e124cb72bef Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 1 Dec 2020 01:37:26 +0300 Subject: [PATCH 59/98] feat: remove fx prefix from rels Rel with Fx prefix is a curie. Let's not confuse people even further :) --- src/customer/Graph/attribute.d.ts | 6 +- src/customer/Graph/attributes.d.ts | 8 +- .../Graph/default_billing_address.d.ts | 6 +- .../Graph/default_payment_method.d.ts | 6 +- .../Graph/default_shipping_address.d.ts | 6 +- src/customer/Graph/index.d.ts | 26 ++--- src/customer/Graph/item.d.ts | 6 +- src/customer/Graph/items.d.ts | 8 +- src/customer/Graph/subscription.d.ts | 18 +-- src/customer/Graph/subscriptions.d.ts | 8 +- src/customer/Graph/transaction.d.ts | 12 +- src/customer/Graph/transaction_template.d.ts | 10 +- src/customer/Graph/transactions.d.ts | 8 +- src/integration/API.ts | 4 +- .../Graph/admin_email_template.d.ts | 8 +- .../Graph/applied_coupon_code.d.ts | 20 ++-- .../Graph/applied_coupon_codes.d.ts | 8 +- src/integration/Graph/applied_tax.d.ts | 16 +-- src/integration/Graph/applied_taxes.d.ts | 8 +- src/integration/Graph/attribute.d.ts | 4 +- src/integration/Graph/attributes.d.ts | 8 +- src/integration/Graph/billing_address.d.ts | 24 ++-- src/integration/Graph/billing_addresses.d.ts | 8 +- src/integration/Graph/cache.d.ts | 2 +- src/integration/Graph/capture.d.ts | 2 +- src/integration/Graph/cart.d.ts | 50 ++++----- .../Graph/cart_include_template.d.ts | 16 +-- .../Graph/cart_include_templates.d.ts | 8 +- src/integration/Graph/cart_template.d.ts | 16 +-- src/integration/Graph/cart_templates.d.ts | 8 +- src/integration/Graph/carts.d.ts | 8 +- src/integration/Graph/checkout_template.d.ts | 20 ++-- src/integration/Graph/checkout_templates.d.ts | 8 +- src/integration/Graph/checkout_types.d.ts | 8 +- src/integration/Graph/client.d.ts | 8 +- src/integration/Graph/countries.d.ts | 8 +- src/integration/Graph/coupon.d.ts | 24 ++-- src/integration/Graph/coupon_code.d.ts | 16 +-- .../Graph/coupon_code_transaction.d.ts | 20 ++-- .../Graph/coupon_code_transactions.d.ts | 8 +- src/integration/Graph/coupon_codes.d.ts | 8 +- src/integration/Graph/coupon_detail.d.ts | 24 ++-- src/integration/Graph/coupon_details.d.ts | 8 +- .../Graph/coupon_item_categories.d.ts | 8 +- .../Graph/coupon_item_category.d.ts | 16 +-- src/integration/Graph/coupons.d.ts | 8 +- src/integration/Graph/create_client.d.ts | 8 +- src/integration/Graph/create_session.d.ts | 2 +- src/integration/Graph/create_user.d.ts | 8 +- src/integration/Graph/custom_field.d.ts | 12 +- src/integration/Graph/custom_fields.d.ts | 8 +- src/integration/Graph/customer.d.ts | 46 ++++---- src/integration/Graph/customer_address.d.ts | 12 +- src/integration/Graph/customer_addresses.d.ts | 8 +- .../Graph/customer_email_template.d.ts | 20 ++-- .../Graph/customer_password_hash_types.d.ts | 8 +- .../Graph/customer_portal_settings.d.ts | 8 +- src/integration/Graph/customers.d.ts | 8 +- .../Graph/default_billing_address.d.ts | 8 +- .../Graph/default_payment_method.d.ts | 12 +- .../Graph/default_shipping_address.d.ts | 8 +- src/integration/Graph/default_store.d.ts | 8 +- src/integration/Graph/default_templates.d.ts | 28 ++--- src/integration/Graph/discount.d.ts | 24 ++-- src/integration/Graph/discount_detail.d.ts | 16 +-- src/integration/Graph/discount_details.d.ts | 8 +- src/integration/Graph/discounts.d.ts | 8 +- src/integration/Graph/downloadable.d.ts | 16 +-- .../Graph/downloadable_item_categories.d.ts | 8 +- .../Graph/downloadable_purchase.d.ts | 24 ++-- src/integration/Graph/downloadables.d.ts | 8 +- src/integration/Graph/email_template.d.ts | 16 +-- src/integration/Graph/email_templates.d.ts | 8 +- src/integration/Graph/encode.d.ts | 2 +- src/integration/Graph/error_entries.d.ts | 8 +- src/integration/Graph/error_entry.d.ts | 8 +- src/integration/Graph/fraud_protection.d.ts | 12 +- src/integration/Graph/fraud_protections.d.ts | 8 +- src/integration/Graph/generate_codes.d.ts | 2 +- .../Graph/hosted_payment_gateway.d.ts | 8 +- .../Graph/hosted_payment_gateways.d.ts | 8 +- src/integration/Graph/index.d.ts | 28 ++--- src/integration/Graph/integration.d.ts | 16 +-- src/integration/Graph/item.d.ts | 44 ++++---- src/integration/Graph/item_categories.d.ts | 8 +- src/integration/Graph/item_category.d.ts | 16 +-- src/integration/Graph/item_option.d.ts | 16 +-- src/integration/Graph/item_options.d.ts | 8 +- src/integration/Graph/items.d.ts | 8 +- src/integration/Graph/language_override.d.ts | 16 +-- src/integration/Graph/language_overrides.d.ts | 8 +- src/integration/Graph/language_strings.d.ts | 8 +- src/integration/Graph/languages.d.ts | 8 +- src/integration/Graph/last_transaction.d.ts | 10 +- src/integration/Graph/locale_codes.d.ts | 8 +- src/integration/Graph/native_integration.d.ts | 8 +- .../Graph/native_integrations.d.ts | 8 +- .../Graph/original_transaction.d.ts | 10 +- src/integration/Graph/payment.d.ts | 12 +- src/integration/Graph/payment_gateway.d.ts | 12 +- src/integration/Graph/payment_gateways.d.ts | 8 +- .../Graph/payment_method_expiring.d.ts | 24 ++-- src/integration/Graph/payment_method_set.d.ts | 24 ++-- .../payment_method_set_fraud_protection.d.ts | 16 +-- .../payment_method_set_fraud_protections.d.ts | 8 +- ...ent_method_set_hosted_payment_gateway.d.ts | 16 +-- ...nt_method_set_hosted_payment_gateways.d.ts | 8 +- .../Graph/payment_method_sets.d.ts | 8 +- src/integration/Graph/payments.d.ts | 8 +- .../Graph/process_subscription_webhook.d.ts | 2 +- src/integration/Graph/process_webhook.d.ts | 2 +- src/integration/Graph/property_helpers.d.ts | 60 +++++----- src/integration/Graph/receipt.d.ts | 2 +- src/integration/Graph/receipt_template.d.ts | 20 ++-- src/integration/Graph/receipt_templates.d.ts | 8 +- src/integration/Graph/refund.d.ts | 2 +- src/integration/Graph/regions.d.ts | 8 +- src/integration/Graph/reporting.d.ts | 12 +- .../Graph/reporting_email_exists.d.ts | 12 +- .../Graph/reporting_store_domain_exists.d.ts | 12 +- src/integration/Graph/send_emails.d.ts | 2 +- src/integration/Graph/shipment.d.ts | 28 ++--- src/integration/Graph/shipments.d.ts | 8 +- .../Graph/shipping_address_types.d.ts | 8 +- src/integration/Graph/shipping_container.d.ts | 20 ++-- .../Graph/shipping_containers.d.ts | 8 +- src/integration/Graph/shipping_drop_type.d.ts | 20 ++-- .../Graph/shipping_drop_types.d.ts | 8 +- src/integration/Graph/shipping_method.d.ts | 24 ++-- src/integration/Graph/shipping_methods.d.ts | 8 +- src/integration/Graph/shipping_service.d.ts | 16 +-- src/integration/Graph/shipping_services.d.ts | 8 +- src/integration/Graph/store.d.ts | 104 +++++++++--------- .../Graph/store_shipping_method.d.ts | 48 ++++---- .../Graph/store_shipping_service.d.ts | 24 ++-- .../Graph/store_shipping_services.d.ts | 8 +- src/integration/Graph/store_version.d.ts | 12 +- src/integration/Graph/store_versions.d.ts | 8 +- src/integration/Graph/stores.d.ts | 8 +- src/integration/Graph/sub_token_url.d.ts | 2 +- src/integration/Graph/subscription.d.ts | 46 ++++---- .../Graph/subscription_settings.d.ts | 8 +- src/integration/Graph/subscriptions.d.ts | 8 +- src/integration/Graph/tax.d.ts | 16 +-- .../Graph/tax_item_categories.d.ts | 8 +- src/integration/Graph/tax_item_category.d.ts | 16 +-- src/integration/Graph/taxes.d.ts | 8 +- src/integration/Graph/template_config.d.ts | 12 +- src/integration/Graph/template_set.d.ts | 42 +++---- src/integration/Graph/template_sets.d.ts | 8 +- src/integration/Graph/timezones.d.ts | 8 +- src/integration/Graph/token.d.ts | 2 +- src/integration/Graph/transaction.d.ts | 94 ++++++++-------- src/integration/Graph/transaction_log.d.ts | 24 ++-- .../Graph/transaction_log_detail.d.ts | 12 +- .../Graph/transaction_log_details.d.ts | 8 +- src/integration/Graph/transaction_logs.d.ts | 8 +- .../Graph/transaction_template.d.ts | 10 +- src/integration/Graph/transactions.d.ts | 8 +- src/integration/Graph/user.d.ts | 16 +-- src/integration/Graph/user_access.d.ts | 12 +- src/integration/Graph/user_accesses.d.ts | 8 +- src/integration/Graph/users.d.ts | 8 +- src/integration/Graph/void.d.ts | 2 +- src/integration/getAllowedFrequencies.ts | 4 +- src/integration/isNextTransactionDate.ts | 4 +- tests/integration/API.test.ts | 4 +- .../integration/getAllowedFrequencies.test.ts | 4 +- .../integration/isNextTransactionDate.test.ts | 4 +- 169 files changed, 1119 insertions(+), 1119 deletions(-) diff --git a/src/customer/Graph/attribute.d.ts b/src/customer/Graph/attribute.d.ts index 6a7306e..0bc9223 100644 --- a/src/customer/Graph/attribute.d.ts +++ b/src/customer/Graph/attribute.d.ts @@ -1,7 +1,7 @@ import type * as Core from '../../core'; import type * as Integration from '../../integration'; -export interface FxAttribute extends Core.Graph { - curie: Integration.Rels.FxAttribute['curie']; - props: Integration.Rels.FxAttribute['props']; +export interface Attribute extends Core.Graph { + curie: Integration.Rels.Attribute['curie']; + props: Integration.Rels.Attribute['props']; } diff --git a/src/customer/Graph/attributes.d.ts b/src/customer/Graph/attributes.d.ts index e9f4a6e..60b8bce 100644 --- a/src/customer/Graph/attributes.d.ts +++ b/src/customer/Graph/attributes.d.ts @@ -1,8 +1,8 @@ import type * as Core from '../../core'; import type * as Integration from '../../integration'; -import type { FxAttribute } from './attribute'; +import type { Attribute } from './attribute'; -export interface FxAttributes extends Core.Graph { - curie: Integration.Rels.FxAttributes['curie']; - child: FxAttribute; +export interface Attributes extends Core.Graph { + curie: Integration.Rels.Attributes['curie']; + child: Attribute; } diff --git a/src/customer/Graph/default_billing_address.d.ts b/src/customer/Graph/default_billing_address.d.ts index 9a9fa99..aa1b9ea 100644 --- a/src/customer/Graph/default_billing_address.d.ts +++ b/src/customer/Graph/default_billing_address.d.ts @@ -1,7 +1,7 @@ import type * as Core from '../../core'; import type * as Integration from '../../integration'; -export interface FxDefaultBillingAddress extends Core.Graph { - curie: Integration.Rels.FxDefaultBillingAddress['curie']; - props: Integration.Rels.FxDefaultBillingAddress['props']; +export interface DefaultBillingAddress extends Core.Graph { + curie: Integration.Rels.DefaultBillingAddress['curie']; + props: Integration.Rels.DefaultBillingAddress['props']; } diff --git a/src/customer/Graph/default_payment_method.d.ts b/src/customer/Graph/default_payment_method.d.ts index c051a16..4c627ea 100644 --- a/src/customer/Graph/default_payment_method.d.ts +++ b/src/customer/Graph/default_payment_method.d.ts @@ -1,7 +1,7 @@ import type * as Core from '../../core'; import type * as Integration from '../../integration'; -export interface FxDefaultPaymentMethod extends Core.Graph { - curie: Integration.Rels.FxDefaultPaymentMethod['curie']; - props: Integration.Rels.FxDefaultPaymentMethod['props']; +export interface DefaultPaymentMethod extends Core.Graph { + curie: Integration.Rels.DefaultPaymentMethod['curie']; + props: Integration.Rels.DefaultPaymentMethod['props']; } diff --git a/src/customer/Graph/default_shipping_address.d.ts b/src/customer/Graph/default_shipping_address.d.ts index 2f7d0fb..58a7be7 100644 --- a/src/customer/Graph/default_shipping_address.d.ts +++ b/src/customer/Graph/default_shipping_address.d.ts @@ -1,7 +1,7 @@ import type * as Core from '../../core'; import type * as Integration from '../../integration'; -export interface FxDefaultShippingAddress extends Core.Graph { - curie: Integration.Rels.FxDefaultShippingAddress['curie']; - props: Integration.Rels.FxDefaultShippingAddress['props']; +export interface DefaultShippingAddress extends Core.Graph { + curie: Integration.Rels.DefaultShippingAddress['curie']; + props: Integration.Rels.DefaultShippingAddress['props']; } diff --git a/src/customer/Graph/index.d.ts b/src/customer/Graph/index.d.ts index dc218d6..4a94d9b 100644 --- a/src/customer/Graph/index.d.ts +++ b/src/customer/Graph/index.d.ts @@ -1,15 +1,15 @@ import type * as Core from '../../core'; import type * as Integration from '../../integration'; -import type { FxAttributes } from './attributes'; -import type { FxDefaultBillingAddress } from './default_billing_address'; -import type { FxDefaultPaymentMethod } from './default_payment_method'; -import type { FxDefaultShippingAddress } from './default_shipping_address'; -import type { FxSubscriptions } from './subscriptions'; -import type { FxTransactions } from './transactions'; +import type { Attributes } from './attributes'; +import type { DefaultBillingAddress } from './default_billing_address'; +import type { DefaultPaymentMethod } from './default_payment_method'; +import type { DefaultShippingAddress } from './default_shipping_address'; +import type { Subscriptions } from './subscriptions'; +import type { Transactions } from './transactions'; export interface Graph extends Core.Graph { props: Pick< - Integration.Rels.FxCustomer['props'], + Integration.Rels.Customer['props'], | 'date_created' | 'date_modified' | 'email' @@ -22,11 +22,11 @@ export interface Graph extends Core.Graph { >; zooms: { - default_shipping_address?: FxDefaultShippingAddress; - default_billing_address?: FxDefaultBillingAddress; - default_payment_method?: FxDefaultPaymentMethod; - subscriptions?: FxSubscriptions; - transactions?: FxTransactions; - attributes: FxAttributes; + default_shipping_address?: DefaultShippingAddress; + default_billing_address?: DefaultBillingAddress; + default_payment_method?: DefaultPaymentMethod; + subscriptions?: Subscriptions; + transactions?: Transactions; + attributes: Attributes; }; } diff --git a/src/customer/Graph/item.d.ts b/src/customer/Graph/item.d.ts index 69f472e..688e894 100644 --- a/src/customer/Graph/item.d.ts +++ b/src/customer/Graph/item.d.ts @@ -1,7 +1,7 @@ import type * as Core from '../../core'; import type * as Integration from '../../integration'; -export interface FxItem extends Core.Graph { - curie: Integration.Rels.FxItem['curie']; - props: Integration.Rels.FxItem['props']; +export interface Item extends Core.Graph { + curie: Integration.Rels.Item['curie']; + props: Integration.Rels.Item['props']; } diff --git a/src/customer/Graph/items.d.ts b/src/customer/Graph/items.d.ts index 732b342..c3139cc 100644 --- a/src/customer/Graph/items.d.ts +++ b/src/customer/Graph/items.d.ts @@ -1,8 +1,8 @@ import type * as Core from '../../core'; import type * as Integration from '../../integration'; -import type { FxItem } from './item'; +import type { Item } from './item'; -export interface FxItems extends Core.Graph { - curie: Integration.Rels.FxItems['curie']; - child: FxItem; +export interface Items extends Core.Graph { + curie: Integration.Rels.Items['curie']; + child: Item; } diff --git a/src/customer/Graph/subscription.d.ts b/src/customer/Graph/subscription.d.ts index 44b1796..332a68e 100644 --- a/src/customer/Graph/subscription.d.ts +++ b/src/customer/Graph/subscription.d.ts @@ -1,18 +1,18 @@ import type * as Core from '../../core'; import type * as Integration from '../../integration'; -import type { FxTransactionTemplate } from './transaction_template'; -import type { FxTransactions } from './transactions'; +import type { TransactionTemplate } from './transaction_template'; +import type { Transactions } from './transactions'; -export interface FxSubscription extends Core.Graph { - curie: Integration.Rels.FxSubscription['curie']; - links: Pick; - props: Integration.Rels.FxSubscription['props']; +export interface Subscription extends Core.Graph { + curie: Integration.Rels.Subscription['curie']; + links: Pick; + props: Integration.Rels.Subscription['props']; zooms: { - transaction_template: FxTransactionTemplate; - transactions: FxTransactions; + transaction_template: TransactionTemplate; + transactions: Transactions; template_config: { curie: 'template_config'; - props: Integration.Rels.FxCustomerPortalSettings['props']['subscriptions']; + props: Integration.Rels.CustomerPortalSettings['props']['subscriptions']; }; }; } diff --git a/src/customer/Graph/subscriptions.d.ts b/src/customer/Graph/subscriptions.d.ts index 70960c7..a0ae40e 100644 --- a/src/customer/Graph/subscriptions.d.ts +++ b/src/customer/Graph/subscriptions.d.ts @@ -1,8 +1,8 @@ import type * as Core from '../../core'; import type * as Integration from '../../integration'; -import type { FxSubscription } from './subscription'; +import type { Subscription } from './subscription'; -export interface FxSubscriptions extends Core.Graph { - curie: Integration.Rels.FxSubscriptions['curie']; - child: FxSubscription; +export interface Subscriptions extends Core.Graph { + curie: Integration.Rels.Subscriptions['curie']; + child: Subscription; } diff --git a/src/customer/Graph/transaction.d.ts b/src/customer/Graph/transaction.d.ts index f526a53..720b9fb 100644 --- a/src/customer/Graph/transaction.d.ts +++ b/src/customer/Graph/transaction.d.ts @@ -1,10 +1,10 @@ import type * as Core from '../../core'; import type * as Integration from '../../integration'; -import type { FxItems } from './items'; +import type { Items } from './items'; -export interface FxTransaction extends Core.Graph { - curie: Integration.Rels.FxTransaction['curie']; - links: Pick; - props: Integration.Rels.FxTransaction['props']; - zooms: { items?: FxItems }; +export interface Transaction extends Core.Graph { + curie: Integration.Rels.Transaction['curie']; + links: Pick; + props: Integration.Rels.Transaction['props']; + zooms: { items?: Items }; } diff --git a/src/customer/Graph/transaction_template.d.ts b/src/customer/Graph/transaction_template.d.ts index c2f5afa..cb9cbdc 100644 --- a/src/customer/Graph/transaction_template.d.ts +++ b/src/customer/Graph/transaction_template.d.ts @@ -1,11 +1,11 @@ import type * as Core from '../../core'; import type * as Integration from '../../integration'; -import type { FxItems } from './items'; +import type { Items } from './items'; -export interface FxTransactionTemplate extends Core.Graph { - curie: Integration.Rels.FxTransactionTemplate['curie']; - props: Integration.Rels.FxTransactionTemplate['props']; +export interface TransactionTemplate extends Core.Graph { + curie: Integration.Rels.TransactionTemplate['curie']; + props: Integration.Rels.TransactionTemplate['props']; zooms: { - items: FxItems; + items: Items; }; } diff --git a/src/customer/Graph/transactions.d.ts b/src/customer/Graph/transactions.d.ts index 820bf62..d10c686 100644 --- a/src/customer/Graph/transactions.d.ts +++ b/src/customer/Graph/transactions.d.ts @@ -1,8 +1,8 @@ import type * as Core from '../../core'; import type * as Integration from '../../integration'; -import { FxTransaction } from './transaction'; +import { Transaction } from './transaction'; -export interface FxTransactions extends Core.Graph { - curie: Integration.Rels.FxTransactions['curie']; - child: FxTransaction; +export interface Transactions extends Core.Graph { + curie: Integration.Rels.Transactions['curie']; + child: Transaction; } diff --git a/src/integration/API.ts b/src/integration/API.ts index 1f0d553..a15b1f8 100644 --- a/src/integration/API.ts +++ b/src/integration/API.ts @@ -8,7 +8,7 @@ import { Graph } from './Graph'; import { LogLevel } from 'consola'; import MemoryStorage from 'fake-storage'; -type LocalToken = Rels.FxToken['props'] & { date_created: string }; +type LocalToken = Rels.Token['props'] & { date_created: string }; /** In order to facilitate any major, unforeseen breaking changes in the future, we require each request to include API version. We hope to rarely (never?) change it but by requiring it up front, we can ensure what you get today is what you’ll get tomorrow. */ type IntegrationAPIVersion = '1'; @@ -104,7 +104,7 @@ export class API extends Core.API { const response = await fetch(url, { body, headers, method: 'POST' }); if (response.ok) { - const props = (await response.json()) as Rels.FxToken['props']; + const props = (await response.json()) as Rels.Token['props']; token = { ...props, date_created: new Date().toISOString() }; this.storage.setItem(API.ACCESS_TOKEN, JSON.stringify(token)); this.console.info('Access token updated.'); diff --git a/src/integration/Graph/admin_email_template.d.ts b/src/integration/Graph/admin_email_template.d.ts index 796d65f..46ef5ed 100644 --- a/src/integration/Graph/admin_email_template.d.ts +++ b/src/integration/Graph/admin_email_template.d.ts @@ -1,8 +1,8 @@ -import type { FxEmailTemplate } from './email_template'; +import type { EmailTemplate } from './email_template'; import type { Graph } from '../../core'; -export interface FxAdminEmailTemplate extends Graph { +export interface AdminEmailTemplate extends Graph { curie: 'fx:admin_email_template'; - links: FxEmailTemplate['links']; - props: FxEmailTemplate['props']; + links: EmailTemplate['links']; + props: EmailTemplate['props']; } diff --git a/src/integration/Graph/applied_coupon_code.d.ts b/src/integration/Graph/applied_coupon_code.d.ts index 2244c00..59c4a8e 100644 --- a/src/integration/Graph/applied_coupon_code.d.ts +++ b/src/integration/Graph/applied_coupon_code.d.ts @@ -1,23 +1,23 @@ -import type { FxCart } from './cart'; -import type { FxCoupon } from './coupon'; -import type { FxCouponCode } from './coupon_code'; -import type { FxStore } from './store'; +import type { Cart } from './cart'; +import type { Coupon } from './coupon'; +import type { CouponCode } from './coupon_code'; +import type { Store } from './store'; import type { Graph } from '../../core'; -export interface FxAppliedCouponCode extends Graph { +export interface AppliedCouponCode extends Graph { curie: 'fx:applied_coupon_code'; links: { /** This resource. */ - 'self': FxAppliedCouponCode; + 'self': AppliedCouponCode; /** Related cart resource. */ - 'fx:cart': FxCart; + 'fx:cart': Cart; /** Related store resource. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Related coupon resource. */ - 'fx:coupon': FxCoupon; + 'fx:coupon': Coupon; /** Related coupon code resource. */ - 'fx:coupon_code': FxCouponCode; + 'fx:coupon_code': CouponCode; }; props: { diff --git a/src/integration/Graph/applied_coupon_codes.d.ts b/src/integration/Graph/applied_coupon_codes.d.ts index 4bf25ac..85ecdd1 100644 --- a/src/integration/Graph/applied_coupon_codes.d.ts +++ b/src/integration/Graph/applied_coupon_codes.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxAppliedCouponCode } from './applied_coupon_code'; +import type { AppliedCouponCode } from './applied_coupon_code'; import type { Graph } from '../../core'; -export interface FxAppliedCouponCodes extends Graph { +export interface AppliedCouponCodes extends Graph { curie: 'fx:applied_coupon_codes'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxAppliedCouponCode; + child: AppliedCouponCode; } diff --git a/src/integration/Graph/applied_tax.d.ts b/src/integration/Graph/applied_tax.d.ts index 500d360..1e55ab1 100644 --- a/src/integration/Graph/applied_tax.d.ts +++ b/src/integration/Graph/applied_tax.d.ts @@ -1,20 +1,20 @@ -import type { FxStore } from './store'; -import type { FxTax } from './tax'; -import type { FxTransaction } from './transaction'; +import type { Store } from './store'; +import type { Tax } from './tax'; +import type { Transaction } from './transaction'; import type { Graph } from '../../core'; -export interface FxAppliedTax extends Graph { +export interface AppliedTax extends Graph { curie: 'fx:applied_tax'; links: { /** This resource. */ - 'self': FxAppliedTax; + 'self': AppliedTax; /** Tax configuration. */ - 'fx:tax': FxTax; + 'fx:tax': Tax; /** Store that handled the transaction this tax applies to. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Transaction this tax applies to. */ - 'fx:transaction': FxTransaction; + 'fx:transaction': Transaction; }; props: { diff --git a/src/integration/Graph/applied_taxes.d.ts b/src/integration/Graph/applied_taxes.d.ts index 160591a..3ac3703 100644 --- a/src/integration/Graph/applied_taxes.d.ts +++ b/src/integration/Graph/applied_taxes.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxAppliedTax } from './applied_tax'; +import type { AppliedTax } from './applied_tax'; import type { Graph } from '../../core'; -export interface FxAppliedTaxes extends Graph { +export interface AppliedTaxes extends Graph { curie: 'fx:applied_taxes'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxAppliedTax; + child: AppliedTax; } diff --git a/src/integration/Graph/attribute.d.ts b/src/integration/Graph/attribute.d.ts index d6566a4..6e8cc8a 100644 --- a/src/integration/Graph/attribute.d.ts +++ b/src/integration/Graph/attribute.d.ts @@ -1,11 +1,11 @@ import type { Graph } from '../../core'; -export interface FxAttribute extends Graph { +export interface Attribute extends Graph { curie: 'fx:attribute'; links: { /** This resource. */ - self: FxAttribute; + self: Attribute; }; props: { diff --git a/src/integration/Graph/attributes.d.ts b/src/integration/Graph/attributes.d.ts index 2f9ecb3..74421ca 100644 --- a/src/integration/Graph/attributes.d.ts +++ b/src/integration/Graph/attributes.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxAttribute } from './attribute'; +import type { Attribute } from './attribute'; import type { Graph } from '../../core'; -export interface FxAttributes extends Graph { +export interface Attributes extends Graph { curie: 'fx:attributes'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxAttribute; + child: Attribute; } diff --git a/src/integration/Graph/billing_address.d.ts b/src/integration/Graph/billing_address.d.ts index cfefb20..5616387 100644 --- a/src/integration/Graph/billing_address.d.ts +++ b/src/integration/Graph/billing_address.d.ts @@ -1,26 +1,26 @@ -import type { FxBillingAddresses } from './billing_addresses'; -import type { FxCustomer } from './customer'; -import type { FxCustomerAddress } from './customer_address'; -import type { FxStore } from './store'; -import type { FxTransaction } from './transaction'; +import type { BillingAddresses } from './billing_addresses'; +import type { Customer } from './customer'; +import type { CustomerAddress } from './customer_address'; +import type { Store } from './store'; +import type { Transaction } from './transaction'; import type { Graph } from '../../core'; -export interface FxBillingAddress extends Graph { +export interface BillingAddress extends Graph { curie: 'fx:billing_address'; links: { /** This resource. */ - 'self': FxBillingAddress; + 'self': BillingAddress; /** Store this billing address is registered in. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Customer this billing address belongs to. */ - 'fx:customer': FxCustomer; + 'fx:customer': Customer; /** Transaction associated with this billing address. */ - 'fx:transaction': FxTransaction; + 'fx:transaction': Transaction; /** Address of the customer this billing address belongs to. */ - 'fx:customer_address': FxCustomerAddress; + 'fx:customer_address': CustomerAddress; /** Collection of all billing addresses. */ - 'fx:billing_addresses': FxBillingAddresses; + 'fx:billing_addresses': BillingAddresses; }; props: { diff --git a/src/integration/Graph/billing_addresses.d.ts b/src/integration/Graph/billing_addresses.d.ts index ba7d63b..82ba159 100644 --- a/src/integration/Graph/billing_addresses.d.ts +++ b/src/integration/Graph/billing_addresses.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxBillingAddress } from './billing_address'; +import type { BillingAddress } from './billing_address'; import type { Graph } from '../../core'; -export interface FxBillingAddresses extends Graph { +export interface BillingAddresses extends Graph { curie: 'fx:billing_addresses'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxBillingAddress; + child: BillingAddress; } diff --git a/src/integration/Graph/cache.d.ts b/src/integration/Graph/cache.d.ts index c1587ab..f5d2fb0 100644 --- a/src/integration/Graph/cache.d.ts +++ b/src/integration/Graph/cache.d.ts @@ -1,5 +1,5 @@ import type { Graph } from '../../core'; -export interface FxCache extends Graph { +export interface Cache extends Graph { curie: 'fx:cache'; } diff --git a/src/integration/Graph/capture.d.ts b/src/integration/Graph/capture.d.ts index b33c629..31d8331 100644 --- a/src/integration/Graph/capture.d.ts +++ b/src/integration/Graph/capture.d.ts @@ -1,5 +1,5 @@ import type { Graph } from '../../core'; -export interface FxCapture extends Graph { +export interface Capture extends Graph { curie: 'fx:capture'; } diff --git a/src/integration/Graph/cart.d.ts b/src/integration/Graph/cart.d.ts index 9acfa67..de4a4a2 100644 --- a/src/integration/Graph/cart.d.ts +++ b/src/integration/Graph/cart.d.ts @@ -1,38 +1,38 @@ -import type { FxAppliedCouponCodes } from './applied_coupon_codes'; -import type { FxAttributes } from './attributes'; -import type { FxCreateSession } from './create_session'; -import type { FxCustomFields } from './custom_fields'; -import type { FxCustomer } from './customer'; -import type { FxDiscounts } from './discounts'; -import type { FxItems } from './items'; -import type { FxStore } from './store'; -import type { FxSubscription } from './subscription'; +import type { AppliedCouponCodes } from './applied_coupon_codes'; +import type { Attributes } from './attributes'; +import type { CreateSession } from './create_session'; +import type { CustomFields } from './custom_fields'; +import type { Customer } from './customer'; +import type { Discounts } from './discounts'; +import type { Items } from './items'; +import type { Store } from './store'; +import type { Subscription } from './subscription'; import type { Graph } from '../../core'; -export interface FxCart extends Graph { +export interface Cart extends Graph { curie: 'fx:cart'; links: { /** This resource. */ - 'self': FxCart; + 'self': Cart; /** Store this cart was created in. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Items in this cart. */ - 'fx:items': FxItems; + 'fx:items': Items; /** Customer who created this cart. */ - 'fx:customer': FxCustomer; + 'fx:customer': Customer; /** Discounts applied to the products in this cart. */ - 'fx:discounts': FxDiscounts; + 'fx:discounts': Discounts; /** Various attributes of this cart. */ - 'fx:attributes': FxAttributes; + 'fx:attributes': Attributes; /** Subscription linked to this cart. */ - 'fx:subscription': FxSubscription; + 'fx:subscription': Subscription; /** Custom fields applied to this cart. */ - 'fx:custom_fields': FxCustomFields; + 'fx:custom_fields': CustomFields; /** POST here to create a browser session link. */ - 'fx:create_session': FxCreateSession; + 'fx:create_session': CreateSession; /** Coupon codes applied to the items in this cart. */ - 'fx:applied_coupon_codes': FxAppliedCouponCodes; + 'fx:applied_coupon_codes': AppliedCouponCodes; }; props: { @@ -130,10 +130,10 @@ export interface FxCart extends Graph { }; zooms: { - custom_fields?: FxCustomFields; - attributes: FxAttributes; - discounts?: FxDiscounts; - customer?: FxCustomer; - items?: FxItems; + custom_fields?: CustomFields; + attributes: Attributes; + discounts?: Discounts; + customer?: Customer; + items?: Items; }; } diff --git a/src/integration/Graph/cart_include_template.d.ts b/src/integration/Graph/cart_include_template.d.ts index 0b32402..f3eb69a 100644 --- a/src/integration/Graph/cart_include_template.d.ts +++ b/src/integration/Graph/cart_include_template.d.ts @@ -1,20 +1,20 @@ -import type { FxCache } from './cache'; -import type { FxStore } from './store'; -import type { FxTemplateSets } from './template_sets'; +import type { Cache } from './cache'; +import type { Store } from './store'; +import type { TemplateSets } from './template_sets'; import type { Graph } from '../../core'; -export interface FxCartIncludeTemplate extends Graph { +export interface CartIncludeTemplate extends Graph { curie: 'fx:cart_include_template'; links: { /** This resource. */ - 'self': FxCartIncludeTemplate; + 'self': CartIncludeTemplate; /** POST here to cache your template using the `content_html_url` and `content_text_url`. */ - 'fx:cache': FxCache; + 'fx:cache': Cache; /** Store this template belongs to. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Template sets using this template. */ - 'fx:template_sets': FxTemplateSets; + 'fx:template_sets': TemplateSets; }; props: { diff --git a/src/integration/Graph/cart_include_templates.d.ts b/src/integration/Graph/cart_include_templates.d.ts index 4655501..8baa0a5 100644 --- a/src/integration/Graph/cart_include_templates.d.ts +++ b/src/integration/Graph/cart_include_templates.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxCartIncludeTemplate } from './cart_include_template'; +import type { CartIncludeTemplate } from './cart_include_template'; import type { Graph } from '../../core'; -export interface FxCartIncludeTemplates extends Graph { +export interface CartIncludeTemplates extends Graph { curie: 'fx:cart_include_templates'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxCartIncludeTemplate; + child: CartIncludeTemplate; } diff --git a/src/integration/Graph/cart_template.d.ts b/src/integration/Graph/cart_template.d.ts index cfb573b..b3a0cb4 100644 --- a/src/integration/Graph/cart_template.d.ts +++ b/src/integration/Graph/cart_template.d.ts @@ -1,20 +1,20 @@ -import type { FxCache } from './cache'; -import type { FxStore } from './store'; -import type { FxTemplateSets } from './template_sets'; +import type { Cache } from './cache'; +import type { Store } from './store'; +import type { TemplateSets } from './template_sets'; import type { Graph } from '../../core'; -export interface FxCartTemplate extends Graph { +export interface CartTemplate extends Graph { curie: 'fx:cart_template'; links: { /** This resource. */ - 'self': FxCartTemplate; + 'self': CartTemplate; /** POST here to cache your template using the `content_html_url` and `content_text_url`. */ - 'fx:cache': FxCache; + 'fx:cache': Cache; /** Store this template belongs to. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Template sets using this template. */ - 'fx:template_sets': FxTemplateSets; + 'fx:template_sets': TemplateSets; }; props: { diff --git a/src/integration/Graph/cart_templates.d.ts b/src/integration/Graph/cart_templates.d.ts index da9e372..24cead3 100644 --- a/src/integration/Graph/cart_templates.d.ts +++ b/src/integration/Graph/cart_templates.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxCartTemplate } from './cart_template'; +import type { CartTemplate } from './cart_template'; import type { Graph } from '../../core'; -export interface FxCartTemplates extends Graph { +export interface CartTemplates extends Graph { curie: 'fx:cart_templates'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxCartTemplate; + child: CartTemplate; } diff --git a/src/integration/Graph/carts.d.ts b/src/integration/Graph/carts.d.ts index 2d25dd2..b166a12 100644 --- a/src/integration/Graph/carts.d.ts +++ b/src/integration/Graph/carts.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxCart } from './cart'; +import type { Cart } from './cart'; import type { Graph } from '../../core'; -export interface FxCarts extends Graph { +export interface Carts extends Graph { curie: 'fx:carts'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxCart; + child: Cart; } diff --git a/src/integration/Graph/checkout_template.d.ts b/src/integration/Graph/checkout_template.d.ts index 7b947d2..c1d2828 100644 --- a/src/integration/Graph/checkout_template.d.ts +++ b/src/integration/Graph/checkout_template.d.ts @@ -1,23 +1,23 @@ -import type { FxCache } from './cache'; -import type { FxEncode } from './encode'; -import type { FxStore } from './store'; -import type { FxTemplateSets } from './template_sets'; +import type { Cache } from './cache'; +import type { Encode } from './encode'; +import type { Store } from './store'; +import type { TemplateSets } from './template_sets'; import type { Graph } from '../../core'; -export interface FxCheckoutTemplate extends Graph { +export interface CheckoutTemplate extends Graph { curie: 'fx:checkout_template'; links: { /** This resource. */ - 'self': FxCheckoutTemplate; + 'self': CheckoutTemplate; /** Store this template belongs to. */ - 'fx:store': FxStore; + 'fx:store': Store; /** POST here to cache your template using the `content_url`. */ - 'fx:cache': FxCache; + 'fx:cache': Cache; /** POST here to encode a body of html for use with our HMAC cart encryption. */ - 'fx:encode': FxEncode; + 'fx:encode': Encode; /** Template sets using this template. */ - 'fx:template_sets': FxTemplateSets; + 'fx:template_sets': TemplateSets; }; props: { diff --git a/src/integration/Graph/checkout_templates.d.ts b/src/integration/Graph/checkout_templates.d.ts index b4c7223..906e703 100644 --- a/src/integration/Graph/checkout_templates.d.ts +++ b/src/integration/Graph/checkout_templates.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxCheckoutTemplate } from './checkout_template'; +import type { CheckoutTemplate } from './checkout_template'; import type { Graph } from '../../core'; -export interface FxCheckoutTemplates extends Graph { +export interface CheckoutTemplates extends Graph { curie: 'fx:checkout_templates'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxCheckoutTemplate; + child: CheckoutTemplate; } diff --git a/src/integration/Graph/checkout_types.d.ts b/src/integration/Graph/checkout_types.d.ts index 7b58204..0819dfc 100644 --- a/src/integration/Graph/checkout_types.d.ts +++ b/src/integration/Graph/checkout_types.d.ts @@ -1,14 +1,14 @@ -import type { FxPropertyHelpers } from './property_helpers'; +import type { PropertyHelpers } from './property_helpers'; import type { Graph } from '../../core'; -export interface FxCheckoutTypes extends Graph { +export interface CheckoutTypes extends Graph { curie: 'fx:checkout_types'; links: { /** This resource. */ - 'self': FxCheckoutTypes; + 'self': CheckoutTypes; /** Various pre-defined property values. */ - 'fx:property_helpers': FxPropertyHelpers; + 'fx:property_helpers': PropertyHelpers; }; props: { diff --git a/src/integration/Graph/client.d.ts b/src/integration/Graph/client.d.ts index e81a35a..a5138ba 100644 --- a/src/integration/Graph/client.d.ts +++ b/src/integration/Graph/client.d.ts @@ -1,14 +1,14 @@ -import type { FxAttributes } from './attributes'; +import type { Attributes } from './attributes'; import type { Graph } from '../../core'; -export interface FxClient extends Graph { +export interface Client extends Graph { curie: 'fx:client'; links: { /** This resource. */ - 'self': FxClient; + 'self': Client; /** Custom attributes of this client. */ - 'fx:attributes': FxAttributes; + 'fx:attributes': Attributes; }; props: { diff --git a/src/integration/Graph/countries.d.ts b/src/integration/Graph/countries.d.ts index 8cb6bd1..bde080f 100644 --- a/src/integration/Graph/countries.d.ts +++ b/src/integration/Graph/countries.d.ts @@ -1,14 +1,14 @@ -import type { FxPropertyHelpers } from './property_helpers'; +import type { PropertyHelpers } from './property_helpers'; import type { Graph } from '../../core'; -export interface FxCountries extends Graph { +export interface Countries extends Graph { curie: 'fx:countries'; links: { /** This resource. */ - 'self': FxCountries; + 'self': Countries; /** Various pre-defined property values. */ - 'fx:property_helpers': FxPropertyHelpers; + 'fx:property_helpers': PropertyHelpers; }; props: { diff --git a/src/integration/Graph/coupon.d.ts b/src/integration/Graph/coupon.d.ts index ac4e818..b1fdcf5 100644 --- a/src/integration/Graph/coupon.d.ts +++ b/src/integration/Graph/coupon.d.ts @@ -1,23 +1,23 @@ -import type { FxCouponCodes } from './coupon_codes'; -import type { FxCouponItemCategories } from './coupon_item_categories'; -import type { FxGenerateCodes } from './generate_codes'; -import type { FxStore } from './store'; +import type { CouponCodes } from './coupon_codes'; +import type { CouponItemCategories } from './coupon_item_categories'; +import type { GenerateCodes } from './generate_codes'; +import type { Store } from './store'; import type { Graph } from '../../core'; -export interface FxCoupon extends Graph { +export interface Coupon extends Graph { curie: 'fx:coupon'; links: { /** This resource. */ - 'self': FxCoupon; + 'self': Coupon; /** Store this coupon belongs to. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Codes linked to this coupon. */ - 'fx:coupon_codes': FxCouponCodes; + 'fx:coupon_codes': CouponCodes; /** POST here to generate random coupon codes. */ - 'fx:generate_codes': FxGenerateCodes; + 'fx:generate_codes': GenerateCodes; /** Valid item categories for this coupon. */ - 'fx:coupon_item_categories': FxCouponItemCategories; + 'fx:coupon_item_categories': CouponItemCategories; }; props: { @@ -58,7 +58,7 @@ export interface FxCoupon extends Graph { }; zooms: { - coupon_item_categories?: FxCouponItemCategories; - coupon_codes?: FxCouponCodes; + coupon_item_categories?: CouponItemCategories; + coupon_codes?: CouponCodes; }; } diff --git a/src/integration/Graph/coupon_code.d.ts b/src/integration/Graph/coupon_code.d.ts index 49d1a95..2d48e70 100644 --- a/src/integration/Graph/coupon_code.d.ts +++ b/src/integration/Graph/coupon_code.d.ts @@ -1,20 +1,20 @@ -import type { FxCoupon } from './coupon'; -import type { FxCouponCodeTransactions } from './coupon_code_transactions'; -import type { FxStore } from './store'; +import type { Coupon } from './coupon'; +import type { CouponCodeTransactions } from './coupon_code_transactions'; +import type { Store } from './store'; import type { Graph } from '../../core'; -export interface FxCouponCode extends Graph { +export interface CouponCode extends Graph { curie: 'fx:coupon_code'; links: { /** This resource. */ - 'self': FxCouponCode; + 'self': CouponCode; /** Store this coupon code belongs to. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Coupon this code corresponds to. */ - 'fx:coupon': FxCoupon; + 'fx:coupon': Coupon; /** Transactions using this coupon code. */ - 'fx:coupon_code_transactions': FxCouponCodeTransactions; + 'fx:coupon_code_transactions': CouponCodeTransactions; }; props: { diff --git a/src/integration/Graph/coupon_code_transaction.d.ts b/src/integration/Graph/coupon_code_transaction.d.ts index 8e8ba6d..962ff83 100644 --- a/src/integration/Graph/coupon_code_transaction.d.ts +++ b/src/integration/Graph/coupon_code_transaction.d.ts @@ -1,23 +1,23 @@ -import type { FxCoupon } from './coupon'; -import type { FxCouponCode } from './coupon_code'; -import type { FxStore } from './store'; -import type { FxTransaction } from './transaction'; +import type { Coupon } from './coupon'; +import type { CouponCode } from './coupon_code'; +import type { Store } from './store'; +import type { Transaction } from './transaction'; import type { Graph } from '../../core'; -export interface FxCouponCodeTransaction extends Graph { +export interface CouponCodeTransaction extends Graph { curie: 'fx:coupon_code_transaction'; links: { /** This resource. */ - 'self': FxCouponCodeTransaction; + 'self': CouponCodeTransaction; /** Store this transaction was processed by. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Coupon that was used with this transaction. */ - 'fx:coupon': FxCoupon; + 'fx:coupon': Coupon; /** Coupon code that was used with this transaction. */ - 'fx:coupon_code': FxCouponCode; + 'fx:coupon_code': CouponCode; /** Transaction the coupon code was used with. */ - 'fx:transaction': FxTransaction; + 'fx:transaction': Transaction; }; props: { diff --git a/src/integration/Graph/coupon_code_transactions.d.ts b/src/integration/Graph/coupon_code_transactions.d.ts index 5a1022e..8a0ceb7 100644 --- a/src/integration/Graph/coupon_code_transactions.d.ts +++ b/src/integration/Graph/coupon_code_transactions.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxCouponCodeTransaction } from './coupon_code_transaction'; +import type { CouponCodeTransaction } from './coupon_code_transaction'; import type { Graph } from '../../core'; -export interface FxCouponCodeTransactions extends Graph { +export interface CouponCodeTransactions extends Graph { curie: 'fx:coupon_code_transactions'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxCouponCodeTransaction; + child: CouponCodeTransaction; } diff --git a/src/integration/Graph/coupon_codes.d.ts b/src/integration/Graph/coupon_codes.d.ts index c840bfb..f00ff3d 100644 --- a/src/integration/Graph/coupon_codes.d.ts +++ b/src/integration/Graph/coupon_codes.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxCouponCode } from './coupon_code'; +import type { CouponCode } from './coupon_code'; import type { Graph } from '../../core'; -export interface FxCouponCodes extends Graph { +export interface CouponCodes extends Graph { curie: 'fx:coupon_codes'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxCouponCode; + child: CouponCode; } diff --git a/src/integration/Graph/coupon_detail.d.ts b/src/integration/Graph/coupon_detail.d.ts index 9f385b4..8ce32a8 100644 --- a/src/integration/Graph/coupon_detail.d.ts +++ b/src/integration/Graph/coupon_detail.d.ts @@ -1,26 +1,26 @@ -import type { FxCoupon } from './coupon'; -import type { FxCouponCode } from './coupon_code'; -import type { FxItem } from './item'; -import type { FxStore } from './store'; -import type { FxTransaction } from './transaction'; +import type { Coupon } from './coupon'; +import type { CouponCode } from './coupon_code'; +import type { Item } from './item'; +import type { Store } from './store'; +import type { Transaction } from './transaction'; import type { Graph } from '../../core'; -export interface FxCouponDetail extends Graph { +export interface CouponDetail extends Graph { curie: 'fx:coupon_detail'; links: { /** This resource. */ - 'self': FxCouponDetail; + 'self': CouponDetail; /** Item the coupon was applied to. */ - 'fx:item': FxItem; + 'fx:item': Item; /** Store the coupon belongs to. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Coupon this detail describes. */ - 'fx:coupon': FxCoupon; + 'fx:coupon': Coupon; /** Coupon code used in the coupon. */ - 'fx:coupon_code': FxCouponCode; + 'fx:coupon_code': CouponCode; /** Transaction the coupon was applied to. */ - 'fx:transaction': FxTransaction; + 'fx:transaction': Transaction; }; props: { diff --git a/src/integration/Graph/coupon_details.d.ts b/src/integration/Graph/coupon_details.d.ts index 5cb9b84..afcc957 100644 --- a/src/integration/Graph/coupon_details.d.ts +++ b/src/integration/Graph/coupon_details.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxCouponDetail } from './coupon_detail'; +import type { CouponDetail } from './coupon_detail'; import type { Graph } from '../../core'; -export interface FxCouponDetails extends Graph { +export interface CouponDetails extends Graph { curie: 'fx:coupon_details'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxCouponDetail; + child: CouponDetail; } diff --git a/src/integration/Graph/coupon_item_categories.d.ts b/src/integration/Graph/coupon_item_categories.d.ts index 20d0b96..45aea11 100644 --- a/src/integration/Graph/coupon_item_categories.d.ts +++ b/src/integration/Graph/coupon_item_categories.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxCouponItemCategory } from './coupon_item_category'; +import type { CouponItemCategory } from './coupon_item_category'; import type { Graph } from '../../core'; -export interface FxCouponItemCategories extends Graph { +export interface CouponItemCategories extends Graph { curie: 'fx:coupon_item_categories'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxCouponItemCategory; + child: CouponItemCategory; } diff --git a/src/integration/Graph/coupon_item_category.d.ts b/src/integration/Graph/coupon_item_category.d.ts index 3e2650b..4194943 100644 --- a/src/integration/Graph/coupon_item_category.d.ts +++ b/src/integration/Graph/coupon_item_category.d.ts @@ -1,20 +1,20 @@ -import type { FxCoupon } from './coupon'; -import type { FxItemCategory } from './item_category'; -import type { FxStore } from './store'; +import type { Coupon } from './coupon'; +import type { ItemCategory } from './item_category'; +import type { Store } from './store'; import type { Graph } from '../../core'; -export interface FxCouponItemCategory extends Graph { +export interface CouponItemCategory extends Graph { curie: 'fx:coupon_item_category'; links: { /** This resource. */ - 'self': FxCouponItemCategory; + 'self': CouponItemCategory; /** Store the coupon belongs to. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Coupon this category belongs to. */ - 'fx:coupon': FxCoupon; + 'fx:coupon': Coupon; /** Item category this resource links to. */ - 'fx:item_category': FxItemCategory; + 'fx:item_category': ItemCategory; }; props: { diff --git a/src/integration/Graph/coupons.d.ts b/src/integration/Graph/coupons.d.ts index e1119fe..86288f3 100644 --- a/src/integration/Graph/coupons.d.ts +++ b/src/integration/Graph/coupons.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxCoupon } from './coupon'; +import type { Coupon } from './coupon'; import type { Graph } from '../../core'; -export interface FxCoupons extends Graph { +export interface Coupons extends Graph { curie: 'fx:coupons'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxCoupon; + child: Coupon; } diff --git a/src/integration/Graph/create_client.d.ts b/src/integration/Graph/create_client.d.ts index b92fbf6..92dbb86 100644 --- a/src/integration/Graph/create_client.d.ts +++ b/src/integration/Graph/create_client.d.ts @@ -1,8 +1,8 @@ -import type { FxClient } from './client'; +import type { Client } from './client'; import type { Graph } from '../../core'; -export interface FxCreateClient extends Graph { +export interface CreateClient extends Graph { curie: 'fx:create_client'; - links: FxClient['links']; - props: FxClient['props']; + links: Client['links']; + props: Client['props']; } diff --git a/src/integration/Graph/create_session.d.ts b/src/integration/Graph/create_session.d.ts index 08bd90d..1149b48 100644 --- a/src/integration/Graph/create_session.d.ts +++ b/src/integration/Graph/create_session.d.ts @@ -1,6 +1,6 @@ import type { Graph } from '../../core'; -export interface FxCreateSession extends Graph { +export interface CreateSession extends Graph { curie: 'fx:create_session'; props: { diff --git a/src/integration/Graph/create_user.d.ts b/src/integration/Graph/create_user.d.ts index 3150b6b..b1cf96f 100644 --- a/src/integration/Graph/create_user.d.ts +++ b/src/integration/Graph/create_user.d.ts @@ -1,8 +1,8 @@ -import type { FxUser } from './user'; +import type { User } from './user'; import type { Graph } from '../../core'; -export interface FxCreateUser extends Graph { +export interface CreateUser extends Graph { curie: 'fx:create_user'; - links: FxUser['links']; - props: FxUser['props']; + links: User['links']; + props: User['props']; } diff --git a/src/integration/Graph/custom_field.d.ts b/src/integration/Graph/custom_field.d.ts index ffdab93..c0c550f 100644 --- a/src/integration/Graph/custom_field.d.ts +++ b/src/integration/Graph/custom_field.d.ts @@ -1,17 +1,17 @@ -import type { FxStore } from './store'; -import type { FxTransaction } from './transaction'; +import type { Store } from './store'; +import type { Transaction } from './transaction'; import type { Graph } from '../../core'; -export interface FxCustomField extends Graph { +export interface CustomField extends Graph { curie: 'fx:custom_field'; links: { /** This resource. */ - 'self': FxCustomField; + 'self': CustomField; /** Store this custom field was created in. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Transaction this custom field is linked to. */ - 'fx:transaction': FxTransaction; + 'fx:transaction': Transaction; }; props: { diff --git a/src/integration/Graph/custom_fields.d.ts b/src/integration/Graph/custom_fields.d.ts index bbc62ba..8af8d6a 100644 --- a/src/integration/Graph/custom_fields.d.ts +++ b/src/integration/Graph/custom_fields.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxCustomField } from './custom_field'; +import type { CustomField } from './custom_field'; import type { Graph } from '../../core'; -export interface FxCustomFields extends Graph { +export interface CustomFields extends Graph { curie: 'fx:custom_fields'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxCustomField; + child: CustomField; } diff --git a/src/integration/Graph/customer.d.ts b/src/integration/Graph/customer.d.ts index c28fcf7..848d7c7 100644 --- a/src/integration/Graph/customer.d.ts +++ b/src/integration/Graph/customer.d.ts @@ -1,35 +1,35 @@ -import type { FxAttributes } from './attributes'; -import type { FxCustomerAddresses } from './customer_addresses'; -import type { FxDefaultBillingAddress } from './default_billing_address'; -import type { FxDefaultPaymentMethod } from './default_payment_method'; -import type { FxDefaultShippingAddress } from './default_shipping_address'; -import type { FxStore } from './store'; -import type { FxSubscriptions } from './subscriptions'; -import type { FxTransactions } from './transactions'; +import type { Attributes } from './attributes'; +import type { CustomerAddresses } from './customer_addresses'; +import type { DefaultBillingAddress } from './default_billing_address'; +import type { DefaultPaymentMethod } from './default_payment_method'; +import type { DefaultShippingAddress } from './default_shipping_address'; +import type { Store } from './store'; +import type { Subscriptions } from './subscriptions'; +import type { Transactions } from './transactions'; import type { Graph } from '../../core'; -export interface FxCustomer extends Graph { +export interface Customer extends Graph { curie: 'fx:customer'; links: { /** This resource. */ - 'self': FxCustomer; + 'self': Customer; /** Store this customer is registered in. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Attributes for this customer. */ - 'fx:attributes': FxAttributes; + 'fx:attributes': Attributes; /** List of customer's transactions. */ - 'fx:transactions': FxTransactions; + 'fx:transactions': Transactions; /** List of customer's subscriptions. */ - 'fx:subscriptions': FxSubscriptions; + 'fx:subscriptions': Subscriptions; /** List of customer's addresses. */ - 'fx:customer_addresses': FxCustomerAddresses; + 'fx:customer_addresses': CustomerAddresses; /** Customer's default payment method. */ - 'fx:default_payment_method': FxDefaultPaymentMethod; + 'fx:default_payment_method': DefaultPaymentMethod; /** Customer's default billing address. */ - 'fx:default_billing_address': FxDefaultBillingAddress; + 'fx:default_billing_address': DefaultBillingAddress; /** Customer's default shipping address. */ - 'fx:default_shipping_address': FxDefaultShippingAddress; + 'fx:default_shipping_address': DefaultShippingAddress; }; props: { @@ -68,10 +68,10 @@ export interface FxCustomer extends Graph { }; zooms: { - default_shipping_address?: FxDefaultShippingAddress; - default_billing_address?: FxDefaultBillingAddress; - default_payment_method?: FxDefaultPaymentMethod; - customer_addresses?: FxCustomerAddresses; - attributes: FxAttributes; + default_shipping_address?: DefaultShippingAddress; + default_billing_address?: DefaultBillingAddress; + default_payment_method?: DefaultPaymentMethod; + customer_addresses?: CustomerAddresses; + attributes: Attributes; }; } diff --git a/src/integration/Graph/customer_address.d.ts b/src/integration/Graph/customer_address.d.ts index 582b47c..571fbd3 100644 --- a/src/integration/Graph/customer_address.d.ts +++ b/src/integration/Graph/customer_address.d.ts @@ -1,17 +1,17 @@ -import type { FxCustomer } from './customer'; -import type { FxStore } from './store'; +import type { Customer } from './customer'; +import type { Store } from './store'; import type { Graph } from '../../core'; -export interface FxCustomerAddress extends Graph { +export interface CustomerAddress extends Graph { curie: 'fx:customer_address'; links: { /** This resource. */ - 'self': FxCustomerAddress; + 'self': CustomerAddress; /** Store the customer account belongs to. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Customer this address is linked to. */ - 'fx:customer': FxCustomer; + 'fx:customer': Customer; }; props: { diff --git a/src/integration/Graph/customer_addresses.d.ts b/src/integration/Graph/customer_addresses.d.ts index 8e568e1..4e10422 100644 --- a/src/integration/Graph/customer_addresses.d.ts +++ b/src/integration/Graph/customer_addresses.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxCustomerAddress } from './customer_address'; +import type { CustomerAddress } from './customer_address'; import type { Graph } from '../../core'; -export interface FxCustomerAddresses extends Graph { +export interface CustomerAddresses extends Graph { curie: 'fx:customer_addresses'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxCustomerAddress; + child: CustomerAddress; } diff --git a/src/integration/Graph/customer_email_template.d.ts b/src/integration/Graph/customer_email_template.d.ts index 49db1dc..d35123c 100644 --- a/src/integration/Graph/customer_email_template.d.ts +++ b/src/integration/Graph/customer_email_template.d.ts @@ -1,22 +1,22 @@ -import type { FxCache } from './cache'; -import type { FxEmailTemplate } from './email_template'; -import type { FxStore } from './store'; -import type { FxTemplateSets } from './template_sets'; +import type { Cache } from './cache'; +import type { EmailTemplate } from './email_template'; +import type { Store } from './store'; +import type { TemplateSets } from './template_sets'; import type { Graph } from '../../core'; -export interface FxCustomerEmailTemplate extends Graph { +export interface CustomerEmailTemplate extends Graph { curie: 'fx:customer_email_template'; links: { /** This resource. */ - 'self': FxCustomerEmailTemplate; + 'self': CustomerEmailTemplate; /** Store this template belongs to. */ - 'fx:store': FxStore; + 'fx:store': Store; /** POST here to cache your template using the `content_html_url` and `content_text_url`. */ - 'fx:cache': FxCache; + 'fx:cache': Cache; /** Template sets using this template. */ - 'fx:template_sets': FxTemplateSets; + 'fx:template_sets': TemplateSets; }; - props: FxEmailTemplate['props']; + props: EmailTemplate['props']; } diff --git a/src/integration/Graph/customer_password_hash_types.d.ts b/src/integration/Graph/customer_password_hash_types.d.ts index e62054c..7d51efd 100644 --- a/src/integration/Graph/customer_password_hash_types.d.ts +++ b/src/integration/Graph/customer_password_hash_types.d.ts @@ -1,14 +1,14 @@ -import type { FxPropertyHelpers } from './property_helpers'; +import type { PropertyHelpers } from './property_helpers'; import type { Graph } from '../../core'; -export interface FxCustomerPasswordHashTypes extends Graph { +export interface CustomerPasswordHashTypes extends Graph { curie: 'fx:customer_password_hash_types'; links: { /** This resource. */ - 'self': FxCustomerPasswordHashTypes; + 'self': CustomerPasswordHashTypes; /** Various pre-defined property values. */ - 'fx:property_helpers': FxPropertyHelpers; + 'fx:property_helpers': PropertyHelpers; }; props: { diff --git a/src/integration/Graph/customer_portal_settings.d.ts b/src/integration/Graph/customer_portal_settings.d.ts index 6bbca8c..d312b46 100644 --- a/src/integration/Graph/customer_portal_settings.d.ts +++ b/src/integration/Graph/customer_portal_settings.d.ts @@ -1,14 +1,14 @@ -import type { FxStore } from './store'; +import type { Store } from './store'; import type { Graph } from '../../core'; -export interface FxCustomerPortalSettings extends Graph { +export interface CustomerPortalSettings extends Graph { curie: 'fx:customer_portal_settings'; links: { /** This resource. */ - 'self': FxCustomerPortalSettings; + 'self': CustomerPortalSettings; /** Store the customer portal of which this resource configures. */ - 'fx:store': FxStore; + 'fx:store': Store; }; props: { diff --git a/src/integration/Graph/customers.d.ts b/src/integration/Graph/customers.d.ts index cd48c2b..93343ee 100644 --- a/src/integration/Graph/customers.d.ts +++ b/src/integration/Graph/customers.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxCustomer } from './customer'; +import type { Customer } from './customer'; import type { Graph } from '../../core'; -export interface FxCustomers extends Graph { +export interface Customers extends Graph { curie: 'fx:customers'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxCustomer; + child: Customer; } diff --git a/src/integration/Graph/default_billing_address.d.ts b/src/integration/Graph/default_billing_address.d.ts index daef1c8..6f770ad 100644 --- a/src/integration/Graph/default_billing_address.d.ts +++ b/src/integration/Graph/default_billing_address.d.ts @@ -1,8 +1,8 @@ -import type { FxCustomerAddress } from './customer_address'; +import type { CustomerAddress } from './customer_address'; import type { Graph } from '../../core'; -export interface FxDefaultBillingAddress extends Graph { +export interface DefaultBillingAddress extends Graph { curie: 'fx:default_billing_address'; - links: FxCustomerAddress['links']; - props: FxCustomerAddress['props']; + links: CustomerAddress['links']; + props: CustomerAddress['props']; } diff --git a/src/integration/Graph/default_payment_method.d.ts b/src/integration/Graph/default_payment_method.d.ts index 0962dc9..bc0f351 100644 --- a/src/integration/Graph/default_payment_method.d.ts +++ b/src/integration/Graph/default_payment_method.d.ts @@ -1,17 +1,17 @@ -import type { FxCustomer } from './customer'; -import type { FxStore } from './store'; +import type { Customer } from './customer'; +import type { Store } from './store'; import type { Graph } from '../../core'; -export interface FxDefaultPaymentMethod extends Graph { +export interface DefaultPaymentMethod extends Graph { curie: 'fx:default_payment_method'; links: { /** This resource. */ - 'self': FxDefaultPaymentMethod; + 'self': DefaultPaymentMethod; /** Store the customer is registered in. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Customer using this payment method as default. */ - 'fx:customer': FxCustomer; + 'fx:customer': Customer; }; props: { diff --git a/src/integration/Graph/default_shipping_address.d.ts b/src/integration/Graph/default_shipping_address.d.ts index 639b626..6eb4da8 100644 --- a/src/integration/Graph/default_shipping_address.d.ts +++ b/src/integration/Graph/default_shipping_address.d.ts @@ -1,8 +1,8 @@ -import type { FxCustomerAddress } from './customer_address'; +import type { CustomerAddress } from './customer_address'; import type { Graph } from '../../core'; -export interface FxDefaultShippingAddress extends Graph { +export interface DefaultShippingAddress extends Graph { curie: 'fx:default_shipping_address'; - links: FxCustomerAddress['links']; - props: FxCustomerAddress['props']; + links: CustomerAddress['links']; + props: CustomerAddress['props']; } diff --git a/src/integration/Graph/default_store.d.ts b/src/integration/Graph/default_store.d.ts index 635d381..486e307 100644 --- a/src/integration/Graph/default_store.d.ts +++ b/src/integration/Graph/default_store.d.ts @@ -1,8 +1,8 @@ -import type { FxStore } from './store'; +import type { Store } from './store'; import type { Graph } from '../../core'; -export interface FxDefaultStore extends Graph { +export interface DefaultStore extends Graph { curie: 'fx:default_store'; - links: FxStore['links']; - props: FxStore['props']; + links: Store['links']; + props: Store['props']; } diff --git a/src/integration/Graph/default_templates.d.ts b/src/integration/Graph/default_templates.d.ts index 9d631f5..d958515 100644 --- a/src/integration/Graph/default_templates.d.ts +++ b/src/integration/Graph/default_templates.d.ts @@ -1,29 +1,29 @@ -import type { FxCartIncludeTemplates } from './cart_include_templates'; -import type { FxCartTemplates } from './cart_templates'; -import type { FxCheckoutTemplates } from './checkout_templates'; -import type { FxEmailTemplates } from './email_templates'; -import type { FxPropertyHelpers } from './property_helpers'; -import type { FxReceiptTemplates } from './receipt_templates'; +import type { CartIncludeTemplates } from './cart_include_templates'; +import type { CartTemplates } from './cart_templates'; +import type { CheckoutTemplates } from './checkout_templates'; +import type { EmailTemplates } from './email_templates'; +import type { PropertyHelpers } from './property_helpers'; +import type { ReceiptTemplates } from './receipt_templates'; import type { Graph } from '../../core'; -export interface FxDefaultTemplates extends Graph { +export interface DefaultTemplates extends Graph { curie: 'fx:default_templates'; links: { /** This resource. */ - 'self': FxDefaultTemplates; + 'self': DefaultTemplates; /** Default cart templates. */ - 'fx:cart_templates': FxCartTemplates; + 'fx:cart_templates': CartTemplates; /** Default email templates. */ - 'fx:email_templates': FxEmailTemplates; + 'fx:email_templates': EmailTemplates; /** Various predefined property values. */ - 'fx:property_helpers': FxPropertyHelpers; + 'fx:property_helpers': PropertyHelpers; /** Default receipt templates. */ - 'fx:receipt_templates': FxReceiptTemplates; + 'fx:receipt_templates': ReceiptTemplates; /** Default checkout templates. */ - 'fx:checkout_templates': FxCheckoutTemplates; + 'fx:checkout_templates': CheckoutTemplates; /** Default cart include templates. */ - 'fx:cart_include_templates': FxCartIncludeTemplates; + 'fx:cart_include_templates': CartIncludeTemplates; }; props: { diff --git a/src/integration/Graph/discount.d.ts b/src/integration/Graph/discount.d.ts index e1f7a35..f3e7049 100644 --- a/src/integration/Graph/discount.d.ts +++ b/src/integration/Graph/discount.d.ts @@ -1,26 +1,26 @@ -import type { FxCoupon } from './coupon'; -import type { FxCouponCode } from './coupon_code'; -import type { FxCustomer } from './customer'; -import type { FxStore } from './store'; -import type { FxTransaction } from './transaction'; +import type { Coupon } from './coupon'; +import type { CouponCode } from './coupon_code'; +import type { Customer } from './customer'; +import type { Store } from './store'; +import type { Transaction } from './transaction'; import type { Graph } from '../../core'; -export interface FxDiscount extends Graph { +export interface Discount extends Graph { curie: 'fx:discount'; links: { /** This resource. */ - 'self': FxDiscount; + 'self': Discount; /** Store that provided this discount. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Coupon that was used to get this discount. */ - 'fx:coupon': FxCoupon; + 'fx:coupon': Coupon; /** Customer who used this discount. */ - 'fx:customer': FxCustomer; + 'fx:customer': Customer; /** Transaction this discount was applied to. */ - 'fx:transaction': FxTransaction; + 'fx:transaction': Transaction; /** Coupon code that was used to get this discount. */ - 'fx:coupon_code': FxCouponCode; + 'fx:coupon_code': CouponCode; }; props: { diff --git a/src/integration/Graph/discount_detail.d.ts b/src/integration/Graph/discount_detail.d.ts index 7d580b0..7f57cb3 100644 --- a/src/integration/Graph/discount_detail.d.ts +++ b/src/integration/Graph/discount_detail.d.ts @@ -1,20 +1,20 @@ -import type { FxItem } from './item'; -import type { FxStore } from './store'; -import type { FxTransaction } from './transaction'; +import type { Item } from './item'; +import type { Store } from './store'; +import type { Transaction } from './transaction'; import type { Graph } from '../../core'; -export interface FxDiscountDetail extends Graph { +export interface DiscountDetail extends Graph { curie: 'fx:discount_detail'; links: { /** This resource. */ - 'self': FxDiscountDetail; + 'self': DiscountDetail; /** Item the discount was applied to. */ - 'fx:item': FxItem; + 'fx:item': Item; /** Store that provided the discount. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Transaction the discount was applied to. */ - 'fx:transaction': FxTransaction; + 'fx:transaction': Transaction; }; props: { diff --git a/src/integration/Graph/discount_details.d.ts b/src/integration/Graph/discount_details.d.ts index f65dacc..32e2a21 100644 --- a/src/integration/Graph/discount_details.d.ts +++ b/src/integration/Graph/discount_details.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxDiscountDetail } from './discount_detail'; +import type { DiscountDetail } from './discount_detail'; import type { Graph } from '../../core'; -export interface FxDiscountDetails extends Graph { +export interface DiscountDetails extends Graph { curie: 'fx:discount_details'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxDiscountDetail; + child: DiscountDetail; } diff --git a/src/integration/Graph/discounts.d.ts b/src/integration/Graph/discounts.d.ts index 5001dda..f5439e1 100644 --- a/src/integration/Graph/discounts.d.ts +++ b/src/integration/Graph/discounts.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxDiscount } from './discount'; +import type { Discount } from './discount'; import type { Graph } from '../../core'; -export interface FxDiscounts extends Graph { +export interface Discounts extends Graph { curie: 'fx:discounts'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxDiscount; + child: Discount; } diff --git a/src/integration/Graph/downloadable.d.ts b/src/integration/Graph/downloadable.d.ts index 1005b81..5f20056 100644 --- a/src/integration/Graph/downloadable.d.ts +++ b/src/integration/Graph/downloadable.d.ts @@ -1,20 +1,20 @@ -import type { FxDownloadableItemCategories } from './downloadable_item_categories'; -import type { FxItemCategory } from './item_category'; -import type { FxStore } from './store'; +import type { DownloadableItemCategories } from './downloadable_item_categories'; +import type { ItemCategory } from './item_category'; +import type { Store } from './store'; import type { Graph } from '../../core'; -export interface FxDownloadable extends Graph { +export interface Downloadable extends Graph { curie: 'fx:downloadable'; links: { /** This resource. */ - 'self': FxDownloadable; + 'self': Downloadable; /** Store this downloadable product belongs to. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Item category this downloadable product belongs to. */ - 'fx:item_category': FxItemCategory; + 'fx:item_category': ItemCategory; /** List of all downloadable item categories in the store. */ - 'fx:downloadable_item_categories': FxDownloadableItemCategories; + 'fx:downloadable_item_categories': DownloadableItemCategories; }; props: { diff --git a/src/integration/Graph/downloadable_item_categories.d.ts b/src/integration/Graph/downloadable_item_categories.d.ts index ca05a02..e323392 100644 --- a/src/integration/Graph/downloadable_item_categories.d.ts +++ b/src/integration/Graph/downloadable_item_categories.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxItemCategory } from './item_category'; +import type { ItemCategory } from './item_category'; import type { Graph } from '../../core'; -export interface FxDownloadableItemCategories extends Graph { +export interface DownloadableItemCategories extends Graph { curie: 'fx:downloadable_item_categories'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxItemCategory; + child: ItemCategory; } diff --git a/src/integration/Graph/downloadable_purchase.d.ts b/src/integration/Graph/downloadable_purchase.d.ts index 26cfda3..ec38e0f 100644 --- a/src/integration/Graph/downloadable_purchase.d.ts +++ b/src/integration/Graph/downloadable_purchase.d.ts @@ -1,26 +1,26 @@ -import type { FxCustomer } from './customer'; -import type { FxDownloadable } from './downloadable'; -import type { FxItem } from './item'; -import type { FxStore } from './store'; -import type { FxTransaction } from './transaction'; +import type { Customer } from './customer'; +import type { Downloadable } from './downloadable'; +import type { Item } from './item'; +import type { Store } from './store'; +import type { Transaction } from './transaction'; import type { Graph } from '../../core'; -export interface FxDownloadablePurchase extends Graph { +export interface DownloadablePurchase extends Graph { curie: 'fx:downloadable_purchase'; links: { /** This resource. */ - 'self': FxDownloadablePurchase; + 'self': DownloadablePurchase; /** Related cart item. */ - 'fx:item': FxItem; + 'fx:item': Item; /** Store that provided the downloadable product. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Customer who purchased the downloadable product. */ - 'fx:customer': FxCustomer; + 'fx:customer': Customer; /** Related transaction. */ - 'fx:transaction': FxTransaction; + 'fx:transaction': Transaction; /** Downloadable product. */ - 'fx:downloadable': FxDownloadable; + 'fx:downloadable': Downloadable; }; props: { diff --git a/src/integration/Graph/downloadables.d.ts b/src/integration/Graph/downloadables.d.ts index 17a0485..c7e7d55 100644 --- a/src/integration/Graph/downloadables.d.ts +++ b/src/integration/Graph/downloadables.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxDownloadable } from './downloadable'; +import type { Downloadable } from './downloadable'; import type { Graph } from '../../core'; -export interface FxDownloadables extends Graph { +export interface Downloadables extends Graph { curie: 'fx:downloadables'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxDownloadable; + child: Downloadable; } diff --git a/src/integration/Graph/email_template.d.ts b/src/integration/Graph/email_template.d.ts index a1b9abb..daef5bb 100644 --- a/src/integration/Graph/email_template.d.ts +++ b/src/integration/Graph/email_template.d.ts @@ -1,20 +1,20 @@ -import type { FxCache } from './cache'; -import type { FxStore } from './store'; -import type { FxTemplateSets } from './template_sets'; +import type { Cache } from './cache'; +import type { Store } from './store'; +import type { TemplateSets } from './template_sets'; import type { Graph } from '../../core'; -export interface FxEmailTemplate extends Graph { +export interface EmailTemplate extends Graph { curie: 'fx:email_template'; links: { /** This resource. */ - 'self': FxEmailTemplate; + 'self': EmailTemplate; /** POST here to cache your template using the `content_html_url` and `content_text_url`. */ - 'fx:cache': FxCache; + 'fx:cache': Cache; /** Store this template belongs to. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Template sets using this template. */ - 'fx:template_sets': FxTemplateSets; + 'fx:template_sets': TemplateSets; }; props: { diff --git a/src/integration/Graph/email_templates.d.ts b/src/integration/Graph/email_templates.d.ts index d9dd6f0..df92175 100644 --- a/src/integration/Graph/email_templates.d.ts +++ b/src/integration/Graph/email_templates.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxEmailTemplate } from './email_template'; +import type { EmailTemplate } from './email_template'; import type { Graph } from '../../core'; -export interface FxEmailTemplates extends Graph { +export interface EmailTemplates extends Graph { curie: 'fx:email_templates'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxEmailTemplate; + child: EmailTemplate; } diff --git a/src/integration/Graph/encode.d.ts b/src/integration/Graph/encode.d.ts index 012d026..409b95a 100644 --- a/src/integration/Graph/encode.d.ts +++ b/src/integration/Graph/encode.d.ts @@ -1,5 +1,5 @@ import type { Graph } from '../../core'; -export interface FxEncode extends Graph { +export interface Encode extends Graph { curie: 'fx:encode'; } diff --git a/src/integration/Graph/error_entries.d.ts b/src/integration/Graph/error_entries.d.ts index 67a9dc3..8d17d79 100644 --- a/src/integration/Graph/error_entries.d.ts +++ b/src/integration/Graph/error_entries.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxErrorEntry } from './error_entry'; +import type { ErrorEntry } from './error_entry'; import type { Graph } from '../../core'; -export interface FxErrorEntries extends Graph { +export interface ErrorEntries extends Graph { curie: 'fx:error_entries'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxErrorEntry; + child: ErrorEntry; } diff --git a/src/integration/Graph/error_entry.d.ts b/src/integration/Graph/error_entry.d.ts index 336e2ab..f966956 100644 --- a/src/integration/Graph/error_entry.d.ts +++ b/src/integration/Graph/error_entry.d.ts @@ -1,14 +1,14 @@ -import type { FxStore } from './store'; +import type { Store } from './store'; import type { Graph } from '../../core'; -export interface FxErrorEntry extends Graph { +export interface ErrorEntry extends Graph { curie: 'fx:error_entry'; links: { /** This resource. */ - 'self': FxErrorEntry; + 'self': ErrorEntry; /** Store this error entry was created in. */ - 'fx:store': FxStore; + 'fx:store': Store; }; props: { diff --git a/src/integration/Graph/fraud_protection.d.ts b/src/integration/Graph/fraud_protection.d.ts index 1e7c550..7ae3d5f 100644 --- a/src/integration/Graph/fraud_protection.d.ts +++ b/src/integration/Graph/fraud_protection.d.ts @@ -1,17 +1,17 @@ -import type { FxPaymentMethodSets } from './payment_method_sets'; -import type { FxStore } from './store'; +import type { PaymentMethodSets } from './payment_method_sets'; +import type { Store } from './store'; import type { Graph } from '../../core'; -export interface FxFraudProtection extends Graph { +export interface FraudProtection extends Graph { curie: 'fx:fraud_protection'; links: { /** This resource. */ - 'self': FxFraudProtection; + 'self': FraudProtection; /** Store this fraud protection policy was set on. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Payment method sets these fraud protection measures are enabled on. */ - 'fx:payment_method_sets': FxPaymentMethodSets; + 'fx:payment_method_sets': PaymentMethodSets; }; props: { diff --git a/src/integration/Graph/fraud_protections.d.ts b/src/integration/Graph/fraud_protections.d.ts index 9495d23..4b1e615 100644 --- a/src/integration/Graph/fraud_protections.d.ts +++ b/src/integration/Graph/fraud_protections.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxFraudProtection } from './fraud_protection'; +import type { FraudProtection } from './fraud_protection'; import type { Graph } from '../../core'; -export interface FxFraudProtections extends Graph { +export interface FraudProtections extends Graph { curie: 'fx:fraud_protections'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxFraudProtection; + child: FraudProtection; } diff --git a/src/integration/Graph/generate_codes.d.ts b/src/integration/Graph/generate_codes.d.ts index 7621cf7..cf9de7f 100644 --- a/src/integration/Graph/generate_codes.d.ts +++ b/src/integration/Graph/generate_codes.d.ts @@ -1,6 +1,6 @@ import type { Graph } from '../../core'; -export interface FxGenerateCodes extends Graph { +export interface GenerateCodes extends Graph { curie: 'fx:generate_codes'; props: { diff --git a/src/integration/Graph/hosted_payment_gateway.d.ts b/src/integration/Graph/hosted_payment_gateway.d.ts index 94c408b..67756c1 100644 --- a/src/integration/Graph/hosted_payment_gateway.d.ts +++ b/src/integration/Graph/hosted_payment_gateway.d.ts @@ -1,8 +1,8 @@ -import { FxPaymentGateway } from './payment_gateway'; +import { PaymentGateway } from './payment_gateway'; import type { Graph } from '../../core'; -export interface FxHostedPaymentGateway extends Graph { +export interface HostedPaymentGateway extends Graph { curie: 'fx:hosted_payment_gateway'; - links: FxPaymentGateway['links']; - props: FxPaymentGateway['props']; + links: PaymentGateway['links']; + props: PaymentGateway['props']; } diff --git a/src/integration/Graph/hosted_payment_gateways.d.ts b/src/integration/Graph/hosted_payment_gateways.d.ts index 9f83d7f..7c3237e 100644 --- a/src/integration/Graph/hosted_payment_gateways.d.ts +++ b/src/integration/Graph/hosted_payment_gateways.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxHostedPaymentGateway } from './hosted_payment_gateway'; +import type { HostedPaymentGateway } from './hosted_payment_gateway'; import type { Graph } from '../../core'; -export interface FxHostedPaymentGateways extends Graph { +export interface HostedPaymentGateways extends Graph { curie: 'fx:hosted_payment_gateways'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxHostedPaymentGateway; + child: HostedPaymentGateway; } diff --git a/src/integration/Graph/index.d.ts b/src/integration/Graph/index.d.ts index 874260a..89563ec 100644 --- a/src/integration/Graph/index.d.ts +++ b/src/integration/Graph/index.d.ts @@ -1,30 +1,30 @@ import type * as Core from '../../core'; -import type { FxEncode } from './encode'; -import type { FxPropertyHelpers } from './property_helpers'; -import type { FxReporting } from './reporting'; -import type { FxStore } from './store'; -import type { FxStores } from './stores'; -import type { FxToken } from './token'; -import type { FxUser } from './user'; +import type { Encode } from './encode'; +import type { PropertyHelpers } from './property_helpers'; +import type { Reporting } from './reporting'; +import type { Store } from './store'; +import type { Stores } from './stores'; +import type { Token } from './token'; +import type { User } from './user'; export interface Graph extends Core.Graph { links: { /** Your API starting point. */ 'self': Graph; /** Various helpers used for determing valid property values. */ - 'fx:property_helpers': FxPropertyHelpers; + 'fx:property_helpers': PropertyHelpers; /** Reporting API home. */ - 'fx:reporting': FxReporting; + 'fx:reporting': Reporting; /** POST here to encode a body of html for use with our HMAC cart encryption. */ - 'fx:encode': FxEncode; + 'fx:encode': Encode; /** Your stores. */ - 'fx:stores': FxStores; + 'fx:stores': Stores; /** The current store for your authentication token. */ - 'fx:store': FxStore; + 'fx:store': Store; /** The OAuth endpoint for obtaining a new access_token using an existing refresh_token. POST `www-form-url-encoded` data as follows: `grant_type=refresh_token&refresh_token={refresh_token}&client_id={client_id}&client_secret={client_secret}`. */ - 'fx:token': FxToken; + 'fx:token': Token; /** Your API home page. */ - 'fx:user': FxUser; + 'fx:user': User; }; props: { diff --git a/src/integration/Graph/integration.d.ts b/src/integration/Graph/integration.d.ts index e1b1468..6314074 100644 --- a/src/integration/Graph/integration.d.ts +++ b/src/integration/Graph/integration.d.ts @@ -1,20 +1,20 @@ -import type { FxClient } from './client'; -import type { FxStore } from './store'; -import type { FxUser } from './user'; +import type { Client } from './client'; +import type { Store } from './store'; +import type { User } from './user'; import type { Graph } from '../../core'; -export interface FxIntegration extends Graph { +export interface Integration extends Graph { curie: 'fx:integration'; links: { /** This resource. */ - 'self': FxIntegration; + 'self': Integration; /** Admin user who created this integration. */ - 'fx:user': FxUser; + 'fx:user': User; /** Store this integration is assigned to. */ - 'fx:store': FxStore; + 'fx:store': Store; /** API client details. */ - 'fx:client': FxClient; + 'fx:client': Client; }; props: { diff --git a/src/integration/Graph/item.d.ts b/src/integration/Graph/item.d.ts index 1137637..f7d8f9b 100644 --- a/src/integration/Graph/item.d.ts +++ b/src/integration/Graph/item.d.ts @@ -1,35 +1,35 @@ -import type { FxAttributes } from './attributes'; -import type { FxCouponDetails } from './coupon_details'; -import type { FxDiscountDetails } from './discount_details'; -import type { FxItemCategory } from './item_category'; -import type { FxItemOptions } from './item_options'; -import type { FxShipment } from './shipment'; -import type { FxStore } from './store'; -import type { FxTransaction } from './transaction'; +import type { Attributes } from './attributes'; +import type { CouponDetails } from './coupon_details'; +import type { DiscountDetails } from './discount_details'; +import type { ItemCategory } from './item_category'; +import type { ItemOptions } from './item_options'; +import type { Shipment } from './shipment'; +import type { Store } from './store'; +import type { Transaction } from './transaction'; import type { Graph } from '../../core'; -export interface FxItem extends Graph { +export interface Item extends Graph { curie: 'fx:item'; links: { /** This resource. */ - 'self': FxItem; + 'self': Item; /** Store this item belongs to. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Related shipment info. */ - 'fx:shipment': FxShipment; + 'fx:shipment': Shipment; /** Custom attributes linked to this item. */ - 'fx:attributes': FxAttributes; + 'fx:attributes': Attributes; /** Related transaction info. */ - 'fx:transaction': FxTransaction; + 'fx:transaction': Transaction; /** Various custom options for this item. */ - 'fx:item_options': FxItemOptions; + 'fx:item_options': ItemOptions; /** Category this item belongs in. */ - 'fx:item_category': FxItemCategory; + 'fx:item_category': ItemCategory; /** Details about coupons linked to this item. */ - 'fx:coupon_details': FxCouponDetails; + 'fx:coupon_details': CouponDetails; /** Details about discounts linked to this item. */ - 'fx:discount_details': FxDiscountDetails; + 'fx:discount_details': DiscountDetails; }; props: { @@ -88,9 +88,9 @@ export interface FxItem extends Graph { }; zooms: { - discount_details?: FxDiscountDetails; - coupon_details?: FxCouponDetails; - item_category?: FxItemCategory; - item_options?: FxItemOptions; + discount_details?: DiscountDetails; + coupon_details?: CouponDetails; + item_category?: ItemCategory; + item_options?: ItemOptions; }; } diff --git a/src/integration/Graph/item_categories.d.ts b/src/integration/Graph/item_categories.d.ts index 63c0df8..8bfcd2f 100644 --- a/src/integration/Graph/item_categories.d.ts +++ b/src/integration/Graph/item_categories.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxItemCategory } from './item_category'; +import type { ItemCategory } from './item_category'; import type { Graph } from '../../core'; -export interface FxItemCategories extends Graph { +export interface ItemCategories extends Graph { curie: 'fx:item_categories'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxItemCategory; + child: ItemCategory; } diff --git a/src/integration/Graph/item_category.d.ts b/src/integration/Graph/item_category.d.ts index b80bc1e..53e1ec0 100644 --- a/src/integration/Graph/item_category.d.ts +++ b/src/integration/Graph/item_category.d.ts @@ -1,20 +1,20 @@ -import type { FxEmailTemplates } from './email_templates'; -import type { FxStore } from './store'; -import type { FxTaxItemCategories } from './tax_item_categories'; +import type { EmailTemplates } from './email_templates'; +import type { Store } from './store'; +import type { TaxItemCategories } from './tax_item_categories'; import type { Graph } from '../../core'; -export interface FxItemCategory extends Graph { +export interface ItemCategory extends Graph { curie: 'fx:item_category'; links: { /** This resource. */ - 'self': FxItemCategory; + 'self': ItemCategory; /** Store this category is registered in. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Email templates for the store. */ - 'fx:email_templates': FxEmailTemplates; + 'fx:email_templates': EmailTemplates; /** Related tax item categories. */ - 'fx:tax_item_categories': FxTaxItemCategories; + 'fx:tax_item_categories': TaxItemCategories; }; props: { diff --git a/src/integration/Graph/item_option.d.ts b/src/integration/Graph/item_option.d.ts index 4fadc69..51b4310 100644 --- a/src/integration/Graph/item_option.d.ts +++ b/src/integration/Graph/item_option.d.ts @@ -1,20 +1,20 @@ -import type { FxItem } from './item'; -import type { FxStore } from './store'; -import type { FxTransaction } from './transaction'; +import type { Item } from './item'; +import type { Store } from './store'; +import type { Transaction } from './transaction'; import type { Graph } from '../../core'; -export interface FxItemOption extends Graph { +export interface ItemOption extends Graph { curie: 'fx:item_option'; links: { /** This resource. */ - 'self': FxItemOption; + 'self': ItemOption; /** Item this option is attached to. */ - 'fx:item': FxItem; + 'fx:item': Item; /** Store the item belongs to. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Related transaction resource. */ - 'fx:transaction': FxTransaction; + 'fx:transaction': Transaction; }; props: { diff --git a/src/integration/Graph/item_options.d.ts b/src/integration/Graph/item_options.d.ts index e9d0ff3..00e1fc4 100644 --- a/src/integration/Graph/item_options.d.ts +++ b/src/integration/Graph/item_options.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxItemOption } from './item_option'; +import type { ItemOption } from './item_option'; import type { Graph } from '../../core'; -export interface FxItemOptions extends Graph { +export interface ItemOptions extends Graph { curie: 'fx:item_options'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxItemOption; + child: ItemOption; } diff --git a/src/integration/Graph/items.d.ts b/src/integration/Graph/items.d.ts index 114a8ef..1869228 100644 --- a/src/integration/Graph/items.d.ts +++ b/src/integration/Graph/items.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxItem } from './item'; +import type { Item } from './item'; import type { Graph } from '../../core'; -export interface FxItems extends Graph { +export interface Items extends Graph { curie: 'fx:items'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxItem; + child: Item; } diff --git a/src/integration/Graph/language_override.d.ts b/src/integration/Graph/language_override.d.ts index efb69ba..b921012 100644 --- a/src/integration/Graph/language_override.d.ts +++ b/src/integration/Graph/language_override.d.ts @@ -1,20 +1,20 @@ -import type { FxLanguageOverrides } from './language_overrides'; -import type { FxStore } from './store'; -import type { FxTemplateSet } from './template_set'; +import type { LanguageOverrides } from './language_overrides'; +import type { Store } from './store'; +import type { TemplateSet } from './template_set'; import type { Graph } from '../../core'; -export interface FxLanguageOverride extends Graph { +export interface LanguageOverride extends Graph { curie: 'fx:language_override'; links: { /** This resource. */ - 'self': FxLanguageOverride; + 'self': LanguageOverride; /** Store this language override is registered in. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Template set this language override belongs to. */ - 'fx:template_set': FxTemplateSet; + 'fx:template_set': TemplateSet; /** List of all language overrides in the template set. */ - 'fx:language_overrides': FxLanguageOverrides; + 'fx:language_overrides': LanguageOverrides; }; props: { diff --git a/src/integration/Graph/language_overrides.d.ts b/src/integration/Graph/language_overrides.d.ts index 6c6064e..888dc20 100644 --- a/src/integration/Graph/language_overrides.d.ts +++ b/src/integration/Graph/language_overrides.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxLanguageOverride } from './language_override'; +import type { LanguageOverride } from './language_override'; import type { Graph } from '../../core'; -export interface FxLanguageOverrides extends Graph { +export interface LanguageOverrides extends Graph { curie: 'fx:language_overrides'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxLanguageOverride; + child: LanguageOverride; } diff --git a/src/integration/Graph/language_strings.d.ts b/src/integration/Graph/language_strings.d.ts index f026ef0..cb82599 100644 --- a/src/integration/Graph/language_strings.d.ts +++ b/src/integration/Graph/language_strings.d.ts @@ -1,18 +1,18 @@ -import type { FxPropertyHelpers } from './property_helpers'; +import type { PropertyHelpers } from './property_helpers'; import type { Graph } from '../../core'; interface StringRecord { [key: string]: StringRecord; } -export interface FxLanguageStrings extends Graph { +export interface LanguageStrings extends Graph { curie: 'fx:language_strings'; links: { /** This resource. */ - 'self': FxLanguageStrings; + 'self': LanguageStrings; /** Various predefined property values. */ - 'fx:property_helpers': FxPropertyHelpers; + 'fx:property_helpers': PropertyHelpers; }; props: { diff --git a/src/integration/Graph/languages.d.ts b/src/integration/Graph/languages.d.ts index c5e229f..08fa400 100644 --- a/src/integration/Graph/languages.d.ts +++ b/src/integration/Graph/languages.d.ts @@ -1,14 +1,14 @@ -import type { FxPropertyHelpers } from './property_helpers'; +import type { PropertyHelpers } from './property_helpers'; import type { Graph } from '../../core'; -export interface FxLanguages extends Graph { +export interface Languages extends Graph { curie: 'fx:languages'; links: { /** This resource. */ - 'self': FxLanguages; + 'self': Languages; /** Various predefined property values. */ - 'fx:property_helpers': FxPropertyHelpers; + 'fx:property_helpers': PropertyHelpers; }; props: { diff --git a/src/integration/Graph/last_transaction.d.ts b/src/integration/Graph/last_transaction.d.ts index 5c760ee..06d9369 100644 --- a/src/integration/Graph/last_transaction.d.ts +++ b/src/integration/Graph/last_transaction.d.ts @@ -1,9 +1,9 @@ -import type { FxTransaction } from './transaction'; +import type { Transaction } from './transaction'; import type { Graph } from '../../core'; -export interface FxLastTransaction extends Graph { +export interface LastTransaction extends Graph { curie: 'fx:last_transaction'; - links: FxTransaction['links']; - props: FxTransaction['props']; - zooms: FxTransaction['zooms']; + links: Transaction['links']; + props: Transaction['props']; + zooms: Transaction['zooms']; } diff --git a/src/integration/Graph/locale_codes.d.ts b/src/integration/Graph/locale_codes.d.ts index a785b1e..49989ac 100644 --- a/src/integration/Graph/locale_codes.d.ts +++ b/src/integration/Graph/locale_codes.d.ts @@ -1,14 +1,14 @@ -import type { FxPropertyHelpers } from './property_helpers'; +import type { PropertyHelpers } from './property_helpers'; import type { Graph } from '../../core'; -export interface FxLocaleCodes extends Graph { +export interface LocaleCodes extends Graph { curie: 'fx:locale_codes'; links: { /** This resource. */ - 'self': FxLocaleCodes; + 'self': LocaleCodes; /** Various predefined property values. */ - 'fx:property_helpers': FxPropertyHelpers; + 'fx:property_helpers': PropertyHelpers; }; props: { diff --git a/src/integration/Graph/native_integration.d.ts b/src/integration/Graph/native_integration.d.ts index f761728..173385b 100644 --- a/src/integration/Graph/native_integration.d.ts +++ b/src/integration/Graph/native_integration.d.ts @@ -1,14 +1,14 @@ -import type { FxStore } from './store'; +import type { Store } from './store'; import type { Graph } from '../../core'; -export interface FxNativeIntegration extends Graph { +export interface NativeIntegration extends Graph { curie: 'fx:native_integration'; links: { /** This resource. */ - 'self': FxNativeIntegration; + 'self': NativeIntegration; /** Store this native integration is enabled on. */ - 'fx:store': FxStore; + 'fx:store': Store; }; props: { diff --git a/src/integration/Graph/native_integrations.d.ts b/src/integration/Graph/native_integrations.d.ts index 385bca7..a17fc8b 100644 --- a/src/integration/Graph/native_integrations.d.ts +++ b/src/integration/Graph/native_integrations.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxNativeIntegration } from './native_integration'; +import type { NativeIntegration } from './native_integration'; import type { Graph } from '../../core'; -export interface FxNativeIntegrations extends Graph { +export interface NativeIntegrations extends Graph { curie: 'fx:native_integrations'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxNativeIntegration; + child: NativeIntegration; } diff --git a/src/integration/Graph/original_transaction.d.ts b/src/integration/Graph/original_transaction.d.ts index a380a18..bc36c84 100644 --- a/src/integration/Graph/original_transaction.d.ts +++ b/src/integration/Graph/original_transaction.d.ts @@ -1,9 +1,9 @@ -import type { FxTransaction } from './transaction'; +import type { Transaction } from './transaction'; import type { Graph } from '../../core'; -export interface FxOriginalTransaction extends Graph { +export interface OriginalTransaction extends Graph { curie: 'fx:original_transaction'; - links: FxTransaction['links']; - props: FxTransaction['props']; - zooms: FxTransaction['zooms']; + links: Transaction['links']; + props: Transaction['props']; + zooms: Transaction['zooms']; } diff --git a/src/integration/Graph/payment.d.ts b/src/integration/Graph/payment.d.ts index 80467d6..6a634f4 100644 --- a/src/integration/Graph/payment.d.ts +++ b/src/integration/Graph/payment.d.ts @@ -1,17 +1,17 @@ -import type { FxStore } from './store'; -import type { FxTransaction } from './transaction'; +import type { Store } from './store'; +import type { Transaction } from './transaction'; import type { Graph } from '../../core'; -export interface FxPayment extends Graph { +export interface Payment extends Graph { curie: 'fx:payment'; links: { /** This resource. */ - 'self': FxPayment; + 'self': Payment; /** Store that received this payment. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Related transaction resource. */ - 'fx:transaction': FxTransaction; + 'fx:transaction': Transaction; }; props: { diff --git a/src/integration/Graph/payment_gateway.d.ts b/src/integration/Graph/payment_gateway.d.ts index 2633a27..38a05c0 100644 --- a/src/integration/Graph/payment_gateway.d.ts +++ b/src/integration/Graph/payment_gateway.d.ts @@ -1,17 +1,17 @@ -import type { FxPaymentMethodSets } from './payment_method_sets'; -import type { FxStore } from './store'; +import type { PaymentMethodSets } from './payment_method_sets'; +import type { Store } from './store'; import type { Graph } from '../../core'; -export interface FxPaymentGateway extends Graph { +export interface PaymentGateway extends Graph { curie: 'fx:payment_gateway'; links: { /** This resource. */ - 'self': FxPaymentGateway; + 'self': PaymentGateway; /** Store using this gateway. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Payment method sets using this gateway. */ - 'fx:payment_method_sets': FxPaymentMethodSets; + 'fx:payment_method_sets': PaymentMethodSets; }; props: { diff --git a/src/integration/Graph/payment_gateways.d.ts b/src/integration/Graph/payment_gateways.d.ts index 3df2fe1..74a5060 100644 --- a/src/integration/Graph/payment_gateways.d.ts +++ b/src/integration/Graph/payment_gateways.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxPaymentGateway } from './payment_gateway'; +import type { PaymentGateway } from './payment_gateway'; import type { Graph } from '../../core'; -export interface FxPaymentGateways extends Graph { +export interface PaymentGateways extends Graph { curie: 'fx:payment_gateways'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxPaymentGateway; + child: PaymentGateway; } diff --git a/src/integration/Graph/payment_method_expiring.d.ts b/src/integration/Graph/payment_method_expiring.d.ts index 7f5f5d7..2853152 100644 --- a/src/integration/Graph/payment_method_expiring.d.ts +++ b/src/integration/Graph/payment_method_expiring.d.ts @@ -1,26 +1,26 @@ -import type { FxCustomer } from './customer'; -import type { FxDefaultBillingAddress } from './default_billing_address'; -import type { FxDefaultPaymentMethod } from './default_payment_method'; -import type { FxStore } from './store'; -import type { FxSubscriptions } from './subscriptions'; +import type { Customer } from './customer'; +import type { DefaultBillingAddress } from './default_billing_address'; +import type { DefaultPaymentMethod } from './default_payment_method'; +import type { Store } from './store'; +import type { Subscriptions } from './subscriptions'; import type { Graph } from '../../core'; -export interface FxPaymentMethodExpiring extends Graph { +export interface PaymentMethodExpiring extends Graph { curie: 'fx:payment_method_expiring'; links: { /** This resource. */ - 'self': FxPaymentMethodExpiring; + 'self': PaymentMethodExpiring; /** Related store resource. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Customer who this payment method belongs to. */ - 'fx:customer': FxCustomer; + 'fx:customer': Customer; /** List of customer's subscriptions. */ - 'fx:subscriptions': FxSubscriptions; + 'fx:subscriptions': Subscriptions; /** Customer's default payment method. */ - 'fx:default_payment_method': FxDefaultPaymentMethod; + 'fx:default_payment_method': DefaultPaymentMethod; /** Customer's default billing address. */ - 'fx:default_billing_address': FxDefaultBillingAddress; + 'fx:default_billing_address': DefaultBillingAddress; }; props: { diff --git a/src/integration/Graph/payment_method_set.d.ts b/src/integration/Graph/payment_method_set.d.ts index 163227a..ca6bef0 100644 --- a/src/integration/Graph/payment_method_set.d.ts +++ b/src/integration/Graph/payment_method_set.d.ts @@ -1,26 +1,26 @@ -import type { FxPaymentGateway } from './payment_gateway'; -import type { FxPaymentMethodSetFraudProtections } from './payment_method_set_fraud_protections'; -import type { FxPaymentMethodSetHostedPaymentGateways } from './payment_method_set_hosted_payment_gateways'; -import type { FxPaymentMethodSets } from './payment_method_sets'; -import type { FxStore } from './store'; +import type { PaymentGateway } from './payment_gateway'; +import type { PaymentMethodSetFraudProtections } from './payment_method_set_fraud_protections'; +import type { PaymentMethodSetHostedPaymentGateways } from './payment_method_set_hosted_payment_gateways'; +import type { PaymentMethodSets } from './payment_method_sets'; +import type { Store } from './store'; import type { Graph } from '../../core'; -export interface FxPaymentMethodSet extends Graph { +export interface PaymentMethodSet extends Graph { curie: 'fx:payment_method_set'; links: { /** This resource. */ - 'self': FxPaymentMethodSet; + 'self': PaymentMethodSet; /** Store this payment method set belongs to. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Payment gateway for this payment method set. */ - 'fx:payment_gateway': FxPaymentGateway; + 'fx:payment_gateway': PaymentGateway; /** List of payment method sets for the store. */ - 'fx:payment_method_sets': FxPaymentMethodSets; + 'fx:payment_method_sets': PaymentMethodSets; /** Payment method set and fraud protection relationships. */ - 'fx:payment_method_set_fraud_protections': FxPaymentMethodSetFraudProtections; + 'fx:payment_method_set_fraud_protections': PaymentMethodSetFraudProtections; /** Payment method set and hosted payment gateways relationships. */ - 'fx:payment_method_set_hosted_payment_gateways': FxPaymentMethodSetHostedPaymentGateways; + 'fx:payment_method_set_hosted_payment_gateways': PaymentMethodSetHostedPaymentGateways; }; props: { diff --git a/src/integration/Graph/payment_method_set_fraud_protection.d.ts b/src/integration/Graph/payment_method_set_fraud_protection.d.ts index 551b138..3a549d4 100644 --- a/src/integration/Graph/payment_method_set_fraud_protection.d.ts +++ b/src/integration/Graph/payment_method_set_fraud_protection.d.ts @@ -1,20 +1,20 @@ -import type { FxFraudProtection } from './fraud_protection'; -import type { FxPaymentMethodSet } from './payment_method_set'; -import type { FxStore } from './store'; +import type { FraudProtection } from './fraud_protection'; +import type { PaymentMethodSet } from './payment_method_set'; +import type { Store } from './store'; import type { Graph } from '../../core'; -export interface FxPaymentMethodSetFraudProtection extends Graph { +export interface PaymentMethodSetFraudProtection extends Graph { curie: 'fx:payment_method_set_fraud_protection'; links: { /** This resource. */ - 'self': FxPaymentMethodSetFraudProtection; + 'self': PaymentMethodSetFraudProtection; /** Store this configuration belongs to. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Fraud protection configuration. */ - 'fx:fraud_protection': FxFraudProtection; + 'fx:fraud_protection': FraudProtection; /** Payment method set configuration. */ - 'fx:payment_method_set': FxPaymentMethodSet; + 'fx:payment_method_set': PaymentMethodSet; }; props: { diff --git a/src/integration/Graph/payment_method_set_fraud_protections.d.ts b/src/integration/Graph/payment_method_set_fraud_protections.d.ts index 01c320a..ca4d6ea 100644 --- a/src/integration/Graph/payment_method_set_fraud_protections.d.ts +++ b/src/integration/Graph/payment_method_set_fraud_protections.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxPaymentMethodSetFraudProtection } from './payment_method_set_fraud_protection'; +import type { PaymentMethodSetFraudProtection } from './payment_method_set_fraud_protection'; import type { Graph } from '../../core'; -export interface FxPaymentMethodSetFraudProtections extends Graph { +export interface PaymentMethodSetFraudProtections extends Graph { curie: 'fx:payment_method_set_fraud_protections'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxPaymentMethodSetFraudProtection; + child: PaymentMethodSetFraudProtection; } diff --git a/src/integration/Graph/payment_method_set_hosted_payment_gateway.d.ts b/src/integration/Graph/payment_method_set_hosted_payment_gateway.d.ts index cbe298e..2bd70c0 100644 --- a/src/integration/Graph/payment_method_set_hosted_payment_gateway.d.ts +++ b/src/integration/Graph/payment_method_set_hosted_payment_gateway.d.ts @@ -1,20 +1,20 @@ -import type { FxHostedPaymentGateway } from './hosted_payment_gateway'; -import type { FxPaymentMethodSet } from './payment_method_set'; -import type { FxStore } from './store'; +import type { HostedPaymentGateway } from './hosted_payment_gateway'; +import type { PaymentMethodSet } from './payment_method_set'; +import type { Store } from './store'; import type { Graph } from '../../core'; -export interface FxPaymentMethodSetHostedPaymentGateway extends Graph { +export interface PaymentMethodSetHostedPaymentGateway extends Graph { curie: 'fx:payment_method_set_hosted_payment_gateway'; links: { /** This resource. */ - 'self': FxPaymentMethodSetHostedPaymentGateway; + 'self': PaymentMethodSetHostedPaymentGateway; /** Related store resource. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Linked payment method set. */ - 'fx:payment_method_set': FxPaymentMethodSet; + 'fx:payment_method_set': PaymentMethodSet; /** Linked hosted payment gateway. */ - 'fx:hosted_payment_gateway': FxHostedPaymentGateway; + 'fx:hosted_payment_gateway': HostedPaymentGateway; }; props: { diff --git a/src/integration/Graph/payment_method_set_hosted_payment_gateways.d.ts b/src/integration/Graph/payment_method_set_hosted_payment_gateways.d.ts index 1f9b9d7..de71ace 100644 --- a/src/integration/Graph/payment_method_set_hosted_payment_gateways.d.ts +++ b/src/integration/Graph/payment_method_set_hosted_payment_gateways.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxPaymentMethodSetHostedPaymentGateway } from './payment_method_set_hosted_payment_gateway'; +import type { PaymentMethodSetHostedPaymentGateway } from './payment_method_set_hosted_payment_gateway'; import type { Graph } from '../../core'; -export interface FxPaymentMethodSetHostedPaymentGateways extends Graph { +export interface PaymentMethodSetHostedPaymentGateways extends Graph { curie: 'fx:payment_method_set_hosted_payment_gateways'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxPaymentMethodSetHostedPaymentGateway; + child: PaymentMethodSetHostedPaymentGateway; } diff --git a/src/integration/Graph/payment_method_sets.d.ts b/src/integration/Graph/payment_method_sets.d.ts index 4ec785b..531494d 100644 --- a/src/integration/Graph/payment_method_sets.d.ts +++ b/src/integration/Graph/payment_method_sets.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxPaymentMethodSet } from './payment_method_set'; +import type { PaymentMethodSet } from './payment_method_set'; import type { Graph } from '../../core'; -export interface FxPaymentMethodSets extends Graph { +export interface PaymentMethodSets extends Graph { curie: 'fx:payment_method_sets'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxPaymentMethodSet; + child: PaymentMethodSet; } diff --git a/src/integration/Graph/payments.d.ts b/src/integration/Graph/payments.d.ts index b4b46cd..49a7b9b 100644 --- a/src/integration/Graph/payments.d.ts +++ b/src/integration/Graph/payments.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxPayment } from './payment'; +import type { Payment } from './payment'; import type { Graph } from '../../core'; -export interface FxPayments extends Graph { +export interface Payments extends Graph { curie: 'fx:payments'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxPayment; + child: Payment; } diff --git a/src/integration/Graph/process_subscription_webhook.d.ts b/src/integration/Graph/process_subscription_webhook.d.ts index d54b7c5..809a8b6 100644 --- a/src/integration/Graph/process_subscription_webhook.d.ts +++ b/src/integration/Graph/process_subscription_webhook.d.ts @@ -1,5 +1,5 @@ import type { Graph } from '../../core'; -export interface FxProcessSubscriptionWebhook extends Graph { +export interface ProcessSubscriptionWebhook extends Graph { curie: 'fx:process_subscription_webhook'; } diff --git a/src/integration/Graph/process_webhook.d.ts b/src/integration/Graph/process_webhook.d.ts index 39940a4..b3e4696 100644 --- a/src/integration/Graph/process_webhook.d.ts +++ b/src/integration/Graph/process_webhook.d.ts @@ -1,5 +1,5 @@ import type { Graph } from '../../core'; -export interface FxProcessWebhook extends Graph { +export interface ProcessWebhook extends Graph { curie: 'fx:process_webhook'; } diff --git a/src/integration/Graph/property_helpers.d.ts b/src/integration/Graph/property_helpers.d.ts index f1853d3..9cb1924 100644 --- a/src/integration/Graph/property_helpers.d.ts +++ b/src/integration/Graph/property_helpers.d.ts @@ -1,53 +1,53 @@ -import type { FxCheckoutTypes } from './checkout_types'; -import type { FxCountries } from './countries'; -import type { FxCustomerPasswordHashTypes } from './customer_password_hash_types'; -import type { FxDefaultTemplates } from './default_templates'; -import type { FxHostedPaymentGateways } from './hosted_payment_gateways'; -import type { FxLanguageStrings } from './language_strings'; -import type { FxLanguages } from './languages'; -import type { FxLocaleCodes } from './locale_codes'; -import type { FxPaymentGateways } from './payment_gateways'; -import type { FxRegions } from './regions'; -import type { FxShippingAddressTypes } from './shipping_address_types'; -import type { FxShippingMethods } from './shipping_methods'; -import type { FxStoreVersions } from './store_versions'; -import type { FxTimezones } from './timezones'; +import type { CheckoutTypes } from './checkout_types'; +import type { Countries } from './countries'; +import type { CustomerPasswordHashTypes } from './customer_password_hash_types'; +import type { DefaultTemplates } from './default_templates'; +import type { HostedPaymentGateways } from './hosted_payment_gateways'; +import type { LanguageStrings } from './language_strings'; +import type { Languages } from './languages'; +import type { LocaleCodes } from './locale_codes'; +import type { PaymentGateways } from './payment_gateways'; +import type { Regions } from './regions'; +import type { ShippingAddressTypes } from './shipping_address_types'; +import type { ShippingMethods } from './shipping_methods'; +import type { StoreVersions } from './store_versions'; +import type { Timezones } from './timezones'; import type { Graph } from '../../core'; -export interface FxPropertyHelpers extends Graph { +export interface PropertyHelpers extends Graph { curie: 'fx:property_helpers'; links: { /** This resource. */ - 'self': FxPropertyHelpers; + 'self': PropertyHelpers; /** List of valid region values. It defaults to US states, but you can fetch other country states using `?country_code=`. */ - 'fx:regions': FxRegions; + 'fx:regions': Regions; /** List of valid timezones for the store's `timezone` setting. */ - 'fx:timezones': FxTimezones; + 'fx:timezones': Timezones; /** List of valid country values for any country setting such as the store's `store_country`. */ - 'fx:countries': FxCountries; + 'fx:countries': Countries; /** List of valid language values for the store's `language` setting. */ - 'fx:languages': FxLanguages; + 'fx:languages': Languages; /** List of all supported locales. */ - 'fx:locale_codes': FxLocaleCodes; + 'fx:locale_codes': LocaleCodes; /** Store versions available along with their changelog details. */ - 'fx:store_versions': FxStoreVersions; + 'fx:store_versions': StoreVersions; /** List of valid checkout type values for the store's `checkout_type` setting. */ - 'fx:checkout_types': FxCheckoutTypes; + 'fx:checkout_types': CheckoutTypes; /** The shipping carriers used when configuring live shipping rates. */ - 'fx:shipping_methods': FxShippingMethods; + 'fx:shipping_methods': ShippingMethods; /** List of supported payment gateways and valid entries for that resource's `type` setting. */ - 'fx:payment_gateways': FxPaymentGateways; + 'fx:payment_gateways': PaymentGateways; /** List of default language strings that can be overriden. */ - 'fx:language_strings': FxLanguageStrings; + 'fx:language_strings': LanguageStrings; /** Default templates for the cart, checkout, receipt and email. */ - 'fx:default_templates': FxDefaultTemplates; + 'fx:default_templates': DefaultTemplates; /** List of valid address type values for the store's `shipping_address_type` setting. */ - 'fx:shipping_address_types': FxShippingAddressTypes; + 'fx:shipping_address_types': ShippingAddressTypes; /** Hosted payment gateways such as PayPal, BitPay, and Dwolla. */ - 'fx:hosted_payment_gateways': FxHostedPaymentGateways; + 'fx:hosted_payment_gateways': HostedPaymentGateways; /** List of valid customer password hash type values for the store's `customer_password_hash_type` setting. */ - 'fx:customer_password_hash_types': FxCustomerPasswordHashTypes; + 'fx:customer_password_hash_types': CustomerPasswordHashTypes; }; props: { diff --git a/src/integration/Graph/receipt.d.ts b/src/integration/Graph/receipt.d.ts index e211c32..ad46fba 100644 --- a/src/integration/Graph/receipt.d.ts +++ b/src/integration/Graph/receipt.d.ts @@ -1,5 +1,5 @@ import type { Graph } from '../../core'; -export interface FxReceipt extends Graph { +export interface Receipt extends Graph { curie: 'fx:receipt'; } diff --git a/src/integration/Graph/receipt_template.d.ts b/src/integration/Graph/receipt_template.d.ts index 0985f92..8c75bda 100644 --- a/src/integration/Graph/receipt_template.d.ts +++ b/src/integration/Graph/receipt_template.d.ts @@ -1,23 +1,23 @@ -import type { FxCache } from './cache'; -import type { FxEncode } from './encode'; -import type { FxStore } from './store'; -import type { FxTemplateSets } from './template_sets'; +import type { Cache } from './cache'; +import type { Encode } from './encode'; +import type { Store } from './store'; +import type { TemplateSets } from './template_sets'; import type { Graph } from '../../core'; -export interface FxReceiptTemplate extends Graph { +export interface ReceiptTemplate extends Graph { curie: 'fx:receipt_template'; links: { /** This resource. */ - 'self': FxReceiptTemplate; + 'self': ReceiptTemplate; /** Related store resource. */ - 'fx:store': FxStore; + 'fx:store': Store; /** POST here to cache your template using the `content_url`. */ - 'fx:cache': FxCache; + 'fx:cache': Cache; /** POST here to encode a body of html for use with our HMAC cart encryption. */ - 'fx:encode': FxEncode; + 'fx:encode': Encode; /** Template sets using this template. */ - 'fx:template_sets': FxTemplateSets; + 'fx:template_sets': TemplateSets; }; props: { diff --git a/src/integration/Graph/receipt_templates.d.ts b/src/integration/Graph/receipt_templates.d.ts index a125dd9..a113154 100644 --- a/src/integration/Graph/receipt_templates.d.ts +++ b/src/integration/Graph/receipt_templates.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxReceiptTemplate } from './receipt_template'; +import type { ReceiptTemplate } from './receipt_template'; import type { Graph } from '../../core'; -export interface FxReceiptTemplates extends Graph { +export interface ReceiptTemplates extends Graph { curie: 'fx:receipt_templates'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxReceiptTemplate; + child: ReceiptTemplate; } diff --git a/src/integration/Graph/refund.d.ts b/src/integration/Graph/refund.d.ts index cc37ec7..d9b86a0 100644 --- a/src/integration/Graph/refund.d.ts +++ b/src/integration/Graph/refund.d.ts @@ -1,5 +1,5 @@ import type { Graph } from '../../core'; -export interface FxRefund extends Graph { +export interface Refund extends Graph { curie: 'fx:refund'; } diff --git a/src/integration/Graph/regions.d.ts b/src/integration/Graph/regions.d.ts index bd1545f..75212eb 100644 --- a/src/integration/Graph/regions.d.ts +++ b/src/integration/Graph/regions.d.ts @@ -1,14 +1,14 @@ -import type { FxPropertyHelpers } from './property_helpers'; +import type { PropertyHelpers } from './property_helpers'; import type { Graph } from '../../core'; -export interface FxRegions extends Graph { +export interface Regions extends Graph { curie: 'fx:regions'; links: { /** This resource. */ - 'self': FxRegions; + 'self': Regions; /** Various predefined property values. */ - 'fx:property_helpers': FxPropertyHelpers; + 'fx:property_helpers': PropertyHelpers; }; props: { diff --git a/src/integration/Graph/reporting.d.ts b/src/integration/Graph/reporting.d.ts index ea66deb..beb1536 100644 --- a/src/integration/Graph/reporting.d.ts +++ b/src/integration/Graph/reporting.d.ts @@ -1,17 +1,17 @@ -import type { FxReportingEmailExists } from './reporting_email_exists'; -import type { FxReportingStoreDomainExists } from './reporting_store_domain_exists'; +import type { ReportingEmailExists } from './reporting_email_exists'; +import type { ReportingStoreDomainExists } from './reporting_store_domain_exists'; import type { Graph } from '../../core'; -export interface FxReporting extends Graph { +export interface Reporting extends Graph { curie: 'fx:reporting'; links: { /** This resource. */ - 'self': FxReporting; + 'self': Reporting; /** Send a GET with an `email` query parameter to see if an existing user exists for this email value. */ - 'fx:reporting_email_exists': FxReportingEmailExists; + 'fx:reporting_email_exists': ReportingEmailExists; /** Send a GET with a `store_domain` query parameter to see if an existing store exists for this `store_domain` value. */ - 'fx:reporting_store_domain_exists': FxReportingStoreDomainExists; + 'fx:reporting_store_domain_exists': ReportingStoreDomainExists; }; props: { diff --git a/src/integration/Graph/reporting_email_exists.d.ts b/src/integration/Graph/reporting_email_exists.d.ts index 2ae44aa..e0759da 100644 --- a/src/integration/Graph/reporting_email_exists.d.ts +++ b/src/integration/Graph/reporting_email_exists.d.ts @@ -1,17 +1,17 @@ -import type { FxReporting } from './reporting'; -import type { FxUser } from './user'; +import type { Reporting } from './reporting'; +import type { User } from './user'; import type { Graph } from '../../core'; -export interface FxReportingEmailExists extends Graph { +export interface ReportingEmailExists extends Graph { curie: 'fx:reporting_email_exists'; links: { /** This resource. */ - 'self': FxReportingEmailExists; + 'self': ReportingEmailExists; /** Link to user resource for the requested email. */ - 'fx:user': FxUser; + 'fx:user': User; /** Reporting API home. */ - 'fx:reporting': FxReporting; + 'fx:reporting': Reporting; }; props: { diff --git a/src/integration/Graph/reporting_store_domain_exists.d.ts b/src/integration/Graph/reporting_store_domain_exists.d.ts index 7a23b68..58d2f59 100644 --- a/src/integration/Graph/reporting_store_domain_exists.d.ts +++ b/src/integration/Graph/reporting_store_domain_exists.d.ts @@ -1,17 +1,17 @@ -import type { FxReporting } from './reporting'; -import type { FxStore } from './store'; +import type { Reporting } from './reporting'; +import type { Store } from './store'; import type { Graph } from '../../core'; -export interface FxReportingStoreDomainExists extends Graph { +export interface ReportingStoreDomainExists extends Graph { curie: 'fx:reporting_store_domain_exists'; links: { /** This resource. */ - 'self': FxReportingStoreDomainExists; + 'self': ReportingStoreDomainExists; /** Link to store for the requested domain. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Reporting API home. */ - 'fx:reporting': FxReporting; + 'fx:reporting': Reporting; }; props: { diff --git a/src/integration/Graph/send_emails.d.ts b/src/integration/Graph/send_emails.d.ts index 84f7ea2..f3eba92 100644 --- a/src/integration/Graph/send_emails.d.ts +++ b/src/integration/Graph/send_emails.d.ts @@ -1,5 +1,5 @@ import type { Graph } from '../../core'; -export interface FxSendEmails extends Graph { +export interface SendEmails extends Graph { curie: 'fx:send_emails'; } diff --git a/src/integration/Graph/shipment.d.ts b/src/integration/Graph/shipment.d.ts index 6a1f82b..dd9bd64 100644 --- a/src/integration/Graph/shipment.d.ts +++ b/src/integration/Graph/shipment.d.ts @@ -1,29 +1,29 @@ -import type { FxCustomer } from './customer'; -import type { FxCustomerAddress } from './customer_address'; -import type { FxItems } from './items'; -import type { FxShipments } from './shipments'; -import type { FxStore } from './store'; -import type { FxTransaction } from './transaction'; +import type { Customer } from './customer'; +import type { CustomerAddress } from './customer_address'; +import type { Items } from './items'; +import type { Shipments } from './shipments'; +import type { Store } from './store'; +import type { Transaction } from './transaction'; import type { Graph } from '../../core'; -export interface FxShipment extends Graph { +export interface Shipment extends Graph { curie: 'fx:shipment'; links: { /** This resource. */ - 'self': FxShipment; + 'self': Shipment; /** Related store resource. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Items in this shipment. */ - 'fx:items': FxItems; + 'fx:items': Items; /** Customer who this shipment is intented for. */ - 'fx:customer': FxCustomer; + 'fx:customer': Customer; /** List of all shipments in the transaction. */ - 'fx:shipments': FxShipments; + 'fx:shipments': Shipments; /** Related transaction resource. */ - 'fx:transaction': FxTransaction; + 'fx:transaction': Transaction; /** Customer's address. */ - 'fx:customer_address': FxCustomerAddress; + 'fx:customer_address': CustomerAddress; }; props: { diff --git a/src/integration/Graph/shipments.d.ts b/src/integration/Graph/shipments.d.ts index 2c9d676..bf31610 100644 --- a/src/integration/Graph/shipments.d.ts +++ b/src/integration/Graph/shipments.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxShipment } from './shipment'; +import type { Shipment } from './shipment'; import type { Graph } from '../../core'; -export interface FxShipments extends Graph { +export interface Shipments extends Graph { curie: 'fx:shipments'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxShipment; + child: Shipment; } diff --git a/src/integration/Graph/shipping_address_types.d.ts b/src/integration/Graph/shipping_address_types.d.ts index aae9b4a..d119858 100644 --- a/src/integration/Graph/shipping_address_types.d.ts +++ b/src/integration/Graph/shipping_address_types.d.ts @@ -1,14 +1,14 @@ -import type { FxPropertyHelpers } from './property_helpers'; +import type { PropertyHelpers } from './property_helpers'; import type { Graph } from '../../core'; -export interface FxShippingAddressTypes extends Graph { +export interface ShippingAddressTypes extends Graph { curie: 'fx:shipping_address_types'; links: { /** This resource. */ - 'self': FxShippingAddressTypes; + 'self': ShippingAddressTypes; /** Various predefined property values. */ - 'fx:property_helpers': FxPropertyHelpers; + 'fx:property_helpers': PropertyHelpers; }; props: { diff --git a/src/integration/Graph/shipping_container.d.ts b/src/integration/Graph/shipping_container.d.ts index 2779063..84df8b5 100644 --- a/src/integration/Graph/shipping_container.d.ts +++ b/src/integration/Graph/shipping_container.d.ts @@ -1,23 +1,23 @@ -import type { FxPropertyHelpers } from './property_helpers'; -import type { FxShippingContainers } from './shipping_containers'; -import type { FxShippingMethod } from './shipping_method'; -import type { FxShippingMethods } from './shipping_methods'; +import type { PropertyHelpers } from './property_helpers'; +import type { ShippingContainers } from './shipping_containers'; +import type { ShippingMethod } from './shipping_method'; +import type { ShippingMethods } from './shipping_methods'; import type { Graph } from '../../core'; -export interface FxShippingContainer extends Graph { +export interface ShippingContainer extends Graph { curie: 'fx:shipping_container'; links: { /** This resource. */ - 'self': FxShippingContainer; + 'self': ShippingContainer; /** Shipping method that will be used to deliver this container. */ - 'fx:shipping_method': FxShippingMethod; + 'fx:shipping_method': ShippingMethod; /** List of all available shipping methods. */ - 'fx:shipping_methods': FxShippingMethods; + 'fx:shipping_methods': ShippingMethods; /** Various predefined property values. */ - 'fx:property_helpers': FxPropertyHelpers; + 'fx:property_helpers': PropertyHelpers; /** List of all shipping containers for the shipping method. */ - 'fx:shipping_containers': FxShippingContainers; + 'fx:shipping_containers': ShippingContainers; }; props: { diff --git a/src/integration/Graph/shipping_containers.d.ts b/src/integration/Graph/shipping_containers.d.ts index 0e82a10..db85907 100644 --- a/src/integration/Graph/shipping_containers.d.ts +++ b/src/integration/Graph/shipping_containers.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxShippingContainer } from './shipping_container'; +import type { ShippingContainer } from './shipping_container'; import type { Graph } from '../../core'; -export interface FxShippingContainers extends Graph { +export interface ShippingContainers extends Graph { curie: 'fx:shipping_containers'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxShippingContainer; + child: ShippingContainer; } diff --git a/src/integration/Graph/shipping_drop_type.d.ts b/src/integration/Graph/shipping_drop_type.d.ts index a1b7094..fad88b6 100644 --- a/src/integration/Graph/shipping_drop_type.d.ts +++ b/src/integration/Graph/shipping_drop_type.d.ts @@ -1,23 +1,23 @@ -import type { FxPropertyHelpers } from './property_helpers'; -import type { FxShippingDropTypes } from './shipping_drop_types'; -import type { FxShippingMethod } from './shipping_method'; -import type { FxShippingMethods } from './shipping_methods'; +import type { PropertyHelpers } from './property_helpers'; +import type { ShippingDropTypes } from './shipping_drop_types'; +import type { ShippingMethod } from './shipping_method'; +import type { ShippingMethods } from './shipping_methods'; import type { Graph } from '../../core'; -export interface FxShippingDropType extends Graph { +export interface ShippingDropType extends Graph { curie: 'fx:shipping_drop_type'; links: { /** This resource. */ - 'self': FxShippingDropType; + 'self': ShippingDropType; /** Shipping method that will be used to deliver this container. */ - 'fx:shipping_method': FxShippingMethod; + 'fx:shipping_method': ShippingMethod; /** List of all available shipping methods. */ - 'fx:shipping_methods': FxShippingMethods; + 'fx:shipping_methods': ShippingMethods; /** Various predefined property values. */ - 'fx:property_helpers': FxPropertyHelpers; + 'fx:property_helpers': PropertyHelpers; /** List of all drop types for the shipping method. */ - 'fx:shipping_drop_types': FxShippingDropTypes; + 'fx:shipping_drop_types': ShippingDropTypes; }; props: { diff --git a/src/integration/Graph/shipping_drop_types.d.ts b/src/integration/Graph/shipping_drop_types.d.ts index 0fbd0ba..bfa867f 100644 --- a/src/integration/Graph/shipping_drop_types.d.ts +++ b/src/integration/Graph/shipping_drop_types.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxShippingDropType } from './shipping_drop_type'; +import type { ShippingDropType } from './shipping_drop_type'; import type { Graph } from '../../core'; -export interface FxShippingDropTypes extends Graph { +export interface ShippingDropTypes extends Graph { curie: 'fx:shipping_drop_types'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxShippingDropType; + child: ShippingDropType; } diff --git a/src/integration/Graph/shipping_method.d.ts b/src/integration/Graph/shipping_method.d.ts index 5e0ab13..2ff247a 100644 --- a/src/integration/Graph/shipping_method.d.ts +++ b/src/integration/Graph/shipping_method.d.ts @@ -1,26 +1,26 @@ -import type { FxPropertyHelpers } from './property_helpers'; -import type { FxShippingContainers } from './shipping_containers'; -import type { FxShippingDropTypes } from './shipping_drop_types'; -import type { FxShippingMethods } from './shipping_methods'; -import type { FxShippingServices } from './shipping_services'; +import type { PropertyHelpers } from './property_helpers'; +import type { ShippingContainers } from './shipping_containers'; +import type { ShippingDropTypes } from './shipping_drop_types'; +import type { ShippingMethods } from './shipping_methods'; +import type { ShippingServices } from './shipping_services'; import type { Graph } from '../../core'; -export interface FxShippingMethod extends Graph { +export interface ShippingMethod extends Graph { curie: 'fx:shipping_method'; links: { /** This resource. */ - 'self': FxShippingMethod; + 'self': ShippingMethod; /** List of all available shipping methods. */ - 'fx:shipping_methods': FxShippingMethods; + 'fx:shipping_methods': ShippingMethods; /** Various predefined property values. */ - 'fx:property_helpers': FxPropertyHelpers; + 'fx:property_helpers': PropertyHelpers; /** List of available shipping services for this shipping method. */ - 'fx:shipping_services': FxShippingServices; + 'fx:shipping_services': ShippingServices; /** List of available shipping containers for this shipping method. */ - 'fx:shipping_containers': FxShippingContainers; + 'fx:shipping_containers': ShippingContainers; /** List of available shipping drop types for this shipping method. */ - 'fx:shipping_drop_types': FxShippingDropTypes; + 'fx:shipping_drop_types': ShippingDropTypes; }; props: { diff --git a/src/integration/Graph/shipping_methods.d.ts b/src/integration/Graph/shipping_methods.d.ts index 59876e5..4af75d4 100644 --- a/src/integration/Graph/shipping_methods.d.ts +++ b/src/integration/Graph/shipping_methods.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxShippingMethod } from './shipping_method'; +import type { ShippingMethod } from './shipping_method'; import type { Graph } from '../../core'; -export interface FxShippingMethods extends Graph { +export interface ShippingMethods extends Graph { curie: 'fx:shipping_methods'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxShippingMethod; + child: ShippingMethod; } diff --git a/src/integration/Graph/shipping_service.d.ts b/src/integration/Graph/shipping_service.d.ts index 6723057..87189f5 100644 --- a/src/integration/Graph/shipping_service.d.ts +++ b/src/integration/Graph/shipping_service.d.ts @@ -1,20 +1,20 @@ -import type { FxPropertyHelpers } from './property_helpers'; -import type { FxShippingMethod } from './shipping_method'; -import type { FxShippingMethods } from './shipping_methods'; +import type { PropertyHelpers } from './property_helpers'; +import type { ShippingMethod } from './shipping_method'; +import type { ShippingMethods } from './shipping_methods'; import type { Graph } from '../../core'; -export interface FxShippingService extends Graph { +export interface ShippingService extends Graph { curie: 'fx:shipping_service'; links: { /** This resource. */ - 'self': FxShippingService; + 'self': ShippingService; /** Shipping method associated with this shipping service. */ - 'fx:shipping_method': FxShippingMethod; + 'fx:shipping_method': ShippingMethod; /** List of all available shipping methods. */ - 'fx:shipping_methods': FxShippingMethods; + 'fx:shipping_methods': ShippingMethods; /** Various predefined property values. */ - 'fx:property_helpers': FxPropertyHelpers; + 'fx:property_helpers': PropertyHelpers; }; props: { diff --git a/src/integration/Graph/shipping_services.d.ts b/src/integration/Graph/shipping_services.d.ts index a749807..f95fb18 100644 --- a/src/integration/Graph/shipping_services.d.ts +++ b/src/integration/Graph/shipping_services.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxShippingService } from './shipping_service'; +import type { ShippingService } from './shipping_service'; import type { Graph } from '../../core'; -export interface FxShippingServices extends Graph { +export interface ShippingServices extends Graph { curie: 'fx:shipping_services'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxShippingService; + child: ShippingService; } diff --git a/src/integration/Graph/store.d.ts b/src/integration/Graph/store.d.ts index 59dcb58..c1e1ad2 100644 --- a/src/integration/Graph/store.d.ts +++ b/src/integration/Graph/store.d.ts @@ -1,86 +1,86 @@ -import type { FxAttributes } from './attributes'; -import type { FxCartIncludeTemplates } from './cart_include_templates'; -import type { FxCartTemplates } from './cart_templates'; -import type { FxCarts } from './carts'; -import type { FxCheckoutTemplates } from './checkout_templates'; -import type { FxCoupons } from './coupons'; -import type { FxCustomerPortalSettings } from './customer_portal_settings'; -import type { FxCustomers } from './customers'; -import type { FxDownloadables } from './downloadables'; -import type { FxEmailTemplates } from './email_templates'; -import type { FxErrorEntries } from './error_entries'; -import type { FxFraudProtections } from './fraud_protections'; -import type { FxHostedPaymentGateways } from './hosted_payment_gateways'; -import type { FxItemCategories } from './item_categories'; -import type { FxPaymentMethodSets } from './payment_method_sets'; -import type { FxProcessSubscriptionWebhook } from './process_subscription_webhook'; -import type { FxReceiptTemplates } from './receipt_templates'; -import type { FxStoreVersion } from './store_version'; -import type { FxSubscriptionSettings } from './subscription_settings'; -import type { FxSubscriptions } from './subscriptions'; -import type { FxTaxes } from './taxes'; -import type { FxTemplateSets } from './template_sets'; -import type { FxTransactions } from './transactions'; -import type { FxUserAccesses } from './user_accesses'; -import type { FxUsers } from './users'; +import type { Attributes } from './attributes'; +import type { CartIncludeTemplates } from './cart_include_templates'; +import type { CartTemplates } from './cart_templates'; +import type { Carts } from './carts'; +import type { CheckoutTemplates } from './checkout_templates'; +import type { Coupons } from './coupons'; +import type { CustomerPortalSettings } from './customer_portal_settings'; +import type { Customers } from './customers'; +import type { Downloadables } from './downloadables'; +import type { EmailTemplates } from './email_templates'; +import type { ErrorEntries } from './error_entries'; +import type { FraudProtections } from './fraud_protections'; +import type { HostedPaymentGateways } from './hosted_payment_gateways'; +import type { ItemCategories } from './item_categories'; +import type { PaymentMethodSets } from './payment_method_sets'; +import type { ProcessSubscriptionWebhook } from './process_subscription_webhook'; +import type { ReceiptTemplates } from './receipt_templates'; +import type { StoreVersion } from './store_version'; +import type { SubscriptionSettings } from './subscription_settings'; +import type { Subscriptions } from './subscriptions'; +import type { Taxes } from './taxes'; +import type { TemplateSets } from './template_sets'; +import type { Transactions } from './transactions'; +import type { UserAccesses } from './user_accesses'; +import type { Users } from './users'; import type { Graph } from '../../core'; -export interface FxStore extends Graph { +export interface Store extends Graph { curie: 'fx:store'; links: { /** This resource. */ - 'self': FxStore; + 'self': Store; /** List of carts in this store. */ - 'fx:carts': FxCarts; + 'fx:carts': Carts; /** List of users with access to this store. */ - 'fx:users': FxUsers; + 'fx:users': Users; /** List of taxes configured for this store. */ - 'fx:taxes': FxTaxes; + 'fx:taxes': Taxes; /** List of coupons available in this store. */ - 'fx:coupons': FxCoupons; + 'fx:coupons': Coupons; /** List of customers of this store. */ - 'fx:customers': FxCustomers; + 'fx:customers': Customers; /** List of custom attributes of this store. */ - 'fx:attributes': FxAttributes; + 'fx:attributes': Attributes; /** List of transactions performed in this store. */ - 'fx:transactions': FxTransactions; + 'fx:transactions': Transactions; /** List of template sets configured for this store. */ - 'fx:template_sets': FxTemplateSets; + 'fx:template_sets': TemplateSets; /** Version of this store. */ - 'fx:store_version': FxStoreVersion; + 'fx:store_version': StoreVersion; /** List of user access resources for this store. */ - 'fx:user_accesses': FxUserAccesses; + 'fx:user_accesses': UserAccesses; /** List of subscriptions created in this store. */ - 'fx:subscriptions': FxSubscriptions; + 'fx:subscriptions': Subscriptions; /** List of error entries for this store. */ - 'fx:error_entries': FxErrorEntries; + 'fx:error_entries': ErrorEntries; /** List of downloadable products available in this store. */ - 'fx:downloadables': FxDownloadables; + 'fx:downloadables': Downloadables; /** List of cart templates available in this store. */ - 'fx:cart_templates': FxCartTemplates; + 'fx:cart_templates': CartTemplates; /** List of email templates for this store. */ - 'fx:email_templates': FxEmailTemplates; + 'fx:email_templates': EmailTemplates; /** List of item categories configured in this store. */ - 'fx:item_categories': FxItemCategories; + 'fx:item_categories': ItemCategories; /** List of fraud protection measures enabled on this store. */ - 'fx:fraud_protections': FxFraudProtections; + 'fx:fraud_protections': FraudProtections; /** List of receipt templates for this store. */ - 'fx:receipt_templates': FxReceiptTemplates; + 'fx:receipt_templates': ReceiptTemplates; /** List of checkout templates for this store. */ - 'fx:checkout_templates': FxCheckoutTemplates; + 'fx:checkout_templates': CheckoutTemplates; /** List of payment method sets configured for this store. */ - 'fx:payment_method_sets': FxPaymentMethodSets; + 'fx:payment_method_sets': PaymentMethodSets; /** Subscription settings for this store. */ - 'fx:subscription_settings': FxSubscriptionSettings; + 'fx:subscription_settings': SubscriptionSettings; /** List of cart include templates available in this store. */ - 'fx:cart_include_templates': FxCartIncludeTemplates; + 'fx:cart_include_templates': CartIncludeTemplates; /** List of hosted payment gateways enabled for this store. */ - 'fx:hosted_payment_gateways': FxHostedPaymentGateways; + 'fx:hosted_payment_gateways': HostedPaymentGateways; /** Configuration of this store's customer portal. */ - 'fx:customer_portal_settings': FxCustomerPortalSettings; + 'fx:customer_portal_settings': CustomerPortalSettings; /** POST here to resend the daily subscription webhook notification for this store. */ - 'fx:process_subscription_webhook': FxProcessSubscriptionWebhook; + 'fx:process_subscription_webhook': ProcessSubscriptionWebhook; }; props: { diff --git a/src/integration/Graph/store_shipping_method.d.ts b/src/integration/Graph/store_shipping_method.d.ts index 9d6f603..8a8a710 100644 --- a/src/integration/Graph/store_shipping_method.d.ts +++ b/src/integration/Graph/store_shipping_method.d.ts @@ -1,38 +1,38 @@ -import type { FxShippingContainer } from './shipping_container'; -import type { FxShippingContainers } from './shipping_containers'; -import type { FxShippingDropType } from './shipping_drop_type'; -import type { FxShippingDropTypes } from './shipping_drop_types'; -import type { FxShippingMethod } from './shipping_method'; -import type { FxShippingMethods } from './shipping_methods'; -import type { FxShippingServices } from './shipping_services'; -import type { FxStore } from './store'; -import type { FxStoreShippingServices } from './store_shipping_services'; +import type { ShippingContainer } from './shipping_container'; +import type { ShippingContainers } from './shipping_containers'; +import type { ShippingDropType } from './shipping_drop_type'; +import type { ShippingDropTypes } from './shipping_drop_types'; +import type { ShippingMethod } from './shipping_method'; +import type { ShippingMethods } from './shipping_methods'; +import type { ShippingServices } from './shipping_services'; +import type { Store } from './store'; +import type { StoreShippingServices } from './store_shipping_services'; import type { Graph } from '../../core'; -export interface FxStoreShippingMethod extends Graph { +export interface StoreShippingMethod extends Graph { curie: 'fx:store_shipping_method'; links: { /** This resource. */ - 'self': FxStoreShippingMethod; + 'self': StoreShippingMethod; /** Related store resource. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Related shipping method resource. */ - 'fx:shipping_method': FxShippingMethod; + 'fx:shipping_method': ShippingMethod; /** List of all available shipping methods. */ - 'fx:shipping_methods': FxShippingMethods; + 'fx:shipping_methods': ShippingMethods; /** List of all available shipping services. */ - 'fx:shipping_services': FxShippingServices; + 'fx:shipping_services': ShippingServices; /** Shipping container linked to this shipping method. */ - 'fx:shipping_container': FxShippingContainer; + 'fx:shipping_container': ShippingContainer; /** Shipping drop type linked to this shipping method. */ - 'fx:shipping_drop_type': FxShippingDropType; + 'fx:shipping_drop_type': ShippingDropType; /** List of all available shipping containers for this shipping method. */ - 'fx:shipping_containers': FxShippingContainers; + 'fx:shipping_containers': ShippingContainers; /** List of all available shipping drop types for this shipping method. */ - 'fx:shipping_drop_types': FxShippingDropTypes; + 'fx:shipping_drop_types': ShippingDropTypes; /** Available shipping services for this shipping method. */ - 'fx:store_shipping_services': FxStoreShippingServices; + 'fx:store_shipping_services': StoreShippingServices; }; props: { @@ -65,9 +65,9 @@ export interface FxStoreShippingMethod extends Graph { }; zooms: { - store_shipping_services: FxStoreShippingServices; - shipping_container: FxShippingContainer; - shipping_drop_type: FxShippingDropType; - shipping_method: FxShippingMethod; + store_shipping_services: StoreShippingServices; + shipping_container: ShippingContainer; + shipping_drop_type: ShippingDropType; + shipping_method: ShippingMethod; }; } diff --git a/src/integration/Graph/store_shipping_service.d.ts b/src/integration/Graph/store_shipping_service.d.ts index 23f99ba..9395964 100644 --- a/src/integration/Graph/store_shipping_service.d.ts +++ b/src/integration/Graph/store_shipping_service.d.ts @@ -1,26 +1,26 @@ -import type { FxShippingMethod } from './shipping_method'; -import type { FxShippingMethods } from './shipping_methods'; -import type { FxShippingService } from './shipping_service'; -import type { FxShippingServices } from './shipping_services'; -import type { FxStore } from './store'; +import type { ShippingMethod } from './shipping_method'; +import type { ShippingMethods } from './shipping_methods'; +import type { ShippingService } from './shipping_service'; +import type { ShippingServices } from './shipping_services'; +import type { Store } from './store'; import type { Graph } from '../../core'; -export interface FxStoreShippingService extends Graph { +export interface StoreShippingService extends Graph { curie: 'fx:store_shipping_service'; links: { /** This resource. */ - 'self': FxStoreShippingService; + 'self': StoreShippingService; /** Related store resource. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Shipping method linked to this shipping service. */ - 'fx:shipping_method': FxShippingMethod; + 'fx:shipping_method': ShippingMethod; /** Related shipping service. */ - 'fx:shipping_service': FxShippingService; + 'fx:shipping_service': ShippingService; /** List of all available shipping methods. */ - 'fx:shipping_methods': FxShippingMethods; + 'fx:shipping_methods': ShippingMethods; /** List of all available shipping services for this shipping method. */ - 'fx:shipping_services': FxShippingServices; + 'fx:shipping_services': ShippingServices; }; props: { diff --git a/src/integration/Graph/store_shipping_services.d.ts b/src/integration/Graph/store_shipping_services.d.ts index 983f326..3fb820c 100644 --- a/src/integration/Graph/store_shipping_services.d.ts +++ b/src/integration/Graph/store_shipping_services.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxStoreShippingService } from './store_shipping_service'; +import type { StoreShippingService } from './store_shipping_service'; import type { Graph } from '../../core'; -export interface FxStoreShippingServices extends Graph { +export interface StoreShippingServices extends Graph { curie: 'fx:store_shipping_services'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxStoreShippingService; + child: StoreShippingService; } diff --git a/src/integration/Graph/store_version.d.ts b/src/integration/Graph/store_version.d.ts index 54f777d..efe94a7 100644 --- a/src/integration/Graph/store_version.d.ts +++ b/src/integration/Graph/store_version.d.ts @@ -1,17 +1,17 @@ -import type { FxPropertyHelpers } from './property_helpers'; -import type { FxStoreVersions } from './store_versions'; +import type { PropertyHelpers } from './property_helpers'; +import type { StoreVersions } from './store_versions'; import type { Graph } from '../../core'; -export interface FxStoreVersion extends Graph { +export interface StoreVersion extends Graph { curie: 'fx:store_version'; links: { /** This resource. */ - 'self': FxStoreVersion; + 'self': StoreVersion; /** List of all available store versions. */ - 'fx:store_versions': FxStoreVersions; + 'fx:store_versions': StoreVersions; /** Various predefined property values. */ - 'fx:property_helpers': FxPropertyHelpers; + 'fx:property_helpers': PropertyHelpers; }; props: { diff --git a/src/integration/Graph/store_versions.d.ts b/src/integration/Graph/store_versions.d.ts index 084383c..a6da0a4 100644 --- a/src/integration/Graph/store_versions.d.ts +++ b/src/integration/Graph/store_versions.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxStoreVersion } from './store_version'; +import type { StoreVersion } from './store_version'; import type { Graph } from '../../core'; -export interface FxStoreVersions extends Graph { +export interface StoreVersions extends Graph { curie: 'fx:store_versions'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxStoreVersion; + child: StoreVersion; } diff --git a/src/integration/Graph/stores.d.ts b/src/integration/Graph/stores.d.ts index 3453799..a45b588 100644 --- a/src/integration/Graph/stores.d.ts +++ b/src/integration/Graph/stores.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxStore } from './store'; +import type { Store } from './store'; import type { Graph } from '../../core'; -export interface FxStores extends Graph { +export interface Stores extends Graph { curie: 'fx:stores'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxStore; + child: Store; } diff --git a/src/integration/Graph/sub_token_url.d.ts b/src/integration/Graph/sub_token_url.d.ts index 011a704..24cd844 100644 --- a/src/integration/Graph/sub_token_url.d.ts +++ b/src/integration/Graph/sub_token_url.d.ts @@ -1,5 +1,5 @@ import type { Graph } from '../../core'; -export interface FxSubTokenUrl extends Graph { +export interface SubTokenUrl extends Graph { curie: 'fx:sub_token_url'; } diff --git a/src/integration/Graph/subscription.d.ts b/src/integration/Graph/subscription.d.ts index 34775c6..2961e54 100644 --- a/src/integration/Graph/subscription.d.ts +++ b/src/integration/Graph/subscription.d.ts @@ -1,33 +1,33 @@ -import type { FxAttributes } from './attributes'; -import type { FxCustomer } from './customer'; -import type { FxLastTransaction } from './last_transaction'; -import type { FxOriginalTransaction } from './original_transaction'; -import type { FxStore } from './store'; -import type { FxSubTokenUrl } from './sub_token_url'; -import type { FxTransactionTemplate } from './transaction_template'; -import type { FxTransactions } from './transactions'; +import type { Attributes } from './attributes'; +import type { Customer } from './customer'; +import type { LastTransaction } from './last_transaction'; +import type { OriginalTransaction } from './original_transaction'; +import type { Store } from './store'; +import type { SubTokenUrl } from './sub_token_url'; +import type { TransactionTemplate } from './transaction_template'; +import type { Transactions } from './transactions'; import type { Graph } from '../../core'; -export interface FxSubscription extends Graph { +export interface Subscription extends Graph { curie: 'fx:subscription'; links: { /** This resource. */ - 'self': FxSubscription; + 'self': Subscription; /** List of attributes for this subscription. */ - 'fx:attributes': FxAttributes; + 'fx:attributes': Attributes; /** Related store resource. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Customer who created this subscription. */ - 'fx:customer': FxCustomer; + 'fx:customer': Customer; /** Last transaction for this subscription. */ - 'fx:last_transaction': FxLastTransaction; + 'fx:last_transaction': LastTransaction; /** List of transactions for this subscription. */ - 'fx:transactions': FxTransactions; + 'fx:transactions': Transactions; /** Transaction template for this subscription. */ - 'fx:transaction_template': FxTransactionTemplate; + 'fx:transaction_template': TransactionTemplate; /** Open this link in browser to load up the subscription template into a full HTML cart for the store. */ - 'fx:sub_token_url': FxSubTokenUrl; + 'fx:sub_token_url': SubTokenUrl; }; props: { @@ -56,11 +56,11 @@ export interface FxSubscription extends Graph { }; zooms: { - original_transaction?: FxOriginalTransaction; - transaction_template?: FxTransactionTemplate; - last_transaction?: FxLastTransaction; - transactions?: FxTransactions; - attributes: FxAttributes; - customer?: FxCustomer; + original_transaction?: OriginalTransaction; + transaction_template?: TransactionTemplate; + last_transaction?: LastTransaction; + transactions?: Transactions; + attributes: Attributes; + customer?: Customer; }; } diff --git a/src/integration/Graph/subscription_settings.d.ts b/src/integration/Graph/subscription_settings.d.ts index 10a9be3..fefdc22 100644 --- a/src/integration/Graph/subscription_settings.d.ts +++ b/src/integration/Graph/subscription_settings.d.ts @@ -1,14 +1,14 @@ -import type { FxStore } from './store'; +import type { Store } from './store'; import type { Graph } from '../../core'; -export interface FxSubscriptionSettings extends Graph { +export interface SubscriptionSettings extends Graph { curie: 'fx:subscription_settings'; links: { /** This resource. */ - 'self': FxSubscriptionSettings; + 'self': SubscriptionSettings; /** Related store resource. */ - 'fx:store': FxStore; + 'fx:store': Store; }; props: { diff --git a/src/integration/Graph/subscriptions.d.ts b/src/integration/Graph/subscriptions.d.ts index a160ac3..ec0fbad 100644 --- a/src/integration/Graph/subscriptions.d.ts +++ b/src/integration/Graph/subscriptions.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxSubscription } from './subscription'; +import type { Subscription } from './subscription'; import type { Graph } from '../../core'; -export interface FxSubscriptions extends Graph { +export interface Subscriptions extends Graph { curie: 'fx:subscriptions'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxSubscription; + child: Subscription; } diff --git a/src/integration/Graph/tax.d.ts b/src/integration/Graph/tax.d.ts index 8948791..9686b50 100644 --- a/src/integration/Graph/tax.d.ts +++ b/src/integration/Graph/tax.d.ts @@ -1,20 +1,20 @@ -import type { FxNativeIntegrations } from './native_integrations'; -import type { FxStore } from './store'; -import type { FxTaxItemCategories } from './tax_item_categories'; +import type { NativeIntegrations } from './native_integrations'; +import type { Store } from './store'; +import type { TaxItemCategories } from './tax_item_categories'; import type { Graph } from '../../core'; -export interface FxTax extends Graph { +export interface Tax extends Graph { curie: 'fx:tax'; links: { /** This resource. */ - 'self': FxTax; + 'self': Tax; /** Related store resource. */ - 'fx:store': FxStore; + 'fx:store': Store; /** List of tax item category relationships. */ - 'fx:tax_item_categories': FxTaxItemCategories; + 'fx:tax_item_categories': TaxItemCategories; /** List of native integrations for this service provider. */ - 'fx:native_integrations': FxNativeIntegrations; + 'fx:native_integrations': NativeIntegrations; }; props: { diff --git a/src/integration/Graph/tax_item_categories.d.ts b/src/integration/Graph/tax_item_categories.d.ts index 95b8bd3..13e702c 100644 --- a/src/integration/Graph/tax_item_categories.d.ts +++ b/src/integration/Graph/tax_item_categories.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxTaxItemCategory } from './tax_item_category'; +import type { TaxItemCategory } from './tax_item_category'; import type { Graph } from '../../core'; -export interface FxTaxItemCategories extends Graph { +export interface TaxItemCategories extends Graph { curie: 'fx:tax_item_categories'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxTaxItemCategory; + child: TaxItemCategory; } diff --git a/src/integration/Graph/tax_item_category.d.ts b/src/integration/Graph/tax_item_category.d.ts index 0f9a381..7255bc2 100644 --- a/src/integration/Graph/tax_item_category.d.ts +++ b/src/integration/Graph/tax_item_category.d.ts @@ -1,20 +1,20 @@ -import type { FxItemCategory } from './item_category'; -import type { FxStore } from './store'; -import type { FxTax } from './tax'; +import type { ItemCategory } from './item_category'; +import type { Store } from './store'; +import type { Tax } from './tax'; import type { Graph } from '../../core'; -export interface FxTaxItemCategory extends Graph { +export interface TaxItemCategory extends Graph { curie: 'fx:tax_item_category'; links: { /** This resource. */ - 'self': FxTaxItemCategory; + 'self': TaxItemCategory; /** Related tax resource. */ - 'fx:tax': FxTax; + 'fx:tax': Tax; /** Related store resource. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Related item category resource. */ - 'fx:item_category': FxItemCategory; + 'fx:item_category': ItemCategory; }; props: { diff --git a/src/integration/Graph/taxes.d.ts b/src/integration/Graph/taxes.d.ts index 7411624..68cc204 100644 --- a/src/integration/Graph/taxes.d.ts +++ b/src/integration/Graph/taxes.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxTax } from './tax'; +import type { Tax } from './tax'; import type { Graph } from '../../core'; -export interface FxTaxes extends Graph { +export interface Taxes extends Graph { curie: 'fx:taxes'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxTax; + child: Tax; } diff --git a/src/integration/Graph/template_config.d.ts b/src/integration/Graph/template_config.d.ts index 34a5987..d8bcf4d 100644 --- a/src/integration/Graph/template_config.d.ts +++ b/src/integration/Graph/template_config.d.ts @@ -1,17 +1,17 @@ -import type { FxStore } from './store'; -import type { FxTemplateSets } from './template_sets'; +import type { Store } from './store'; +import type { TemplateSets } from './template_sets'; import type { Graph } from '../../core'; -export interface FxTemplateConfig extends Graph { +export interface TemplateConfig extends Graph { curie: 'fx:template_config'; links: { /** This resource. */ - 'self': FxTemplateConfig; + 'self': TemplateConfig; /** Related store resource. */ - 'fx:store': FxStore; + 'fx:store': Store; /** List of template sets using this template config. */ - 'fx:template_sets': FxTemplateSets; + 'fx:template_sets': TemplateSets; }; props: { diff --git a/src/integration/Graph/template_set.d.ts b/src/integration/Graph/template_set.d.ts index 3c7f054..395c2c1 100644 --- a/src/integration/Graph/template_set.d.ts +++ b/src/integration/Graph/template_set.d.ts @@ -1,32 +1,32 @@ -import type { FxCartIncludeTemplate } from './cart_include_template'; -import type { FxCartTemplate } from './cart_template'; -import type { FxCheckoutTemplate } from './checkout_template'; -import type { FxEmailTemplate } from './email_template'; -import type { FxLanguageOverrides } from './language_overrides'; -import type { FxReceiptTemplate } from './receipt_template'; -import type { FxStore } from './store'; +import type { CartIncludeTemplate } from './cart_include_template'; +import type { CartTemplate } from './cart_template'; +import type { CheckoutTemplate } from './checkout_template'; +import type { EmailTemplate } from './email_template'; +import type { LanguageOverrides } from './language_overrides'; +import type { ReceiptTemplate } from './receipt_template'; +import type { Store } from './store'; import type { Graph } from '../../core'; -export interface FxTemplateSet extends Graph { +export interface TemplateSet extends Graph { curie: 'fx:template_set'; links: { /** This resource. */ - 'self': FxTemplateSet; + 'self': TemplateSet; /** Related store resource. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Cart template for this template set. */ - 'fx:cart_template': FxCartTemplate; + 'fx:cart_template': CartTemplate; /** Email template for this template set. */ - 'fx:email_template': FxEmailTemplate; + 'fx:email_template': EmailTemplate; /** Receipt template for this template set. */ - 'fx:receipt_template': FxReceiptTemplate; + 'fx:receipt_template': ReceiptTemplate; /** Checkout template for this template set. */ - 'fx:checkout_template': FxCheckoutTemplate; + 'fx:checkout_template': CheckoutTemplate; /** Language overrides for this template set. */ - 'fx:language_overrides': FxLanguageOverrides; + 'fx:language_overrides': LanguageOverrides; /** Cart include template for this template set. */ - 'fx:cart_include_template': FxCartIncludeTemplate; + 'fx:cart_include_template': CartIncludeTemplate; }; props: { @@ -59,10 +59,10 @@ export interface FxTemplateSet extends Graph { }; zooms: { - cart_include_template?: FxCartIncludeTemplate; - checkout_template?: FxCheckoutTemplate; - receipt_template?: FxReceiptTemplate; - email_template?: FxEmailTemplate; - cart_template?: FxCartTemplate; + cart_include_template?: CartIncludeTemplate; + checkout_template?: CheckoutTemplate; + receipt_template?: ReceiptTemplate; + email_template?: EmailTemplate; + cart_template?: CartTemplate; }; } diff --git a/src/integration/Graph/template_sets.d.ts b/src/integration/Graph/template_sets.d.ts index 3ceb4a9..0b393eb 100644 --- a/src/integration/Graph/template_sets.d.ts +++ b/src/integration/Graph/template_sets.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxTemplateSet } from './template_set'; +import type { TemplateSet } from './template_set'; import type { Graph } from '../../core'; -export interface FxTemplateSets extends Graph { +export interface TemplateSets extends Graph { curie: 'fx:template_sets'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxTemplateSet; + child: TemplateSet; } diff --git a/src/integration/Graph/timezones.d.ts b/src/integration/Graph/timezones.d.ts index 4797357..fe1dab2 100644 --- a/src/integration/Graph/timezones.d.ts +++ b/src/integration/Graph/timezones.d.ts @@ -1,14 +1,14 @@ -import type { FxPropertyHelpers } from './property_helpers'; +import type { PropertyHelpers } from './property_helpers'; import type { Graph } from '../../core'; -export interface FxTimezones extends Graph { +export interface Timezones extends Graph { curie: 'fx:timezones'; links: { /** This resource. */ - 'self': FxTimezones; + 'self': Timezones; /** Various predefined property values. */ - 'fx:property_helpers': FxPropertyHelpers; + 'fx:property_helpers': PropertyHelpers; }; props: { diff --git a/src/integration/Graph/token.d.ts b/src/integration/Graph/token.d.ts index ce8d3ac..5a7d814 100644 --- a/src/integration/Graph/token.d.ts +++ b/src/integration/Graph/token.d.ts @@ -1,6 +1,6 @@ import type { Graph } from '../../core'; -export interface FxToken extends Graph { +export interface Token extends Graph { curie: 'fx:token'; props: { diff --git a/src/integration/Graph/transaction.d.ts b/src/integration/Graph/transaction.d.ts index 18baf45..af92672 100644 --- a/src/integration/Graph/transaction.d.ts +++ b/src/integration/Graph/transaction.d.ts @@ -1,65 +1,65 @@ -import type { FxAppliedTaxes } from './applied_taxes'; -import type { FxAttributes } from './attributes'; -import type { FxBillingAddresses } from './billing_addresses'; -import type { FxCapture } from './capture'; -import type { FxCustomFields } from './custom_fields'; -import type { FxCustomer } from './customer'; -import type { FxDiscounts } from './discounts'; -import type { FxItems } from './items'; -import type { FxNativeIntegrations } from './native_integrations'; -import type { FxPayments } from './payments'; -import type { FxProcessWebhook } from './process_webhook'; -import type { FxReceipt } from './receipt'; -import type { FxRefund } from './refund'; -import type { FxSendEmails } from './send_emails'; -import type { FxShipments } from './shipments'; -import type { FxStore } from './store'; -import type { FxTransactionLogs } from './transaction_logs'; -import type { FxVoid } from './void'; +import type { AppliedTaxes } from './applied_taxes'; +import type { Attributes } from './attributes'; +import type { BillingAddresses } from './billing_addresses'; +import type { Capture } from './capture'; +import type { CustomFields } from './custom_fields'; +import type { Customer } from './customer'; +import type { Discounts } from './discounts'; +import type { Items } from './items'; +import type { NativeIntegrations } from './native_integrations'; +import type { Payments } from './payments'; +import type { ProcessWebhook } from './process_webhook'; +import type { Receipt } from './receipt'; +import type { Refund } from './refund'; +import type { SendEmails } from './send_emails'; +import type { Shipments } from './shipments'; +import type { Store } from './store'; +import type { TransactionLogs } from './transaction_logs'; +import type { Void } from './void'; import type { Graph } from '../../core'; -export interface FxTransaction extends Graph { +export interface Transaction extends Graph { curie: 'fx:transaction'; links: { /** This resource. */ - 'self': FxTransaction; + 'self': Transaction; /** POST here to void this transaction. */ - 'fx:void': FxVoid; + 'fx:void': Void; /** Related store resource. */ - 'fx:store': FxStore; + 'fx:store': Store; /** List of items in this transaction. */ - 'fx:items': FxItems; + 'fx:items': Items; /** POST here to refund this transaction. */ - 'fx:refund': FxRefund; + 'fx:refund': Refund; /** Open this link in a browser to see a receipt for this transaction. */ - 'fx:receipt': FxReceipt; + 'fx:receipt': Receipt; /** POST here to capture this transaction. */ - 'fx:capture': FxCapture; + 'fx:capture': Capture; /** List of payments for this transaction. */ - 'fx:payments': FxPayments; + 'fx:payments': Payments; /** Related customer resource. */ - 'fx:customer': FxCustomer; + 'fx:customer': Customer; /** List of discounts applied to this transaction. */ - 'fx:discounts': FxDiscounts; + 'fx:discounts': Discounts; /** List of shipments for this transaction. */ - 'fx:shipments': FxShipments; + 'fx:shipments': Shipments; /** List of custom attributes on this transaction. */ - 'fx:attributes': FxAttributes; + 'fx:attributes': Attributes; /** POST here to resend emails for this transaction. */ - 'fx:send_emails': FxSendEmails; + 'fx:send_emails': SendEmails; /** List of taxes applied to this transaction. */ - 'fx:applied_taxes': FxAppliedTaxes; + 'fx:applied_taxes': AppliedTaxes; /** List of custom fields on this transaction. */ - 'fx:custom_fields': FxCustomFields; + 'fx:custom_fields': CustomFields; /** POST here to resend the webhook notification for this transaction. */ - 'fx:process_webhook': FxProcessWebhook; + 'fx:process_webhook': ProcessWebhook; /** Transaction logs. */ - 'fx:transaction_logs': FxTransactionLogs; + 'fx:transaction_logs': TransactionLogs; /** List of billing addresses applicable to this transaction. */ - 'fx:billing_addresses': FxBillingAddresses; + 'fx:billing_addresses': BillingAddresses; /** POST here to resend transaction to the webhooks. */ - 'fx:native_integrations': FxNativeIntegrations; + 'fx:native_integrations': NativeIntegrations; }; props: { @@ -112,14 +112,14 @@ export interface FxTransaction extends Graph { }; zooms: { - billing_addresses?: FxBillingAddresses; - applied_taxes?: FxAppliedTaxes; - custom_fields?: FxCustomFields; - attributes: FxAttributes; - discounts?: FxDiscounts; - shipments?: FxShipments; - customer?: FxCustomer; - payments?: FxPayments; - items?: FxItems; + billing_addresses?: BillingAddresses; + applied_taxes?: AppliedTaxes; + custom_fields?: CustomFields; + attributes: Attributes; + discounts?: Discounts; + shipments?: Shipments; + customer?: Customer; + payments?: Payments; + items?: Items; }; } diff --git a/src/integration/Graph/transaction_log.d.ts b/src/integration/Graph/transaction_log.d.ts index 29eecb7..b7f3ee3 100644 --- a/src/integration/Graph/transaction_log.d.ts +++ b/src/integration/Graph/transaction_log.d.ts @@ -1,26 +1,26 @@ -import type { FxCustomer } from './customer'; -import type { FxStore } from './store'; -import type { FxTransaction } from './transaction'; -import type { FxTransactionLogDetails } from './transaction_log_details'; -import type { FxUser } from './user'; +import type { Customer } from './customer'; +import type { Store } from './store'; +import type { Transaction } from './transaction'; +import type { TransactionLogDetails } from './transaction_log_details'; +import type { User } from './user'; import type { Graph } from '../../core'; -export interface FxTransactionLog extends Graph { +export interface TransactionLog extends Graph { curie: 'fx:transaction_logs'; links: { /** This resource. */ - 'self': FxTransactionLog; + 'self': TransactionLog; /** Related user resource. */ - 'fx:user': FxUser; + 'fx:user': User; /** Relared store resource. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Related customer resource. */ - 'fx:customer': FxCustomer; + 'fx:customer': Customer; /** Related transaction resource. */ - 'fx:transaction': FxTransaction; + 'fx:transaction': Transaction; /** List of detailed entries for this log. */ - 'fx:transaction_log_details': FxTransactionLogDetails; + 'fx:transaction_log_details': TransactionLogDetails; }; props: { diff --git a/src/integration/Graph/transaction_log_detail.d.ts b/src/integration/Graph/transaction_log_detail.d.ts index 392ff39..6c6630e 100644 --- a/src/integration/Graph/transaction_log_detail.d.ts +++ b/src/integration/Graph/transaction_log_detail.d.ts @@ -1,17 +1,17 @@ -import type { FxStore } from './store'; -import type { FxTransactionLog } from './transaction_log'; +import type { Store } from './store'; +import type { TransactionLog } from './transaction_log'; import type { Graph } from '../../core'; -export interface FxTransactionLogDetail extends Graph { +export interface TransactionLogDetail extends Graph { curie: 'fx:transaction_log_detail'; links: { /** This resource. */ - 'self': FxTransactionLogDetail; + 'self': TransactionLogDetail; /** Relared store resource. */ - 'fx:store': FxStore; + 'fx:store': Store; /** Related transaction log resource. */ - 'fx:transaction_log': FxTransactionLog; + 'fx:transaction_log': TransactionLog; }; props: { diff --git a/src/integration/Graph/transaction_log_details.d.ts b/src/integration/Graph/transaction_log_details.d.ts index d264486..37fe39d 100644 --- a/src/integration/Graph/transaction_log_details.d.ts +++ b/src/integration/Graph/transaction_log_details.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxTransactionLogDetail } from './transaction_log_detail'; +import type { TransactionLogDetail } from './transaction_log_detail'; import type { Graph } from '../../core'; -export interface FxTransactionLogDetails extends Graph { +export interface TransactionLogDetails extends Graph { curie: 'fx:transaction_log_details'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxTransactionLogDetail; + child: TransactionLogDetail; } diff --git a/src/integration/Graph/transaction_logs.d.ts b/src/integration/Graph/transaction_logs.d.ts index 4992c98..a6411f6 100644 --- a/src/integration/Graph/transaction_logs.d.ts +++ b/src/integration/Graph/transaction_logs.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxTransactionLog } from './transaction_log'; +import type { TransactionLog } from './transaction_log'; import type { Graph } from '../../core'; -export interface FxTransactionLogs extends Graph { +export interface TransactionLogs extends Graph { curie: 'fx:transaction_logs'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxTransactionLog; + child: TransactionLog; } diff --git a/src/integration/Graph/transaction_template.d.ts b/src/integration/Graph/transaction_template.d.ts index fdf6b44..b39d689 100644 --- a/src/integration/Graph/transaction_template.d.ts +++ b/src/integration/Graph/transaction_template.d.ts @@ -1,9 +1,9 @@ -import type { FxCart } from './cart'; +import type { Cart } from './cart'; import type { Graph } from '../../core'; -export interface FxTransactionTemplate extends Graph { +export interface TransactionTemplate extends Graph { curie: 'fx:transaction_template'; - links: FxCart['links']; - props: FxCart['props']; - zooms: FxCart['zooms']; + links: Cart['links']; + props: Cart['props']; + zooms: Cart['zooms']; } diff --git a/src/integration/Graph/transactions.d.ts b/src/integration/Graph/transactions.d.ts index 8e64169..631f31d 100644 --- a/src/integration/Graph/transactions.d.ts +++ b/src/integration/Graph/transactions.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxTransaction } from './transaction'; +import type { Transaction } from './transaction'; import type { Graph } from '../../core'; -export interface FxTransactions extends Graph { +export interface Transactions extends Graph { curie: 'fx:transactions'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxTransaction; + child: Transaction; } diff --git a/src/integration/Graph/user.d.ts b/src/integration/Graph/user.d.ts index a1879b7..4affd2a 100644 --- a/src/integration/Graph/user.d.ts +++ b/src/integration/Graph/user.d.ts @@ -1,20 +1,20 @@ -import type { FxAttributes } from './attributes'; -import type { FxDefaultStore } from './default_store'; -import type { FxStores } from './stores'; +import type { Attributes } from './attributes'; +import type { DefaultStore } from './default_store'; +import type { Stores } from './stores'; import type { Graph } from '../../core'; -export interface FxUser extends Graph { +export interface User extends Graph { curie: 'fx:user'; links: { /** This resource. */ - 'self': FxUser; + 'self': User; /** List of stores this user has access to. */ - 'fx:stores': FxStores; + 'fx:stores': Stores; /** List of custom attributes on this user resource. */ - 'fx:attributes': FxAttributes; + 'fx:attributes': Attributes; /** Default store for this user. */ - 'fx:default_store': FxDefaultStore; + 'fx:default_store': DefaultStore; }; props: { diff --git a/src/integration/Graph/user_access.d.ts b/src/integration/Graph/user_access.d.ts index bdeb27d..5c0594c 100644 --- a/src/integration/Graph/user_access.d.ts +++ b/src/integration/Graph/user_access.d.ts @@ -1,17 +1,17 @@ -import type { FxStore } from './store'; -import type { FxUser } from './user'; +import type { Store } from './store'; +import type { User } from './user'; import type { Graph } from '../../core'; -export interface FxUserAccess extends Graph { +export interface UserAccess extends Graph { curie: 'fx:user_access'; links: { /** This resource. */ - 'self': FxUserAccess; + 'self': UserAccess; /** Related user resource. */ - 'fx:user': FxUser; + 'fx:user': User; /** Related store resource. */ - 'fx:store': FxStore; + 'fx:store': Store; }; props: { diff --git a/src/integration/Graph/user_accesses.d.ts b/src/integration/Graph/user_accesses.d.ts index 40361d5..988b460 100644 --- a/src/integration/Graph/user_accesses.d.ts +++ b/src/integration/Graph/user_accesses.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxUserAccess } from './user_access'; +import type { UserAccess } from './user_access'; import type { Graph } from '../../core'; -export interface FxUserAccesses extends Graph { +export interface UserAccesses extends Graph { curie: 'fx:user_accesses'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxUserAccess; + child: UserAccess; } diff --git a/src/integration/Graph/users.d.ts b/src/integration/Graph/users.d.ts index 757771e..7a1108e 100644 --- a/src/integration/Graph/users.d.ts +++ b/src/integration/Graph/users.d.ts @@ -1,10 +1,10 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { FxUser } from './user'; +import type { User } from './user'; import type { Graph } from '../../core'; -export interface FxUsers extends Graph { +export interface Users extends Graph { curie: 'fx:users'; - links: CollectionGraphLinks; + links: CollectionGraphLinks; props: CollectionGraphProps; - child: FxUser; + child: User; } diff --git a/src/integration/Graph/void.d.ts b/src/integration/Graph/void.d.ts index b5a4b4f..aa3f631 100644 --- a/src/integration/Graph/void.d.ts +++ b/src/integration/Graph/void.d.ts @@ -1,5 +1,5 @@ import type { Graph } from '../../core'; -export interface FxVoid extends Graph { +export interface Void extends Graph { curie: 'fx:void'; } diff --git a/src/integration/getAllowedFrequencies.ts b/src/integration/getAllowedFrequencies.ts index 83a1b9f..342ce0c 100644 --- a/src/integration/getAllowedFrequencies.ts +++ b/src/integration/getAllowedFrequencies.ts @@ -1,7 +1,7 @@ -import { FxCustomerPortalSettings } from './Graph/customer_portal_settings'; +import { CustomerPortalSettings } from './Graph/customer_portal_settings'; import jsonata from 'jsonata'; -type Rules = FxCustomerPortalSettings['props']['subscriptions']['allowFrequencyModification']; +type Rules = CustomerPortalSettings['props']['subscriptions']['allowFrequencyModification']; type Options = { settings: { subscriptions: { allowFrequencyModification: Rules } }; diff --git a/src/integration/isNextTransactionDate.ts b/src/integration/isNextTransactionDate.ts index 45e3336..14ff633 100644 --- a/src/integration/isNextTransactionDate.ts +++ b/src/integration/isNextTransactionDate.ts @@ -1,8 +1,8 @@ -import { FxCustomerPortalSettings } from './Graph/customer_portal_settings'; +import { CustomerPortalSettings } from './Graph/customer_portal_settings'; import jsonata from 'jsonata'; import parse from 'parse-duration'; -type Config = FxCustomerPortalSettings['props']['subscriptions']['allowNextDateModification']; +type Config = CustomerPortalSettings['props']['subscriptions']['allowNextDateModification']; type Options = { value: string; diff --git a/tests/integration/API.test.ts b/tests/integration/API.test.ts index 6b6e89b..6689976 100644 --- a/tests/integration/API.test.ts +++ b/tests/integration/API.test.ts @@ -9,7 +9,7 @@ jest.mock('cross-fetch', () => ({ import { Headers, Request, Response, fetch } from 'cross-fetch'; import { API as CoreAPI } from '../../src/core/API'; -import { FxToken } from '../../src/integration/Rels'; +import { Token } from '../../src/integration/Rels'; import { API as IntegrationAPI } from '../../src/integration/API'; import MemoryCache from 'fake-storage'; @@ -27,7 +27,7 @@ const commonInit = { refreshToken: '65redfghyuyjthgrhyjthrgdfghytredtyuytredrtyuy6trtyuhgfdr', }; -const sampleToken: FxToken['props'] = { +const sampleToken: Token['props'] = { access_token: 'w8a49rbvuznxmzs39xliwfa943fda84klkvniutgh34q1fjmnfma90iubl', expires_in: IntegrationAPI.REFRESH_THRESHOLD * 3, refresh_token: '65redfghyuyjthgrhyjthrgdfghytredtyuytredrtyuy6trtyuhgfdr', diff --git a/tests/integration/getAllowedFrequencies.test.ts b/tests/integration/getAllowedFrequencies.test.ts index 7fdf3aa..ef87264 100644 --- a/tests/integration/getAllowedFrequencies.test.ts +++ b/tests/integration/getAllowedFrequencies.test.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable jsdoc/require-jsdoc */ -import { FxCustomerPortalSettings } from '../../src/integration/Graph/customer_portal_settings'; +import { CustomerPortalSettings } from '../../src/integration/Graph/customer_portal_settings'; import { getAllowedFrequencies } from '../../src/integration/getAllowedFrequencies'; function mockSubscription(frequency = '1m') { @@ -20,7 +20,7 @@ function mockSubscription(frequency = '1m') { }; } -type Rules = FxCustomerPortalSettings['props']['subscriptions']['allowFrequencyModification']; +type Rules = CustomerPortalSettings['props']['subscriptions']['allowFrequencyModification']; function mockSettings(rules: Rules = []) { return { subscriptions: { allowFrequencyModification: rules } }; diff --git a/tests/integration/isNextTransactionDate.test.ts b/tests/integration/isNextTransactionDate.test.ts index 452d744..1a4c256 100644 --- a/tests/integration/isNextTransactionDate.test.ts +++ b/tests/integration/isNextTransactionDate.test.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable jsdoc/require-jsdoc */ -import { FxCustomerPortalSettings } from '../../src/integration/Graph/customer_portal_settings'; +import { CustomerPortalSettings } from '../../src/integration/Graph/customer_portal_settings'; import { isNextTransactionDate } from '../../src/integration/isNextTransactionDate'; function mockSubscription(frequency = '1m') { @@ -20,7 +20,7 @@ function mockSubscription(frequency = '1m') { }; } -type Config = FxCustomerPortalSettings['props']['subscriptions']['allowNextDateModification']; +type Config = CustomerPortalSettings['props']['subscriptions']['allowNextDateModification']; function mockSettings(rules: Config) { return { subscriptions: { allowNextDateModification: rules } }; From 8a6f05dd893d39207610492d566aadb015d6076a Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Tue, 1 Dec 2020 01:48:15 +0300 Subject: [PATCH 60/98] style: fix eslint issues --- src/customer/API.ts | 6 ++++-- src/integration/Graph/applied_coupon_code.d.ts | 2 +- src/integration/Graph/applied_tax.d.ts | 2 +- src/integration/Graph/billing_address.d.ts | 2 +- src/integration/Graph/cart.d.ts | 2 +- src/integration/Graph/cart_include_template.d.ts | 2 +- src/integration/Graph/cart_template.d.ts | 2 +- src/integration/Graph/checkout_template.d.ts | 2 +- src/integration/Graph/checkout_types.d.ts | 2 +- src/integration/Graph/countries.d.ts | 2 +- src/integration/Graph/coupon.d.ts | 2 +- src/integration/Graph/coupon_code.d.ts | 2 +- src/integration/Graph/coupon_code_transaction.d.ts | 2 +- src/integration/Graph/coupon_detail.d.ts | 2 +- src/integration/Graph/coupon_item_category.d.ts | 2 +- src/integration/Graph/create_user.d.ts | 2 +- src/integration/Graph/custom_field.d.ts | 2 +- src/integration/Graph/customer.d.ts | 2 +- src/integration/Graph/customer_address.d.ts | 2 +- src/integration/Graph/customer_email_template.d.ts | 2 +- src/integration/Graph/customer_password_hash_types.d.ts | 2 +- src/integration/Graph/customer_portal_settings.d.ts | 2 +- src/integration/Graph/default_payment_method.d.ts | 2 +- src/integration/Graph/default_store.d.ts | 2 +- src/integration/Graph/default_templates.d.ts | 2 +- src/integration/Graph/discount.d.ts | 2 +- src/integration/Graph/discount_detail.d.ts | 2 +- src/integration/Graph/downloadable.d.ts | 2 +- src/integration/Graph/downloadable_item_categories.d.ts | 2 +- src/integration/Graph/downloadable_purchase.d.ts | 2 +- src/integration/Graph/email_template.d.ts | 2 +- src/integration/Graph/error_entry.d.ts | 2 +- src/integration/Graph/fraud_protection.d.ts | 2 +- src/integration/Graph/hosted_payment_gateway.d.ts | 2 +- src/integration/Graph/hosted_payment_gateways.d.ts | 2 +- src/integration/Graph/integration.d.ts | 2 +- src/integration/Graph/item.d.ts | 2 +- src/integration/Graph/item_categories.d.ts | 2 +- src/integration/Graph/item_category.d.ts | 2 +- src/integration/Graph/item_option.d.ts | 2 +- src/integration/Graph/item_options.d.ts | 2 +- src/integration/Graph/items.d.ts | 2 +- src/integration/Graph/language_override.d.ts | 2 +- src/integration/Graph/language_overrides.d.ts | 2 +- src/integration/Graph/language_strings.d.ts | 2 +- src/integration/Graph/languages.d.ts | 2 +- src/integration/Graph/last_transaction.d.ts | 2 +- src/integration/Graph/locale_codes.d.ts | 2 +- src/integration/Graph/native_integration.d.ts | 2 +- src/integration/Graph/native_integrations.d.ts | 2 +- src/integration/Graph/original_transaction.d.ts | 2 +- src/integration/Graph/payment.d.ts | 2 +- src/integration/Graph/payment_gateway.d.ts | 2 +- src/integration/Graph/payment_gateways.d.ts | 2 +- src/integration/Graph/payment_method_expiring.d.ts | 2 +- src/integration/Graph/payment_method_set.d.ts | 2 +- .../Graph/payment_method_set_fraud_protection.d.ts | 2 +- .../Graph/payment_method_set_fraud_protections.d.ts | 2 +- .../Graph/payment_method_set_hosted_payment_gateway.d.ts | 2 +- .../Graph/payment_method_set_hosted_payment_gateways.d.ts | 2 +- src/integration/Graph/payment_method_sets.d.ts | 2 +- src/integration/Graph/payments.d.ts | 2 +- src/integration/Graph/property_helpers.d.ts | 2 +- src/integration/Graph/receipt_template.d.ts | 2 +- src/integration/Graph/receipt_templates.d.ts | 2 +- src/integration/Graph/regions.d.ts | 2 +- src/integration/Graph/reporting.d.ts | 2 +- src/integration/Graph/reporting_email_exists.d.ts | 2 +- src/integration/Graph/reporting_store_domain_exists.d.ts | 2 +- src/integration/Graph/shipment.d.ts | 2 +- src/integration/Graph/shipments.d.ts | 2 +- src/integration/Graph/shipping_address_types.d.ts | 2 +- src/integration/Graph/shipping_container.d.ts | 2 +- src/integration/Graph/shipping_containers.d.ts | 2 +- src/integration/Graph/shipping_drop_type.d.ts | 2 +- src/integration/Graph/shipping_drop_types.d.ts | 2 +- src/integration/Graph/shipping_method.d.ts | 2 +- src/integration/Graph/shipping_methods.d.ts | 2 +- src/integration/Graph/shipping_service.d.ts | 2 +- src/integration/Graph/shipping_services.d.ts | 2 +- src/integration/Graph/store.d.ts | 2 +- src/integration/Graph/store_shipping_method.d.ts | 2 +- src/integration/Graph/store_shipping_service.d.ts | 2 +- src/integration/Graph/store_shipping_services.d.ts | 2 +- src/integration/Graph/store_version.d.ts | 2 +- src/integration/Graph/store_versions.d.ts | 2 +- src/integration/Graph/stores.d.ts | 2 +- src/integration/Graph/subscription.d.ts | 2 +- src/integration/Graph/subscription_settings.d.ts | 2 +- src/integration/Graph/subscriptions.d.ts | 2 +- src/integration/Graph/tax.d.ts | 2 +- src/integration/Graph/tax_item_categories.d.ts | 2 +- src/integration/Graph/tax_item_category.d.ts | 2 +- src/integration/Graph/taxes.d.ts | 2 +- src/integration/Graph/template_config.d.ts | 2 +- src/integration/Graph/template_set.d.ts | 2 +- src/integration/Graph/template_sets.d.ts | 2 +- src/integration/Graph/timezones.d.ts | 2 +- src/integration/Graph/transaction.d.ts | 2 +- src/integration/Graph/transaction_log.d.ts | 2 +- src/integration/Graph/transaction_log_detail.d.ts | 2 +- src/integration/Graph/transaction_log_details.d.ts | 2 +- src/integration/Graph/transaction_logs.d.ts | 2 +- src/integration/Graph/transactions.d.ts | 2 +- src/integration/Graph/user.d.ts | 2 +- src/integration/Graph/user_access.d.ts | 2 +- src/integration/Graph/user_accesses.d.ts | 2 +- src/integration/Graph/users.d.ts | 2 +- tests/integration/API.test.ts | 2 +- 109 files changed, 112 insertions(+), 110 deletions(-) diff --git a/src/customer/API.ts b/src/customer/API.ts index adfd60c..e7965bc 100644 --- a/src/customer/API.ts +++ b/src/customer/API.ts @@ -1,6 +1,8 @@ import * as Core from '../core'; + import type { Credentials, Session } from './types'; import { Headers, fetch } from 'cross-fetch'; + import type { Graph } from './Graph'; export class API extends Core.API { @@ -21,9 +23,9 @@ export class API extends Core.API { try { response = await fetch(new URL('authenticate', this.base).toString(), { + body: JSON.stringify(credentials), headers: new Headers({ 'Content-Type': 'application/json' }), method: 'POST', - body: JSON.stringify(credentials), }); } catch (err) { throw new Core.API.AuthError({ @@ -51,9 +53,9 @@ export class API extends Core.API { try { response = await fetch(new URL('forgot_password', this.base).toString(), { + body: JSON.stringify({ email }), headers: new Headers({ 'Content-Type': 'application/json' }), method: 'POST', - body: JSON.stringify({ email }), }); } catch (err) { throw new Core.API.AuthError({ diff --git a/src/integration/Graph/applied_coupon_code.d.ts b/src/integration/Graph/applied_coupon_code.d.ts index 59c4a8e..536aee0 100644 --- a/src/integration/Graph/applied_coupon_code.d.ts +++ b/src/integration/Graph/applied_coupon_code.d.ts @@ -1,8 +1,8 @@ import type { Cart } from './cart'; import type { Coupon } from './coupon'; import type { CouponCode } from './coupon_code'; -import type { Store } from './store'; import type { Graph } from '../../core'; +import type { Store } from './store'; export interface AppliedCouponCode extends Graph { curie: 'fx:applied_coupon_code'; diff --git a/src/integration/Graph/applied_tax.d.ts b/src/integration/Graph/applied_tax.d.ts index 1e55ab1..33aa47a 100644 --- a/src/integration/Graph/applied_tax.d.ts +++ b/src/integration/Graph/applied_tax.d.ts @@ -1,7 +1,7 @@ +import type { Graph } from '../../core'; import type { Store } from './store'; import type { Tax } from './tax'; import type { Transaction } from './transaction'; -import type { Graph } from '../../core'; export interface AppliedTax extends Graph { curie: 'fx:applied_tax'; diff --git a/src/integration/Graph/billing_address.d.ts b/src/integration/Graph/billing_address.d.ts index 5616387..ddd8727 100644 --- a/src/integration/Graph/billing_address.d.ts +++ b/src/integration/Graph/billing_address.d.ts @@ -1,9 +1,9 @@ import type { BillingAddresses } from './billing_addresses'; import type { Customer } from './customer'; import type { CustomerAddress } from './customer_address'; +import type { Graph } from '../../core'; import type { Store } from './store'; import type { Transaction } from './transaction'; -import type { Graph } from '../../core'; export interface BillingAddress extends Graph { curie: 'fx:billing_address'; diff --git a/src/integration/Graph/cart.d.ts b/src/integration/Graph/cart.d.ts index de4a4a2..16d34c5 100644 --- a/src/integration/Graph/cart.d.ts +++ b/src/integration/Graph/cart.d.ts @@ -4,10 +4,10 @@ import type { CreateSession } from './create_session'; import type { CustomFields } from './custom_fields'; import type { Customer } from './customer'; import type { Discounts } from './discounts'; +import type { Graph } from '../../core'; import type { Items } from './items'; import type { Store } from './store'; import type { Subscription } from './subscription'; -import type { Graph } from '../../core'; export interface Cart extends Graph { curie: 'fx:cart'; diff --git a/src/integration/Graph/cart_include_template.d.ts b/src/integration/Graph/cart_include_template.d.ts index f3eb69a..248cbe5 100644 --- a/src/integration/Graph/cart_include_template.d.ts +++ b/src/integration/Graph/cart_include_template.d.ts @@ -1,7 +1,7 @@ import type { Cache } from './cache'; +import type { Graph } from '../../core'; import type { Store } from './store'; import type { TemplateSets } from './template_sets'; -import type { Graph } from '../../core'; export interface CartIncludeTemplate extends Graph { curie: 'fx:cart_include_template'; diff --git a/src/integration/Graph/cart_template.d.ts b/src/integration/Graph/cart_template.d.ts index b3a0cb4..23ce4c9 100644 --- a/src/integration/Graph/cart_template.d.ts +++ b/src/integration/Graph/cart_template.d.ts @@ -1,7 +1,7 @@ import type { Cache } from './cache'; +import type { Graph } from '../../core'; import type { Store } from './store'; import type { TemplateSets } from './template_sets'; -import type { Graph } from '../../core'; export interface CartTemplate extends Graph { curie: 'fx:cart_template'; diff --git a/src/integration/Graph/checkout_template.d.ts b/src/integration/Graph/checkout_template.d.ts index c1d2828..9bdcf20 100644 --- a/src/integration/Graph/checkout_template.d.ts +++ b/src/integration/Graph/checkout_template.d.ts @@ -1,8 +1,8 @@ import type { Cache } from './cache'; import type { Encode } from './encode'; +import type { Graph } from '../../core'; import type { Store } from './store'; import type { TemplateSets } from './template_sets'; -import type { Graph } from '../../core'; export interface CheckoutTemplate extends Graph { curie: 'fx:checkout_template'; diff --git a/src/integration/Graph/checkout_types.d.ts b/src/integration/Graph/checkout_types.d.ts index 0819dfc..ebf1900 100644 --- a/src/integration/Graph/checkout_types.d.ts +++ b/src/integration/Graph/checkout_types.d.ts @@ -1,5 +1,5 @@ -import type { PropertyHelpers } from './property_helpers'; import type { Graph } from '../../core'; +import type { PropertyHelpers } from './property_helpers'; export interface CheckoutTypes extends Graph { curie: 'fx:checkout_types'; diff --git a/src/integration/Graph/countries.d.ts b/src/integration/Graph/countries.d.ts index bde080f..01aa735 100644 --- a/src/integration/Graph/countries.d.ts +++ b/src/integration/Graph/countries.d.ts @@ -1,5 +1,5 @@ -import type { PropertyHelpers } from './property_helpers'; import type { Graph } from '../../core'; +import type { PropertyHelpers } from './property_helpers'; export interface Countries extends Graph { curie: 'fx:countries'; diff --git a/src/integration/Graph/coupon.d.ts b/src/integration/Graph/coupon.d.ts index b1fdcf5..aea86c6 100644 --- a/src/integration/Graph/coupon.d.ts +++ b/src/integration/Graph/coupon.d.ts @@ -1,8 +1,8 @@ import type { CouponCodes } from './coupon_codes'; import type { CouponItemCategories } from './coupon_item_categories'; import type { GenerateCodes } from './generate_codes'; -import type { Store } from './store'; import type { Graph } from '../../core'; +import type { Store } from './store'; export interface Coupon extends Graph { curie: 'fx:coupon'; diff --git a/src/integration/Graph/coupon_code.d.ts b/src/integration/Graph/coupon_code.d.ts index 2d48e70..64cf1c5 100644 --- a/src/integration/Graph/coupon_code.d.ts +++ b/src/integration/Graph/coupon_code.d.ts @@ -1,7 +1,7 @@ import type { Coupon } from './coupon'; import type { CouponCodeTransactions } from './coupon_code_transactions'; -import type { Store } from './store'; import type { Graph } from '../../core'; +import type { Store } from './store'; export interface CouponCode extends Graph { curie: 'fx:coupon_code'; diff --git a/src/integration/Graph/coupon_code_transaction.d.ts b/src/integration/Graph/coupon_code_transaction.d.ts index 962ff83..7ecb6d9 100644 --- a/src/integration/Graph/coupon_code_transaction.d.ts +++ b/src/integration/Graph/coupon_code_transaction.d.ts @@ -1,8 +1,8 @@ import type { Coupon } from './coupon'; import type { CouponCode } from './coupon_code'; +import type { Graph } from '../../core'; import type { Store } from './store'; import type { Transaction } from './transaction'; -import type { Graph } from '../../core'; export interface CouponCodeTransaction extends Graph { curie: 'fx:coupon_code_transaction'; diff --git a/src/integration/Graph/coupon_detail.d.ts b/src/integration/Graph/coupon_detail.d.ts index 8ce32a8..813ce42 100644 --- a/src/integration/Graph/coupon_detail.d.ts +++ b/src/integration/Graph/coupon_detail.d.ts @@ -1,9 +1,9 @@ import type { Coupon } from './coupon'; import type { CouponCode } from './coupon_code'; +import type { Graph } from '../../core'; import type { Item } from './item'; import type { Store } from './store'; import type { Transaction } from './transaction'; -import type { Graph } from '../../core'; export interface CouponDetail extends Graph { curie: 'fx:coupon_detail'; diff --git a/src/integration/Graph/coupon_item_category.d.ts b/src/integration/Graph/coupon_item_category.d.ts index 4194943..c1b1933 100644 --- a/src/integration/Graph/coupon_item_category.d.ts +++ b/src/integration/Graph/coupon_item_category.d.ts @@ -1,7 +1,7 @@ import type { Coupon } from './coupon'; +import type { Graph } from '../../core'; import type { ItemCategory } from './item_category'; import type { Store } from './store'; -import type { Graph } from '../../core'; export interface CouponItemCategory extends Graph { curie: 'fx:coupon_item_category'; diff --git a/src/integration/Graph/create_user.d.ts b/src/integration/Graph/create_user.d.ts index b1cf96f..3f47f76 100644 --- a/src/integration/Graph/create_user.d.ts +++ b/src/integration/Graph/create_user.d.ts @@ -1,5 +1,5 @@ -import type { User } from './user'; import type { Graph } from '../../core'; +import type { User } from './user'; export interface CreateUser extends Graph { curie: 'fx:create_user'; diff --git a/src/integration/Graph/custom_field.d.ts b/src/integration/Graph/custom_field.d.ts index c0c550f..bd3d0d3 100644 --- a/src/integration/Graph/custom_field.d.ts +++ b/src/integration/Graph/custom_field.d.ts @@ -1,6 +1,6 @@ +import type { Graph } from '../../core'; import type { Store } from './store'; import type { Transaction } from './transaction'; -import type { Graph } from '../../core'; export interface CustomField extends Graph { curie: 'fx:custom_field'; diff --git a/src/integration/Graph/customer.d.ts b/src/integration/Graph/customer.d.ts index 848d7c7..1ef3a5e 100644 --- a/src/integration/Graph/customer.d.ts +++ b/src/integration/Graph/customer.d.ts @@ -3,10 +3,10 @@ import type { CustomerAddresses } from './customer_addresses'; import type { DefaultBillingAddress } from './default_billing_address'; import type { DefaultPaymentMethod } from './default_payment_method'; import type { DefaultShippingAddress } from './default_shipping_address'; +import type { Graph } from '../../core'; import type { Store } from './store'; import type { Subscriptions } from './subscriptions'; import type { Transactions } from './transactions'; -import type { Graph } from '../../core'; export interface Customer extends Graph { curie: 'fx:customer'; diff --git a/src/integration/Graph/customer_address.d.ts b/src/integration/Graph/customer_address.d.ts index 571fbd3..d283548 100644 --- a/src/integration/Graph/customer_address.d.ts +++ b/src/integration/Graph/customer_address.d.ts @@ -1,6 +1,6 @@ import type { Customer } from './customer'; -import type { Store } from './store'; import type { Graph } from '../../core'; +import type { Store } from './store'; export interface CustomerAddress extends Graph { curie: 'fx:customer_address'; diff --git a/src/integration/Graph/customer_email_template.d.ts b/src/integration/Graph/customer_email_template.d.ts index d35123c..2c6d6c4 100644 --- a/src/integration/Graph/customer_email_template.d.ts +++ b/src/integration/Graph/customer_email_template.d.ts @@ -1,8 +1,8 @@ import type { Cache } from './cache'; import type { EmailTemplate } from './email_template'; +import type { Graph } from '../../core'; import type { Store } from './store'; import type { TemplateSets } from './template_sets'; -import type { Graph } from '../../core'; export interface CustomerEmailTemplate extends Graph { curie: 'fx:customer_email_template'; diff --git a/src/integration/Graph/customer_password_hash_types.d.ts b/src/integration/Graph/customer_password_hash_types.d.ts index 7d51efd..5d56c36 100644 --- a/src/integration/Graph/customer_password_hash_types.d.ts +++ b/src/integration/Graph/customer_password_hash_types.d.ts @@ -1,5 +1,5 @@ -import type { PropertyHelpers } from './property_helpers'; import type { Graph } from '../../core'; +import type { PropertyHelpers } from './property_helpers'; export interface CustomerPasswordHashTypes extends Graph { curie: 'fx:customer_password_hash_types'; diff --git a/src/integration/Graph/customer_portal_settings.d.ts b/src/integration/Graph/customer_portal_settings.d.ts index d312b46..e015688 100644 --- a/src/integration/Graph/customer_portal_settings.d.ts +++ b/src/integration/Graph/customer_portal_settings.d.ts @@ -1,5 +1,5 @@ -import type { Store } from './store'; import type { Graph } from '../../core'; +import type { Store } from './store'; export interface CustomerPortalSettings extends Graph { curie: 'fx:customer_portal_settings'; diff --git a/src/integration/Graph/default_payment_method.d.ts b/src/integration/Graph/default_payment_method.d.ts index bc0f351..09ffd8e 100644 --- a/src/integration/Graph/default_payment_method.d.ts +++ b/src/integration/Graph/default_payment_method.d.ts @@ -1,6 +1,6 @@ import type { Customer } from './customer'; -import type { Store } from './store'; import type { Graph } from '../../core'; +import type { Store } from './store'; export interface DefaultPaymentMethod extends Graph { curie: 'fx:default_payment_method'; diff --git a/src/integration/Graph/default_store.d.ts b/src/integration/Graph/default_store.d.ts index 486e307..5858a44 100644 --- a/src/integration/Graph/default_store.d.ts +++ b/src/integration/Graph/default_store.d.ts @@ -1,5 +1,5 @@ -import type { Store } from './store'; import type { Graph } from '../../core'; +import type { Store } from './store'; export interface DefaultStore extends Graph { curie: 'fx:default_store'; diff --git a/src/integration/Graph/default_templates.d.ts b/src/integration/Graph/default_templates.d.ts index d958515..db01c57 100644 --- a/src/integration/Graph/default_templates.d.ts +++ b/src/integration/Graph/default_templates.d.ts @@ -2,9 +2,9 @@ import type { CartIncludeTemplates } from './cart_include_templates'; import type { CartTemplates } from './cart_templates'; import type { CheckoutTemplates } from './checkout_templates'; import type { EmailTemplates } from './email_templates'; +import type { Graph } from '../../core'; import type { PropertyHelpers } from './property_helpers'; import type { ReceiptTemplates } from './receipt_templates'; -import type { Graph } from '../../core'; export interface DefaultTemplates extends Graph { curie: 'fx:default_templates'; diff --git a/src/integration/Graph/discount.d.ts b/src/integration/Graph/discount.d.ts index f3e7049..c0a0a59 100644 --- a/src/integration/Graph/discount.d.ts +++ b/src/integration/Graph/discount.d.ts @@ -1,9 +1,9 @@ import type { Coupon } from './coupon'; import type { CouponCode } from './coupon_code'; import type { Customer } from './customer'; +import type { Graph } from '../../core'; import type { Store } from './store'; import type { Transaction } from './transaction'; -import type { Graph } from '../../core'; export interface Discount extends Graph { curie: 'fx:discount'; diff --git a/src/integration/Graph/discount_detail.d.ts b/src/integration/Graph/discount_detail.d.ts index 7f57cb3..fc5d2f7 100644 --- a/src/integration/Graph/discount_detail.d.ts +++ b/src/integration/Graph/discount_detail.d.ts @@ -1,7 +1,7 @@ +import type { Graph } from '../../core'; import type { Item } from './item'; import type { Store } from './store'; import type { Transaction } from './transaction'; -import type { Graph } from '../../core'; export interface DiscountDetail extends Graph { curie: 'fx:discount_detail'; diff --git a/src/integration/Graph/downloadable.d.ts b/src/integration/Graph/downloadable.d.ts index 5f20056..959fa12 100644 --- a/src/integration/Graph/downloadable.d.ts +++ b/src/integration/Graph/downloadable.d.ts @@ -1,7 +1,7 @@ import type { DownloadableItemCategories } from './downloadable_item_categories'; +import type { Graph } from '../../core'; import type { ItemCategory } from './item_category'; import type { Store } from './store'; -import type { Graph } from '../../core'; export interface Downloadable extends Graph { curie: 'fx:downloadable'; diff --git a/src/integration/Graph/downloadable_item_categories.d.ts b/src/integration/Graph/downloadable_item_categories.d.ts index e323392..b0908a7 100644 --- a/src/integration/Graph/downloadable_item_categories.d.ts +++ b/src/integration/Graph/downloadable_item_categories.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { ItemCategory } from './item_category'; import type { Graph } from '../../core'; +import type { ItemCategory } from './item_category'; export interface DownloadableItemCategories extends Graph { curie: 'fx:downloadable_item_categories'; diff --git a/src/integration/Graph/downloadable_purchase.d.ts b/src/integration/Graph/downloadable_purchase.d.ts index ec38e0f..12bfa32 100644 --- a/src/integration/Graph/downloadable_purchase.d.ts +++ b/src/integration/Graph/downloadable_purchase.d.ts @@ -1,9 +1,9 @@ import type { Customer } from './customer'; import type { Downloadable } from './downloadable'; +import type { Graph } from '../../core'; import type { Item } from './item'; import type { Store } from './store'; import type { Transaction } from './transaction'; -import type { Graph } from '../../core'; export interface DownloadablePurchase extends Graph { curie: 'fx:downloadable_purchase'; diff --git a/src/integration/Graph/email_template.d.ts b/src/integration/Graph/email_template.d.ts index daef5bb..079e24b 100644 --- a/src/integration/Graph/email_template.d.ts +++ b/src/integration/Graph/email_template.d.ts @@ -1,7 +1,7 @@ import type { Cache } from './cache'; +import type { Graph } from '../../core'; import type { Store } from './store'; import type { TemplateSets } from './template_sets'; -import type { Graph } from '../../core'; export interface EmailTemplate extends Graph { curie: 'fx:email_template'; diff --git a/src/integration/Graph/error_entry.d.ts b/src/integration/Graph/error_entry.d.ts index f966956..9015865 100644 --- a/src/integration/Graph/error_entry.d.ts +++ b/src/integration/Graph/error_entry.d.ts @@ -1,5 +1,5 @@ -import type { Store } from './store'; import type { Graph } from '../../core'; +import type { Store } from './store'; export interface ErrorEntry extends Graph { curie: 'fx:error_entry'; diff --git a/src/integration/Graph/fraud_protection.d.ts b/src/integration/Graph/fraud_protection.d.ts index 7ae3d5f..fe963a5 100644 --- a/src/integration/Graph/fraud_protection.d.ts +++ b/src/integration/Graph/fraud_protection.d.ts @@ -1,6 +1,6 @@ +import type { Graph } from '../../core'; import type { PaymentMethodSets } from './payment_method_sets'; import type { Store } from './store'; -import type { Graph } from '../../core'; export interface FraudProtection extends Graph { curie: 'fx:fraud_protection'; diff --git a/src/integration/Graph/hosted_payment_gateway.d.ts b/src/integration/Graph/hosted_payment_gateway.d.ts index 67756c1..81d8779 100644 --- a/src/integration/Graph/hosted_payment_gateway.d.ts +++ b/src/integration/Graph/hosted_payment_gateway.d.ts @@ -1,5 +1,5 @@ -import { PaymentGateway } from './payment_gateway'; import type { Graph } from '../../core'; +import type { PaymentGateway } from './payment_gateway'; export interface HostedPaymentGateway extends Graph { curie: 'fx:hosted_payment_gateway'; diff --git a/src/integration/Graph/hosted_payment_gateways.d.ts b/src/integration/Graph/hosted_payment_gateways.d.ts index 7c3237e..d742081 100644 --- a/src/integration/Graph/hosted_payment_gateways.d.ts +++ b/src/integration/Graph/hosted_payment_gateways.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { HostedPaymentGateway } from './hosted_payment_gateway'; import type { Graph } from '../../core'; +import type { HostedPaymentGateway } from './hosted_payment_gateway'; export interface HostedPaymentGateways extends Graph { curie: 'fx:hosted_payment_gateways'; diff --git a/src/integration/Graph/integration.d.ts b/src/integration/Graph/integration.d.ts index 6314074..44feb61 100644 --- a/src/integration/Graph/integration.d.ts +++ b/src/integration/Graph/integration.d.ts @@ -1,7 +1,7 @@ import type { Client } from './client'; +import type { Graph } from '../../core'; import type { Store } from './store'; import type { User } from './user'; -import type { Graph } from '../../core'; export interface Integration extends Graph { curie: 'fx:integration'; diff --git a/src/integration/Graph/item.d.ts b/src/integration/Graph/item.d.ts index f7d8f9b..428c0fe 100644 --- a/src/integration/Graph/item.d.ts +++ b/src/integration/Graph/item.d.ts @@ -1,12 +1,12 @@ import type { Attributes } from './attributes'; import type { CouponDetails } from './coupon_details'; import type { DiscountDetails } from './discount_details'; +import type { Graph } from '../../core'; import type { ItemCategory } from './item_category'; import type { ItemOptions } from './item_options'; import type { Shipment } from './shipment'; import type { Store } from './store'; import type { Transaction } from './transaction'; -import type { Graph } from '../../core'; export interface Item extends Graph { curie: 'fx:item'; diff --git a/src/integration/Graph/item_categories.d.ts b/src/integration/Graph/item_categories.d.ts index 8bfcd2f..b8e4781 100644 --- a/src/integration/Graph/item_categories.d.ts +++ b/src/integration/Graph/item_categories.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { ItemCategory } from './item_category'; import type { Graph } from '../../core'; +import type { ItemCategory } from './item_category'; export interface ItemCategories extends Graph { curie: 'fx:item_categories'; diff --git a/src/integration/Graph/item_category.d.ts b/src/integration/Graph/item_category.d.ts index 53e1ec0..187c164 100644 --- a/src/integration/Graph/item_category.d.ts +++ b/src/integration/Graph/item_category.d.ts @@ -1,7 +1,7 @@ import type { EmailTemplates } from './email_templates'; +import type { Graph } from '../../core'; import type { Store } from './store'; import type { TaxItemCategories } from './tax_item_categories'; -import type { Graph } from '../../core'; export interface ItemCategory extends Graph { curie: 'fx:item_category'; diff --git a/src/integration/Graph/item_option.d.ts b/src/integration/Graph/item_option.d.ts index 51b4310..8a4e6c6 100644 --- a/src/integration/Graph/item_option.d.ts +++ b/src/integration/Graph/item_option.d.ts @@ -1,7 +1,7 @@ +import type { Graph } from '../../core'; import type { Item } from './item'; import type { Store } from './store'; import type { Transaction } from './transaction'; -import type { Graph } from '../../core'; export interface ItemOption extends Graph { curie: 'fx:item_option'; diff --git a/src/integration/Graph/item_options.d.ts b/src/integration/Graph/item_options.d.ts index 00e1fc4..ddca8f9 100644 --- a/src/integration/Graph/item_options.d.ts +++ b/src/integration/Graph/item_options.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { ItemOption } from './item_option'; import type { Graph } from '../../core'; +import type { ItemOption } from './item_option'; export interface ItemOptions extends Graph { curie: 'fx:item_options'; diff --git a/src/integration/Graph/items.d.ts b/src/integration/Graph/items.d.ts index 1869228..26b9b4d 100644 --- a/src/integration/Graph/items.d.ts +++ b/src/integration/Graph/items.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { Item } from './item'; import type { Graph } from '../../core'; +import type { Item } from './item'; export interface Items extends Graph { curie: 'fx:items'; diff --git a/src/integration/Graph/language_override.d.ts b/src/integration/Graph/language_override.d.ts index b921012..b229907 100644 --- a/src/integration/Graph/language_override.d.ts +++ b/src/integration/Graph/language_override.d.ts @@ -1,7 +1,7 @@ +import type { Graph } from '../../core'; import type { LanguageOverrides } from './language_overrides'; import type { Store } from './store'; import type { TemplateSet } from './template_set'; -import type { Graph } from '../../core'; export interface LanguageOverride extends Graph { curie: 'fx:language_override'; diff --git a/src/integration/Graph/language_overrides.d.ts b/src/integration/Graph/language_overrides.d.ts index 888dc20..b98e365 100644 --- a/src/integration/Graph/language_overrides.d.ts +++ b/src/integration/Graph/language_overrides.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { LanguageOverride } from './language_override'; import type { Graph } from '../../core'; +import type { LanguageOverride } from './language_override'; export interface LanguageOverrides extends Graph { curie: 'fx:language_overrides'; diff --git a/src/integration/Graph/language_strings.d.ts b/src/integration/Graph/language_strings.d.ts index cb82599..a475001 100644 --- a/src/integration/Graph/language_strings.d.ts +++ b/src/integration/Graph/language_strings.d.ts @@ -1,5 +1,5 @@ -import type { PropertyHelpers } from './property_helpers'; import type { Graph } from '../../core'; +import type { PropertyHelpers } from './property_helpers'; interface StringRecord { [key: string]: StringRecord; diff --git a/src/integration/Graph/languages.d.ts b/src/integration/Graph/languages.d.ts index 08fa400..2284857 100644 --- a/src/integration/Graph/languages.d.ts +++ b/src/integration/Graph/languages.d.ts @@ -1,5 +1,5 @@ -import type { PropertyHelpers } from './property_helpers'; import type { Graph } from '../../core'; +import type { PropertyHelpers } from './property_helpers'; export interface Languages extends Graph { curie: 'fx:languages'; diff --git a/src/integration/Graph/last_transaction.d.ts b/src/integration/Graph/last_transaction.d.ts index 06d9369..cb85411 100644 --- a/src/integration/Graph/last_transaction.d.ts +++ b/src/integration/Graph/last_transaction.d.ts @@ -1,5 +1,5 @@ -import type { Transaction } from './transaction'; import type { Graph } from '../../core'; +import type { Transaction } from './transaction'; export interface LastTransaction extends Graph { curie: 'fx:last_transaction'; diff --git a/src/integration/Graph/locale_codes.d.ts b/src/integration/Graph/locale_codes.d.ts index 49989ac..3867c49 100644 --- a/src/integration/Graph/locale_codes.d.ts +++ b/src/integration/Graph/locale_codes.d.ts @@ -1,5 +1,5 @@ -import type { PropertyHelpers } from './property_helpers'; import type { Graph } from '../../core'; +import type { PropertyHelpers } from './property_helpers'; export interface LocaleCodes extends Graph { curie: 'fx:locale_codes'; diff --git a/src/integration/Graph/native_integration.d.ts b/src/integration/Graph/native_integration.d.ts index 173385b..6cd0651 100644 --- a/src/integration/Graph/native_integration.d.ts +++ b/src/integration/Graph/native_integration.d.ts @@ -1,5 +1,5 @@ -import type { Store } from './store'; import type { Graph } from '../../core'; +import type { Store } from './store'; export interface NativeIntegration extends Graph { curie: 'fx:native_integration'; diff --git a/src/integration/Graph/native_integrations.d.ts b/src/integration/Graph/native_integrations.d.ts index a17fc8b..388ec6f 100644 --- a/src/integration/Graph/native_integrations.d.ts +++ b/src/integration/Graph/native_integrations.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { NativeIntegration } from './native_integration'; import type { Graph } from '../../core'; +import type { NativeIntegration } from './native_integration'; export interface NativeIntegrations extends Graph { curie: 'fx:native_integrations'; diff --git a/src/integration/Graph/original_transaction.d.ts b/src/integration/Graph/original_transaction.d.ts index bc36c84..db09d74 100644 --- a/src/integration/Graph/original_transaction.d.ts +++ b/src/integration/Graph/original_transaction.d.ts @@ -1,5 +1,5 @@ -import type { Transaction } from './transaction'; import type { Graph } from '../../core'; +import type { Transaction } from './transaction'; export interface OriginalTransaction extends Graph { curie: 'fx:original_transaction'; diff --git a/src/integration/Graph/payment.d.ts b/src/integration/Graph/payment.d.ts index 6a634f4..2d10188 100644 --- a/src/integration/Graph/payment.d.ts +++ b/src/integration/Graph/payment.d.ts @@ -1,6 +1,6 @@ +import type { Graph } from '../../core'; import type { Store } from './store'; import type { Transaction } from './transaction'; -import type { Graph } from '../../core'; export interface Payment extends Graph { curie: 'fx:payment'; diff --git a/src/integration/Graph/payment_gateway.d.ts b/src/integration/Graph/payment_gateway.d.ts index 38a05c0..aaa6382 100644 --- a/src/integration/Graph/payment_gateway.d.ts +++ b/src/integration/Graph/payment_gateway.d.ts @@ -1,6 +1,6 @@ +import type { Graph } from '../../core'; import type { PaymentMethodSets } from './payment_method_sets'; import type { Store } from './store'; -import type { Graph } from '../../core'; export interface PaymentGateway extends Graph { curie: 'fx:payment_gateway'; diff --git a/src/integration/Graph/payment_gateways.d.ts b/src/integration/Graph/payment_gateways.d.ts index 74a5060..9005bcf 100644 --- a/src/integration/Graph/payment_gateways.d.ts +++ b/src/integration/Graph/payment_gateways.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { PaymentGateway } from './payment_gateway'; import type { Graph } from '../../core'; +import type { PaymentGateway } from './payment_gateway'; export interface PaymentGateways extends Graph { curie: 'fx:payment_gateways'; diff --git a/src/integration/Graph/payment_method_expiring.d.ts b/src/integration/Graph/payment_method_expiring.d.ts index 2853152..b22e14e 100644 --- a/src/integration/Graph/payment_method_expiring.d.ts +++ b/src/integration/Graph/payment_method_expiring.d.ts @@ -1,9 +1,9 @@ import type { Customer } from './customer'; import type { DefaultBillingAddress } from './default_billing_address'; import type { DefaultPaymentMethod } from './default_payment_method'; +import type { Graph } from '../../core'; import type { Store } from './store'; import type { Subscriptions } from './subscriptions'; -import type { Graph } from '../../core'; export interface PaymentMethodExpiring extends Graph { curie: 'fx:payment_method_expiring'; diff --git a/src/integration/Graph/payment_method_set.d.ts b/src/integration/Graph/payment_method_set.d.ts index ca6bef0..da14a67 100644 --- a/src/integration/Graph/payment_method_set.d.ts +++ b/src/integration/Graph/payment_method_set.d.ts @@ -1,9 +1,9 @@ +import type { Graph } from '../../core'; import type { PaymentGateway } from './payment_gateway'; import type { PaymentMethodSetFraudProtections } from './payment_method_set_fraud_protections'; import type { PaymentMethodSetHostedPaymentGateways } from './payment_method_set_hosted_payment_gateways'; import type { PaymentMethodSets } from './payment_method_sets'; import type { Store } from './store'; -import type { Graph } from '../../core'; export interface PaymentMethodSet extends Graph { curie: 'fx:payment_method_set'; diff --git a/src/integration/Graph/payment_method_set_fraud_protection.d.ts b/src/integration/Graph/payment_method_set_fraud_protection.d.ts index 3a549d4..4958bb3 100644 --- a/src/integration/Graph/payment_method_set_fraud_protection.d.ts +++ b/src/integration/Graph/payment_method_set_fraud_protection.d.ts @@ -1,7 +1,7 @@ import type { FraudProtection } from './fraud_protection'; +import type { Graph } from '../../core'; import type { PaymentMethodSet } from './payment_method_set'; import type { Store } from './store'; -import type { Graph } from '../../core'; export interface PaymentMethodSetFraudProtection extends Graph { curie: 'fx:payment_method_set_fraud_protection'; diff --git a/src/integration/Graph/payment_method_set_fraud_protections.d.ts b/src/integration/Graph/payment_method_set_fraud_protections.d.ts index ca4d6ea..ceac1e8 100644 --- a/src/integration/Graph/payment_method_set_fraud_protections.d.ts +++ b/src/integration/Graph/payment_method_set_fraud_protections.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { PaymentMethodSetFraudProtection } from './payment_method_set_fraud_protection'; import type { Graph } from '../../core'; +import type { PaymentMethodSetFraudProtection } from './payment_method_set_fraud_protection'; export interface PaymentMethodSetFraudProtections extends Graph { curie: 'fx:payment_method_set_fraud_protections'; diff --git a/src/integration/Graph/payment_method_set_hosted_payment_gateway.d.ts b/src/integration/Graph/payment_method_set_hosted_payment_gateway.d.ts index 2bd70c0..c4f166e 100644 --- a/src/integration/Graph/payment_method_set_hosted_payment_gateway.d.ts +++ b/src/integration/Graph/payment_method_set_hosted_payment_gateway.d.ts @@ -1,7 +1,7 @@ +import type { Graph } from '../../core'; import type { HostedPaymentGateway } from './hosted_payment_gateway'; import type { PaymentMethodSet } from './payment_method_set'; import type { Store } from './store'; -import type { Graph } from '../../core'; export interface PaymentMethodSetHostedPaymentGateway extends Graph { curie: 'fx:payment_method_set_hosted_payment_gateway'; diff --git a/src/integration/Graph/payment_method_set_hosted_payment_gateways.d.ts b/src/integration/Graph/payment_method_set_hosted_payment_gateways.d.ts index de71ace..81165dc 100644 --- a/src/integration/Graph/payment_method_set_hosted_payment_gateways.d.ts +++ b/src/integration/Graph/payment_method_set_hosted_payment_gateways.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { PaymentMethodSetHostedPaymentGateway } from './payment_method_set_hosted_payment_gateway'; import type { Graph } from '../../core'; +import type { PaymentMethodSetHostedPaymentGateway } from './payment_method_set_hosted_payment_gateway'; export interface PaymentMethodSetHostedPaymentGateways extends Graph { curie: 'fx:payment_method_set_hosted_payment_gateways'; diff --git a/src/integration/Graph/payment_method_sets.d.ts b/src/integration/Graph/payment_method_sets.d.ts index 531494d..2840659 100644 --- a/src/integration/Graph/payment_method_sets.d.ts +++ b/src/integration/Graph/payment_method_sets.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { PaymentMethodSet } from './payment_method_set'; import type { Graph } from '../../core'; +import type { PaymentMethodSet } from './payment_method_set'; export interface PaymentMethodSets extends Graph { curie: 'fx:payment_method_sets'; diff --git a/src/integration/Graph/payments.d.ts b/src/integration/Graph/payments.d.ts index 49a7b9b..6679118 100644 --- a/src/integration/Graph/payments.d.ts +++ b/src/integration/Graph/payments.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { Payment } from './payment'; import type { Graph } from '../../core'; +import type { Payment } from './payment'; export interface Payments extends Graph { curie: 'fx:payments'; diff --git a/src/integration/Graph/property_helpers.d.ts b/src/integration/Graph/property_helpers.d.ts index 9cb1924..31c3ff2 100644 --- a/src/integration/Graph/property_helpers.d.ts +++ b/src/integration/Graph/property_helpers.d.ts @@ -2,6 +2,7 @@ import type { CheckoutTypes } from './checkout_types'; import type { Countries } from './countries'; import type { CustomerPasswordHashTypes } from './customer_password_hash_types'; import type { DefaultTemplates } from './default_templates'; +import type { Graph } from '../../core'; import type { HostedPaymentGateways } from './hosted_payment_gateways'; import type { LanguageStrings } from './language_strings'; import type { Languages } from './languages'; @@ -12,7 +13,6 @@ import type { ShippingAddressTypes } from './shipping_address_types'; import type { ShippingMethods } from './shipping_methods'; import type { StoreVersions } from './store_versions'; import type { Timezones } from './timezones'; -import type { Graph } from '../../core'; export interface PropertyHelpers extends Graph { curie: 'fx:property_helpers'; diff --git a/src/integration/Graph/receipt_template.d.ts b/src/integration/Graph/receipt_template.d.ts index 8c75bda..e46189f 100644 --- a/src/integration/Graph/receipt_template.d.ts +++ b/src/integration/Graph/receipt_template.d.ts @@ -1,8 +1,8 @@ import type { Cache } from './cache'; import type { Encode } from './encode'; +import type { Graph } from '../../core'; import type { Store } from './store'; import type { TemplateSets } from './template_sets'; -import type { Graph } from '../../core'; export interface ReceiptTemplate extends Graph { curie: 'fx:receipt_template'; diff --git a/src/integration/Graph/receipt_templates.d.ts b/src/integration/Graph/receipt_templates.d.ts index a113154..7a8c9dd 100644 --- a/src/integration/Graph/receipt_templates.d.ts +++ b/src/integration/Graph/receipt_templates.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { ReceiptTemplate } from './receipt_template'; import type { Graph } from '../../core'; +import type { ReceiptTemplate } from './receipt_template'; export interface ReceiptTemplates extends Graph { curie: 'fx:receipt_templates'; diff --git a/src/integration/Graph/regions.d.ts b/src/integration/Graph/regions.d.ts index 75212eb..3428e62 100644 --- a/src/integration/Graph/regions.d.ts +++ b/src/integration/Graph/regions.d.ts @@ -1,5 +1,5 @@ -import type { PropertyHelpers } from './property_helpers'; import type { Graph } from '../../core'; +import type { PropertyHelpers } from './property_helpers'; export interface Regions extends Graph { curie: 'fx:regions'; diff --git a/src/integration/Graph/reporting.d.ts b/src/integration/Graph/reporting.d.ts index beb1536..dde9b3f 100644 --- a/src/integration/Graph/reporting.d.ts +++ b/src/integration/Graph/reporting.d.ts @@ -1,6 +1,6 @@ +import type { Graph } from '../../core'; import type { ReportingEmailExists } from './reporting_email_exists'; import type { ReportingStoreDomainExists } from './reporting_store_domain_exists'; -import type { Graph } from '../../core'; export interface Reporting extends Graph { curie: 'fx:reporting'; diff --git a/src/integration/Graph/reporting_email_exists.d.ts b/src/integration/Graph/reporting_email_exists.d.ts index e0759da..9555921 100644 --- a/src/integration/Graph/reporting_email_exists.d.ts +++ b/src/integration/Graph/reporting_email_exists.d.ts @@ -1,6 +1,6 @@ +import type { Graph } from '../../core'; import type { Reporting } from './reporting'; import type { User } from './user'; -import type { Graph } from '../../core'; export interface ReportingEmailExists extends Graph { curie: 'fx:reporting_email_exists'; diff --git a/src/integration/Graph/reporting_store_domain_exists.d.ts b/src/integration/Graph/reporting_store_domain_exists.d.ts index 58d2f59..1c163e5 100644 --- a/src/integration/Graph/reporting_store_domain_exists.d.ts +++ b/src/integration/Graph/reporting_store_domain_exists.d.ts @@ -1,6 +1,6 @@ +import type { Graph } from '../../core'; import type { Reporting } from './reporting'; import type { Store } from './store'; -import type { Graph } from '../../core'; export interface ReportingStoreDomainExists extends Graph { curie: 'fx:reporting_store_domain_exists'; diff --git a/src/integration/Graph/shipment.d.ts b/src/integration/Graph/shipment.d.ts index dd9bd64..51bc50c 100644 --- a/src/integration/Graph/shipment.d.ts +++ b/src/integration/Graph/shipment.d.ts @@ -1,10 +1,10 @@ import type { Customer } from './customer'; import type { CustomerAddress } from './customer_address'; +import type { Graph } from '../../core'; import type { Items } from './items'; import type { Shipments } from './shipments'; import type { Store } from './store'; import type { Transaction } from './transaction'; -import type { Graph } from '../../core'; export interface Shipment extends Graph { curie: 'fx:shipment'; diff --git a/src/integration/Graph/shipments.d.ts b/src/integration/Graph/shipments.d.ts index bf31610..7f0f712 100644 --- a/src/integration/Graph/shipments.d.ts +++ b/src/integration/Graph/shipments.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { Shipment } from './shipment'; import type { Graph } from '../../core'; +import type { Shipment } from './shipment'; export interface Shipments extends Graph { curie: 'fx:shipments'; diff --git a/src/integration/Graph/shipping_address_types.d.ts b/src/integration/Graph/shipping_address_types.d.ts index d119858..daf1d31 100644 --- a/src/integration/Graph/shipping_address_types.d.ts +++ b/src/integration/Graph/shipping_address_types.d.ts @@ -1,5 +1,5 @@ -import type { PropertyHelpers } from './property_helpers'; import type { Graph } from '../../core'; +import type { PropertyHelpers } from './property_helpers'; export interface ShippingAddressTypes extends Graph { curie: 'fx:shipping_address_types'; diff --git a/src/integration/Graph/shipping_container.d.ts b/src/integration/Graph/shipping_container.d.ts index 84df8b5..c668dc2 100644 --- a/src/integration/Graph/shipping_container.d.ts +++ b/src/integration/Graph/shipping_container.d.ts @@ -1,8 +1,8 @@ +import type { Graph } from '../../core'; import type { PropertyHelpers } from './property_helpers'; import type { ShippingContainers } from './shipping_containers'; import type { ShippingMethod } from './shipping_method'; import type { ShippingMethods } from './shipping_methods'; -import type { Graph } from '../../core'; export interface ShippingContainer extends Graph { curie: 'fx:shipping_container'; diff --git a/src/integration/Graph/shipping_containers.d.ts b/src/integration/Graph/shipping_containers.d.ts index db85907..36f5cbb 100644 --- a/src/integration/Graph/shipping_containers.d.ts +++ b/src/integration/Graph/shipping_containers.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { ShippingContainer } from './shipping_container'; import type { Graph } from '../../core'; +import type { ShippingContainer } from './shipping_container'; export interface ShippingContainers extends Graph { curie: 'fx:shipping_containers'; diff --git a/src/integration/Graph/shipping_drop_type.d.ts b/src/integration/Graph/shipping_drop_type.d.ts index fad88b6..e487749 100644 --- a/src/integration/Graph/shipping_drop_type.d.ts +++ b/src/integration/Graph/shipping_drop_type.d.ts @@ -1,8 +1,8 @@ +import type { Graph } from '../../core'; import type { PropertyHelpers } from './property_helpers'; import type { ShippingDropTypes } from './shipping_drop_types'; import type { ShippingMethod } from './shipping_method'; import type { ShippingMethods } from './shipping_methods'; -import type { Graph } from '../../core'; export interface ShippingDropType extends Graph { curie: 'fx:shipping_drop_type'; diff --git a/src/integration/Graph/shipping_drop_types.d.ts b/src/integration/Graph/shipping_drop_types.d.ts index bfa867f..1c89892 100644 --- a/src/integration/Graph/shipping_drop_types.d.ts +++ b/src/integration/Graph/shipping_drop_types.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { ShippingDropType } from './shipping_drop_type'; import type { Graph } from '../../core'; +import type { ShippingDropType } from './shipping_drop_type'; export interface ShippingDropTypes extends Graph { curie: 'fx:shipping_drop_types'; diff --git a/src/integration/Graph/shipping_method.d.ts b/src/integration/Graph/shipping_method.d.ts index 2ff247a..5c17e58 100644 --- a/src/integration/Graph/shipping_method.d.ts +++ b/src/integration/Graph/shipping_method.d.ts @@ -1,9 +1,9 @@ +import type { Graph } from '../../core'; import type { PropertyHelpers } from './property_helpers'; import type { ShippingContainers } from './shipping_containers'; import type { ShippingDropTypes } from './shipping_drop_types'; import type { ShippingMethods } from './shipping_methods'; import type { ShippingServices } from './shipping_services'; -import type { Graph } from '../../core'; export interface ShippingMethod extends Graph { curie: 'fx:shipping_method'; diff --git a/src/integration/Graph/shipping_methods.d.ts b/src/integration/Graph/shipping_methods.d.ts index 4af75d4..aca4d3a 100644 --- a/src/integration/Graph/shipping_methods.d.ts +++ b/src/integration/Graph/shipping_methods.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { ShippingMethod } from './shipping_method'; import type { Graph } from '../../core'; +import type { ShippingMethod } from './shipping_method'; export interface ShippingMethods extends Graph { curie: 'fx:shipping_methods'; diff --git a/src/integration/Graph/shipping_service.d.ts b/src/integration/Graph/shipping_service.d.ts index 87189f5..166cfc8 100644 --- a/src/integration/Graph/shipping_service.d.ts +++ b/src/integration/Graph/shipping_service.d.ts @@ -1,7 +1,7 @@ +import type { Graph } from '../../core'; import type { PropertyHelpers } from './property_helpers'; import type { ShippingMethod } from './shipping_method'; import type { ShippingMethods } from './shipping_methods'; -import type { Graph } from '../../core'; export interface ShippingService extends Graph { curie: 'fx:shipping_service'; diff --git a/src/integration/Graph/shipping_services.d.ts b/src/integration/Graph/shipping_services.d.ts index f95fb18..ba3ac7d 100644 --- a/src/integration/Graph/shipping_services.d.ts +++ b/src/integration/Graph/shipping_services.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { ShippingService } from './shipping_service'; import type { Graph } from '../../core'; +import type { ShippingService } from './shipping_service'; export interface ShippingServices extends Graph { curie: 'fx:shipping_services'; diff --git a/src/integration/Graph/store.d.ts b/src/integration/Graph/store.d.ts index c1e1ad2..dcbc3e1 100644 --- a/src/integration/Graph/store.d.ts +++ b/src/integration/Graph/store.d.ts @@ -10,6 +10,7 @@ import type { Downloadables } from './downloadables'; import type { EmailTemplates } from './email_templates'; import type { ErrorEntries } from './error_entries'; import type { FraudProtections } from './fraud_protections'; +import type { Graph } from '../../core'; import type { HostedPaymentGateways } from './hosted_payment_gateways'; import type { ItemCategories } from './item_categories'; import type { PaymentMethodSets } from './payment_method_sets'; @@ -23,7 +24,6 @@ import type { TemplateSets } from './template_sets'; import type { Transactions } from './transactions'; import type { UserAccesses } from './user_accesses'; import type { Users } from './users'; -import type { Graph } from '../../core'; export interface Store extends Graph { curie: 'fx:store'; diff --git a/src/integration/Graph/store_shipping_method.d.ts b/src/integration/Graph/store_shipping_method.d.ts index 8a8a710..4ab4efb 100644 --- a/src/integration/Graph/store_shipping_method.d.ts +++ b/src/integration/Graph/store_shipping_method.d.ts @@ -1,3 +1,4 @@ +import type { Graph } from '../../core'; import type { ShippingContainer } from './shipping_container'; import type { ShippingContainers } from './shipping_containers'; import type { ShippingDropType } from './shipping_drop_type'; @@ -7,7 +8,6 @@ import type { ShippingMethods } from './shipping_methods'; import type { ShippingServices } from './shipping_services'; import type { Store } from './store'; import type { StoreShippingServices } from './store_shipping_services'; -import type { Graph } from '../../core'; export interface StoreShippingMethod extends Graph { curie: 'fx:store_shipping_method'; diff --git a/src/integration/Graph/store_shipping_service.d.ts b/src/integration/Graph/store_shipping_service.d.ts index 9395964..7b1588d 100644 --- a/src/integration/Graph/store_shipping_service.d.ts +++ b/src/integration/Graph/store_shipping_service.d.ts @@ -1,9 +1,9 @@ +import type { Graph } from '../../core'; import type { ShippingMethod } from './shipping_method'; import type { ShippingMethods } from './shipping_methods'; import type { ShippingService } from './shipping_service'; import type { ShippingServices } from './shipping_services'; import type { Store } from './store'; -import type { Graph } from '../../core'; export interface StoreShippingService extends Graph { curie: 'fx:store_shipping_service'; diff --git a/src/integration/Graph/store_shipping_services.d.ts b/src/integration/Graph/store_shipping_services.d.ts index 3fb820c..ba65a18 100644 --- a/src/integration/Graph/store_shipping_services.d.ts +++ b/src/integration/Graph/store_shipping_services.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { StoreShippingService } from './store_shipping_service'; import type { Graph } from '../../core'; +import type { StoreShippingService } from './store_shipping_service'; export interface StoreShippingServices extends Graph { curie: 'fx:store_shipping_services'; diff --git a/src/integration/Graph/store_version.d.ts b/src/integration/Graph/store_version.d.ts index efe94a7..f5d6e8c 100644 --- a/src/integration/Graph/store_version.d.ts +++ b/src/integration/Graph/store_version.d.ts @@ -1,6 +1,6 @@ +import type { Graph } from '../../core'; import type { PropertyHelpers } from './property_helpers'; import type { StoreVersions } from './store_versions'; -import type { Graph } from '../../core'; export interface StoreVersion extends Graph { curie: 'fx:store_version'; diff --git a/src/integration/Graph/store_versions.d.ts b/src/integration/Graph/store_versions.d.ts index a6da0a4..b00a2b6 100644 --- a/src/integration/Graph/store_versions.d.ts +++ b/src/integration/Graph/store_versions.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { StoreVersion } from './store_version'; import type { Graph } from '../../core'; +import type { StoreVersion } from './store_version'; export interface StoreVersions extends Graph { curie: 'fx:store_versions'; diff --git a/src/integration/Graph/stores.d.ts b/src/integration/Graph/stores.d.ts index a45b588..8e4c520 100644 --- a/src/integration/Graph/stores.d.ts +++ b/src/integration/Graph/stores.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { Store } from './store'; import type { Graph } from '../../core'; +import type { Store } from './store'; export interface Stores extends Graph { curie: 'fx:stores'; diff --git a/src/integration/Graph/subscription.d.ts b/src/integration/Graph/subscription.d.ts index 2961e54..e16026c 100644 --- a/src/integration/Graph/subscription.d.ts +++ b/src/integration/Graph/subscription.d.ts @@ -1,12 +1,12 @@ import type { Attributes } from './attributes'; import type { Customer } from './customer'; +import type { Graph } from '../../core'; import type { LastTransaction } from './last_transaction'; import type { OriginalTransaction } from './original_transaction'; import type { Store } from './store'; import type { SubTokenUrl } from './sub_token_url'; import type { TransactionTemplate } from './transaction_template'; import type { Transactions } from './transactions'; -import type { Graph } from '../../core'; export interface Subscription extends Graph { curie: 'fx:subscription'; diff --git a/src/integration/Graph/subscription_settings.d.ts b/src/integration/Graph/subscription_settings.d.ts index fefdc22..ecb2c23 100644 --- a/src/integration/Graph/subscription_settings.d.ts +++ b/src/integration/Graph/subscription_settings.d.ts @@ -1,5 +1,5 @@ -import type { Store } from './store'; import type { Graph } from '../../core'; +import type { Store } from './store'; export interface SubscriptionSettings extends Graph { curie: 'fx:subscription_settings'; diff --git a/src/integration/Graph/subscriptions.d.ts b/src/integration/Graph/subscriptions.d.ts index ec0fbad..a1b392a 100644 --- a/src/integration/Graph/subscriptions.d.ts +++ b/src/integration/Graph/subscriptions.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { Subscription } from './subscription'; import type { Graph } from '../../core'; +import type { Subscription } from './subscription'; export interface Subscriptions extends Graph { curie: 'fx:subscriptions'; diff --git a/src/integration/Graph/tax.d.ts b/src/integration/Graph/tax.d.ts index 9686b50..e61dba8 100644 --- a/src/integration/Graph/tax.d.ts +++ b/src/integration/Graph/tax.d.ts @@ -1,7 +1,7 @@ +import type { Graph } from '../../core'; import type { NativeIntegrations } from './native_integrations'; import type { Store } from './store'; import type { TaxItemCategories } from './tax_item_categories'; -import type { Graph } from '../../core'; export interface Tax extends Graph { curie: 'fx:tax'; diff --git a/src/integration/Graph/tax_item_categories.d.ts b/src/integration/Graph/tax_item_categories.d.ts index 13e702c..de119c6 100644 --- a/src/integration/Graph/tax_item_categories.d.ts +++ b/src/integration/Graph/tax_item_categories.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { TaxItemCategory } from './tax_item_category'; import type { Graph } from '../../core'; +import type { TaxItemCategory } from './tax_item_category'; export interface TaxItemCategories extends Graph { curie: 'fx:tax_item_categories'; diff --git a/src/integration/Graph/tax_item_category.d.ts b/src/integration/Graph/tax_item_category.d.ts index 7255bc2..2e87b3c 100644 --- a/src/integration/Graph/tax_item_category.d.ts +++ b/src/integration/Graph/tax_item_category.d.ts @@ -1,7 +1,7 @@ +import type { Graph } from '../../core'; import type { ItemCategory } from './item_category'; import type { Store } from './store'; import type { Tax } from './tax'; -import type { Graph } from '../../core'; export interface TaxItemCategory extends Graph { curie: 'fx:tax_item_category'; diff --git a/src/integration/Graph/taxes.d.ts b/src/integration/Graph/taxes.d.ts index 68cc204..4266056 100644 --- a/src/integration/Graph/taxes.d.ts +++ b/src/integration/Graph/taxes.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { Tax } from './tax'; import type { Graph } from '../../core'; +import type { Tax } from './tax'; export interface Taxes extends Graph { curie: 'fx:taxes'; diff --git a/src/integration/Graph/template_config.d.ts b/src/integration/Graph/template_config.d.ts index d8bcf4d..019d8d8 100644 --- a/src/integration/Graph/template_config.d.ts +++ b/src/integration/Graph/template_config.d.ts @@ -1,6 +1,6 @@ +import type { Graph } from '../../core'; import type { Store } from './store'; import type { TemplateSets } from './template_sets'; -import type { Graph } from '../../core'; export interface TemplateConfig extends Graph { curie: 'fx:template_config'; diff --git a/src/integration/Graph/template_set.d.ts b/src/integration/Graph/template_set.d.ts index 395c2c1..ef4ff61 100644 --- a/src/integration/Graph/template_set.d.ts +++ b/src/integration/Graph/template_set.d.ts @@ -2,10 +2,10 @@ import type { CartIncludeTemplate } from './cart_include_template'; import type { CartTemplate } from './cart_template'; import type { CheckoutTemplate } from './checkout_template'; import type { EmailTemplate } from './email_template'; +import type { Graph } from '../../core'; import type { LanguageOverrides } from './language_overrides'; import type { ReceiptTemplate } from './receipt_template'; import type { Store } from './store'; -import type { Graph } from '../../core'; export interface TemplateSet extends Graph { curie: 'fx:template_set'; diff --git a/src/integration/Graph/template_sets.d.ts b/src/integration/Graph/template_sets.d.ts index 0b393eb..43dbe05 100644 --- a/src/integration/Graph/template_sets.d.ts +++ b/src/integration/Graph/template_sets.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { TemplateSet } from './template_set'; import type { Graph } from '../../core'; +import type { TemplateSet } from './template_set'; export interface TemplateSets extends Graph { curie: 'fx:template_sets'; diff --git a/src/integration/Graph/timezones.d.ts b/src/integration/Graph/timezones.d.ts index fe1dab2..9e85aba 100644 --- a/src/integration/Graph/timezones.d.ts +++ b/src/integration/Graph/timezones.d.ts @@ -1,5 +1,5 @@ -import type { PropertyHelpers } from './property_helpers'; import type { Graph } from '../../core'; +import type { PropertyHelpers } from './property_helpers'; export interface Timezones extends Graph { curie: 'fx:timezones'; diff --git a/src/integration/Graph/transaction.d.ts b/src/integration/Graph/transaction.d.ts index af92672..901e456 100644 --- a/src/integration/Graph/transaction.d.ts +++ b/src/integration/Graph/transaction.d.ts @@ -5,6 +5,7 @@ import type { Capture } from './capture'; import type { CustomFields } from './custom_fields'; import type { Customer } from './customer'; import type { Discounts } from './discounts'; +import type { Graph } from '../../core'; import type { Items } from './items'; import type { NativeIntegrations } from './native_integrations'; import type { Payments } from './payments'; @@ -16,7 +17,6 @@ import type { Shipments } from './shipments'; import type { Store } from './store'; import type { TransactionLogs } from './transaction_logs'; import type { Void } from './void'; -import type { Graph } from '../../core'; export interface Transaction extends Graph { curie: 'fx:transaction'; diff --git a/src/integration/Graph/transaction_log.d.ts b/src/integration/Graph/transaction_log.d.ts index b7f3ee3..ac0f51a 100644 --- a/src/integration/Graph/transaction_log.d.ts +++ b/src/integration/Graph/transaction_log.d.ts @@ -1,9 +1,9 @@ import type { Customer } from './customer'; +import type { Graph } from '../../core'; import type { Store } from './store'; import type { Transaction } from './transaction'; import type { TransactionLogDetails } from './transaction_log_details'; import type { User } from './user'; -import type { Graph } from '../../core'; export interface TransactionLog extends Graph { curie: 'fx:transaction_logs'; diff --git a/src/integration/Graph/transaction_log_detail.d.ts b/src/integration/Graph/transaction_log_detail.d.ts index 6c6630e..9ed076d 100644 --- a/src/integration/Graph/transaction_log_detail.d.ts +++ b/src/integration/Graph/transaction_log_detail.d.ts @@ -1,6 +1,6 @@ +import type { Graph } from '../../core'; import type { Store } from './store'; import type { TransactionLog } from './transaction_log'; -import type { Graph } from '../../core'; export interface TransactionLogDetail extends Graph { curie: 'fx:transaction_log_detail'; diff --git a/src/integration/Graph/transaction_log_details.d.ts b/src/integration/Graph/transaction_log_details.d.ts index 37fe39d..cbefec1 100644 --- a/src/integration/Graph/transaction_log_details.d.ts +++ b/src/integration/Graph/transaction_log_details.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { TransactionLogDetail } from './transaction_log_detail'; import type { Graph } from '../../core'; +import type { TransactionLogDetail } from './transaction_log_detail'; export interface TransactionLogDetails extends Graph { curie: 'fx:transaction_log_details'; diff --git a/src/integration/Graph/transaction_logs.d.ts b/src/integration/Graph/transaction_logs.d.ts index a6411f6..94b2f4d 100644 --- a/src/integration/Graph/transaction_logs.d.ts +++ b/src/integration/Graph/transaction_logs.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { TransactionLog } from './transaction_log'; import type { Graph } from '../../core'; +import type { TransactionLog } from './transaction_log'; export interface TransactionLogs extends Graph { curie: 'fx:transaction_logs'; diff --git a/src/integration/Graph/transactions.d.ts b/src/integration/Graph/transactions.d.ts index 631f31d..752c7c9 100644 --- a/src/integration/Graph/transactions.d.ts +++ b/src/integration/Graph/transactions.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { Transaction } from './transaction'; import type { Graph } from '../../core'; +import type { Transaction } from './transaction'; export interface Transactions extends Graph { curie: 'fx:transactions'; diff --git a/src/integration/Graph/user.d.ts b/src/integration/Graph/user.d.ts index 4affd2a..9348bab 100644 --- a/src/integration/Graph/user.d.ts +++ b/src/integration/Graph/user.d.ts @@ -1,7 +1,7 @@ import type { Attributes } from './attributes'; import type { DefaultStore } from './default_store'; -import type { Stores } from './stores'; import type { Graph } from '../../core'; +import type { Stores } from './stores'; export interface User extends Graph { curie: 'fx:user'; diff --git a/src/integration/Graph/user_access.d.ts b/src/integration/Graph/user_access.d.ts index 5c0594c..3653bf6 100644 --- a/src/integration/Graph/user_access.d.ts +++ b/src/integration/Graph/user_access.d.ts @@ -1,6 +1,6 @@ +import type { Graph } from '../../core'; import type { Store } from './store'; import type { User } from './user'; -import type { Graph } from '../../core'; export interface UserAccess extends Graph { curie: 'fx:user_access'; diff --git a/src/integration/Graph/user_accesses.d.ts b/src/integration/Graph/user_accesses.d.ts index 988b460..ec0bb26 100644 --- a/src/integration/Graph/user_accesses.d.ts +++ b/src/integration/Graph/user_accesses.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { UserAccess } from './user_access'; import type { Graph } from '../../core'; +import type { UserAccess } from './user_access'; export interface UserAccesses extends Graph { curie: 'fx:user_accesses'; diff --git a/src/integration/Graph/users.d.ts b/src/integration/Graph/users.d.ts index 7a1108e..a09b049 100644 --- a/src/integration/Graph/users.d.ts +++ b/src/integration/Graph/users.d.ts @@ -1,6 +1,6 @@ import type { CollectionGraphLinks, CollectionGraphProps } from '../../core/defaults'; -import type { User } from './user'; import type { Graph } from '../../core'; +import type { User } from './user'; export interface Users extends Graph { curie: 'fx:users'; diff --git a/tests/integration/API.test.ts b/tests/integration/API.test.ts index 6689976..9b7de90 100644 --- a/tests/integration/API.test.ts +++ b/tests/integration/API.test.ts @@ -9,9 +9,9 @@ jest.mock('cross-fetch', () => ({ import { Headers, Request, Response, fetch } from 'cross-fetch'; import { API as CoreAPI } from '../../src/core/API'; -import { Token } from '../../src/integration/Rels'; import { API as IntegrationAPI } from '../../src/integration/API'; import MemoryCache from 'fake-storage'; +import { Token } from '../../src/integration/Rels'; const fetchMock = (fetch as unknown) as jest.MockInstance; From 9024c0108262b51b4ecaf57ed7daed75a29890e1 Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Fri, 4 Dec 2020 16:18:45 +0300 Subject: [PATCH 61/98] feat: add `Integration.API.getToken()` method for OAuth This commit removes misleading type definitions for `fx:token` and adds a separate method for obtaining access token from hAPI with OAuth. --- src/integration/API.ts | 89 +++++++++++++++++++++-------- src/integration/Graph/index.d.ts | 5 +- src/integration/Graph/token.d.ts | 18 ------ src/integration/Rels.d.ts | 1 - tests/integration/API.test.ts | 97 +++++++++++++++++++++++++++++++- 5 files changed, 162 insertions(+), 48 deletions(-) delete mode 100644 src/integration/Graph/token.d.ts diff --git a/src/integration/API.ts b/src/integration/API.ts index a15b1f8..75b7c60 100644 --- a/src/integration/API.ts +++ b/src/integration/API.ts @@ -1,5 +1,4 @@ import * as Core from '../core'; -import * as Rels from './Rels'; import { Headers, fetch } from 'cross-fetch'; import { storageV8N, v8n } from '../core/v8n'; @@ -8,8 +7,6 @@ import { Graph } from './Graph'; import { LogLevel } from 'consola'; import MemoryStorage from 'fake-storage'; -type LocalToken = Rels.Token['props'] & { date_created: string }; - /** In order to facilitate any major, unforeseen breaking changes in the future, we require each request to include API version. We hope to rarely (never?) change it but by requiring it up front, we can ensure what you get today is what you’ll get tomorrow. */ type IntegrationAPIVersion = '1'; @@ -25,6 +22,23 @@ type IntegrationAPIInit = { cache?: Storage; }; +type GrantOpts = ({ code: string } | { refreshToken: string }) & { + clientSecret: string; + clientId: string; + version?: IntegrationAPIVersion; + base?: URL; // pathname ending with "/" !!! +}; + +type Token = { + refresh_token: string; + access_token: string; + expires_in: number; + token_type: string; + scope: string; +}; + +type StoredToken = Token & { date_created: string }; + /** JS SDK for building integrations with [Foxy Hypermedia API](https://api.foxycart.com/docs). Hypermedia API is designed to give you complete control over all aspects of your Foxy accounts, whether working with a single store or automating the provisioning of thousands. Anything you can do within the Foxy administration, you can also do through the API. This means that you can embed Foxy into any application (CMS, LMS, CRM, etc.) and expose as much or as little of Foxy's functionality as desired. */ export class API extends Core.API { static readonly REFRESH_THRESHOLD = 5 * 60 * 1000; @@ -46,8 +60,49 @@ export class API extends Core.API { storage: v8n().optional(storageV8N), version: v8n().optional(v8n().passesAnyOf(v8n().exact('1'))), }), + + getAccessToken: v8n() + .passesAnyOf(v8n().schema({ code: v8n().string() }), v8n().schema({ refreshToken: v8n().string() })) + .schema({ + base: v8n().optional(v8n().instanceOf(URL)), + clientId: v8n().string(), + clientSecret: v8n().string(), + version: v8n().optional(v8n().passesAnyOf(v8n().exact('1'))), + }), }; + /** + * Fetches a new access token in exchange for an authorization code + * or a refresh token. See more in our [authentication docs](https://api.foxycart.com/docs/authentication). + * + * @param opts Request options. + * @returns Access token with additional info on success, null on failure. + */ + static async getToken(opts: GrantOpts): Promise { + API.v8n.getAccessToken.check(opts); + + const headers = new Headers(); + const body = new URLSearchParams(); + const url = new URL('token', opts.base ?? API.BASE_URL).toString(); + + headers.set('FOXY-API-VERSION', opts.version ?? API.VERSION); + headers.set('Content-Type', 'application/x-www-form-urlencoded'); + + body.set('client_id', opts.clientId); + body.set('client_secret', opts.clientSecret); + + if ('code' in opts) { + body.set('code', opts.code); + body.set('grant_type', 'authorization_code'); + } else { + body.set('grant_type', 'refresh_token'); + body.set('refresh_token', opts.refreshToken); + } + + const response = await fetch(url, { body, headers, method: 'POST' }); + return response.ok ? await response.json() : null; + } + readonly refreshToken: string; readonly clientSecret: string; @@ -74,7 +129,7 @@ export class API extends Core.API { } private async __fetch(input: RequestInfo, init?: RequestInit): Promise { - let token = JSON.parse(this.storage.getItem(API.ACCESS_TOKEN) ?? 'null') as LocalToken | null; + let token = JSON.parse(this.storage.getItem(API.ACCESS_TOKEN) ?? 'null') as StoredToken | null; if (token !== null) { const expiresAt = new Date(token.date_created).getTime() + token.expires_in * 1000; @@ -88,24 +143,11 @@ export class API extends Core.API { } if (token === null) { - const headers = new Headers(); - const body = new URLSearchParams(); - const url = new URL('token', this.base).toString(); - - headers.set('FOXY-API-VERSION', this.version); - headers.set('Content-Type', 'application/x-www-form-urlencoded'); - - body.set('client_id', this.clientId); - body.set('client_secret', this.clientSecret); - body.set('grant_type', 'refresh_token'); - body.set('refresh_token', this.refreshToken); - this.console.trace("Access token isn't present in the storage. Fetching a new one..."); - const response = await fetch(url, { body, headers, method: 'POST' }); + const rawToken = await API.getToken(this); - if (response.ok) { - const props = (await response.json()) as Rels.Token['props']; - token = { ...props, date_created: new Date().toISOString() }; + if (rawToken) { + token = { ...rawToken, date_created: new Date().toISOString() }; this.storage.setItem(API.ACCESS_TOKEN, JSON.stringify(token)); this.console.info('Access token updated.'); } else { @@ -117,10 +159,9 @@ export class API extends Core.API { const method = init?.method?.toUpperCase() ?? 'GET'; const url = typeof input === 'string' ? input : input.url; - headers.set('FOXY-API-VERSION', this.version); - headers.set('Content-Type', 'application/json'); - - if (token !== null) headers.set('Authorization', `Bearer ${token.access_token}`); + if (!headers.get('Authorization') && token) headers.set('Authorization', `Bearer ${token.access_token}`); + if (!headers.get('Content-Type')) headers.set('Content-Type', 'application/json'); + if (!headers.get('FOXY-API-VERSION')) headers.set('FOXY-API-VERSION', this.version); this.console.trace(`${method} ${url}`); return fetch(input, { ...init, headers }); diff --git a/src/integration/Graph/index.d.ts b/src/integration/Graph/index.d.ts index 89563ec..f678bd7 100644 --- a/src/integration/Graph/index.d.ts +++ b/src/integration/Graph/index.d.ts @@ -4,7 +4,6 @@ import type { PropertyHelpers } from './property_helpers'; import type { Reporting } from './reporting'; import type { Store } from './store'; import type { Stores } from './stores'; -import type { Token } from './token'; import type { User } from './user'; export interface Graph extends Core.Graph { @@ -21,8 +20,8 @@ export interface Graph extends Core.Graph { 'fx:stores': Stores; /** The current store for your authentication token. */ 'fx:store': Store; - /** The OAuth endpoint for obtaining a new access_token using an existing refresh_token. POST `www-form-url-encoded` data as follows: `grant_type=refresh_token&refresh_token={refresh_token}&client_id={client_id}&client_secret={client_secret}`. */ - 'fx:token': Token; + /** OAuth endpoint for obtaining an access + refresh token pair. Please use the `FoxySDK.Integration.API.getAccessToken()` method to work with this endpoint. */ + 'fx:token': never; /** Your API home page. */ 'fx:user': User; }; diff --git a/src/integration/Graph/token.d.ts b/src/integration/Graph/token.d.ts deleted file mode 100644 index 5a7d814..0000000 --- a/src/integration/Graph/token.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { Graph } from '../../core'; - -export interface Token extends Graph { - curie: 'fx:token'; - - props: { - /** The OAuth refresh token. This token is returned in the response whenever creating a client, user or store or when doing an authorization code grant. */ - refresh_token: string; - /** The OAuth access token. Access tokens expire after 7200 seconds (2 hours). */ - access_token: string; - /** Lifespan of the access token in seconds. */ - expires_in: number; - /** Returned token type, e.g. `bearer`. */ - token_type: string; - /** The scopes assigned to this token. */ - scope: string; - }; -} diff --git a/src/integration/Rels.d.ts b/src/integration/Rels.d.ts index 7154aa4..90e20d4 100644 --- a/src/integration/Rels.d.ts +++ b/src/integration/Rels.d.ts @@ -134,7 +134,6 @@ export * from './Graph/template_config'; export * from './Graph/template_set'; export * from './Graph/template_sets'; export * from './Graph/timezones'; -export * from './Graph/token'; export * from './Graph/transaction'; export * from './Graph/transaction_log'; export * from './Graph/transaction_log_detail'; diff --git a/tests/integration/API.test.ts b/tests/integration/API.test.ts index 9b7de90..26eeb2f 100644 --- a/tests/integration/API.test.ts +++ b/tests/integration/API.test.ts @@ -11,7 +11,6 @@ import { Headers, Request, Response, fetch } from 'cross-fetch'; import { API as CoreAPI } from '../../src/core/API'; import { API as IntegrationAPI } from '../../src/integration/API'; import MemoryCache from 'fake-storage'; -import { Token } from '../../src/integration/Rels'; const fetchMock = (fetch as unknown) as jest.MockInstance; @@ -27,7 +26,7 @@ const commonInit = { refreshToken: '65redfghyuyjthgrhyjthrgdfghytredtyuytredrtyuy6trtyuhgfdr', }; -const sampleToken: Token['props'] = { +const sampleToken = { access_token: 'w8a49rbvuznxmzs39xliwfa943fda84klkvniutgh34q1fjmnfma90iubl', expires_in: IntegrationAPI.REFRESH_THRESHOLD * 3, refresh_token: '65redfghyuyjthgrhyjthrgdfghytredtyuytredrtyuy6trtyuhgfdr', @@ -61,6 +60,100 @@ describe('Integration', () => { expect(typeof IntegrationAPI.VERSION).toBe('string'); }); + it('errors when API.getToken() is called with incorrect arguments', async () => { + const incorrectOpts = ({ + base: 'fax', + cOdE: 'why', + clientId: 0, + client_secret: {}, + refreshToken: null, + version: -1, + } as unknown) as Parameters[0]; + + await expect(() => IntegrationAPI.getToken(incorrectOpts)).rejects.toThrow(); + }); + + it('returns null on auth failure in API.getToken()', async () => { + fetchMock.mockImplementation(() => Promise.resolve(new Response(null, { status: 500 }))); + expect(await IntegrationAPI.getToken({ ...commonInit })).toBeNull(); + fetchMock.mockClear(); + }); + + it('supports authorization_code grant in API.getToken()', async () => { + fetchMock.mockImplementation(() => Promise.resolve(new Response(JSON.stringify(sampleToken)))); + + const { clientId, clientSecret } = commonInit; + const url = new URL('token', IntegrationAPI.BASE_URL).toString(); + const code = '1234567890'; + const token = await IntegrationAPI.getToken({ clientId, clientSecret, code }); + + expect(token).toEqual(sampleToken); + expect(fetchMock).toHaveBeenNthCalledWith(1, url, { + body: new URLSearchParams({ + client_id: clientId, + client_secret: clientSecret, + code, + grant_type: 'authorization_code', + }), + headers: new Headers({ ...commonHeaders, 'Content-Type': 'application/x-www-form-urlencoded' }), + method: 'POST', + }); + + fetchMock.mockClear(); + }); + + it('supports refresh_token grant in API.getToken()', async () => { + fetchMock.mockImplementation(() => Promise.resolve(new Response(JSON.stringify(sampleToken)))); + + const { clientId, clientSecret, refreshToken } = commonInit; + const url = new URL('token', IntegrationAPI.BASE_URL).toString(); + const token = await IntegrationAPI.getToken({ clientId, clientSecret, refreshToken }); + + expect(token).toEqual(sampleToken); + expect(fetchMock).toHaveBeenNthCalledWith(1, url, { + body: new URLSearchParams({ + client_id: clientId, + client_secret: clientSecret, + grant_type: 'refresh_token', + refresh_token: refreshToken, + }), + headers: new Headers({ ...commonHeaders, 'Content-Type': 'application/x-www-form-urlencoded' }), + method: 'POST', + }); + + fetchMock.mockClear(); + }); + + it('supports custom version and base in API.getToken()', async () => { + fetchMock.mockImplementation(() => Promise.resolve(new Response(JSON.stringify(sampleToken)))); + + const { clientId, clientSecret } = commonInit; + const version = '1'; + const base = new URL('https://api-development.foxycart.com/'); + const url = new URL('token', base).toString(); + const code = '1234567890'; + const token = await IntegrationAPI.getToken({ base, clientId, clientSecret, code, version }); + + expect(token).toEqual(sampleToken); + expect(fetchMock).toHaveBeenNthCalledWith(1, url, { + body: new URLSearchParams({ + client_id: clientId, + client_secret: clientSecret, + code, + grant_type: 'authorization_code', + }), + + headers: new Headers({ + 'Content-Type': 'application/x-www-form-urlencoded', + 'FOXY-API-VERSION': version, + }), + + method: 'POST', + }); + + fetchMock.mockClear(); + }); + it('errors when constructed with incorrect arguments', () => { const incorrectInit = ({ base: 0, From 4fba4ed7c4f3647d7b8ccf5bd4b01500d2d0668e Mon Sep 17 00:00:00 2001 From: Daniil Bratukhin Date: Fri, 4 Dec 2020 16:32:48 +0300 Subject: [PATCH 62/98] build: upgrade semantic-release --- package-lock.json | 654 +++++++++++++++++++--------------------------- package.json | 2 +- 2 files changed, 274 insertions(+), 382 deletions(-) diff --git a/package-lock.json b/package-lock.json index 43164b6..5702a00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -810,35 +810,35 @@ } }, "@octokit/auth-token": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.3.tgz", - "integrity": "sha512-fdGoOQ3kQJh+hrilc0Plg50xSfaCKOeYN9t6dpJKXN9BxhhfquL0OzoQXg3spLYymL5rm29uPeI3KEXRaZQ9zg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.4.tgz", + "integrity": "sha512-LNfGu3Ro9uFAYh10MUZVaT7X2CnNm2C8IDQmabx+3DygYIQjs9FwzFAHN/0t6mu5HEPhxcb1XOuxdpY82vCg2Q==", "dev": true, "requires": { - "@octokit/types": "^5.0.0" + "@octokit/types": "^6.0.0" } }, "@octokit/core": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-2.5.4.tgz", - "integrity": "sha512-HCp8yKQfTITYK+Nd09MHzAlP1v3Ii/oCohv0/TW9rhSLvzb98BOVs2QmVYuloE6a3l6LsfyGIwb6Pc4ycgWlIQ==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.2.4.tgz", + "integrity": "sha512-d9dTsqdePBqOn7aGkyRFe7pQpCXdibSJ5SFnrTr0axevObZrpz3qkWm7t/NjYv5a66z6vhfteriaq4FRz3e0Qg==", "dev": true, "requires": { - "@octokit/auth-token": "^2.4.0", - "@octokit/graphql": "^4.3.1", - "@octokit/request": "^5.4.0", - "@octokit/types": "^5.0.0", + "@octokit/auth-token": "^2.4.4", + "@octokit/graphql": "^4.5.8", + "@octokit/request": "^5.4.12", + "@octokit/types": "^6.0.3", "before-after-hook": "^2.1.0", - "universal-user-agent": "^5.0.0" + "universal-user-agent": "^6.0.0" } }, "@octokit/endpoint": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.9.tgz", - "integrity": "sha512-3VPLbcCuqji4IFTclNUtGdp9v7g+nspWdiCUbK3+iPMjJCZ6LEhn1ts626bWLOn0GiDb6j+uqGvPpqLnY7pBgw==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.10.tgz", + "integrity": "sha512-9+Xef8nT7OKZglfkOMm7IL6VwxXUQyR7DUSU0LH/F7VNqs8vyd7es5pTfz9E7DwUIx7R3pGscxu1EBhYljyu7Q==", "dev": true, "requires": { - "@octokit/types": "^5.0.0", + "@octokit/types": "^6.0.0", "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" }, @@ -848,41 +848,33 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true } } }, "@octokit/graphql": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.5.7.tgz", - "integrity": "sha512-Gk0AR+DcwIK/lK/GX+OQ99UqtenQhcbrhHHfOYlrCQe17ADnX3EKAOKRsAZ9qZvpi5MuwWm/Nm+9aO2kTDSdyA==", + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.5.8.tgz", + "integrity": "sha512-WnCtNXWOrupfPJgXe+vSmprZJUr0VIu14G58PMlkWGj3cH+KLZEfKMmbUQ6C3Wwx6fdhzVW1CD5RTnBdUHxhhA==", "dev": true, "requires": { "@octokit/request": "^5.3.0", - "@octokit/types": "^5.0.0", + "@octokit/types": "^6.0.0", "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - } } }, + "@octokit/openapi-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-2.0.0.tgz", + "integrity": "sha512-J4bfM7lf8oZvEAdpS71oTvC1ofKxfEZgU5vKVwzZKi4QPiL82udjpseJwxPid9Pu2FNmyRQOX4iEj6W1iOSnPw==", + "dev": true + }, "@octokit/plugin-paginate-rest": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.6.0.tgz", - "integrity": "sha512-o+O8c1PqsC5++BHXfMZabRRsBIVb34tXPWyQLyp2IXq5MmkxdipS7TXM4Y9ldL1PzY9CTrCsn/lzFFJGM3oRRA==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.6.2.tgz", + "integrity": "sha512-3Dy7/YZAwdOaRpGQoNHPeT0VU1fYLpIUdPyvR37IyFLgd6XSij4j9V/xN/+eSjF2KKvmfIulEh9LF1tRPjIiDA==", "dev": true, "requires": { - "@octokit/types": "^5.5.0" + "@octokit/types": "^6.0.1" } }, "@octokit/plugin-request-log": { @@ -892,35 +884,24 @@ "dev": true }, "@octokit/plugin-rest-endpoint-methods": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.17.0.tgz", - "integrity": "sha512-NFV3vq7GgoO2TrkyBRUOwflkfTYkFKS0tLAPym7RNpkwLCttqShaEGjthOsPEEL+7LFcYv3mU24+F2yVd3npmg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.4.1.tgz", + "integrity": "sha512-+v5PcvrUcDeFXf8hv1gnNvNLdm4C0+2EiuWt9EatjjUmfriM1pTMM+r4j1lLHxeBQ9bVDmbywb11e3KjuavieA==", "dev": true, "requires": { - "@octokit/types": "^4.1.6", + "@octokit/types": "^6.1.0", "deprecation": "^2.3.1" - }, - "dependencies": { - "@octokit/types": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-4.1.10.tgz", - "integrity": "sha512-/wbFy1cUIE5eICcg0wTKGXMlKSbaAxEr00qaBXzscLXpqhcwgXeS6P8O0pkysBhRfyjkKjJaYrvR1ExMO5eOXQ==", - "dev": true, - "requires": { - "@types/node": ">= 8" - } - } } }, "@octokit/request": { - "version": "5.4.10", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.10.tgz", - "integrity": "sha512-egA49HkqEORVGDZGav1mh+VD+7uLgOxtn5oODj6guJk0HCy+YBSYapFkSLFgeYj3Fr18ZULKGURkjyhkAChylw==", + "version": "5.4.12", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.12.tgz", + "integrity": "sha512-MvWYdxengUWTGFpfpefBBpVmmEYfkwMoxonIB3sUGp5rhdgwjXL1ejo6JbgzG/QD9B/NYt/9cJX1pxXeSIUCkg==", "dev": true, "requires": { "@octokit/endpoint": "^6.0.1", "@octokit/request-error": "^2.0.0", - "@octokit/types": "^5.0.0", + "@octokit/types": "^6.0.3", "deprecation": "^2.0.0", "is-plain-object": "^5.0.0", "node-fetch": "^2.6.1", @@ -933,44 +914,39 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true } } }, "@octokit/request-error": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.3.tgz", - "integrity": "sha512-GgD5z8Btm301i2zfvJLk/mkhvGCdjQ7wT8xF9ov5noQY8WbKZDH9cOBqXzoeKd1mLr1xH2FwbtGso135zGBgTA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.4.tgz", + "integrity": "sha512-LjkSiTbsxIErBiRh5wSZvpZqT4t0/c9+4dOe0PII+6jXR+oj/h66s7E4a/MghV7iT8W9ffoQ5Skoxzs96+gBPA==", "dev": true, "requires": { - "@octokit/types": "^5.0.1", + "@octokit/types": "^6.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" } }, "@octokit/rest": { - "version": "17.11.2", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-17.11.2.tgz", - "integrity": "sha512-4jTmn8WossTUaLfNDfXk4fVJgbz5JgZE8eCs4BvIb52lvIH8rpVMD1fgRCrHbSd6LRPE5JFZSfAEtszrOq3ZFQ==", + "version": "18.0.12", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.0.12.tgz", + "integrity": "sha512-hNRCZfKPpeaIjOVuNJzkEL6zacfZlBPV8vw8ReNeyUkVvbuCvvrrx8K8Gw2eyHHsmd4dPlAxIXIZ9oHhJfkJpw==", "dev": true, "requires": { - "@octokit/core": "^2.4.3", - "@octokit/plugin-paginate-rest": "^2.2.0", - "@octokit/plugin-request-log": "^1.0.0", - "@octokit/plugin-rest-endpoint-methods": "3.17.0" + "@octokit/core": "^3.2.3", + "@octokit/plugin-paginate-rest": "^2.6.2", + "@octokit/plugin-request-log": "^1.0.2", + "@octokit/plugin-rest-endpoint-methods": "4.4.1" } }, "@octokit/types": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-5.5.0.tgz", - "integrity": "sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.1.0.tgz", + "integrity": "sha512-bMWBmg77MQTiRkOVyf50qK3QECWOEy43rLy/6fTWZ4HEwAhNfqzMcjiBDZAowkILwTrFvzE1CpP6gD0MuPHS+A==", "dev": true, "requires": { + "@octokit/openapi-types": "^2.0.0", "@types/node": ">= 8" } }, @@ -996,12 +972,12 @@ "dev": true }, "@semantic-release/github": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-7.1.1.tgz", - "integrity": "sha512-w8CLCvGVKNe2FPOYQ68OFxFVNNha7YRzptnwTZYdjXYtgTDKw0XVfnMSd9NlJeQPYGfQmIhIVPNBU/cA6zUY0A==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-7.2.0.tgz", + "integrity": "sha512-tMRnWiiWb43whRHvbDGXq4DGEbKRi56glDpXDJZit4PIiwDPX7Kx3QzmwRtDOcG+8lcpGjpdPabYZ9NBxoI2mw==", "dev": true, "requires": { - "@octokit/rest": "^17.0.0", + "@octokit/rest": "^18.0.0", "@semantic-release/error": "^2.2.0", "aggregate-error": "^3.0.0", "bottleneck": "^2.18.1", @@ -1058,26 +1034,43 @@ } }, "@semantic-release/npm": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-7.0.6.tgz", - "integrity": "sha512-F4judxdeLe8f7+vDva1TkqNc5Tb2tcltZYW0tLtvP2Xt7CD/gGiz7UxAWEOPsXBvIqAP+uTidvGLPl9U3/uRoQ==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-7.0.9.tgz", + "integrity": "sha512-VsmmQF3/n7mDbm6AGL0yPD3QNTGsHdinBtkyyerN1eLgvhdGJ/vEeAvmDMARiuf5Ev9cFeCheF0wLyUZNlAkeA==", "dev": true, "requires": { "@semantic-release/error": "^2.2.0", "aggregate-error": "^3.0.0", - "execa": "^4.0.0", + "execa": "^5.0.0", "fs-extra": "^9.0.0", "lodash": "^4.17.15", "nerf-dart": "^1.0.0", "normalize-url": "^5.0.0", - "npm": "^6.13.0", + "npm": "^6.14.8", "rc": "^1.2.8", "read-pkg": "^5.0.0", "registry-auth-token": "^4.0.0", "semver": "^7.1.2", - "tempy": "^0.5.0" + "tempy": "^1.0.0" }, "dependencies": { + "execa": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, "fs-extra": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", @@ -1090,6 +1083,18 @@ "universalify": "^1.0.0" } }, + "get-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -1108,6 +1113,21 @@ } } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, "parse-json": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", @@ -1133,10 +1153,13 @@ } }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "type-fest": { "version": "0.6.0", @@ -1170,34 +1193,6 @@ "read-pkg-up": "^7.0.0" }, "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, "parse-json": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", @@ -1210,12 +1205,6 @@ "lines-and-columns": "^1.1.6" } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -1412,9 +1401,9 @@ "dev": true }, "@types/minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", + "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", "dev": true }, "@types/node": { @@ -3231,6 +3220,22 @@ } } }, + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -4426,6 +4431,24 @@ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", "dev": true }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "dependencies": { + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, "find-versions": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", @@ -5540,6 +5563,18 @@ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true + }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -6593,6 +6628,15 @@ "json5": "^1.0.1" } }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", @@ -6797,12 +6841,6 @@ "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "dev": true }, - "macos-release": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz", - "integrity": "sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg==", - "dev": true - }, "make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -6943,16 +6981,6 @@ "yargs-parser": "^20.2.3" }, "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, "hosted-git-info": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", @@ -6962,15 +6990,6 @@ "lru-cache": "^6.0.0" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, "normalize-package-data": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", @@ -6983,15 +7002,6 @@ "validate-npm-package-license": "^3.0.1" } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, "parse-json": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", @@ -7004,12 +7014,6 @@ "lines-and-columns": "^1.1.6" } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -7074,21 +7078,24 @@ } }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "type-fest": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.0.tgz", - "integrity": "sha512-fbDukFPnJBdn2eZ3RR+5mK2slHLFd6gYHY7jna1KWWy4Yr4XysHuCdXRzy+RiG/HwG4WJat00vdC2UHky5eKiQ==", + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true }, "yargs-parser": { - "version": "20.2.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.3.tgz", - "integrity": "sha512-emOFRT9WVHw03QSvN5qor9QQT9+sw5vwxfYweivSMHTcAXPefwVae2FjO7JJjj8hCE4CzPOPeFM83VwT29HCww==", + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", "dev": true } } @@ -7373,9 +7380,9 @@ "dev": true }, "npm": { - "version": "6.14.8", - "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.8.tgz", - "integrity": "sha512-HBZVBMYs5blsj94GTeQZel7s9odVuuSUHy1+AlZh7rPVux1os2ashvEGLy/STNK7vUjbrCg5Kq9/GXisJgdf6A==", + "version": "6.14.9", + "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.9.tgz", + "integrity": "sha512-yHi1+i9LyAZF1gAmgyYtVk+HdABlLy94PMIDoK1TRKWvmFQAt5z3bodqVwKvzY0s6dLqQPVsRLiwhJfNtiHeCg==", "dev": true, "requires": { "JSONStream": "^1.3.5", @@ -7458,7 +7465,7 @@ "npm-pick-manifest": "^3.0.2", "npm-profile": "^4.0.4", "npm-registry-fetch": "^4.0.7", - "npm-user-validate": "~1.0.0", + "npm-user-validate": "^1.0.1", "npmlog": "~4.1.2", "once": "~1.4.0", "opener": "^1.5.1", @@ -7533,17 +7540,6 @@ "humanize-ms": "^1.2.1" } }, - "ajv": { - "version": "5.5.2", - "bundled": true, - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, "ansi-align": { "version": "2.0.0", "bundled": true, @@ -7874,11 +7870,6 @@ "mkdirp": "~0.5.0" } }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true - }, "code-point-at": { "version": "1.1.0", "bundled": true, @@ -8327,11 +8318,6 @@ "bundled": true, "dev": true }, - "fast-deep-equal": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, "fast-json-stable-stringify": { "version": "2.0.0", "bundled": true, @@ -8652,12 +8638,35 @@ "dev": true }, "har-validator": { - "version": "5.1.0", + "version": "5.1.5", "bundled": true, "dev": true, "requires": { - "ajv": "^5.3.0", + "ajv": "^6.12.3", "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "bundled": true, + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "bundled": true, + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "bundled": true, + "dev": true + } } }, "has": { @@ -8944,11 +8953,6 @@ "bundled": true, "dev": true }, - "json-schema-traverse": { - "version": "0.3.1", - "bundled": true, - "dev": true - }, "json-stringify-safe": { "version": "5.0.1", "bundled": true, @@ -9591,7 +9595,7 @@ } }, "npm-user-validate": { - "version": "1.0.0", + "version": "1.0.1", "bundled": true, "dev": true }, @@ -10595,6 +10599,21 @@ "xdg-basedir": "^3.0.0" } }, + "uri-js": { + "version": "4.4.0", + "bundled": true, + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "bundled": true, + "dev": true + } + } + }, "url-parse-lax": { "version": "1.0.0", "bundled": true, @@ -11151,16 +11170,6 @@ "word-wrap": "~1.2.3" } }, - "os-name": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", - "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", - "dev": true, - "requires": { - "macos-release": "^2.2.0", - "windows-release": "^3.1.0" - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -11211,6 +11220,15 @@ "p-try": "^2.0.0" } }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, "p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -11346,6 +11364,12 @@ "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", "dev": true }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, "pirates": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", @@ -11429,12 +11453,6 @@ "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true } } }, @@ -11762,9 +11780,9 @@ "dev": true }, "registry-auth-token": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", - "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", "dev": true, "requires": { "rc": "^1.2.8" @@ -12257,9 +12275,9 @@ } }, "semantic-release": { - "version": "17.2.2", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-17.2.2.tgz", - "integrity": "sha512-LNU68ud3a3oU46H11OThXaKAK430jGGGTIF4VsiP843kRmS6s8kVCceLRdi7yWWz/sCCMD0zygPTQV2Jw79J5g==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-17.3.0.tgz", + "integrity": "sha512-enhDayMZRP4nWcWAMBFHHB7THRaIcRdUAZv3lxd65pXs2ttzay7IeCvRRrGayRWExtnY0ulwRz5Ycp88Dv/UeQ==", "dev": true, "requires": { "@semantic-release/commit-analyzer": "^8.0.0", @@ -12314,16 +12332,6 @@ "escape-string-regexp": "^1.0.5" } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, "hosted-git-info": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", @@ -12333,30 +12341,12 @@ "lru-cache": "^6.0.0" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, "marked": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.3.tgz", - "integrity": "sha512-RQuL2i6I6Gn+9n81IDNGbL0VHnta4a+8ZhqvryXEniTb/hQNtf3i26hi1XWUhzb9BgVyWHKR3UO8MaHtKoYibw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.5.tgz", + "integrity": "sha512-2AlqgYnVPOc9WDyWu7S5DJaEZsfk6dNh/neatQ3IHUW4QLutM/VPSH9lG7bif+XjFWc9K9XR3QvR+fXuECmfdA==", "dev": true }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, "parse-json": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", @@ -12369,12 +12359,6 @@ "lines-and-columns": "^1.1.6" } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -12413,10 +12397,13 @@ "dev": true }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, @@ -13186,21 +13173,22 @@ "dev": true }, "tempy": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.5.0.tgz", - "integrity": "sha512-VEY96x7gbIRfsxqsafy2l5yVxxp3PhwAGoWMyC2D2Zt5DmEv+2tGiPOrquNRpf21hhGnKLVEsuqleqiZmKG/qw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.0.tgz", + "integrity": "sha512-eLXG5B1G0mRPHmgH2WydPl5v4jH35qEn3y/rA/aahKhIa91Pn119SsU7n7v/433gtT9ONzC8ISvNHIh2JSTm0w==", "dev": true, "requires": { + "del": "^6.0.0", "is-stream": "^2.0.0", "temp-dir": "^2.0.0", - "type-fest": "^0.12.0", + "type-fest": "^0.16.0", "unique-string": "^2.0.0" }, "dependencies": { "type-fest": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", - "integrity": "sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", "dev": true } } @@ -13708,13 +13696,10 @@ } }, "universal-user-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz", - "integrity": "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==", - "dev": true, - "requires": { - "os-name": "^3.1.0" - } + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true }, "universalify": { "version": "0.1.2", @@ -14119,99 +14104,6 @@ "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", "dev": true }, - "windows-release": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", - "integrity": "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg==", - "dev": true, - "requires": { - "execa": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", diff --git a/package.json b/package.json index 4d9d57c..cb03508 100755 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "npm-run-all": "^4.1.5", "prettier": "^2.1.2", "rimraf": "^3.0.2", - "semantic-release": "^17.2.2", + "semantic-release": "^17.3.0", "ts-jest": "^26.4.4", "ts-loader": "^8.0.9", "typedoc": "0.17.0-3", From 7048643ebe322b4eaba60d554da6360aaa202468 Mon Sep 17 00:00:00 2001 From: ndvo Date: Fri, 18 Dec 2020 17:55:56 -0300 Subject: [PATCH 63/98] refactor(signer): pull tests from old repo & remove dependency on parent instance In the old repo "FoxySigner" was a field of a FoxyAPI instance, and therefore had access to its clientSecret. It is now an independent utility. The first step to make this code adherent to the new codebase was to remove this dependency. This was only relevant in the test file because the class itself was already receiving clientSecret as a parameter. There is still two issues, though. 1- tests are dependent on the existence of certain html files on the filesystem in order to test the ability to sign files. This dependency must be removed from the tests. 2- Signer should become a simple function, as happened with the other utilities from the FoxyAPI in the previous repository. --- src/integration/Signer.ts | 51 +++---- tests/integration/Signer.test.ts | 228 +++++++++++++++++++++++++++++++ 2 files changed, 254 insertions(+), 25 deletions(-) create mode 100644 tests/integration/Signer.test.ts diff --git a/src/integration/Signer.ts b/src/integration/Signer.ts index 706fa56..7b6921c 100644 --- a/src/integration/Signer.ts +++ b/src/integration/Signer.ts @@ -79,7 +79,7 @@ export class Signer { */ public url(urlStr: string): string { // Build a URL object - if (this._isSigned(urlStr)) { + if (Signer._isSigned(urlStr)) { console.error('Attempt to sign a signed URL', urlStr); return urlStr; } @@ -95,7 +95,7 @@ export class Signer { } const originalParams = url.searchParams; const newParams = stripped.searchParams; - const code = this._getCodeFromURL(url); + const code = Signer._getCodeFromURL(url); // If there is no code, return the same URL if (!code) { return urlStr; @@ -108,7 +108,7 @@ export class Signer { newParams.set(signed[0], signed[1]); } url.search = newParams.toString(); - return this._replaceURLchars(url.toString()); + return Signer._replaceURLchars(url.toString()); } /** @@ -123,7 +123,7 @@ export class Signer { name = name.replace(/ /g, '_'); const signature = this._product(code + parentCode, name, value); const encodedName = encodeURIComponent(name); - const nameAttr = this._buildSignedName(encodedName, signature, value); + const nameAttr = Signer._buildSignedName(encodedName, signature, value); return nameAttr; } @@ -138,7 +138,7 @@ export class Signer { public value(name: string, code: string, parentCode = '', value?: string | number): string { name = name.replace(/ /g, '_'); const signature = this._product(code + parentCode, name, value); - const valueAttr = this._buildSignedValue(signature, value); + const valueAttr = Signer._buildSignedValue(signature, value); return valueAttr; } @@ -151,7 +151,7 @@ export class Signer { * @private */ private _product(code: string, name: string, value?: string | number): string { - return this._message(code + name + this._valueOrOpen(value)); + return this._message(code + name + Signer._valueOrOpen(value)); } /** @@ -167,8 +167,8 @@ export class Signer { code = code.replace(/ /g, '_'); const signature = this._product(code, name, value); const encodedName = encodeURIComponent(name).replace(/%20/g, '+'); - const encodedValue = encodeURIComponent(this._valueOrOpen(value)).replace(/%20/g, '+'); - const nameAttr = this._buildSignedQueryArg(encodedName, signature, encodedValue); + const encodedValue = encodeURIComponent(Signer._valueOrOpen(value)).replace(/%20/g, '+'); + const nameAttr = Signer._buildSignedQueryArg(encodedName, signature, encodedValue); return nameAttr; } @@ -353,16 +353,17 @@ export class Signer { } /** - * Builds a signed name given it components. + * Builds the value for the signed "name" attribute value given it components. * - * @param name - * @param signature - * @param value + * @param name that was signed + * @param signature the resulting signature + * @param value of the field that, if equal to --OPEN-- identifies an editable field. + * @returns the signed value for the "name" attribute * @private */ - private _buildSignedName(name: string, signature: string, value?: string | number) { - let open = this._valueOrOpen(value); - open = this._valueOrOpen(value) == '--OPEN--' ? '||open' : ''; + private static _buildSignedName(name: string, signature: string, value?: string | number) { + let open = Signer._valueOrOpen(value); + open = Signer._valueOrOpen(value) == '--OPEN--' ? '||open' : ''; return `${name}||${signature}${open}`; } @@ -373,9 +374,9 @@ export class Signer { * @param value * @private */ - private _buildSignedValue(signature: string, value?: string | number) { - let open = this._valueOrOpen(value); - open = this._valueOrOpen(value) == '--OPEN--' ? '||open' : (value as string); + private static _buildSignedValue(signature: string, value?: string | number) { + let open = Signer._valueOrOpen(value); + open = Signer._valueOrOpen(value) == '--OPEN--' ? '||open' : (value as string); return `${open}||${signature}`; } @@ -387,7 +388,7 @@ export class Signer { * @param value * @private */ - private _buildSignedQueryArg(name: string, signature: string, value: string | number) { + private static _buildSignedQueryArg(name: string, signature: string, value: string | number) { return `${name}||${signature}=${value}`; } @@ -398,7 +399,7 @@ export class Signer { * @param value * @private */ - private _valueOrOpen(value: string | number | undefined): string | number { + private static _valueOrOpen(value: string | number | undefined): string | number { if (value === undefined || value === null || value === '') { return '--OPEN--'; } @@ -412,7 +413,7 @@ export class Signer { * @param url * @private */ - private _isSigned(url: string): boolean { + private static _isSigned(url: string): boolean { return url.match(/^.*\|\|[0-9a-fA-F]{64}/) != null; } @@ -422,7 +423,7 @@ export class Signer { * @param url * @private */ - private _getCodeFromURL(url: URL): string | undefined { + private static _getCodeFromURL(url: URL): string | undefined { for (const p of url.searchParams) { if (p[0] == 'code') { return p[1]; @@ -436,7 +437,7 @@ export class Signer { * @param doc * @private */ - private _findCartForms(doc: ParentNode) { + private static _findCartForms(doc: ParentNode) { return Array.from(doc.querySelectorAll('form')).filter(e => e.querySelector('[name=code]')); } @@ -446,7 +447,7 @@ export class Signer { * @param urlStr * @private */ - private _replaceURLchars(urlStr: string): string { + private static _replaceURLchars(urlStr: string): string { return urlStr.replace(/%7C/g, '|').replace(/%3D/g, '=').replace(/%2B/g, '+'); } @@ -460,7 +461,7 @@ export class Signer { doc.querySelectorAll('a').forEach(l => { l.href = this.url(l.href); }); - this._findCartForms(doc).forEach(this._form.bind(this)); + Signer._findCartForms(doc).forEach(this._form.bind(this)); return doc; } diff --git a/tests/integration/Signer.test.ts b/tests/integration/Signer.test.ts new file mode 100644 index 0000000..fb9965b --- /dev/null +++ b/tests/integration/Signer.test.ts @@ -0,0 +1,228 @@ +import * as fs from "fs"; +import { JSDOM } from "jsdom"; +import { Signer } from '../../src/integration'; + +describe("Signer", () => { + + const signer = new Signer("1"); + + const outputPath = "/tmp/foxyTestOutput.html"; + + it("Signs an input name", () => { + const code = "ABC123"; + const name = "name"; + const value = "My Example Product"; + expect(signer.name(name, code, "", value)).toBe( + "name||dbaa042ec8018e342058417e058d7a479226976c7cb287664197fd67970c4715" + ); + expect(signer.name(name, code, "", 100)).toBe( + "name||bd87a3e47a20a60c9c5d7d2a026605310f20753b80535e56336cfd5502f61143" + ); + }); + + it("Signs an input name with user edited values", () => { + const code = "ABC123"; + const name = "name"; + expect(signer.name(name, code, "")).toBe( + "name||3f2075135e3455131bd0d6ce8643551e9e2e43bc09dd0474fa3effbe4e588c9e||open" + ); + expect(signer.name(name, code)).toBe( + "name||3f2075135e3455131bd0d6ce8643551e9e2e43bc09dd0474fa3effbe4e588c9e||open" + ); + }); + + it("Signs a value with user edited values", () => { + const code = "ABC123"; + const name = "name"; + expect(signer.value(name, code, "")).toBe( + "||open||3f2075135e3455131bd0d6ce8643551e9e2e43bc09dd0474fa3effbe4e588c9e" + ); + expect(signer.value(name, code)).toBe( + "||open||3f2075135e3455131bd0d6ce8643551e9e2e43bc09dd0474fa3effbe4e588c9e" + ); + }); + + it("Signs a whole URL", () => { + const fullURL = + "http://mockdomain.mock/?code=mycode&name=testname&price=123.00&other atribute=Some Other Thing"; + const signedURL = + "http://mockdomain.mock/?" + + "code||43f429e41303929871266b879a880efce32b35bda757e70f527bc5c8e1353c0a=mycode&" + + "name||07f23df6159ba32f01de36db07bf998d7661bda812a7c0d597cfacdefe0f0064=testname&" + + "price||aed2692b1b278b04b974c3c9822e597dc5da880561cf256ab20b2873a5346b66=123.00&" + + "other_atribute||98700cf679c5d7394e3e33b883f18683664b4843707f916a0739ba1c9adeabab=Some+Other+Thing"; + expect(signer.url(fullURL)).toBe(signedURL); + }); + + it("Signs a whole HTML string", () => { + const htmlString = fs.readFileSync("./test/mocks/html/onepage.html").toString(); + const signedHTML = signer.htmlString(htmlString); + // e.g: ||aed2692b1b278b04b974c3c9822e597dc5da880561cf256ab20b2873a5346b66= + const signatureRegex = /\|\|[0-9a-fA-F]{64}=/; + const expectedAttributeMatches = [/name/, /price/, /quantity/]; + for (const p of expectedAttributeMatches) { + const toMatch = new RegExp(p.source + signatureRegex.source, "g"); + const signedItems = signedHTML.match(toMatch); + expect(signedItems).toHaveLength(31); + } + }); + + it("Signs an HTML string", () => { + const htmlString = fs.readFileSync("./test/mocks/html/onepagewithforms.html").toString(); + const signedHTML = signer.htmlString(htmlString); + // e.g: ||aed2692b1b278b04b974c3c9822e597dc5da880561cf256ab20b2873a5346b66= + const namePrefixRegex = /name="\d{1,3}:/; + const valuePrefixRegex = /value="\d{1,3}:/; + const signatureRegex = /\|\|[0-9a-fA-F]{64}\W/; + const expectedAttributeMatches: [RegExp, RegExp, number][] = [ + [namePrefixRegex, /name/, 5], + [namePrefixRegex, /price/, 5], + [namePrefixRegex, /code/, 5], + [valuePrefixRegex, /small\{p-2\}/, 5], + [valuePrefixRegex, /medium/, 5], + [valuePrefixRegex, /large\{p\+3\}/, 5], + [namePrefixRegex, /quantity/, 5], + ]; + for (const p of expectedAttributeMatches) { + const toMatch = new RegExp(p[0].source + p[1].source + signatureRegex.source, "g"); + const signedItems = signedHTML.match(toMatch); + expect(signedItems).toHaveLength(p[2]); + } + }); + + it("Signs an HTML file", async () => { + const inputPath = "./test/mocks/html/onepagewithforms.html"; + await signer.htmlFile(inputPath, outputPath); + const result = fs.readFileSync(outputPath).toString(); + const namePrefixRegex = /name="\d{1,3}:/; + const valuePrefixRegex = /value="\d{1,3}:/; + const signatureRegex = /\|\|[0-9a-fA-F]{64}\W/; + const expectedAttributeMatches: [RegExp, RegExp, number][] = [ + [namePrefixRegex, /name/, 5], + [namePrefixRegex, /price/, 5], + [namePrefixRegex, /code/, 5], + [valuePrefixRegex, /express/, 3], + [valuePrefixRegex, /regular/, 3], + [valuePrefixRegex, /pickup/, 3], + [valuePrefixRegex, /small\{p-2\}/, 5], + [valuePrefixRegex, /medium/, 5], + [valuePrefixRegex, /large\{p\+3\}/, 5], + [namePrefixRegex, /quantity/, 5], + ]; + for (const p of expectedAttributeMatches) { + const toMatch = new RegExp(p[0].source + p[1].source + signatureRegex.source, "g"); + const signedItems = result.match(toMatch); + expect(signedItems?.length).toBe(p[2]); + } + + const notAFile = await signer + .htmlFile(inputPath, "/shouldNotHavePermissionHere") + .then(() => false) + .catch(() => true); + expect(notAFile).toBe(true); + }); + + it("Signs fields with editable values", () => { + // Reuse previously generated signed html + const result = fs.readFileSync(outputPath).toString(); + const colorEditable = /name="\d{1,3}:color\|\|[0-9a-fA-F]{64}||open\W/; + const additionalDetails = /name="\d{1,3}:additional-details\|\|[0-9a-fA-F]{64}||open\W/; + let signedItems = result.match(colorEditable); + expect(signedItems?.length).toBe(1); + signedItems = result.match(additionalDetails); + expect(signedItems?.length).toBe(1); + }); + + it("Preserves different products", () => { + const inputPath = "./test/mocks/html/onepagewithforms.html"; + const before = fs.readFileSync(inputPath).toString(); + // Reuse previously generated signed html + const result = fs.readFileSync(outputPath).toString(); + const names1before = before.match(/name="1:/g)?.length; + const names1after = result.match(/name="1:/g)?.length; + const names2before = before.match(/name="2:/g)?.length; + const names2after = result.match(/name="2:/g)?.length; + expect(names1before).toBe(names1after); + expect(names2before).toBe(names2after); + }); + + it("Properly signs signs bundled products", () => { + expect(signer.name("name", "abc124", "abc123", "Different T-Shirt")).toBe( + "name||ca2df56d0a72b3637b688d519939f7f00551f054cede1e35aa57602201e2b75f" + ); + // Reuse previously generated signed html + const result = fs.readFileSync(outputPath).toString(); + expect( + result.match( + /name="2:name\|\|ca2df56d0a72b3637b688d519939f7f00551f054cede1e35aa57602201e2b75f" value="Different T-Shirt"/ + )?.length + ).toBe(1); + }); + + it("Do not touch forms without code", () => { + // Reuse previously generated signed html + const result = fs.readFileSync(outputPath).toString(); + expect(result.match(/name="honeypot"/)?.length).toBe(1); + // Do not affect html without code attribute + let simpleHTML = `

Test form

There is no form to be found here

`; + let signed = signer.htmlString(simpleHTML); + expect(signed).toBe(simpleHTML); + // Do not affect forms html without code attribute + simpleHTML = `

Test + form

There is no code to be found here +
`; + signed = signer.htmlString(simpleHTML); + expect(signed).toBe(simpleHTML); + // Do not change a form element without a code + const dom = new JSDOM(simpleHTML).window.document; + const f = dom.querySelector("form"); + const prev = f!.outerHTML; + signer.htmlString(f!.outerHTML); + expect(f!.outerHTML).toBe(prev); + }); + + it("Does not process multiple codes for a product", () => { + const simpleHTML = `

Test form

+
+ + +
+ `; + expect(() => signer.htmlString(simpleHTML)).toThrow(); + }); + + it("Does not resigns a url", async () => { + const url = "http://storename?code=ABC123&name=name&value=My Example Product"; + const consoleError = console.error; + console.error = jest.fn(); + const signed = signer.url(url); + const reSigned = signer.url(signed); + expect(signed).toBe(reSigned); + console.error = consoleError; + }); + + it("Does not sign without a secret", () => { + const woSecretFoxy = new Signer(); + const woSign = () => woSecretFoxy.url("http://signthis?code=test&price=5"); + expect(woSign).toThrow(); + }); + + it("Does not sign invalid URL", () => { + const badURL = `href="what://code=test"`; + const attemptSigned = signer.url(badURL); + expect(badURL).toBe(attemptSigned); + }); + + it("Parent code can be missing", () => { + const noParent = ` +
+ + +
+ `; + const signed = signer.htmlString(noParent); + expect( + signed.match(/3ce339bde0689065ad4f18698603d5f957581bc8ef819e1a6d5a11ddefddc46a/) + ).toHaveLength(1); + }); +}); From dbaa893464642fc0ed766c7703be2a026a5f32ba Mon Sep 17 00:00:00 2001 From: ndvo Date: Fri, 18 Dec 2020 18:33:07 -0300 Subject: [PATCH 64/98] docs(signer): add missing documentation. Lint --- src/integration/Signer.ts | 124 +++++++++++++++++++++++--------------- 1 file changed, 74 insertions(+), 50 deletions(-) diff --git a/src/integration/Signer.ts b/src/integration/Signer.ts index 7b6921c..ce15685 100644 --- a/src/integration/Signer.ts +++ b/src/integration/Signer.ts @@ -36,6 +36,7 @@ export class Signer { * It won't be possible to sign anything without this secret. * * @param secret OAuth2 client secret for your integration. + * @returns Signer to allow for convenient concatenation. */ public setSecret(secret: string): Signer { this._secret = secret; @@ -46,8 +47,9 @@ export class Signer { * Signs a whole HTML snippet. * * @param htmlStr HTML snippet to sign. + * @returns the HTML snippet signed. */ - public htmlString(htmlStr: string) { + public htmlString(htmlStr: string): string { const dom = new JSDOM(htmlStr); this._fragment(dom.window.document); return dom.serialize(); @@ -58,8 +60,9 @@ export class Signer { * * @param inputPath Path of the file to sign. * @param outputPath Path of the file where the signed result will be stored. + * @returns a ParentNode object of the signed HTML. */ - public htmlFile(inputPath: string, outputPath: string) { + public htmlFile(inputPath: string, outputPath: string): Promise { return new Promise((resolve, reject) => { JSDOM.fromFile(inputPath).then(dom => { const signed = this._fragment(dom.window.document); @@ -76,6 +79,7 @@ export class Signer { * All query fields withing the query string will be signed, provided it is a proper URL and there is a code field * * @param urlStr Full URL including the query string that needs to be signed. + * @returns the signed query string. */ public url(urlStr: string): string { // Build a URL object @@ -118,6 +122,7 @@ export class Signer { * @param code Product code. * @param parentCode Parent product code. * @param value Input value. + * @returns the signed input name. */ public name(name: string, code: string, parentCode = '', value?: string | number): string { name = name.replace(/ /g, '_'); @@ -134,6 +139,7 @@ export class Signer { * @param code Product code. * @param parentCode Parent product code. * @param value Input value. + * @returns the signed value. */ public value(name: string, code: string, parentCode = '', value?: string | number): string { name = name.replace(/ /g, '_'); @@ -145,9 +151,10 @@ export class Signer { /** * Signs a product composed of code, name and value. * - * @param code - * @param name - * @param value + * @param code of the product. + * @param name name of the product. + * @param value of the product. + * @returns the signed product. * @private */ private _product(code: string, name: string, value?: string | number): string { @@ -157,9 +164,10 @@ export class Signer { /** * Signs a single query argument to be used in `GET` requests. * - * @param name - * @param code - * @param value + * @param name of the argument. + * @param code of the product. + * @param value of the argument. + * @returns the signed query argument. * @private */ private _queryArg(name: string, code: string, value?: string): string { @@ -168,19 +176,19 @@ export class Signer { const signature = this._product(code, name, value); const encodedName = encodeURIComponent(name).replace(/%20/g, '+'); const encodedValue = encodeURIComponent(Signer._valueOrOpen(value)).replace(/%20/g, '+'); - const nameAttr = Signer._buildSignedQueryArg(encodedName, signature, encodedValue); - return nameAttr; + return Signer._buildSignedQueryArg(encodedName, signature, encodedValue); } /** * Signs an input element. * - * @param el - * @param codes + * @param el the input element + * @param codes the codes dict object containing the code and parent code + * @returns the signed element * @private */ private _input(el: HTMLInputElement, codes: CodesDict): HTMLInputElement { - const splitted = this._splitNamePrefix(el.name); + const splitted = Signer._splitNamePrefix(el.name); const nameString = splitted[1]; const prefix = splitted[0]; const code = codes[prefix].code; @@ -194,12 +202,13 @@ export class Signer { /** * Signs a texArea element. * - * @param el - * @param codes + * @param el the textArea element. + * @param codes the codes dict object containing the code and parent code + * @returns the signed textarea element. * @private */ private _textArea(el: HTMLTextAreaElement, codes: CodesDict): HTMLTextAreaElement { - const splitted = this._splitNamePrefix(el.name); + const splitted = Signer._splitNamePrefix(el.name); const nameString = splitted[1]; const prefix = splitted[0]; const code = codes[prefix].code; @@ -213,8 +222,9 @@ export class Signer { /** * Signs all option elements within a Select element. * - * @param el - * @param codes + * @param el the select element. + * @param codes the codes dict object containing the code and parent code. + * @returns the signed select element. * @private */ private _select(el: HTMLSelectElement, codes: CodesDict): HTMLSelectElement { @@ -229,8 +239,9 @@ export class Signer { * Signatures are added to the value attribute on options. * This function may also be used to sign radio buttons. * - * @param el - * @param codes + * @param el the option element to be signed. + * @param codes the codes dict object containing the code and parent code. + * @returns the signed option element. * @private */ private _option(el: HTMLOptionElement | HTMLInputElement, codes: CodesDict): HTMLOptionElement | HTMLInputElement { @@ -242,7 +253,7 @@ export class Signer { const p = el.parentElement as HTMLSelectElement; n = p.name; } - const splitted = this._splitNamePrefix(n); + const splitted = Signer._splitNamePrefix(n); const nameString = splitted[1]; const prefix = splitted[0]; const code = codes[prefix].code; @@ -256,8 +267,9 @@ export class Signer { /** * Signs a radio button. Radio buttons use the value attribute to hold their signatures. * - * @param el - * @param codes + * @param el the radio button element. + * @param codes the codes dict object containing the code and parent code. + * @returns the signed radio button. * @private */ private _radio(el: HTMLInputElement, codes: CodesDict): HTMLInputElement { @@ -268,10 +280,11 @@ export class Signer { * Splits a string using the prefix pattern for foxy store. * The prefix pattern allows for including more than a single product in a given GET or POST request. * - * @param name + * @param name the name to be splitted. + * @returns an array with [prefix, name] * @private */ - private _splitNamePrefix(name: string): [number, string] { + private static _splitNamePrefix(name: string): [number, string] { const splitted = name.split(':'); if (splitted.length == 2) { return [parseInt(splitted[0], 10), splitted[1]]; @@ -282,16 +295,14 @@ export class Signer { /** * Retrieve a parent code value from a form, given a prefix. * - * @param formElement - * @param prefix + * @param formElement the element with the code and parent code values. + * @param prefix the prefix used in hte element. + * @returns the parentCode * @private */ - private _retrieveParentCode(formElement: Element, prefix: string | number = ''): string { + private static _retrieveParentCode(formElement: Element, prefix: string | number = ''): string { let result = ''; // A blank string indicates no parent - let separator = ''; - if (prefix) { - separator = ':'; - } + const separator = prefix ? ':' : ''; const parentCodeEl = formElement.querySelector(`[name='${prefix}${separator}parent_code']`); if (parentCodeEl) { const parentCode = parentCodeEl.getAttribute('value'); @@ -305,10 +316,10 @@ export class Signer { /** * Signs a whole form element. * - * @param formElement + * @param formElement the form element to be signed. * @private */ - private _form(formElement: Element) { + private _form(formElement: Element): void { // Grab all codes within the form element const codeList: NodeList = formElement.querySelectorAll('[name$=code]'); // Store all codes in a object @@ -323,13 +334,13 @@ export class Signer { // Store prefix in codes list codes[prefix] = { code: codeValue, - parent: this._retrieveParentCode(formElement, prefix), + parent: Signer._retrieveParentCode(formElement, prefix), }; } else if (codes[0] === undefined) { // Allow to push a single code without prefix codes[0] = { code: codeValue, - parent: this._retrieveParentCode(formElement), + parent: Signer._retrieveParentCode(formElement), }; } else { const documentationURL = 'https://wiki.foxycart.com/v/2.0/hmac_validation#multiple_products_in_one_form'; @@ -370,8 +381,9 @@ export class Signer { /** * Builds a signed name given it components. * - * @param signature - * @param value + * @param signature the resulting signature. + * @param value the value signed. + * @returns the built signed value * @private */ private static _buildSignedValue(signature: string, value?: string | number) { @@ -383,9 +395,10 @@ export class Signer { /** * Builds a signed query argument given its components. * - * @param name - * @param signature - * @param value + * @param name the argument name. + * @param signature the resulting signature. + * @param value the value signed. + * @returns the built query string argument. * @private */ private static _buildSignedQueryArg(name: string, signature: string, value: string | number) { @@ -393,10 +406,11 @@ export class Signer { } /** - * Retuns the value of a field on the `--OPEN--` string if the value is not defined. + * Returns the value of a field on the `--OPEN--` string if the value is not defined. * Please, notice that `0` is an acceptable value. * - * @param value + * @param value of the field. + * @returns '--OPEN--' or the given value. * @private */ private static _valueOrOpen(value: string | number | undefined): string | number { @@ -410,7 +424,11 @@ export class Signer { * Check if a href string is already signed. Signed strings contain two consecutive pipes * followed by 64 hexadecimal characters. * - * @param url + * This method **does not validates the signature**. + * It only checks if the format of the string is evidence that it is signed. + * + * @param url the potentially signed URL. + * @returns true if the string format is evidence that it is already signed. * @private */ private static _isSigned(url: string): boolean { @@ -420,7 +438,8 @@ export class Signer { /** * Returns the code from a URL or undefined if it does not contain a code. * - * @param url + * @param url the URL to retrieve the code from. + * @returns the code found, or undefined if no code was found. * @private */ private static _getCodeFromURL(url: URL): string | undefined { @@ -434,17 +453,19 @@ export class Signer { /** * Find all cart forms in a document fragment that contain an input named `code`. * - * @param doc + * @param doc the document fragment potentially containing cart forms. + * @returns an array of the form elements found. * @private */ - private static _findCartForms(doc: ParentNode) { + private static _findCartForms(doc: ParentNode): HTMLFormElement[] { return Array.from(doc.querySelectorAll('form')).filter(e => e.querySelector('[name=code]')); } /** * Replace some of the characters encoded by `encodeURIComponent()`. * - * @param urlStr + * @param urlStr the URL string. + * @returns a cleaned URL string. * @private */ private static _replaceURLchars(urlStr: string): string { @@ -454,7 +475,8 @@ export class Signer { /** * Signs a document fragment. This method is used to sign HTML snippets. * - * @param doc + * @param doc an HTML doc fragment + * @returns the signed HTML snippet * @private */ private _fragment(doc: ParentNode): ParentNode { @@ -468,7 +490,9 @@ export class Signer { /** * Signs a simple message. This function can only be invoked after the secret has been defined. The secret can be defined either in the construction method as in `new FoxySigner(mySecret)` or by invoking the setSecret method, as in `signer.setSecret(mySecret)` * - * @param message + * + * @param message the message to be signed. + * @returns signed message. * @private */ private _message(message: string): string { From b3ae9913ffebc0836739179ae4753d14408677b7 Mon Sep 17 00:00:00 2001 From: ndvo Date: Sat, 19 Dec 2020 11:58:29 -0300 Subject: [PATCH 65/98] fix(signer): remove dependency of fs for testing allow for dependency injection for fs related functionality --- src/integration/Signer.ts | 12 +++++++++--- tests/integration/Signer.test.ts | 23 ++++++++++++++++------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/integration/Signer.ts b/src/integration/Signer.ts index ce15685..96c39fd 100644 --- a/src/integration/Signer.ts +++ b/src/integration/Signer.ts @@ -60,13 +60,19 @@ export class Signer { * * @param inputPath Path of the file to sign. * @param outputPath Path of the file where the signed result will be stored. + * @param readFunc a function that should read from file + * @param writeFunc a function that should write to to file * @returns a ParentNode object of the signed HTML. */ - public htmlFile(inputPath: string, outputPath: string): Promise { + public htmlFile( + inputPath: string, outputPath: string, + readFunc: (arg0: string) => Promise = JSDOM.fromFile, + writeFunc: (path: string, content: string, callback: (err: any)=>void)=>void = fs.writeFile + ): Promise { return new Promise((resolve, reject) => { - JSDOM.fromFile(inputPath).then(dom => { + readFunc(inputPath).then(dom => { const signed = this._fragment(dom.window.document); - fs.writeFile(outputPath, dom.serialize(), err => { + writeFunc(outputPath, dom.serialize(), err => { if (err) reject(err); else resolve(signed); }); diff --git a/tests/integration/Signer.test.ts b/tests/integration/Signer.test.ts index fb9965b..ca63b2a 100644 --- a/tests/integration/Signer.test.ts +++ b/tests/integration/Signer.test.ts @@ -55,8 +55,7 @@ describe("Signer", () => { }); it("Signs a whole HTML string", () => { - const htmlString = fs.readFileSync("./test/mocks/html/onepage.html").toString(); - const signedHTML = signer.htmlString(htmlString); + const signedHTML = signer.htmlString(htmlContent); // e.g: ||aed2692b1b278b04b974c3c9822e597dc5da880561cf256ab20b2873a5346b66= const signatureRegex = /\|\|[0-9a-fA-F]{64}=/; const expectedAttributeMatches = [/name/, /price/, /quantity/]; @@ -68,8 +67,7 @@ describe("Signer", () => { }); it("Signs an HTML string", () => { - const htmlString = fs.readFileSync("./test/mocks/html/onepagewithforms.html").toString(); - const signedHTML = signer.htmlString(htmlString); + const signedHTML = signer.htmlString(htmlPageWithForm); // e.g: ||aed2692b1b278b04b974c3c9822e597dc5da880561cf256ab20b2873a5346b66= const namePrefixRegex = /name="\d{1,3}:/; const valuePrefixRegex = /value="\d{1,3}:/; @@ -92,8 +90,14 @@ describe("Signer", () => { it("Signs an HTML file", async () => { const inputPath = "./test/mocks/html/onepagewithforms.html"; - await signer.htmlFile(inputPath, outputPath); - const result = fs.readFileSync(outputPath).toString(); + const readFunc = (_: string) => Promise.resolve(new JSDOM(htmlPageWithForm)); + const readFuncFail = (_: string) => {throw new Error();}; + let result = ''; + const writeFunc = (_: any , content: string| any, callback: (err: any) => void) => { + result = content; + callback(null) + }; + await signer.htmlFile(inputPath, outputPath, readFunc, writeFunc); const namePrefixRegex = /name="\d{1,3}:/; const valuePrefixRegex = /value="\d{1,3}:/; const signatureRegex = /\|\|[0-9a-fA-F]{64}\W/; @@ -116,7 +120,7 @@ describe("Signer", () => { } const notAFile = await signer - .htmlFile(inputPath, "/shouldNotHavePermissionHere") + .htmlFile(inputPath, "/shouldNotHavePermissionHere", readFuncFail, writeFunc) .then(() => false) .catch(() => true); expect(notAFile).toBe(true); @@ -226,3 +230,8 @@ describe("Signer", () => { ).toHaveLength(1); }); }); + +/** Test helper content **/ + +const htmlContent = `JAMStack e-commerce with Foxy.io - JAM Stack e-commerce template

JAM Stack e-commerce template

using a set of powerfull tools

Go on! Tweak this site to meet your needs! You'll discover you'll have the perfect site in no time.

Here are some of our highlights


Here is a message for you.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Multa sunt dicta ab antiquis de contemnendis ac despiciendis rebus humanis; Idem etiam dolorem saepe perpetiuntur, ne, si id non faciant, incidant in maiorem. Hoc enim constituto in philosophia constituta sunt omnia. Duo Reges: constructio interrete. Non enim in selectione virtus ponenda erat, ut id ipsum, quod erat bonorum ultimum, aliud aliquid adquireret. Quid de Platone aut de Democrito loquar? Maximeque eos videre possumus res gestas audire et legere velle, qui a spe gerendi absunt confecti senectute. Tu autem negas fortem esse quemquam posse, qui dolorem malum putet. Est autem etiam actio quaedam corporis, quae motus et status naturae congruentis tenet;


Our amazing products!

Quid igitur dubitamus in tota eius natura q

Relieved Lime Jewel

$288
($24/mo)


Quid igitur dubitamus in tota eius natura quaerere quid sit effectum? Itaque hic ipse iam pridem est reiectus; Potius inflammat, ut coercendi magis quam dedocendi esse videantur.


One of our butterflies.Tum, Quintus et Pomponius cum idem s

Crazy Cyan Brain

$19/mo


Tum, Quintus et Pomponius cum idem se velle dixissent, Piso exorsus est.


Non igitur potestis voluptate omnia dirigentes aut t

Outrageous Plum Needle

$45
($/mo)


Non igitur potestis voluptate omnia dirigentes aut tueri aut retinere virtutem.


Hoc enim identidem dicitis, non intellegere n

Healthy Ultramarine Cake

$144
($12/mo)


Hoc enim identidem dicitis, non intellegere nos quam dicatis voluptatem. Itaque ad tempus ad Pisonem omnes.


Cum autem in quo sapienter dicimus, i

Enchanting Amaranth Screw

$96
($8/mo)


Cum autem in quo sapienter dicimus, id a primo rectissime dicitur. Quae sunt igitur communia vobis cum antiquis, iis sic utamur quasi concessis; Certe non potest.


Inde igitur, inquit, ordiendum est.

Good Mauve Fowl

$72
($6/mo)


Inde igitur, inquit, ordiendum est. Dempta enim aeternitate nihilo beatior Iuppiter quam Epicurus; Ut scias me intellegere, primum idem esse dico voluptatem, quod ille don.


Longum est enim ad omnia respondere, q

Creepy Orchid Face

$192
($16/mo)


Longum est enim ad omnia respondere, quae a te dicta sunt.


Inde igitur, inquit, ordiendum est.

Cautious Periwinkle Clock

$966
($83/mo)


Inde igitur, inquit, ordiendum est. Dempta enim aeternitate nihilo beatior Iuppiter quam Epicurus; Ut scias me intellegere, primum idem esse dico voluptatem, quod ille don.


Non risu potius quam oratione eiciendum? N

Weary Black Wall

$468
($39/mo)


Non risu potius quam oratione eiciendum? Nihil enim hoc differt.


Quae quo sunt excelsiores, eo dant c

Outstanding Black Line

$792
($66/mo)


Quae quo sunt excelsiores, eo dant clariora indicia naturae.


Familiares nostros, credo, Sironem dicis e

Wide-eyed Chocolate Face

$25
($/mo)


Familiares nostros, credo, Sironem dicis et Philodemum, cum optimos viros, tum homines doctissimos. Quod quidem iam fit etiam in Academia.


Familiares nostros, credo, Sironem dicis e

Grotesque Red Worm

$132
($11/mo)


Familiares nostros, credo, Sironem dicis et Philodemum, cum optimos viros, tum homines doctissimos. Quod quidem iam fit etiam in Academia.


Hoc enim identidem dicitis, non intellegere n

Witty Sangria Picture

$240
($20/mo)


Hoc enim identidem dicitis, non intellegere nos quam dicatis voluptatem. Itaque ad tempus ad Pisonem omnes.


Quae qui non vident, nihil umquam m

Different Blush Bridge

$120
($10/mo)


Quae qui non vident, nihil umquam magnum ac cognitione dignum amaverunt.


Quid igitur dubitamus in tota eius natura q

Unsightly Salmon Nose

$180
($15/mo)


Quid igitur dubitamus in tota eius natura quaerere quid sit effectum? Itaque hic ipse iam pridem est reiectus; Potius inflammat, ut coercendi magis quam dedocendi esse videantur.


At Zeno eum non beatum modo, s

Busy Green Dog

$396
($33/mo)


At Zeno eum non beatum modo, sed etiam divitem dicere ausus est.


`; +const htmlPageWithForm = `JAMStack e-commerce with Foxy.io - JAM Stack e-commerce template

1